29
30
struct helper_opts {
32
int nodefault_subtype;
33
int nodefault_subtype;
36
37
#define FUSE_HELPER_OPT(t, p) { t, offsetof(struct helper_opts, p), 1 }
38
39
static const struct fuse_opt fuse_helper_opts[] = {
39
FUSE_HELPER_OPT("-d", foreground),
40
FUSE_HELPER_OPT("debug", foreground),
41
FUSE_HELPER_OPT("-f", foreground),
42
FUSE_HELPER_OPT("-s", singlethread),
43
FUSE_HELPER_OPT("fsname=", nodefault_subtype),
44
FUSE_HELPER_OPT("subtype=", nodefault_subtype),
40
FUSE_HELPER_OPT("-d", foreground),
41
FUSE_HELPER_OPT("debug", foreground),
42
FUSE_HELPER_OPT("-f", foreground),
43
FUSE_HELPER_OPT("-s", singlethread),
44
FUSE_HELPER_OPT("fsname=", nodefault_subtype),
45
FUSE_HELPER_OPT("subtype=", nodefault_subtype),
46
FUSE_OPT_KEY("-h", KEY_HELP),
47
FUSE_OPT_KEY("--help", KEY_HELP),
48
FUSE_OPT_KEY("-ho", KEY_HELP_NOHEADER),
49
FUSE_OPT_KEY("-V", KEY_VERSION),
50
FUSE_OPT_KEY("--version", KEY_VERSION),
51
FUSE_OPT_KEY("-d", FUSE_OPT_KEY_KEEP),
52
FUSE_OPT_KEY("debug", FUSE_OPT_KEY_KEEP),
53
FUSE_OPT_KEY("fsname=", FUSE_OPT_KEY_KEEP),
54
FUSE_OPT_KEY("subtype=", FUSE_OPT_KEY_KEEP),
47
FUSE_OPT_KEY("-h", KEY_HELP),
48
FUSE_OPT_KEY("--help", KEY_HELP),
49
FUSE_OPT_KEY("-ho", KEY_HELP_NOHEADER),
50
FUSE_OPT_KEY("-V", KEY_VERSION),
51
FUSE_OPT_KEY("--version", KEY_VERSION),
52
FUSE_OPT_KEY("-d", FUSE_OPT_KEY_KEEP),
53
FUSE_OPT_KEY("debug", FUSE_OPT_KEY_KEEP),
54
FUSE_OPT_KEY("fsname=", FUSE_OPT_KEY_KEEP),
55
FUSE_OPT_KEY("subtype=", FUSE_OPT_KEY_KEEP),
58
59
static void usage(const char *progname)
61
"usage: %s mountpoint [options]\n\n", progname);
64
" -o opt,[opt...] mount options\n"
65
" -h --help print help\n"
66
" -V --version print version\n"
62
"usage: %s mountpoint [options]\n\n", progname);
65
" -o opt,[opt...] mount options\n"
66
" -h --help print help\n"
67
" -V --version print version\n"
70
71
static void helper_help(void)
74
" -d -o debug enable debug output (implies -f)\n"
75
" -f foreground operation\n"
76
" -s disable multi-threaded operation\n"
75
" -d -o debug enable debug output (implies -f)\n"
76
" -f foreground operation\n"
77
" -s disable multi-threaded operation\n"
81
82
static void helper_version(void)
83
fprintf(stderr, "FUSE library version: %s\n", PACKAGE_VERSION);
84
fprintf(stderr, "FUSE library version: %s\n", PACKAGE_VERSION);
86
87
static int fuse_helper_opt_proc(void *data, const char *arg, int key,
87
struct fuse_args *outargs)
88
struct fuse_args *outargs)
89
struct helper_opts *hopts = data;
93
usage(outargs->argv[0]);
96
case KEY_HELP_NOHEADER:
98
return fuse_opt_add_arg(outargs, "-h");
104
case FUSE_OPT_KEY_NONOPT:
105
if (!hopts->mountpoint) {
106
char mountpoint[PATH_MAX];
107
if (realpath(arg, mountpoint) == NULL) {
108
fprintf(stderr, "fuse: bad mount point `%s': %s\n", arg, strerror(errno));
111
return fuse_opt_add_opt(&hopts->mountpoint, mountpoint);
113
fprintf(stderr, "fuse: invalid argument `%s'\n", arg);
90
struct helper_opts *hopts = data;
94
usage(outargs->argv[0]);
97
case KEY_HELP_NOHEADER:
99
return fuse_opt_add_arg(outargs, "-h");
105
case FUSE_OPT_KEY_NONOPT:
106
if (!hopts->mountpoint) {
107
char mountpoint[PATH_MAX];
108
if (realpath(arg, mountpoint) == NULL) {
110
"fuse: bad mount point `%s': %s\n",
111
arg, strerror(errno));
114
return fuse_opt_add_opt(&hopts->mountpoint, mountpoint);
116
fprintf(stderr, "fuse: invalid argument `%s'\n", arg);
122
125
static int add_default_subtype(const char *progname, struct fuse_args *args)
126
const char *basename = strrchr(progname, '/');
127
if (basename == NULL)
129
else if (basename[1] != '\0')
129
const char *basename = strrchr(progname, '/');
130
if (basename == NULL)
132
else if (basename[1] != '\0')
132
subtype_opt = (char *) malloc(strlen(basename) + 64);
133
if (subtype_opt == NULL) {
134
fprintf(stderr, "fuse: memory allocation failed\n");
137
sprintf(subtype_opt, "-osubtype=%s", basename);
138
res = fuse_opt_add_arg(args, subtype_opt);
135
subtype_opt = (char *) malloc(strlen(basename) + 64);
136
if (subtype_opt == NULL) {
137
fprintf(stderr, "fuse: memory allocation failed\n");
140
sprintf(subtype_opt, "-osubtype=%s", basename);
141
res = fuse_opt_add_arg(args, subtype_opt);
143
146
int fuse_parse_cmdline(struct fuse_args *args, char **mountpoint,
144
int *multithreaded, int *foreground)
147
int *multithreaded, int *foreground)
147
struct helper_opts hopts;
149
memset(&hopts, 0, sizeof(hopts));
150
res = fuse_opt_parse(args, &hopts, fuse_helper_opts, fuse_helper_opt_proc);
154
if (!hopts.nodefault_subtype) {
155
res = add_default_subtype(args->argv[0], args);
160
*mountpoint = hopts.mountpoint;
162
free(hopts.mountpoint);
165
*multithreaded = !hopts.singlethread;
167
*foreground = hopts.foreground;
171
free(hopts.mountpoint);
150
struct helper_opts hopts;
152
memset(&hopts, 0, sizeof(hopts));
153
res = fuse_opt_parse(args, &hopts, fuse_helper_opts,
154
fuse_helper_opt_proc);
158
if (!hopts.nodefault_subtype) {
159
res = add_default_subtype(args->argv[0], args);
164
*mountpoint = hopts.mountpoint;
166
free(hopts.mountpoint);
169
*multithreaded = !hopts.singlethread;
171
*foreground = hopts.foreground;
175
free(hopts.mountpoint);
175
179
int fuse_daemonize(int foreground)
182
perror("fuse: failed to daemonize program\n");
186
perror("fuse: failed to daemonize program\n");
189
193
static struct fuse_chan *fuse_mount_common(const char *mountpoint,
190
struct fuse_args *args)
194
struct fuse_args *args)
192
struct fuse_chan *ch;
196
* Make sure file descriptors 0, 1 and 2 are open, otherwise chaos
200
fd = open("/dev/null", O_RDWR);
203
} while (fd >= 0 && fd <= 2);
205
fd = fuse_mount_compat25(mountpoint, args);
209
ch = fuse_kern_chan_new(fd);
211
fuse_kern_unmount(mountpoint, fd);
196
struct fuse_chan *ch;
200
* Make sure file descriptors 0, 1 and 2 are open, otherwise chaos
204
fd = open("/dev/null", O_RDWR);
207
} while (fd >= 0 && fd <= 2);
209
fd = fuse_mount_compat25(mountpoint, args);
213
ch = fuse_kern_chan_new(fd);
215
fuse_kern_unmount(mountpoint, fd);
216
220
struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args)
218
return fuse_mount_common(mountpoint, args);
222
return fuse_mount_common(mountpoint, args);
221
225
static void fuse_unmount_common(const char *mountpoint, struct fuse_chan *ch)
223
int fd = ch ? fuse_chan_fd(ch) : -1;
224
fuse_kern_unmount(mountpoint, fd);
225
fuse_chan_destroy(ch);
227
int fd = ch ? fuse_chan_fd(ch) : -1;
228
fuse_kern_unmount(mountpoint, fd);
229
fuse_chan_destroy(ch);
228
232
void fuse_unmount(const char *mountpoint, struct fuse_chan *ch)
230
fuse_unmount_common(mountpoint, ch);
234
fuse_unmount_common(mountpoint, ch);
233
237
static struct fuse *fuse_setup_common(int argc, char *argv[],
234
const struct fuse_operations *op,
238
const struct fuse_operations *op,
242
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
243
struct fuse_chan *ch;
248
res = fuse_parse_cmdline(&args, mountpoint, multithreaded, &foreground);
252
ch = fuse_mount_common(*mountpoint, &args);
254
fuse_opt_free_args(&args);
258
fuse = fuse_new_common(ch, &args, op, op_size, user_data, compat);
259
fuse_opt_free_args(&args);
263
res = fuse_daemonize(foreground);
267
res = fuse_set_signal_handlers(fuse_get_session(fuse));
272
*fd = fuse_chan_fd(ch);
277
fuse_unmount_common(*mountpoint, ch);
246
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
247
struct fuse_chan *ch;
252
res = fuse_parse_cmdline(&args, mountpoint, multithreaded, &foreground);
256
ch = fuse_mount_common(*mountpoint, &args);
258
fuse_opt_free_args(&args);
262
fuse = fuse_new_common(ch, &args, op, op_size, user_data, compat);
263
fuse_opt_free_args(&args);
267
res = fuse_daemonize(foreground);
271
res = fuse_set_signal_handlers(fuse_get_session(fuse));
276
*fd = fuse_chan_fd(ch);
281
fuse_unmount_common(*mountpoint, ch);
285
289
struct fuse *fuse_setup(int argc, char *argv[],
286
const struct fuse_operations *op, size_t op_size,
287
char **mountpoint, int *multithreaded, void *user_data)
290
const struct fuse_operations *op, size_t op_size,
291
char **mountpoint, int *multithreaded, void *user_data)
289
return fuse_setup_common(argc, argv, op, op_size, mountpoint,
290
multithreaded, NULL, user_data, 0);
293
return fuse_setup_common(argc, argv, op, op_size, mountpoint,
294
multithreaded, NULL, user_data, 0);
293
297
static void fuse_teardown_common(struct fuse *fuse, char *mountpoint)
295
struct fuse_session *se = fuse_get_session(fuse);
296
struct fuse_chan *ch = fuse_session_next_chan(se, NULL);
297
fuse_remove_signal_handlers(se);
298
fuse_unmount_common(mountpoint, ch);
299
struct fuse_session *se = fuse_get_session(fuse);
300
struct fuse_chan *ch = fuse_session_next_chan(se, NULL);
301
fuse_remove_signal_handlers(se);
302
fuse_unmount_common(mountpoint, ch);
303
307
void fuse_teardown(struct fuse *fuse, char *mountpoint)
305
fuse_teardown_common(fuse, mountpoint);
309
fuse_teardown_common(fuse, mountpoint);
308
312
static int fuse_main_common(int argc, char *argv[],
309
const struct fuse_operations *op, size_t op_size,
310
void *user_data, int compat)
313
const struct fuse_operations *op, size_t op_size,
314
void *user_data, int compat)
317
fuse = fuse_setup_common(argc, argv, op, op_size, &mountpoint,
318
&multithreaded, NULL, user_data, compat);
323
res = fuse_loop_mt(fuse);
325
res = fuse_loop(fuse);
327
fuse_teardown_common(fuse, mountpoint);
321
fuse = fuse_setup_common(argc, argv, op, op_size, &mountpoint,
322
&multithreaded, NULL, user_data, compat);
327
res = fuse_loop_mt(fuse);
329
res = fuse_loop(fuse);
331
fuse_teardown_common(fuse, mountpoint);
334
338
int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op,
335
size_t op_size, void *user_data)
339
size_t op_size, void *user_data)
337
return fuse_main_common(argc, argv, op, op_size, user_data, 0);
341
return fuse_main_common(argc, argv, op, op_size, user_data, 0);
341
345
int fuse_main(void);
342
346
int fuse_main(void)
344
fprintf(stderr, "fuse_main(): This function does not exist\n");
348
fprintf(stderr, "fuse_main(): This function does not exist\n");
348
352
int fuse_version(void)
353
357
#include "fuse_compat.h"
355
359
#ifndef __FreeBSD__
357
361
struct fuse *fuse_setup_compat22(int argc, char *argv[],
358
const struct fuse_operations_compat22 *op,
359
size_t op_size, char **mountpoint,
360
int *multithreaded, int *fd)
362
const struct fuse_operations_compat22 *op,
363
size_t op_size, char **mountpoint,
364
int *multithreaded, int *fd)
362
return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
363
op_size, mountpoint, multithreaded, fd, NULL, 22);
366
return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
367
op_size, mountpoint, multithreaded, fd, NULL,
366
371
struct fuse *fuse_setup_compat2(int argc, char *argv[],
367
const struct fuse_operations_compat2 *op,
368
char **mountpoint, int *multithreaded,
372
const struct fuse_operations_compat2 *op,
373
char **mountpoint, int *multithreaded,
371
return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
372
sizeof(struct fuse_operations_compat2),
373
mountpoint, multithreaded, fd, NULL, 21);
376
return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
377
sizeof(struct fuse_operations_compat2),
378
mountpoint, multithreaded, fd, NULL, 21);
376
381
int fuse_main_real_compat22(int argc, char *argv[],
377
const struct fuse_operations_compat22 *op,
382
const struct fuse_operations_compat22 *op,
380
return fuse_main_common(argc, argv, (struct fuse_operations *) op, op_size,
385
return fuse_main_common(argc, argv, (struct fuse_operations *) op,
384
389
void fuse_main_compat1(int argc, char *argv[],
385
const struct fuse_operations_compat1 *op)
390
const struct fuse_operations_compat1 *op)
387
fuse_main_common(argc, argv, (struct fuse_operations *) op,
388
sizeof(struct fuse_operations_compat1), NULL, 11);
392
fuse_main_common(argc, argv, (struct fuse_operations *) op,
393
sizeof(struct fuse_operations_compat1), NULL, 11);
391
396
int fuse_main_compat2(int argc, char *argv[],
392
const struct fuse_operations_compat2 *op)
397
const struct fuse_operations_compat2 *op)
394
return fuse_main_common(argc, argv, (struct fuse_operations *) op,
395
sizeof(struct fuse_operations_compat2), NULL, 21);
399
return fuse_main_common(argc, argv, (struct fuse_operations *) op,
400
sizeof(struct fuse_operations_compat2), NULL,
398
404
int fuse_mount_compat1(const char *mountpoint, const char *args[])
400
/* just ignore mount args for now */
402
return fuse_mount_compat22(mountpoint, NULL);
406
/* just ignore mount args for now */
408
return fuse_mount_compat22(mountpoint, NULL);
405
__asm__(".symver fuse_setup_compat2,__fuse_setup@");
406
__asm__(".symver fuse_setup_compat22,fuse_setup@FUSE_2.2");
407
__asm__(".symver fuse_teardown,__fuse_teardown@");
408
__asm__(".symver fuse_main_compat2,fuse_main@");
409
__asm__(".symver fuse_main_real_compat22,fuse_main_real@FUSE_2.2");
411
FUSE_SYMVER(".symver fuse_setup_compat2,__fuse_setup@");
412
FUSE_SYMVER(".symver fuse_setup_compat22,fuse_setup@FUSE_2.2");
413
FUSE_SYMVER(".symver fuse_teardown,__fuse_teardown@");
414
FUSE_SYMVER(".symver fuse_main_compat2,fuse_main@");
415
FUSE_SYMVER(".symver fuse_main_real_compat22,fuse_main_real@FUSE_2.2");
411
417
#endif /* __FreeBSD__ */
414
420
struct fuse *fuse_setup_compat25(int argc, char *argv[],
415
const struct fuse_operations_compat25 *op,
416
size_t op_size, char **mountpoint,
417
int *multithreaded, int *fd)
421
const struct fuse_operations_compat25 *op,
422
size_t op_size, char **mountpoint,
423
int *multithreaded, int *fd)
419
return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
420
op_size, mountpoint, multithreaded, fd, NULL, 25);
425
return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
426
op_size, mountpoint, multithreaded, fd, NULL,
423
430
int fuse_main_real_compat25(int argc, char *argv[],
424
const struct fuse_operations_compat25 *op,
431
const struct fuse_operations_compat25 *op,
427
return fuse_main_common(argc, argv, (struct fuse_operations *) op, op_size,
434
return fuse_main_common(argc, argv, (struct fuse_operations *) op,
431
438
void fuse_teardown_compat22(struct fuse *fuse, int fd, char *mountpoint)
434
fuse_teardown_common(fuse, mountpoint);
441
fuse_teardown_common(fuse, mountpoint);
437
444
int fuse_mount_compat25(const char *mountpoint, struct fuse_args *args)
439
return fuse_kern_mount(mountpoint, args);
446
return fuse_kern_mount(mountpoint, args);
442
__asm__(".symver fuse_setup_compat25,fuse_setup@FUSE_2.5");
443
__asm__(".symver fuse_teardown_compat22,fuse_teardown@FUSE_2.2");
444
__asm__(".symver fuse_main_real_compat25,fuse_main_real@FUSE_2.5");
445
__asm__(".symver fuse_mount_compat25,fuse_mount@FUSE_2.5");
449
FUSE_SYMVER(".symver fuse_setup_compat25,fuse_setup@FUSE_2.5");
450
FUSE_SYMVER(".symver fuse_teardown_compat22,fuse_teardown@FUSE_2.2");
451
FUSE_SYMVER(".symver fuse_main_real_compat25,fuse_main_real@FUSE_2.5");
452
FUSE_SYMVER(".symver fuse_mount_compat25,fuse_mount@FUSE_2.5");