/* $Id: cvtbatch.c 6135 2003-01-19 01:15:40Z rra $ ** ** Read file list on standard input and spew out batchfiles. */ #include "config.h" #include "clibrary.h" #include "inn/innconf.h" #include "inn/messages.h" #include "inn/qio.h" #include "inn/wire.h" #include "libinn.h" #include "paths.h" #include "storage.h" int main(int ac, char *av[]) { int i; QIOSTATE *qp; char *line; const char *text; char *format; char *p, *q; const char *r; bool Dirty; TOKEN token; ARTHANDLE *art; int len; /* First thing, set up our identity. */ message_program_name = "cvtbatch"; if (!innconf_read(NULL)) exit(1); /* Parse JCL. */ format = xstrdup("nm"); while ((i = getopt(ac, av, "w:")) != EOF) switch (i) { default: die("usage error"); break; case 'w': for (p = format = optarg; *p; p++) { switch (*p) { case FEED_BYTESIZE: case FEED_FULLNAME: case FEED_MESSAGEID: case FEED_NAME: continue; } warn("ignoring %c in -w flag", *p); } } ac -= optind; av += optind; if (ac) die("usage error"); if (!SMinit()) die("cannot initialize storage manager: %s", SMerrorstr); /* Loop over all input. */ qp = QIOfdopen((int)fileno(stdin)); while ((line = QIOread(qp)) != NULL) { for (p = line; *p; p++) if (ISWHITE(*p)) { *p = '\0'; break; } if (!IsToken(line)) continue; token = TextToToken(line); if ((art = SMretrieve(token, RETR_HEAD)) == NULL) continue; text = wire_findheader(art->data, art->len, "Message-ID"); if (text == NULL) { SMfreearticle(art); continue; } len = art->len; for (r = text; r < art->data + art->len; r++) { if (*r == '\r' || *r == '\n') break; } if (r == art->data + art->len) { SMfreearticle(art); continue; } q = xmalloc(r - text + 1); memcpy(q, text, r - text); SMfreearticle(art); q[r - text] = '\0'; /* Write the desired info. */ for (Dirty = false, p = format; *p; p++) { switch (*p) { default: continue; case FEED_BYTESIZE: if (Dirty) putchar(' '); printf("%d", len); break; case FEED_FULLNAME: case FEED_NAME: if (Dirty) putchar(' '); printf("%s", line); break; case FEED_MESSAGEID: if (Dirty) putchar(' '); printf("%s", q); break; } Dirty = true; } free(q); if (Dirty) putchar('\n'); } exit(0); /* NOTREACHED */ }