diff options
Diffstat (limited to 'ubi-utils/src')
-rw-r--r-- | ubi-utils/src/ubimirror.c | 123 |
1 files changed, 63 insertions, 60 deletions
diff --git a/ubi-utils/src/ubimirror.c b/ubi-utils/src/ubimirror.c index e43ba10..1b1d0be 100644 --- a/ubi-utils/src/ubimirror.c +++ b/ubi-utils/src/ubimirror.c @@ -23,7 +23,6 @@ #include <stdlib.h> #include <string.h> #include <getopt.h> -#include <argp.h> #include <unistd.h> #include <errno.h> #include <mtd/ubi-header.h> @@ -40,39 +39,44 @@ typedef enum action_t { } action_t; #define ABORT_ARGP do { \ - state->next = state->argc; \ args->action = ACT_ARGP_ABORT; \ } while (0) #define ERR_ARGP do { \ - state->next = state->argc; \ args->action = ACT_ARGP_ERR; \ } while (0) #define VOL_ARGS_MAX 2 +extern char *optarg; +extern int optind; -const char *argp_program_version = PACKAGE_VERSION; -const char *argp_program_bug_address = PACKAGE_BUGREPORT; static char doc[] = "\nVersion: " PACKAGE_VERSION "\n\tBuilt on " BUILD_CPU" "BUILD_OS" at "__DATE__" "__TIME__"\n" "\n" "ubimirror - mirrors ubi volumes.\n"; -static const char copyright [] __attribute__((unused)) = - "(C) IBM Coorporation 2007"; +static const char *optionsstr = +" -c, --copyright Print copyright information.\n" +" -s, --side=<seqnum> Use the side <seqnum> as source.\n" +" -?, --help Give this help list\n" +" --usage Give a short usage message\n" +" -V, --version Print program version\n"; +static const char *usage = +"Usage: ubimirror [-c?V] [-s <seqnum>] [--copyright] [--side=<seqnum>]\n" +" [--help] [--usage] [--version] <source> <destination>\n"; -static struct argp_option options[] = { - { name: "copyright", key: 'c', arg: NULL, flags: 0, - doc: "Print copyright information.", - group: 1 }, - - { name: "side", key: 's', arg: "<seqnum>", flags: 0, - doc: "Use the side <seqnum> as source.", - group: 1 }, +static const char copyright [] __attribute__((unused)) = + "(C) IBM Coorporation 2007"; - { name: NULL, key: 0, arg: NULL, flags: 0, doc: NULL, group: 0 }, +struct option long_options[] = { + { .name = "copyright", .has_arg = 0, .flag = NULL, .val = 'c' }, + { .name = "side", .has_arg = 1, .flag = NULL, .val = 's' }, + { .name = "help", .has_arg = 0, .flag = NULL, .val = '?' }, + { .name = "usage", .has_arg = 0, .flag = NULL, .val = 0 }, + { .name = "version", .has_arg = 0, .flag = NULL, .val = 'V' }, + { NULL, 0, NULL, 0} }; typedef struct myargs { @@ -99,59 +103,58 @@ get_update_side(const char* str) } -static error_t -parse_opt(int key, char *arg, struct argp_state *state) +static int +parse_opt(int argc, char **argv, myargs *args) { - int err = 0; - - myargs *args = state->input; - - switch (key) { - case 'c': - err_msg("%s\n", copyright); - ABORT_ARGP; - break; - case 's': - args->side = get_update_side(arg); - if (args->side < 0) { - err_msg("Unsupported seqnum: %s.\n" - "Supported seqnums are '0' and '1'\n", arg); - ERR_ARGP; - } - break; - case ARGP_KEY_ARG: + while (1) { + int key; + + key = getopt_long(argc, argv, "cs:?V", long_options, NULL); + if (key == -1) + break; + + switch (key) { + case 'c': + err_msg("%s", copyright); + ABORT_ARGP; + break; + case 's': + args->side = get_update_side(optarg); + if (args->side < 0) { + err_msg("Unsupported seqnum: %s.\n" + "Supported seqnums are '0' and '1'\n", optarg); + ERR_ARGP; + } + break; + case '?': /* help */ + err_msg("Usage: ubimirror [OPTION...] <source> <destination>\n"); + err_msg("%s", doc); + err_msg("%s", optionsstr); + err_msg("\nReport bugs to %s\n", PACKAGE_BUGREPORT); + exit(0); + break; + case 'V': + err_msg("%s", PACKAGE_VERSION); + exit(0); + break; + default: + err_msg("%s", usage); + exit(-1); + } + } + + while (optind < argc) { /* only two entries allowed */ if (args->vol_no >= VOL_ARGS_MAX) { - err_msg("\n"); - argp_usage(state); + err_msg("%s", usage); ERR_ARGP; } - args->vol[(args->vol_no)++] = arg; - break; - case ARGP_KEY_END: - if (err) { - err_msg("\n"); - argp_usage(state); - ERR_ARGP; - } - break; - default: - return(ARGP_ERR_UNKNOWN); + args->vol[(args->vol_no)++] = argv[optind++]; } return 0; } -static struct argp argp = { - options: options, - parser: parse_opt, - args_doc: "<source> <destination>", - doc: doc, - children: NULL, - help_filter: NULL, - argp_domain: NULL, -}; - int main(int argc, char **argv) { @@ -167,7 +170,7 @@ main(int argc, char **argv) { .options = NULL, }; - argp_parse(&argp, argc, argv, ARGP_IN_ORDER, 0, &args); + parse_opt(argc, argv, &args); if (args.action == ACT_ARGP_ERR) { rc = 127; goto err; |