Unreleased Changes
==================
+* Documentation: clarified that the fuse_argv structure that is passed
+ to `fuse_new()` and `fuse_lowlevel_new()` must always contain at
+ least one element.
+
* The high-level init() handler now receives an additional struct
fuse_config pointer that can be used to adjust high-level API
specific configuration options.
* fuse_main() accepts all options that can be passed to
* fuse_parse_cmdline(), fuse_new(), or fuse_session_new().
*
- * Normally, fuse_main() includes a basic ``usage: `` message in the
- * --help output. However, if argv[0] is an empty string, the usage
- * message is suppressed. This can be used by file systems to print
- * their own usage line first. See hello.c for an example of how to do
- * this.
+ * Option parsing skips argv[0], which is assumed to contain the
+ * program name. This element must always be present and is used to
+ * construct a basic ``usage: `` message for the --help
+ * output. argv[0] may also be set to the empty string. In this case
+ * the usage message is suppressed. This can be used by file systems
+ * to print their own usage line first. See hello.c for an example of
+ * how to do this.
*
* Note: this is currently implemented as a macro.
*
* If the --help option is specified, the function writes a help text
* to stdout and returns NULL.
*
+ * Option parsing skips argv[0], which is assumed to contain the
+ * program name. This element must always be present and is used to
+ * construct a basic ``usage: `` message for the --help output. If
+ * argv[0] is set to the empty string, no usage message is included in
+ * the --help output.
+ *
* If an unknown option is passed in, an error message is written to
* stderr and the function returns NULL.
*
* If not all options are known, an error message is written to stderr
* and the function returns NULL.
*
+ * Option parsing skips argv[0], which is assumed to contain the
+ * program name. To prevent accidentially passing an option in
+ * argv[0], this element must always be present (even if no options
+ * are specified). It may be set to the empty string ('\0') if no
+ * reasonable value can be provided.
+ *
* @param args argument vector
* @param op the (low-level) filesystem operations
* @param op_size sizeof(struct fuse_lowlevel_ops)
op_size = sizeof(struct fuse_lowlevel_ops);
}
+ if (args->argc == 0) {
+ fprintf(stderr, "fuse: empty argv passed to fuse_session_new().\n");
+ return NULL;
+ }
+
se = (struct fuse_session *) calloc(1, sizeof(struct fuse_session));
if (se == NULL) {
fprintf(stderr, "fuse: failed to allocate fuse object\n");
goto out2;
if(fuse_opt_parse(args, se, fuse_ll_opts, NULL) == -1)
goto out3;
- if (args->argc != 1) {
+
+ if(args->argc == 1 &&
+ args->argv[0][0] == '-') {
+ fprintf(stderr, "fuse: warning: argv[0] looks like an option, but "
+ "will be ignored\n");
+ } else if (args->argc != 1) {
int i;
fprintf(stderr, "fuse: unknown option(s): `");
for(i = 1; i < args->argc-1; i++)