aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2008-04-22 13:00:14 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2008-04-22 13:00:14 +0000
commitb246ad3da0ca47cda43878aa11b7b7fad2c07e87 (patch)
tree01f0d4ff3090f84a65d8da8cf944696532da08b3
parentc61e700aab78a58dc41b63bc1cbd5088a2ac009a (diff)
downloadsshfs-b246ad3da0ca47cda43878aa11b7b7fad2c07e87.tar
sshfs-b246ad3da0ca47cda43878aa11b7b7fad2c07e87.tar.gz
sshfs-b246ad3da0ca47cda43878aa11b7b7fad2c07e87.tar.bz2
sshfs-b246ad3da0ca47cda43878aa11b7b7fad2c07e87.zip
Allow the '-ossh_command=CMD' command to contain parameters...
-rw-r--r--ChangeLog3
-rw-r--r--sshfs.c77
2 files changed, 74 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index cae6dba..a8da448 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,9 @@
KbdInteractiveAuthentication, KbdInteractiveDevices, LocalCommand,
RekeyLimit (Debian bug #430225).
+ * Allow the '-ossh_command=CMD' command to contain parameters.
+ Escape charater is backslash.
+
2008-04-21 Miklos Szeredi <miklos@szeredi.hu>
* Fix incorrect disk usage reported by 'du' for files of size 4GB
diff --git a/sshfs.c b/sshfs.c
index 72b008b..d0b6f1b 100644
--- a/sshfs.c
+++ b/sshfs.c
@@ -817,6 +817,16 @@ static int pty_master(char **name)
return mfd;
}
+static void replace_arg(char **argp, const char *newarg)
+{
+ free(*argp);
+ *argp = strdup(newarg);
+ if (*argp == NULL) {
+ fprintf(stderr, "sshfs: memory allocation failed\n");
+ abort();
+ }
+}
+
static int start_ssh(void)
{
char *ptyname = NULL;
@@ -857,11 +867,18 @@ static int start_ssh(void)
#endif
if (sshfs.nodelaysrv_workaround) {
+ int i;
/*
* Hack to work around missing TCP_NODELAY
* setting in sshd
*/
- sshfs.ssh_args.argv[1] = "-X";
+ for (i = 1; i < sshfs.ssh_args.argc; i++) {
+ if (strcmp(sshfs.ssh_args.argv[i], "-x") == 0) {
+ replace_arg(&sshfs.ssh_args.argv[i],
+ "-X");
+ break;
+ }
+ }
}
devnull = open("/dev/null", O_WRONLY);
@@ -902,8 +919,19 @@ static int start_ssh(void)
close(sshfs.ptyfd);
}
+ if (sshfs.debug) {
+ int i;
+
+ fprintf(stderr, "executing");
+ for (i = 0; i < sshfs.ssh_args.argc; i++)
+ fprintf(stderr, " <%s>",
+ sshfs.ssh_args.argv[i]);
+ fprintf(stderr, "\n");
+ }
+
execvp(sshfs.ssh_args.argv[0], sshfs.ssh_args.argv);
- perror("execvp");
+ fprintf(stderr, "failed to execute '%s': %s\n",
+ sshfs.ssh_args.argv[0], strerror(errno));
_exit(1);
}
waitpid(pid, NULL, 0);
@@ -2648,6 +2676,8 @@ static int sshfs_truncate_workaround(const char *path, off_t size,
static int processing_init(void)
{
+ signal(SIGPIPE, SIG_IGN);
+
pthread_mutex_init(&sshfs.lock, NULL);
pthread_mutex_init(&sshfs.lock_write, NULL);
pthread_cond_init(&sshfs.outstanding_cond, NULL);
@@ -2914,6 +2944,43 @@ static int read_password(void)
return 0;
}
+static void set_ssh_command(void)
+{
+ char *s;
+ char *d;
+ int i = 0;
+ int end = 0;
+
+ d = sshfs.ssh_command;
+ s = sshfs.ssh_command;
+ while (!end) {
+ switch (*s) {
+ case '\0':
+ end = 1;
+ case ' ':
+ *d = '\0';
+ if (i == 0) {
+ replace_arg(&sshfs.ssh_args.argv[0],
+ sshfs.ssh_command);
+ } else {
+ if (fuse_opt_insert_arg(&sshfs.ssh_args, i,
+ sshfs.ssh_command) == -1)
+ _exit(1);
+ }
+ i++;
+ d = sshfs.ssh_command;
+ break;
+
+ case '\\':
+ if (s[1])
+ s++;
+ default:
+ *d++ = *s;
+ }
+ s++;
+ }
+}
+
int main(int argc, char *argv[])
{
int res;
@@ -2977,10 +3044,8 @@ int main(int argc, char *argv[])
else
sshfs.base_path = g_strdup(base_path);
- if (sshfs.ssh_command) {
- free(sshfs.ssh_args.argv[0]);
- sshfs.ssh_args.argv[0] = sshfs.ssh_command;
- }
+ if (sshfs.ssh_command)
+ set_ssh_command();
tmp = g_strdup_printf("-%i", sshfs.ssh_ver);
ssh_add_arg(tmp);