Mostly just typos. Corrected the example some. However, please see below. I
don't
think the example works or I'm just doing something wrong.
Index: fuse_opt.3
===================================================================
RCS file: /cvs/src/lib/libfuse/fuse_opt.3,v
retrieving revision 1.2
diff -u -p -u -r1.2 fuse_opt.3
--- fuse_opt.3 8 Jul 2018 06:17:10 -0000 1.2
+++ fuse_opt.3 29 Nov 2018 13:27:26 -0000
@@ -224,7 +224,7 @@ automatically depending on the format of
If
.Fa proc
is not NULL, then this is called for any argument that matches a template
-with that has
+that has
.Fa val
= FUSE_OPT_KEY.
.Fa opts
@@ -275,35 +275,34 @@ returns 1 on match, 0 if no match.
.Sh EXAMPLES
.Bd -literal -offset indent
struct foo_config {
- char *foor;
+ char *foo;
int bar;
-};
+} config;
-#define FOO_OPT(t, m) {t, offsetof(struct foo_config, m), 1}
+#define FOO_OPT(t, m) { t, offsetof(struct foo_config, m), 1 }
struct fuse_opt opts[] {
- FUSE_OPT_KEY("--foo ", KEY_FOO),
- FOO_OPT("-b", bar),
- FOO_OPT("gid=", set_gid), /* set to 1 if present */
- FOO_OPT("gid=%u", gid), /* set to parsed value of %u */
+ FUSE_OPT_KEY("--foo %s", KEY_FOO),
+ FOO_OPT("-b", bar),
+ FOO_OPT("gid=", set_gid), /* set to 1 if present */
+ FOO_OPT("gid=%u", gid), /* set to parsed value of %u
*/
FUSE_OPT_END
}
int
-foo_process_proc(void *data, int key, char *val, struct fuse_args *args)
+foo_process_proc(void *data, const char *val, int key, struct fuse_args *args)
{
- foo_cofig *conf = data;
+ foo_config *conf = data;
- switch(key)
- {
+ switch(key) {
case KEY_FOO:
/* Do something... */
- conf.foo = val;
+ conf->foo = val;
return (0); /* discard */
+ default:
+ /* didn't process so keep the option */
+ return (1);
}
-
- /* didn't process so keep the option */
- return (1);
}
int
@@ -311,7 +310,7 @@ main(int argc, char *argv[])
{
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
- if (fuse_opt_parse(opts, config, foo_process_proc) != 0) {
+ if (fuse_opt_parse(opts, &config, opts, foo_process_proc) != 0) {
...
.Ed
.Sh ERRORS
Here was my test to ensure the above worked.
#include <errno.h>
#include <fuse.h>
#include <fuse_opt.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
struct fuse_operations fsops = {
};
struct fuse_config {
char *string;
int num;
} config;
#define TEST_FUSE_OPT(t, m) \
{ t, offsetof(struct fuse_config, m), 1 }
enum {
KEY_STRING,
};
static struct fuse_opt opts[] = {
/* with "--s " this test gives the following output
* config.string = --sstring
* config.num = 1
* fuse: bad mount point string : No such file or directory
*/
FUSE_OPT_KEY("--s %s", KEY_STRING),
TEST_FUSE_OPT("--n", num), /* should set num to 1 */
FUSE_OPT_END
};
static int
fuse_opt_cb(void *data, const char *val, int key, struct fuse_args *outargs)
{
struct fuse_config *conf = data;
switch (key) {
case KEY_STRING:
/* I had to use strdup. conf->string = val didn't seem to work
*/
conf->string = strdup(val);
return (0);
default:
break;
}
return (1);
}
int
main(int argc, char *argv[])
{
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
int rv;
if (fuse_opt_parse(&args, &config, opts, fuse_opt_cb) == -1)
return(1);
fprintf(stderr, "config.string = %s\n", config.string);
fprintf(stderr, "config.num = %d\n", config.num);
rv = fuse_main(argc, argv, &fsops, NULL);
fuse_opt_free_args(&args);
return(rv);
}
clang -o fuse fuse.c -lfuse /* I know creative */
$ mkdir /tmp/test
$ doas ./fuse -d --n --s string /tmp/test
config.string = string
config.num = 1
fuse: bad mount point string : No such file or directory
Thanks,
Edgar