On Fri, Jun 20, 2014 at 03:49:31PM +0200, Sylvestre Gallon wrote:
> On Fri, Jun 20, 2014 at 01:12:01PM +0100, Stuart Henderson wrote:
> > On 2014/06/20 14:03, Gregor Best wrote:
> > > Hi Sylvestre,
> > > 
> > > I've noticed that sysutils/sshfs-fuse does not seem to accept all
> > > options advertised in the manpage and available on e.g. Linux. The most
> > > notable example is -p, which sets the target SSH port. I have a machine
> > > where SSH listens on port 22022. On Linux and the like, I can do
> > > something like
> > > 
> > >   $ sshfs neon:/home/gbe /mnt/tmp -p 22022
> > > 
> > > whereas on OpenBSD, I get
> > > 
> > >   $ sshfs neon:/home/gbe /mnt/tmp -p 22022
> > >   fuse: unknown option -p
> > > 
> > > On the other hand, I _can_ use -o to set options like sshfs_debug, but
> > > not things like Port (e.g. via -o Port=22022).
> > > 
> > > Is there anything I can do to further debug this, or maybe a little hit
> > > with the clue stick you could give me so maybe I can fix it?
> > > 
> > > -- 
> > >   Gregor Best
> > > 
> > 
> > I think this is related to options handling in libfuse. I don't know
> > how to fix it, but as a workaround you can add a Host section to
> > .ssh/config which specifies the port.
> > 
> > Host somehost
> >   HostName 192.0.2.23
> >   Port 2022
> > 
> 
> The problem with fuse_opt is that it is specified by the
> Linux fuse spec which is a real pain in the ass...
> 
> sshfs use '-p ' option and not '-p'. As I understand there is 
> a space at the end of the option. It means we need to get
> the next arg and give it as an argument to -p.
> 
> Here is an attempt to do that...
> 
> Does it fix the -p issue for you ?
> 
> Cheers,
> 

Please forget last diff and use this one instead...

Index: fuse_opt.c
===================================================================
RCS file: /cvs/src/lib/libfuse/fuse_opt.c,v
retrieving revision 1.10
diff -u -p -u -p -r1.10 fuse_opt.c
--- fuse_opt.c  20 May 2014 13:22:06 -0000      1.10
+++ fuse_opt.c  20 Jun 2014 14:02:36 -0000
@@ -218,8 +218,8 @@ fuse_opt_add_arg(struct fuse_args *args,
 }
 
 static int
-parse_opt(const struct fuse_opt *o, const char *val, void *data,
-    fuse_opt_proc_t f, struct fuse_args *arg)
+parse_opt(const struct fuse_opt *o, const char *val, const char *val2,
+    void *data, fuse_opt_proc_t f, struct fuse_args *arg, int *i)
 {
        int found, ret, keyval;
        size_t idx;
@@ -236,6 +236,13 @@ parse_opt(const struct fuse_opt *o, cons
        }
 
        for(; o->templ; o++) {
+               if (val2 && o->templ[strlen(o->templ) -1] == ' ') {
+                       idx--;
+                       keyval = 1;
+                       val = val2;
+                       (*i)++;
+               }
+
                if ((keyval && strncmp(val, o->templ, idx) == 0) ||
                    (!keyval && strcmp(val, o->templ) == 0)) {
                        if (o->val == FUSE_OPT_KEY_DISCARD)
@@ -278,6 +285,7 @@ fuse_opt_parse(struct fuse_args *args, v
 {
        struct fuse_args outargs;
        const char *arg;
+       char *arg2 = NULL;
        int ret = 0;
        int i;
 
@@ -289,6 +297,10 @@ fuse_opt_parse(struct fuse_args *args, v
 
        for (i = 1; i < args->argc; i++) {
                arg = args->argv[i];
+               if (i < args->argc - 1)
+                       if (asprintf(&arg2, "%s %s\n", arg,
+                           args->argv[i + 1]) == -1)
+                               return (-1);
 
                /* not - and not -- */
                if (arg[0] != '-') {
@@ -304,20 +316,24 @@ fuse_opt_parse(struct fuse_args *args, v
                        else
                                arg = args->argv[++i];
 
-                       ret = parse_opt(opt, arg, data, f, &outargs);
+                       ret = parse_opt(opt, arg, arg2, data, f, &outargs,  &i);
 
                        if (ret == -1)
                                goto err;
                } else {
-                       ret = parse_opt(opt, arg, data, f, &outargs);
+                       ret = parse_opt(opt, arg, arg2, data, f, &outargs, &i);
 
                        if (ret == -1)
                                goto err;
                }
+
+               free(arg2);
+               arg2 = NULL;
        }
        ret = 0;
 
 err:
+       free(arg2);
        /* Update args */
        fuse_opt_free_args(args);
        args->allocated = outargs.allocated;

Reply via email to