diff options
author | Andreas Baumann <abaumann@yahoo.com> | 2012-04-06 10:15:44 +0200 |
---|---|---|
committer | Andreas Baumann <abaumann@yahoo.com> | 2012-04-06 10:15:44 +0200 |
commit | 32719304e6fd5062e8ff300f91ccbaeb2496f6b7 (patch) | |
tree | e661dd9c9229caaf6e40af80ab5c6a6167d8c5d2 | |
parent | 38c4bbc4b62e18ae212ca5772dc3cd955db33415 (diff) | |
download | pgfuse-32719304e6fd5062e8ff300f91ccbaeb2496f6b7.tar.gz pgfuse-32719304e6fd5062e8ff300f91ccbaeb2496f6b7.tar.bz2 |
using fuse_opts instead of gengetopt
-rw-r--r-- | INSTALL | 8 | ||||
-rw-r--r-- | Makefile | 15 | ||||
-rw-r--r-- | pgfuse.c | 202 | ||||
-rw-r--r-- | pgfuse.ggo | 23 | ||||
-rw-r--r-- | pgfuse_cmdline.c | 880 | ||||
-rw-r--r-- | pgfuse_cmdline.h | 208 |
6 files changed, 149 insertions, 1187 deletions
@@ -5,13 +5,7 @@ required: * libpq from Postgresql and header files -optionally: - -* gengetopt 2.22.x: a commmand line argument generator, - generates pgfuse_cmdline.h and pgfuse_cmdline.c - (just needed, if you change pgfuse.ggo) - Compilation ----------- -make should do the trick. :-) +make @@ -15,17 +15,8 @@ LDFLAGS = `pkg-config fuse --libs` clean: rm -f pgfuse pgfuse.o -pgfuse: pgfuse.o pgfuse_cmdline.o - gcc -o pgfuse $(LDFLAGS) pgfuse.o pgfuse_cmdline.o +pgfuse: pgfuse.o + gcc -o pgfuse $(LDFLAGS) pgfuse.o -pgfuse_cmdline.o: pgfuse_cmdline.c pgfuse_cmdline.h - gcc -c $(CFLAGS) -o pgfuse_cmdline.o pgfuse_cmdline.c - -pgfuse.o: pgfuse.c pgfuse_cmdline.h +pgfuse.o: pgfuse.c gcc -c $(CFLAGS) -o pgfuse.o pgfuse.c - -pgfuse_cmdline.h: pgfuse.ggo - gengetopt -F pgfuse_cmdline --conf-parser -i pgfuse.ggo - -pgfuse_cmdline.c: pgfuse.ggo - gengetopt -F pgfuse_cmdline --conf-parser -i pgfuse.ggo @@ -17,73 +17,161 @@ #include <unistd.h> /* for exit */ #include <stdlib.h> /* for EXIT_FAILURE, EXIT_SUCCESS */ -#include <stdio.h> /* for fprintf */ #include <string.h> /* for strdup */ - -#include "pgfuse_cmdline.h" /* for command line and option parsing (gengetopt) */ - -static int parse_options_and_arguments( int argc, char *argv[], struct gengetopt_args_info *args_info ) { - struct cmdline_parser_params params; - - cmdline_parser_params_init( ¶ms ); - params.override = 1; - params.initialize = 0; - params.check_required = 1; - - cmdline_parser_init( args_info ); - - if( cmdline_parser_ext( argc, argv, args_info, ¶ms ) != 0 ) { - cmdline_parser_free( args_info ); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; +#include <stdio.h> /* for fprintf */ +#include <stddef.h> /* for offsetof */ +#include <libgen.h> /* for basename */ + +#include <fuse.h> /* for user-land filesystem */ +#include <fuse_opt.h> /* fuse command line parser */ + +/* --- parse arguments --- */ + +struct pgfuse { + int print_help; /* whether we should print a help page */ + int print_version; /* whether we should print the version */ + int verbose; /* whether we should be verbose */ + char *host; /* host running the Postgresql database */ + char *mountpoint; /* where we mount the virtual filesystem */ +} pgfuse; + +#define PGFUSE_OPT( t, p, v ) { t, offsetof( struct pgfuse, p ), v } + +enum { + KEY_HELP, + KEY_VERBOSE, + KEY_VERSION +}; + +static struct fuse_opt pgfuse_opts[] = { + PGFUSE_OPT( "host=%s", host, 0 ), + FUSE_OPT_KEY( "-h", KEY_HELP ), + FUSE_OPT_KEY( "--help", KEY_HELP ), + FUSE_OPT_KEY( "-v", KEY_VERBOSE ), + FUSE_OPT_KEY( "--verbose", KEY_VERBOSE ), + FUSE_OPT_KEY( "-V", KEY_VERSION ), + FUSE_OPT_KEY( "--version", KEY_VERSION ), + FUSE_OPT_END +}; + +static int pgfuse_opt_proc( void* data, const char* arg, int key, + struct fuse_args* outargs ) +{ + switch( key ) { + case FUSE_OPT_KEY_OPT: + return 1; + + case FUSE_OPT_KEY_NONOPT: + /* TODO: check arg */ + pgfuse.mountpoint = strdup( arg ); + return 1; + + case KEY_HELP: + pgfuse.print_help = 1; + return -1; + + case KEY_VERBOSE: + pgfuse.verbose = 1; + return 0; + + case KEY_VERSION: + pgfuse.print_version = 1; + return -1; + + default: + return -1; + } } - -static int test_config( const char *filename ) { - return EXIT_SUCCESS; + +static void print_usage( char* progname ) +{ + printf( + "usage: %s <database connector URL> <mountpoint>\n" + "\n" + "Options:\n" + " -o opt,[opt...] pgfuse options\n" + " -v --verbose make libcurl print verbose debug\n" + " -h --help print help\n" + " -V --version print version\n" + "\n" + "PgFuse options:\n" + " read_only mount filesystem read-only, do not change data in database\n", + progname + ); } + +static int parse_args( int argc, char *argv[] ) +{ + struct fuse_args args = FUSE_ARGS_INIT( argc, argv ); + if( fuse_opt_parse( &args, &pgfuse, pgfuse_opts, pgfuse_opt_proc ) == -1 ) { + if( pgfuse.print_help ) { + print_usage( basename( argv[0] ) ); + return EXIT_SUCCESS; + } + if( pgfuse.print_version ) { + fprintf( stderr, "0.0.1\n" ); + return EXIT_SUCCESS; + } + return EXIT_FAILURE; + } -static int read_config( const char *filename, struct gengetopt_args_info *args_info ) { - char *config_filename = strdup( filename ); - struct cmdline_parser_params params; - - cmdline_parser_params_init( ¶ms ); - params.override = 0; - params.initialize = 0; - params.check_required = 1; - - if( cmdline_parser_config_file( config_filename, args_info, ¶ms ) != 0 ) { - fprintf( stdout, "\n%s\n", gengetopt_args_info_usage ); - cmdline_parser_free( args_info ); - free( config_filename ); + if( pgfuse.host == NULL ) { + fprintf( stderr, "missing host of Postgresql database\n" ); + fprintf( stderr, "see '%s -h' for usage\n", argv[0] ); return EXIT_FAILURE; } - free( config_filename ); - + return EXIT_SUCCESS; } -int main( int argc, char *argv[] ) -{ - struct gengetopt_args_info args_info; - - if( parse_options_and_arguments( argc, argv, &args_info ) == EXIT_FAILURE ) { - exit( EXIT_FAILURE ); - } +/* --- fuse callbacks --- */ + +struct fuse_operations pgfuse_oper = { + .getattr = NULL, + .readlink = NULL, + .mknod = NULL, + .mkdir = NULL, + .unlink = NULL, + .rmdir = NULL, + .symlink = NULL, + .rename = NULL, + .link = NULL, + .chmod = NULL, + .chown = NULL, + .utime = NULL, + .open = NULL, + .read = NULL, + .write = NULL, + .statfs = NULL, + .flush = NULL, + .release = NULL, + .fsync = NULL, + .setxattr = NULL, + .listxattr = NULL, + .removexattr = NULL, + .opendir = NULL, + .readdir = NULL, + .fsyncdir = NULL, + .init = NULL, + .destroy = NULL, + .access = NULL, + .create = NULL, + .ftruncate = NULL, + .fgetattr = NULL, + .lock = NULL, + .utimens = NULL, + .bmap = NULL, + .ioctl = NULL, + .poll = NULL +}; + +/* --- main --- */ - if( args_info.config_file_given ) { - if( read_config( args_info.config_file_arg, &args_info ) == EXIT_FAILURE ) { - exit( EXIT_FAILURE ); - } - } - - if( args_info.test_given ) { - cmdline_parser_free( &args_info ); - exit( test_config( args_info.config_file_arg ) ); - } +int main( int argc, char *argv[] ) +{ + int res; - cmdline_parser_free( &args_info ); + res = parse_args( argc, argv ); - exit( EXIT_SUCCESS ); + exit( res ); } diff --git a/pgfuse.ggo b/pgfuse.ggo deleted file mode 100644 index 722de1e..0000000 --- a/pgfuse.ggo +++ /dev/null @@ -1,23 +0,0 @@ -package "pgfuse" -version "0.0.1" -usage "pgfuse [options] <mount point>" -description "User land filesystem using a Postgresql database\n" - -section "Main Options" - option "ro" r - "Do not allow write operations, only read operations" - optional - - option "debug" d - "Increase debug level (option can be given many times)" - optional multiple - - option "test" t - "Test the configuration without running pgfuse" - optional - - option "config-file" c - "An optional configuration file to be read by pgfuse" - string typestr="file" - optional - diff --git a/pgfuse_cmdline.c b/pgfuse_cmdline.c deleted file mode 100644 index 324b986..0000000 --- a/pgfuse_cmdline.c +++ /dev/null @@ -1,880 +0,0 @@ -/* - File autogenerated by gengetopt version 2.22.5 - generated with the following command: - gengetopt -F pgfuse_cmdline --conf-parser -i pgfuse.ggo - - The developers of gengetopt consider the fixed text that goes in all - gengetopt output files to be in the public domain: - we make no copyright claims on it. -*/ - -/* If we use autoconf. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#ifndef FIX_UNUSED -#define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ -#endif - -#include <getopt.h> - -#include "pgfuse_cmdline.h" - -const char *gengetopt_args_info_purpose = ""; - -const char *gengetopt_args_info_usage = "Usage: pgfuse [options] <mount point>"; - -const char *gengetopt_args_info_description = "User land filesystem using a Postgresql database\n"; - -const char *gengetopt_args_info_help[] = { - " -h, --help Print help and exit", - " -V, --version Print version and exit", - "\nMain Options:", - " -r, --ro Do not allow write operations, only read operations", - " -d, --debug Increase debug level (option can be given many times)", - " -t, --test Test the configuration without running pgfuse", - " -c, --config-file=file An optional configuration file to be read by pgfuse", - 0 -}; - -typedef enum {ARG_NO - , ARG_STRING -} cmdline_parser_arg_type; - -static -void clear_given (struct gengetopt_args_info *args_info); -static -void clear_args (struct gengetopt_args_info *args_info); - -static int -cmdline_parser_internal (int argc, char **argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params, const char *additional_error); - -static int -cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); -struct line_list -{ - char * string_arg; - struct line_list * next; -}; - -static struct line_list *cmd_line_list = 0; -static struct line_list *cmd_line_list_tmp = 0; - -static void -free_cmd_list(void) -{ - /* free the list of a previous call */ - if (cmd_line_list) - { - while (cmd_line_list) { - cmd_line_list_tmp = cmd_line_list; - cmd_line_list = cmd_line_list->next; - free (cmd_line_list_tmp->string_arg); - free (cmd_line_list_tmp); - } - } -} - - -static char * -gengetopt_strdup (const char *s); - -static -void clear_given (struct gengetopt_args_info *args_info) -{ - args_info->help_given = 0 ; - args_info->version_given = 0 ; - args_info->ro_given = 0 ; - args_info->debug_given = 0 ; - args_info->test_given = 0 ; - args_info->config_file_given = 0 ; -} - -static -void clear_args (struct gengetopt_args_info *args_info) -{ - FIX_UNUSED (args_info); - args_info->config_file_arg = NULL; - args_info->config_file_orig = NULL; - -} - -static -void init_args_info(struct gengetopt_args_info *args_info) -{ - - - args_info->help_help = gengetopt_args_info_help[0] ; - args_info->version_help = gengetopt_args_info_help[1] ; - args_info->ro_help = gengetopt_args_info_help[3] ; - args_info->debug_help = gengetopt_args_info_help[4] ; - args_info->debug_min = 0; - args_info->debug_max = 0; - args_info->test_help = gengetopt_args_info_help[5] ; - args_info->config_file_help = gengetopt_args_info_help[6] ; - -} - -void -cmdline_parser_print_version (void) -{ - printf ("%s %s\n", - (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), - CMDLINE_PARSER_VERSION); -} - -static void print_help_common(void) { - cmdline_parser_print_version (); - - if (strlen(gengetopt_args_info_purpose) > 0) - printf("\n%s\n", gengetopt_args_info_purpose); - - if (strlen(gengetopt_args_info_usage) > 0) - printf("\n%s\n", gengetopt_args_info_usage); - - printf("\n"); - - if (strlen(gengetopt_args_info_description) > 0) - printf("%s\n\n", gengetopt_args_info_description); -} - -void -cmdline_parser_print_help (void) -{ - int i = 0; - print_help_common(); - while (gengetopt_args_info_help[i]) - printf("%s\n", gengetopt_args_info_help[i++]); -} - -void -cmdline_parser_init (struct gengetopt_args_info *args_info) -{ - clear_given (args_info); - clear_args (args_info); - init_args_info (args_info); -} - -void -cmdline_parser_params_init(struct cmdline_parser_params *params) -{ - if (params) - { - params->override = 0; - params->initialize = 1; - params->check_required = 1; - params->check_ambiguity = 0; - params->print_errors = 1; - } -} - -struct cmdline_parser_params * -cmdline_parser_params_create(void) -{ - struct cmdline_parser_params *params = - (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); - cmdline_parser_params_init(params); - return params; -} - -static void -free_string_field (char **s) -{ - if (*s) - { - free (*s); - *s = 0; - } -} - - -static void -cmdline_parser_release (struct gengetopt_args_info *args_info) -{ - - free_string_field (&(args_info->config_file_arg)); - free_string_field (&(args_info->config_file_orig)); - - - - clear_given (args_info); -} - - -static void -write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) -{ - FIX_UNUSED (values); - if (arg) { - fprintf(outfile, "%s=\"%s\"\n", opt, arg); - } else { - fprintf(outfile, "%s\n", opt); - } -} - -static void -write_multiple_into_file(FILE *outfile, int len, const char *opt, char **arg, const char *values[]) -{ - int i; - - for (i = 0; i < len; ++i) - write_into_file(outfile, opt, (arg ? arg[i] : 0), values); -} - -int -cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) -{ - int i = 0; - - if (!outfile) - { - fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); - return EXIT_FAILURE; - } - - if (args_info->help_given) - write_into_file(outfile, "help", 0, 0 ); - if (args_info->version_given) - write_into_file(outfile, "version", 0, 0 ); - if (args_info->ro_given) - write_into_file(outfile, "ro", 0, 0 ); - write_multiple_into_file(outfile, args_info->debug_given, "debug", 0, 0); - if (args_info->test_given) - write_into_file(outfile, "test", 0, 0 ); - if (args_info->config_file_given) - write_into_file(outfile, "config-file", args_info->config_file_orig, 0); - - - i = EXIT_SUCCESS; - return i; -} - -int -cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) -{ - FILE *outfile; - int i = 0; - - outfile = fopen(filename, "w"); - - if (!outfile) - { - fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); - return EXIT_FAILURE; - } - - i = cmdline_parser_dump(outfile, args_info); - fclose (outfile); - - return i; -} - -void -cmdline_parser_free (struct gengetopt_args_info *args_info) -{ - cmdline_parser_release (args_info); -} - -/** @brief replacement of strdup, which is not standard */ -char * -gengetopt_strdup (const char *s) -{ - char *result = 0; - if (!s) - return result; - - result = (char*)malloc(strlen(s) + 1); - if (result == (char*)0) - return (char*)0; - strcpy(result, s); - return result; -} - -static int -check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc); - -int -check_multiple_option_occurrences(const char *prog_name, unsigned int option_given, unsigned int min, unsigned int max, const char *option_desc) -{ - int error = 0; - - if (option_given && (min > 0 || max > 0)) - { - if (min > 0 && max > 0) - { - if (min == max) - { - /* specific occurrences */ - if (option_given != (unsigned int) min) - { - fprintf (stderr, "%s: %s option occurrences must be %d\n", - prog_name, option_desc, min); - error = 1; - } - } - else if (option_given < (unsigned int) min - || option_given > (unsigned int) max) - { - /* range occurrences */ - fprintf (stderr, "%s: %s option occurrences must be between %d and %d\n", - prog_name, option_desc, min, max); - error = 1; - } - } - else if (min > 0) - { - /* at least check */ - if (option_given < min) - { - fprintf (stderr, "%s: %s option occurrences must be at least %d\n", - prog_name, option_desc, min); - error = 1; - } - } - else if (max > 0) - { - /* at most check */ - if (option_given > max) - { - fprintf (stderr, "%s: %s option occurrences must be at most %d\n", - prog_name, option_desc, max); - error = 1; - } - } - } - - return error; -} -int -cmdline_parser (int argc, char **argv, struct gengetopt_args_info *args_info) -{ - return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); -} - -int -cmdline_parser_ext (int argc, char **argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params) -{ - int result; - result = cmdline_parser_internal (argc, argv, args_info, params, 0); - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - -int -cmdline_parser2 (int argc, char **argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) -{ - int result; - struct cmdline_parser_params params; - - params.override = override; - params.initialize = initialize; - params.check_required = check_required; - params.check_ambiguity = 0; - params.print_errors = 1; - - result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - -int -cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) -{ - int result = EXIT_SUCCESS; - - if (cmdline_parser_required2(args_info, prog_name, 0) > 0) - result = EXIT_FAILURE; - - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} - -int -cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) -{ - int error = 0; - FIX_UNUSED (additional_error); - - /* checks for required options */ - if (check_multiple_option_occurrences(prog_name, args_info->debug_given, args_info->debug_min, args_info->debug_max, "'--debug' ('-d')")) - error = 1; - - - /* checks for dependences among options */ - - return error; -} - - -static char *package_name = 0; - -/** - * @brief updates an option - * @param field the generic pointer to the field to update - * @param orig_field the pointer to the orig field - * @param field_given the pointer to the number of occurrence of this option - * @param prev_given the pointer to the number of occurrence already seen - * @param value the argument for this option (if null no arg was specified) - * @param possible_values the possible values for this option (if specified) - * @param default_value the default value (in case the option only accepts fixed values) - * @param arg_type the type of this option - * @param check_ambiguity @see cmdline_parser_params.check_ambiguity - * @param override @see cmdline_parser_params.override - * @param no_free whether to free a possible previous value - * @param multiple_option whether this is a multiple option - * @param long_opt the corresponding long option - * @param short_opt the corresponding short option (or '-' if none) - * @param additional_error possible further error specification - */ -static -int update_arg(void *field, char **orig_field, - unsigned int *field_given, unsigned int *prev_given, - char *value, const char *possible_values[], - const char *default_value, - cmdline_parser_arg_type arg_type, - int check_ambiguity, int override, - int no_free, int multiple_option, - const char *long_opt, char short_opt, - const char *additional_error) -{ - char *stop_char = 0; - const char *val = value; - int found; - char **string_field; - FIX_UNUSED (field); - - stop_char = 0; - found = 0; - - if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) - { - if (short_opt != '-') - fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", - package_name, long_opt, short_opt, - (additional_error ? additional_error : "")); - else - fprintf (stderr, "%s: `--%s' option given more than once%s\n", - package_name, long_opt, - (additional_error ? additional_error : "")); - return 1; /* failure */ - } - - FIX_UNUSED (default_value); - - if (field_given && *field_given && ! override) - return 0; - if (prev_given) - (*prev_given)++; - if (field_given) - (*field_given)++; - if (possible_values) - val = possible_values[found]; - - switch(arg_type) { - case ARG_STRING: - if (val) { - string_field = (char **)field; - if (!no_free && *string_field) - free (*string_field); /* free previous string */ - *string_field = gengetopt_strdup (val); - } - break; - default: - break; - }; - - - /* store the original value */ - switch(arg_type) { - case ARG_NO: - break; - default: - if (value && orig_field) { - if (no_free) { - *orig_field = value; - } else { - if (*orig_field) - free (*orig_field); /* free previous string */ - *orig_field = gengetopt_strdup (value); - } - } - }; - - return 0; /* OK */ -} - - -int -cmdline_parser_internal ( - int argc, char **argv, struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params, const char *additional_error) -{ - int c; /* Character of the parsed option. */ - - int error = 0; - struct gengetopt_args_info local_args_info; - - int override; - int initialize; - int check_required; - int check_ambiguity; - - package_name = argv[0]; - - override = params->override; - initialize = params->initialize; - check_required = params->check_required; - check_ambiguity = params->check_ambiguity; - - if (initialize) - cmdline_parser_init (args_info); - - cmdline_parser_init (&local_args_info); - - optarg = 0; - optind = 0; - opterr = params->print_errors; - optopt = '?'; - - while (1) - { - int option_index = 0; - - static struct option long_options[] = { - { "help", 0, NULL, 'h' }, - { "version", 0, NULL, 'V' }, - { "ro", 0, NULL, 'r' }, - { "debug", 0, NULL, 'd' }, - { "test", 0, NULL, 't' }, - { "config-file", 1, NULL, 'c' }, - { 0, 0, 0, 0 } - }; - - c = getopt_long (argc, argv, "hVrdtc:", long_options, &option_index); - - if (c == -1) break; /* Exit from `while (1)' loop. */ - - switch (c) - { - case 'h': /* Print help and exit. */ - cmdline_parser_print_help (); - cmdline_parser_free (&local_args_info); - exit (EXIT_SUCCESS); - - case 'V': /* Print version and exit. */ - cmdline_parser_print_version (); - cmdline_parser_free (&local_args_info); - exit (EXIT_SUCCESS); - - case 'r': /* Do not allow write operations, only read operations. */ - - - if (update_arg( 0 , - 0 , &(args_info->ro_given), - &(local_args_info.ro_given), optarg, 0, 0, ARG_NO, - check_ambiguity, override, 0, 0, - "ro", 'r', - additional_error)) - goto failure; - - break; - case 'd': /* Increase debug level (option can be given many times). */ - - local_args_info.debug_given++; - - break; - case 't': /* Test the configuration without running pgfuse. */ - - - if (update_arg( 0 , - 0 , &(args_info->test_given), - &(local_args_info.test_given), optarg, 0, 0, ARG_NO, - check_ambiguity, override, 0, 0, - "test", 't', - additional_error)) - goto failure; - - break; - case 'c': /* An optional configuration file to be read by pgfuse. */ - - - if (update_arg( (void *)&(args_info->config_file_arg), - &(args_info->config_file_orig), &(args_info->config_file_given), - &(local_args_info.config_file_given), optarg, 0, 0, ARG_STRING, - check_ambiguity, override, 0, 0, - "config-file", 'c', - additional_error)) - goto failure; - - break; - - case 0: /* Long option with no short option */ - case '?': /* Invalid option. */ - /* `getopt_long' already printed an error message. */ - goto failure; - - default: /* bug: option not considered. */ - fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); - abort (); - } /* switch */ - } /* while */ - - - - args_info->debug_given += local_args_info.debug_given; - local_args_info.debug_given = 0; - - if (check_required) - { - error += cmdline_parser_required2 (args_info, argv[0], additional_error); - } - - cmdline_parser_release (&local_args_info); - - if ( error ) - return (EXIT_FAILURE); - - return 0; - -failure: - - cmdline_parser_release (&local_args_info); - return (EXIT_FAILURE); -} - -#ifndef CONFIG_FILE_LINE_SIZE -#define CONFIG_FILE_LINE_SIZE 2048 -#endif -#define ADDITIONAL_ERROR " in configuration file " - -#define CONFIG_FILE_LINE_BUFFER_SIZE (CONFIG_FILE_LINE_SIZE+3) -/* 3 is for "--" and "=" */ - -static int -_cmdline_parser_configfile (const char *filename, int *my_argc) -{ - FILE* file; - char my_argv[CONFIG_FILE_LINE_BUFFER_SIZE+1]; - char linebuf[CONFIG_FILE_LINE_SIZE]; - int line_num = 0; - int result = 0, equal; - char *fopt, *farg; - char *str_index; - size_t len, next_token; - char delimiter; - - if ((file = fopen(filename, "r")) == 0) - { - fprintf (stderr, "%s: Error opening configuration file '%s'\n", - CMDLINE_PARSER_PACKAGE, filename); - return EXIT_FAILURE; - } - - while ((fgets(linebuf, CONFIG_FILE_LINE_SIZE, file)) != 0) - { - ++line_num; - my_argv[0] = '\0'; - len = strlen(linebuf); - if (len > (CONFIG_FILE_LINE_BUFFER_SIZE-1)) - { - fprintf (stderr, "%s:%s:%d: Line too long in configuration file\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - result = EXIT_FAILURE; - break; - } - - /* find first non-whitespace character in the line */ - next_token = strspn (linebuf, " \t\r\n"); - str_index = linebuf + next_token; - - if ( str_index[0] == '\0' || str_index[0] == '#') - continue; /* empty line or comment line is skipped */ - - fopt = str_index; - - /* truncate fopt at the end of the first non-valid character */ - next_token = strcspn (fopt, " \t\r\n="); - - if (fopt[next_token] == '\0') /* the line is over */ - { - farg = 0; - equal = 0; - goto noarg; - } - - /* remember if equal sign is present */ - equal = (fopt[next_token] == '='); - fopt[next_token++] = '\0'; - - /* advance pointers to the next token after the end of fopt */ - next_token += strspn (fopt + next_token, " \t\r\n"); - - /* check for the presence of equal sign, and if so, skip it */ - if ( !equal ) - if ((equal = (fopt[next_token] == '='))) - { - next_token++; - next_token += strspn (fopt + next_token, " \t\r\n"); - } - str_index += next_token; - - /* find argument */ - farg = str_index; - if ( farg[0] == '\"' || farg[0] == '\'' ) - { /* quoted argument */ - str_index = strchr (++farg, str_index[0] ); /* skip opening quote */ - if (! str_index) - { - fprintf - (stderr, - "%s:%s:%d: unterminated string in configuration file\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - result = EXIT_FAILURE; - break; - } - } - else - { /* read up the remaining part up to a delimiter */ - next_token = strcspn (farg, " \t\r\n#\'\""); - str_index += next_token; - } - - /* truncate farg at the delimiter and store it for further check */ - delimiter = *str_index, *str_index++ = '\0'; - - /* everything but comment is illegal at the end of line */ - if (delimiter != '\0' && delimiter != '#') - { - str_index += strspn(str_index, " \t\r\n"); - if (*str_index != '\0' && *str_index != '#') - { - fprintf - (stderr, - "%s:%s:%d: malformed string in configuration file\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - result = EXIT_FAILURE; - break; - } - } - - noarg: - if (!strcmp(fopt,"include")) { - if (farg && *farg) { - result = _cmdline_parser_configfile(farg, my_argc); - } else { - fprintf(stderr, "%s:%s:%d: include requires a filename argument.\n", - CMDLINE_PARSER_PACKAGE, filename, line_num); - } - continue; - } - len = strlen(fopt); - strcat (my_argv, len > 1 ? "--" : "-"); - strcat (my_argv, fopt); - if (len > 1 && ((farg && *farg) || equal)) - strcat (my_argv, "="); - if (farg && *farg) - strcat (my_argv, farg); - ++(*my_argc); - - cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list)); - cmd_line_list_tmp->next = cmd_line_list; - cmd_line_list = cmd_line_list_tmp; - cmd_line_list->string_arg = gengetopt_strdup(my_argv); - } /* while */ - - if (file) - fclose(file); - return result; -} - -int -cmdline_parser_configfile ( - const char *filename, - struct gengetopt_args_info *args_info, - int override, int initialize, int check_required) -{ - struct cmdline_parser_params params; - - params.override = override; - params.initialize = initialize; - params.check_required = check_required; - params.check_ambiguity = 0; - params.print_errors = 1; - - return cmdline_parser_config_file (filename, args_info, ¶ms); -} - -int -cmdline_parser_config_file (const char *filename, - struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params) -{ - int i, result; - int my_argc = 1; - char **my_argv_arg; - char *additional_error; - - /* store the program name */ - cmd_line_list_tmp = (struct line_list *) malloc (sizeof (struct line_list)); - cmd_line_list_tmp->next = cmd_line_list; - cmd_line_list = cmd_line_list_tmp; - cmd_line_list->string_arg = gengetopt_strdup (CMDLINE_PARSER_PACKAGE); - - result = _cmdline_parser_configfile(filename, &my_argc); - - if (result != EXIT_FAILURE) { - my_argv_arg = (char **) malloc((my_argc+1) * sizeof(char *)); - cmd_line_list_tmp = cmd_line_list; - - for (i = my_argc - 1; i >= 0; --i) { - my_argv_arg[i] = cmd_line_list_tmp->string_arg; - cmd_line_list_tmp = cmd_line_list_tmp->next; - } - - my_argv_arg[my_argc] = 0; - - additional_error = (char *)malloc(strlen(filename) + strlen(ADDITIONAL_ERROR) + 1); - strcpy (additional_error, ADDITIONAL_ERROR); - strcat (additional_error, filename); - result = - cmdline_parser_internal (my_argc, my_argv_arg, args_info, - params, - additional_error); - - free (additional_error); - free (my_argv_arg); - } - - free_cmd_list(); - if (result == EXIT_FAILURE) - { - cmdline_parser_free (args_info); - exit (EXIT_FAILURE); - } - - return result; -} diff --git a/pgfuse_cmdline.h b/pgfuse_cmdline.h deleted file mode 100644 index 4245031..0000000 --- a/pgfuse_cmdline.h +++ /dev/null @@ -1,208 +0,0 @@ -/** @file pgfuse_cmdline.h - * @brief The header file for the command line option parser - * generated by GNU Gengetopt version 2.22.5 - * http://www.gnu.org/software/gengetopt. - * DO NOT modify this file, since it can be overwritten - * @author GNU Gengetopt by Lorenzo Bettini */ - -#ifndef PGFUSE_CMDLINE_H -#define PGFUSE_CMDLINE_H - -/* If we use autoconf. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdio.h> /* for FILE */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifndef CMDLINE_PARSER_PACKAGE -/** @brief the program name (used for printing errors) */ -#define CMDLINE_PARSER_PACKAGE "pgfuse" -#endif - -#ifndef CMDLINE_PARSER_PACKAGE_NAME -/** @brief the complete program name (used for help and version) */ -#define CMDLINE_PARSER_PACKAGE_NAME "pgfuse" -#endif - -#ifndef CMDLINE_PARSER_VERSION -/** @brief the program version */ -#define CMDLINE_PARSER_VERSION "0.0.1" -#endif - -/** @brief Where the command line options are stored */ -struct gengetopt_args_info -{ - const char *help_help; /**< @brief Print help and exit help description. */ - const char *version_help; /**< @brief Print version and exit help description. */ - const char *ro_help; /**< @brief Do not allow write operations, only read operations help description. */ - unsigned int debug_min; /**< @brief Increase debug level (option can be given many times)'s minimum occurreces */ - unsigned int debug_max; /**< @brief Increase debug level (option can be given many times)'s maximum occurreces */ - const char *debug_help; /**< @brief Increase debug level (option can be given many times) help description. */ - const char *test_help; /**< @brief Test the configuration without running pgfuse help description. */ - char * config_file_arg; /**< @brief An optional configuration file to be read by pgfuse. */ - char * config_file_orig; /**< @brief An optional configuration file to be read by pgfuse original value given at command line. */ - const char *config_file_help; /**< @brief An optional configuration file to be read by pgfuse help description. */ - - unsigned int help_given ; /**< @brief Whether help was given. */ - unsigned int version_given ; /**< @brief Whether version was given. */ - unsigned int ro_given ; /**< @brief Whether ro was given. */ - unsigned int debug_given ; /**< @brief Whether debug was given. */ - unsigned int test_given ; /**< @brief Whether test was given. */ - unsigned int config_file_given ; /**< @brief Whether config-file was given. */ - -} ; - -/** @brief The additional parameters to pass to parser functions */ -struct cmdline_parser_params -{ - int override; /**< @brief whether to override possibly already present options (default 0) */ - int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ - int check_required; /**< @brief whether to check that all required options were provided (default 1) */ - int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ - int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ -} ; - -/** @brief the purpose string of the program */ -extern const char *gengetopt_args_info_purpose; -/** @brief the usage string of the program */ -extern const char *gengetopt_args_info_usage; -/** @brief all the lines making the help output */ -extern const char *gengetopt_args_info_help[]; - -/** - * The command line parser - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser (int argc, char **argv, - struct gengetopt_args_info *args_info); - -/** - * The command line parser (version with additional parameters - deprecated) - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @param override whether to override possibly already present options - * @param initialize whether to initialize the option structure my_args_info - * @param check_required whether to check that all required options were provided - * @return 0 if everything went fine, NON 0 if an error took place - * @deprecated use cmdline_parser_ext() instead - */ -int cmdline_parser2 (int argc, char **argv, - struct gengetopt_args_info *args_info, - int override, int initialize, int check_required); - -/** - * The command line parser (version with additional parameters) - * @param argc the number of command line options - * @param argv the command line options - * @param args_info the structure where option information will be stored - * @param params additional parameters for the parser - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_ext (int argc, char **argv, - struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params); - -/** - * Save the contents of the option struct into an already open FILE stream. - * @param outfile the stream where to dump options - * @param args_info the option struct to dump - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_dump(FILE *outfile, - struct gengetopt_args_info *args_info); - -/** - * Save the contents of the option struct into a (text) file. - * This file can be read by the config file parser (if generated by gengetopt) - * @param filename the file where to save - * @param args_info the option struct to save - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_file_save(const char *filename, - struct gengetopt_args_info *args_info); - -/** - * Print the help - */ -void cmdline_parser_print_help(void); -/** - * Print the version - */ -void cmdline_parser_print_version(void); - -/** - * Initializes all the fields a cmdline_parser_params structure - * to their default values - * @param params the structure to initialize - */ -void cmdline_parser_params_init(struct cmdline_parser_params *params); - -/** - * Allocates dynamically a cmdline_parser_params structure and initializes - * all its fields to their default values - * @return the created and initialized cmdline_parser_params structure - */ -struct cmdline_parser_params *cmdline_parser_params_create(void); - -/** - * Initializes the passed gengetopt_args_info structure's fields - * (also set default values for options that have a default) - * @param args_info the structure to initialize - */ -void cmdline_parser_init (struct gengetopt_args_info *args_info); -/** - * Deallocates the string fields of the gengetopt_args_info structure - * (but does not deallocate the structure itself) - * @param args_info the structure to deallocate - */ -void cmdline_parser_free (struct gengetopt_args_info *args_info); - -/** - * The config file parser (deprecated version) - * @param filename the name of the config file - * @param args_info the structure where option information will be stored - * @param override whether to override possibly already present options - * @param initialize whether to initialize the option structure my_args_info - * @param check_required whether to check that all required options were provided - * @return 0 if everything went fine, NON 0 if an error took place - * @deprecated use cmdline_parser_config_file() instead - */ -int cmdline_parser_configfile (const char *filename, - struct gengetopt_args_info *args_info, - int override, int initialize, int check_required); - -/** - * The config file parser - * @param filename the name of the config file - * @param args_info the structure where option information will be stored - * @param params additional parameters for the parser - * @return 0 if everything went fine, NON 0 if an error took place - */ -int cmdline_parser_config_file (const char *filename, - struct gengetopt_args_info *args_info, - struct cmdline_parser_params *params); - -/** - * Checks that all the required options were specified - * @param args_info the structure to check - * @param prog_name the name of the program that will be used to print - * possible errors - * @return - */ -int cmdline_parser_required (struct gengetopt_args_info *args_info, - const char *prog_name); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* PGFUSE_CMDLINE_H */ |