Provide an option type that allows for a callback function to consume an
authorjsing <jsing@openbsd.org>
Sun, 28 Dec 2014 16:22:37 +0000 (16:22 +0000)
committerjsing <jsing@openbsd.org>
Sun, 28 Dec 2014 16:22:37 +0000 (16:22 +0000)
arbitrary number of arguments. This will allow for more complex option
handling as required by some of the openssl(1) applications.

usr.bin/openssl/apps.c
usr.bin/openssl/apps.h

index 4640519..1155278 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: apps.c,v 1.19 2014/12/28 16:10:33 jsing Exp $ */
+/* $OpenBSD: apps.c,v 1.20 2014/12/28 16:22:37 jsing Exp $ */
 /*
  * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
  *
@@ -2249,9 +2249,9 @@ options_parse(int argc, char **argv, struct option *opts, char **unnamed,
        struct option *opt;
        long long val;
        char *arg, *p;
+       int fmt, used;
        int ord = 0;
        int i, j;
-       int fmt;
 
        if (unnamed != NULL)
                *unnamed = NULL;
@@ -2286,6 +2286,7 @@ options_parse(int argc, char **argv, struct option *opts, char **unnamed,
                        goto unknown;
                }
 
+               /* See if there is a matching option... */
                for (j = 0; opts[j].name != NULL; j++) {
                        opt = &opts[j];
                        if (strcmp(p, opt->name) == 0)
@@ -2310,6 +2311,12 @@ options_parse(int argc, char **argv, struct option *opts, char **unnamed,
                        *opt->opt.arg = argv[i];
                        break;
 
+               case OPTION_ARGV_FUNC:
+                       if (opt->opt.argvfunc(argc - i, &argv[i], &used) != 0)
+                               return (1);
+                       i += used - 1;
+                       break;
+
                case OPTION_ARG_FORMAT:
                        fmt = str2fmt(argv[i]);
                        if (fmt == FORMAT_UNDEF) {
index c448e85..f057148 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: apps.h,v 1.11 2014/12/28 15:48:52 jsing Exp $ */
+/* $OpenBSD: apps.h,v 1.12 2014/12/28 16:22:37 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -286,6 +286,7 @@ struct option {
        const char *desc;
        enum {
                OPTION_ARG,
+               OPTION_ARGV_FUNC,
                OPTION_ARG_FORMAT,
                OPTION_ARG_FUNC,
                OPTION_ARG_INT,
@@ -297,6 +298,7 @@ struct option {
        union {
                char **arg;
                int (*argfunc)(char *arg);
+               int (*argvfunc)(int argc, char **argv, int *argsused);
                int *flag;
                int (*func)(void);
                int *value;