forked from mirror/qemu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
273 lines
7.6 KiB
C
273 lines
7.6 KiB
C
/*
|
|
* FUSE: Filesystem in Userspace
|
|
* Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
|
|
*
|
|
* This program can be distributed under the terms of the GNU LGPLv2.
|
|
* See the file COPYING.LIB.
|
|
*/
|
|
|
|
#ifndef FUSE_OPT_H_
|
|
#define FUSE_OPT_H_
|
|
|
|
/** @file
|
|
*
|
|
* This file defines the option parsing interface of FUSE
|
|
*/
|
|
|
|
/**
|
|
* Option description
|
|
*
|
|
* This structure describes a single option, and action associated
|
|
* with it, in case it matches.
|
|
*
|
|
* More than one such match may occur, in which case the action for
|
|
* each match is executed.
|
|
*
|
|
* There are three possible actions in case of a match:
|
|
*
|
|
* i) An integer (int or unsigned) variable determined by 'offset' is
|
|
* set to 'value'
|
|
*
|
|
* ii) The processing function is called, with 'value' as the key
|
|
*
|
|
* iii) An integer (any) or string (char *) variable determined by
|
|
* 'offset' is set to the value of an option parameter
|
|
*
|
|
* 'offset' should normally be either set to
|
|
*
|
|
* - 'offsetof(struct foo, member)' actions i) and iii)
|
|
*
|
|
* - -1 action ii)
|
|
*
|
|
* The 'offsetof()' macro is defined in the <stddef.h> header.
|
|
*
|
|
* The template determines which options match, and also have an
|
|
* effect on the action. Normally the action is either i) or ii), but
|
|
* if a format is present in the template, then action iii) is
|
|
* performed.
|
|
*
|
|
* The types of templates are:
|
|
*
|
|
* 1) "-x", "-foo", "--foo", "--foo-bar", etc. These match only
|
|
* themselves. Invalid values are "--" and anything beginning
|
|
* with "-o"
|
|
*
|
|
* 2) "foo", "foo-bar", etc. These match "-ofoo", "-ofoo-bar" or
|
|
* the relevant option in a comma separated option list
|
|
*
|
|
* 3) "bar=", "--foo=", etc. These are variations of 1) and 2)
|
|
* which have a parameter
|
|
*
|
|
* 4) "bar=%s", "--foo=%lu", etc. Same matching as above but perform
|
|
* action iii).
|
|
*
|
|
* 5) "-x ", etc. Matches either "-xparam" or "-x param" as
|
|
* two separate arguments
|
|
*
|
|
* 6) "-x %s", etc. Combination of 4) and 5)
|
|
*
|
|
* If the format is "%s", memory is allocated for the string unlike with
|
|
* scanf(). The previous value (if non-NULL) stored at the this location is
|
|
* freed.
|
|
*/
|
|
struct fuse_opt {
|
|
/** Matching template and optional parameter formatting */
|
|
const char *templ;
|
|
|
|
/**
|
|
* Offset of variable within 'data' parameter of fuse_opt_parse()
|
|
* or -1
|
|
*/
|
|
unsigned long offset;
|
|
|
|
/**
|
|
* Value to set the variable to, or to be passed as 'key' to the
|
|
* processing function. Ignored if template has a format
|
|
*/
|
|
int value;
|
|
};
|
|
|
|
/**
|
|
* Key option. In case of a match, the processing function will be
|
|
* called with the specified key.
|
|
*/
|
|
#define FUSE_OPT_KEY(templ, key) \
|
|
{ \
|
|
templ, -1U, key \
|
|
}
|
|
|
|
/**
|
|
* Last option. An array of 'struct fuse_opt' must end with a NULL
|
|
* template value
|
|
*/
|
|
#define FUSE_OPT_END \
|
|
{ \
|
|
NULL, 0, 0 \
|
|
}
|
|
|
|
/**
|
|
* Argument list
|
|
*/
|
|
struct fuse_args {
|
|
/** Argument count */
|
|
int argc;
|
|
|
|
/** Argument vector. NULL terminated */
|
|
char **argv;
|
|
|
|
/** Is 'argv' allocated? */
|
|
int allocated;
|
|
};
|
|
|
|
/**
|
|
* Initializer for 'struct fuse_args'
|
|
*/
|
|
#define FUSE_ARGS_INIT(argc, argv) \
|
|
{ \
|
|
argc, argv, 0 \
|
|
}
|
|
|
|
/**
|
|
* Key value passed to the processing function if an option did not
|
|
* match any template
|
|
*/
|
|
#define FUSE_OPT_KEY_OPT -1
|
|
|
|
/**
|
|
* Key value passed to the processing function for all non-options
|
|
*
|
|
* Non-options are the arguments beginning with a character other than
|
|
* '-' or all arguments after the special '--' option
|
|
*/
|
|
#define FUSE_OPT_KEY_NONOPT -2
|
|
|
|
/**
|
|
* Special key value for options to keep
|
|
*
|
|
* Argument is not passed to processing function, but behave as if the
|
|
* processing function returned 1
|
|
*/
|
|
#define FUSE_OPT_KEY_KEEP -3
|
|
|
|
/**
|
|
* Special key value for options to discard
|
|
*
|
|
* Argument is not passed to processing function, but behave as if the
|
|
* processing function returned zero
|
|
*/
|
|
#define FUSE_OPT_KEY_DISCARD -4
|
|
|
|
/**
|
|
* Processing function
|
|
*
|
|
* This function is called if
|
|
* - option did not match any 'struct fuse_opt'
|
|
* - argument is a non-option
|
|
* - option did match and offset was set to -1
|
|
*
|
|
* The 'arg' parameter will always contain the whole argument or
|
|
* option including the parameter if exists. A two-argument option
|
|
* ("-x foo") is always converted to single argument option of the
|
|
* form "-xfoo" before this function is called.
|
|
*
|
|
* Options of the form '-ofoo' are passed to this function without the
|
|
* '-o' prefix.
|
|
*
|
|
* The return value of this function determines whether this argument
|
|
* is to be inserted into the output argument vector, or discarded.
|
|
*
|
|
* @param data is the user data passed to the fuse_opt_parse() function
|
|
* @param arg is the whole argument or option
|
|
* @param key determines why the processing function was called
|
|
* @param outargs the current output argument list
|
|
* @return -1 on error, 0 if arg is to be discarded, 1 if arg should be kept
|
|
*/
|
|
typedef int (*fuse_opt_proc_t)(void *data, const char *arg, int key,
|
|
struct fuse_args *outargs);
|
|
|
|
/**
|
|
* Option parsing function
|
|
*
|
|
* If 'args' was returned from a previous call to fuse_opt_parse() or
|
|
* it was constructed from
|
|
*
|
|
* A NULL 'args' is equivalent to an empty argument vector
|
|
*
|
|
* A NULL 'opts' is equivalent to an 'opts' array containing a single
|
|
* end marker
|
|
*
|
|
* A NULL 'proc' is equivalent to a processing function always
|
|
* returning '1'
|
|
*
|
|
* @param args is the input and output argument list
|
|
* @param data is the user data
|
|
* @param opts is the option description array
|
|
* @param proc is the processing function
|
|
* @return -1 on error, 0 on success
|
|
*/
|
|
int fuse_opt_parse(struct fuse_args *args, void *data,
|
|
const struct fuse_opt opts[], fuse_opt_proc_t proc);
|
|
|
|
/**
|
|
* Add an option to a comma separated option list
|
|
*
|
|
* @param opts is a pointer to an option list, may point to a NULL value
|
|
* @param opt is the option to add
|
|
* @return -1 on allocation error, 0 on success
|
|
*/
|
|
int fuse_opt_add_opt(char **opts, const char *opt);
|
|
|
|
/**
|
|
* Add an option, escaping commas, to a comma separated option list
|
|
*
|
|
* @param opts is a pointer to an option list, may point to a NULL value
|
|
* @param opt is the option to add
|
|
* @return -1 on allocation error, 0 on success
|
|
*/
|
|
int fuse_opt_add_opt_escaped(char **opts, const char *opt);
|
|
|
|
/**
|
|
* Add an argument to a NULL terminated argument vector
|
|
*
|
|
* @param args is the structure containing the current argument list
|
|
* @param arg is the new argument to add
|
|
* @return -1 on allocation error, 0 on success
|
|
*/
|
|
int fuse_opt_add_arg(struct fuse_args *args, const char *arg);
|
|
|
|
/**
|
|
* Add an argument at the specified position in a NULL terminated
|
|
* argument vector
|
|
*
|
|
* Adds the argument to the N-th position. This is useful for adding
|
|
* options at the beginning of the array which must not come after the
|
|
* special '--' option.
|
|
*
|
|
* @param args is the structure containing the current argument list
|
|
* @param pos is the position at which to add the argument
|
|
* @param arg is the new argument to add
|
|
* @return -1 on allocation error, 0 on success
|
|
*/
|
|
int fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg);
|
|
|
|
/**
|
|
* Free the contents of argument list
|
|
*
|
|
* The structure itself is not freed
|
|
*
|
|
* @param args is the structure containing the argument list
|
|
*/
|
|
void fuse_opt_free_args(struct fuse_args *args);
|
|
|
|
|
|
/**
|
|
* Check if an option matches
|
|
*
|
|
* @param opts is the option description array
|
|
* @param opt is the option to match
|
|
* @return 1 if a match is found, 0 if not
|
|
*/
|
|
int fuse_opt_match(const struct fuse_opt opts[], const char *opt);
|
|
|
|
#endif /* FUSE_OPT_H_ */
|