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;
}