summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL8
-rw-r--r--Makefile15
-rw-r--r--pgfuse.c202
-rw-r--r--pgfuse.ggo23
-rw-r--r--pgfuse_cmdline.c880
-rw-r--r--pgfuse_cmdline.h208
6 files changed, 149 insertions, 1187 deletions
diff --git a/INSTALL b/INSTALL
index 450c9f8..0f3cc4b 100644
--- a/INSTALL
+++ b/INSTALL
@@ -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
diff --git a/Makefile b/Makefile
index 3a75684..ecd4c87 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/pgfuse.c b/pgfuse.c
index 07d5a97..aa7437f 100644
--- a/pgfuse.c
+++ b/pgfuse.c
@@ -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( &params );
- params.override = 1;
- params.initialize = 0;
- params.check_required = 1;
-
- cmdline_parser_init( args_info );
-
- if( cmdline_parser_ext( argc, argv, args_info, &params ) != 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( &params );
- params.override = 0;
- params.initialize = 0;
- params.check_required = 1;
-
- if( cmdline_parser_config_file( config_filename, args_info, &params ) != 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, &params, 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, &params);
-}
-
-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 */