diff options
Diffstat (limited to 'argp/bug-argp2.c')
-rw-r--r-- | argp/bug-argp2.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/argp/bug-argp2.c b/argp/bug-argp2.c new file mode 100644 index 0000000000..133e5cf6e8 --- /dev/null +++ b/argp/bug-argp2.c @@ -0,0 +1,55 @@ +#include <argp.h> +#include <stdio.h> +#include <stdlib.h> + +static struct argp_option argp_options[] = { + { "dstaddr", 'd', "ADDR", 0, + "set destination (peer) address to ADDR" }, + { "peer", 'p', "ADDR", OPTION_ALIAS }, + { NULL } +}; + +static error_t parse_opt (int key, char *arg, struct argp_state *state); + +static struct argp argp = +{ + argp_options, parse_opt +}; + +static int cnt; + +static int +do_test (int argc, char *argv[]) +{ + int remaining; + argp_parse (&argp, argc, argv, 0, &remaining, NULL); + return cnt != 4; +} + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case 'd': + case 'p': + printf ("got '%c' with argument '%s'\n", key, arg); + ++cnt; + break; + case 0: + case ARGP_KEY_END: + case ARGP_KEY_NO_ARGS: + case ARGP_KEY_INIT: + case ARGP_KEY_SUCCESS: + case ARGP_KEY_FINI: + // Ignore. + return ARGP_ERR_UNKNOWN; + default: + printf ("invalid key '%x'\n", key); + exit (1); + } + return 0; +} + +#define TEST_FUNCTION do_test (argc, argv) +#include "../test-skeleton.c" |