Option parsing in sysutils/sshfs-fuse

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Option parsing in sysutils/sshfs-fuse

Gregor Best
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

Reply | Threaded
Open this post in threaded view
|

Re: Option parsing in sysutils/sshfs-fuse

Jiri B-2
On Fri, Jun 20, 2014 at 02:03:37PM +0200, 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?

Check this, maybe Stuart answers your question:

http://marc.info/?l=openbsd-misc&m=140274931103908&w=2

j.

Reply | Threaded
Open this post in threaded view
|

Re: Option parsing in sysutils/sshfs-fuse

Stuart Henderson-6
In reply to this post by Gregor Best
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

Reply | Threaded
Open this post in threaded view
|

Re: Option parsing in sysutils/sshfs-fuse

Sylvestre Gallon
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,

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 13:29:49 -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 (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 | Threaded
Open this post in threaded view
|

Re: Option parsing in sysutils/sshfs-fuse

Sylvestre Gallon
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 | Threaded
Open this post in threaded view
|

Re: Option parsing in sysutils/sshfs-fuse

Gregor Best
On Fri, Jun 20, 2014 at 04:18:17PM +0200, Sylvestre Gallon wrote:
> > [...]
> > Does it fix the -p issue for you ?
> >
> > Cheers,
> >
>
> Please forget last diff and use this one instead...
> [...]

Yup, the patch fixes -p. Thanks a lot for the quick response.

--
        Gregor Best