Something like this for the program itself:

Index: signify.c
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.bin/signify/signify.c,v
retrieving revision 1.5
diff -u -p -r1.5 signify.c
--- signify.c   31 Dec 2013 17:33:17 -0000      1.5
+++ signify.c   1 Jan 2014 15:50:11 -0000
@@ -64,8 +64,8 @@ extern char *__progname;
 static void
 usage(void)
 {
-       fprintf(stderr, "usage: %s [-N] [-I input] [-O output] [-P pubkey] [-S 
seckey] "
-           "-V generate | sign | verify\n", __progname);
+       fprintf(stderr, "usage: %s -G | -S | -V [-n] [-o output] "
+           "[-p pubkey] [-s seckey] [file...]\n", __progname);
        exit(1);
 }
 
@@ -316,64 +316,91 @@ verify(const char *pubkeyfile, const cha
 int
 main(int argc, char **argv)
 {
-       const char *verb = NULL;
-       const char *pubkeyfile = NULL, *seckeyfile = NULL, *inputfile = NULL,
-           *sigfile = NULL;
-       char sigfilebuf[1024];
-       int ch, rounds;
+       const char *pubkeyfile = NULL, *seckeyfile = NULL, 
+           *sigfilefmt = "%s.sig";
+       int ch, rounds, needfmt, i;
+       enum {
+               NONE,
+               GENERATE,
+               SIGN,
+               VERIFY
+       } verb = NONE;
+
 
        rounds = 42;
 
-       while ((ch = getopt(argc, argv, "I:NO:P:S:V:")) != -1) {
+       while ((ch = getopt(argc, argv, "GSVi:no:p:s:")) != -1) {
                switch (ch) {
-               case 'I':
-                       inputfile = optarg;
+               case 'G':
+                       if (verb)
+                               usage();
+                       verb = GENERATE;
+                       break;
+               case 'S':
+                       if (verb)
+                               usage();
+                       verb = SIGN;
+                       break;
+               case 'V':
+                       if (verb)
+                               usage();
+                       verb = VERIFY;
                        break;
-               case 'N':
+               case 'n':
                        rounds = 0;
                        break;
-               case 'O':
-                       sigfile = optarg;
+               case 'o':
+                       sigfilefmt = optarg;
                        break;
-               case 'P':
+               case 'p':
                        pubkeyfile = optarg;
                        break;
-               case 'S':
+               case 's':
                        seckeyfile = optarg;
                        break;
-               case 'V':
-                       verb = optarg;
-                       break;
                default:
                        usage();
                        break;
                }
        }
        argc -= optind;
-       if (argc != 0 || verb == NULL)
-               usage();
-
-       if (inputfile && !sigfile) {
-               if (snprintf(sigfilebuf, sizeof(sigfilebuf), "%s.sig",
-                   inputfile) >= sizeof(sigfilebuf))
-                       errx(1, "path too long");
-               sigfile = sigfilebuf;
-       }
 
-       if (streq(verb, "generate")) {
-               if (!pubkeyfile || !seckeyfile)
+       if (verb == GENERATE) {
+               if (argc != 0 || !pubkeyfile || !seckeyfile)
                        usage();
                generate(pubkeyfile, seckeyfile, rounds);
-       } else if (streq(verb, "sign")) {
-               if (!seckeyfile || !inputfile)
-                       usage();
-               sign(seckeyfile, inputfile, sigfile);
-       } else if (streq(verb, "verify")) {
-               if (!pubkeyfile || !inputfile)
-                       usage();
-               verify(pubkeyfile, inputfile, sigfile);
-       } else {
+       } else if (verb == NONE || argc == 0) {
                usage();
+       }
+
+       needfmt = strstr(sigfilefmt, "%s") != NULL;
+
+       if (!needfmt && argc != 1) {
+               errx(1, "-o file for several inputs");
+       }
+
+       for (i = 0; i != argc; i++) {
+               char sigfilebuf[1024];
+               const char *inputfile = argv[i];
+               const char *sigfile = NULL;
+
+               if (needfmt) {
+                       if (snprintf(sigfilebuf, sizeof(sigfilebuf),
+                           sigfilefmt, inputfile) >= sizeof(sigfilebuf))
+                               errx(1, "path too long");
+                       sigfile = sigfilebuf;
+               } else {
+                       sigfile = sigfilefmt;
+               }
+               if (verb == SIGN) {
+                       if (!seckeyfile)
+                               usage();
+                       sign(seckeyfile, inputfile, sigfile);
+               } else if (verb == VERIFY) {
+                       if (!pubkeyfile || !inputfile)
+                               usage();
+                       verify(pubkeyfile, inputfile, sigfile);
+               }
        }
        return 0;
 }

Reply via email to