/* -*-c-*-
*
- * $Id: dsig.c,v 1.12 2004/04/17 09:58:37 mdw Exp $
+ * $Id$
*
* Verify signatures on distribuitions of files
*
case T_DATE:
case T_EXPIRE:
DENSURE(d, 8);
- STORE32(d->buf + d->len, ((b->t & ~MASK32) >> 16) >> 16);
- STORE32(d->buf + d->len + 4, b->t);
+ if (b->t == KEXP_FOREVER) {
+ STORE32(d->buf + d->len, 0xffffffff);
+ STORE32(d->buf + d->len + 4, 0xffffffff);
+ } else {
+ STORE32(d->buf + d->len, ((b->t & ~MASK32) >> 16) >> 16);
+ STORE32(d->buf + d->len + 4, b->t);
+ }
d->len += 8;
break;
case T_KEYID:
}
}
if (optind != argc || (f & f_bogus))
- die(EXIT_FAILURE, "Usage: sign [-options]");
+ die(EXIT_FAILURE, "Usage: sign [-OPTIONS]");
/* --- Locate the signing key --- */
argc -= optind;
argv += optind;
if ((f & f_bogus) || argc > 1)
- die(EXIT_FAILURE, "Usage: verify [-qv] [file]");
+ die(EXIT_FAILURE, "Usage: verify [-qv] [FILE]");
/* --- Open the key file, and start reading the input file --- */
break;
case T_EXPIRE: {
time_t now = time(0);
- if (b.t < now) {
+ if (b.t != KEXP_FOREVER && b.t < now) {
if (verb > 1)
puts("BAD signature has expired");
f |= f_bogus;
/*----- Main code ---------------------------------------------------------*/
-typedef struct cmd {
- const char *name;
- int (*func)(int /*argc*/, char */*argv*/[]);
- const char *usage;
- const char *help;
-} cmd;
+#define LISTS(LI) \
+ LI("Lists", list, \
+ listtab[i].name, listtab[i].name) \
+ LI("Signature schemes", sig, \
+ sigtab[i].name, sigtab[i].name) \
+ LI("Hash functions", hash, \
+ ghashtab[i], ghashtab[i]->name)
+
+MAKELISTTAB(listtab, LISTS)
+
+int cmd_show(int argc, char *argv[])
+{
+ return (displaylists(listtab, argv + 1));
+}
+
+static int cmd_help(int, char **);
static cmd cmdtab[] = {
+ { "help", cmd_help, "help [COMMAND...]" },
+ { "show", cmd_show, "show [ITEM...]" },
{ "sign", sign,
- "sign [-0bqv] [-c comment] [-k tag] [-e expire] [-f file] [-o output]",
+ "sign [-0bqv] [-c COMMENT] [-k TAG] [-e EXPIRE]\n\t\
+[-f FILE] [-o OUTPUT]",
"\
Options:\n\
\n\
-e, --expire=TIME The signature should expire after TIME.\n\
" },
{ "verify", verify,
- "verify [-qv] [file]", "\
+ "verify [-qv] [FILE]", "\
Options:\n\
\n\
-q, --quiet Produce fewer messages while working.\n\
{ 0, 0, 0 }
};
-/* --- @findcmd@ --- *
- *
- * Arguments: @const char *name@ = a command name
- *
- * Returns: Pointer to the command structure.
- *
- * Use: Looks up a command by name. If the command isn't found, an
- * error is reported and the program is terminated.
- */
-
-static cmd *findcmd(const char *name)
+static int cmd_help(int argc, char **argv)
{
- cmd *c, *chosen = 0;
- size_t sz = strlen(name);
-
- for (c = cmdtab; c->name; c++) {
- if (strncmp(name, c->name, sz) == 0) {
- if (c->name[sz] == 0) {
- chosen = c;
- break;
- } else if (chosen)
- die(EXIT_FAILURE, "ambiguous command name `%s'", name);
- else
- chosen = c;
- }
- }
- if (!chosen)
- die(EXIT_FAILURE, "unknown command name `%s'", name);
- return (chosen);
+ sc_help(cmdtab, stdout, argv + 1);
+ return (0);
}
-static void version(FILE *fp)
+void version(FILE *fp)
{
pquis(fp, "$, Catacomb version " VERSION "\n");
}
static void usage(FILE *fp)
{
- pquis(fp, "Usage: $ [-k keyring] command [args]\n");
+ pquis(fp, "Usage: $ [-k KEYRING] COMMAND [ARGS]\n");
}
-static void help(FILE *fp, char **argv)
+void help_global(FILE *fp)
{
- cmd *c;
-
- if (*argv) {
- c = findcmd(*argv);
- fprintf(fp, "Usage: %s [-k keyring] %s\n", QUIS, c->usage);
- if (c->help) {
- fputc('\n', fp);
- fputs(c->help, fp);
- }
- } else {
- version(fp);
- fputc('\n', fp);
- usage(fp);
- fputs("\n\
+ usage(fp);
+ fputs("\n\
Create and verify signatures on lists of files.\n\
-\n", fp);
- for (c = cmdtab; c->name; c++)
- fprintf(fp, "%s\n", c->usage);
- }
+\n\
+Global command-line options:\n\
+\n\
+-h, --help [COMMAND...] Show this help message, or help for COMMANDs.\n\
+-v, --version Show program version number.\n\
+-u, --usage Show a terse usage message.\n\
+\n\
+-k, --keyring=FILE Read keys from FILE.\n",
+ fp);
}
/* --- @main@ --- *
break;
switch (i) {
case 'h':
- help(stdout, argv + optind);
+ sc_help(cmdtab, stdout, argv + optind);
exit(0);
break;
case 'v':
/* --- Dispatch to the correct subcommand handler --- */
- return (findcmd(argv[0])->func(argc, argv));
+ return (findcmd(cmdtab, argv[0])->cmd(argc, argv));
#undef f_bogus
}