/* * explode - read relaynews master batch file & write all the real batch files. * for UUNET, the C version needs to fnlock all descriptors */ /* BEGIN { path = "error"; size = "error"; msgid = "error" } /^($|#)/ { next } # comment NF == 3 && /^>$2; next } # B format NF == 2 && /^f/ { print path, size >>$2; next } # C format NF == 2 && /^n/ { print path, msgid >>$2; next } # NNTP format NF == 2 && /^I/ { print msgid >>$2; next } # ihave/sendme format { print "bad input on line", NR, ": " $0 | "cat >&2" } */ #include #include #include #include #include "libc.h" #include "news.h" #include "fgetmfs.h" #include "trbatch.h" /* imports */ extern int optind; extern char *optarg; extern FILE *efopen(); /* exports */ char *progname = ""; int debug; /* * main - parse arguments and handle options */ main(argc, argv) int argc; char *argv[]; { int c, errflg = 0; if (argc > 0) progname = argv[0]; while ((c = getopt(argc, argv, "d")) != EOF) switch (c) { case 'd': ++debug; break; default: errflg++; break; } if (errflg) { (void) fprintf(stderr, "usage: %s [-d] [file]...\n", progname); exit(2); } morefds(); if (optind >= argc) process(stdin, "stdin"); else for (; optind < argc; optind++) if (STREQ(argv[optind], "-")) process(stdin, "-"); else { FILE *in = efopen(argv[optind], "r"); process(in, argv[optind]); (void) fclose(in); } (void) bfrealclose(); /* paranoia */ exit(0); } /* * process - process input file */ process(in, inname) FILE *in; char *inname; { register char *line, *name; register struct batchfile *bf; register long lsize = 0; char *fields[3]; char *msgid = NULL, *path = NULL, *size = NULL; #ifdef UUNET if (!fnlockfile(in)) error("can't lock %s", inname); #endif while ((line = fgetms(in)) != NULL) { switch (*line) { case '#': case '\n': break; /* ignore comments */ case '<': /* new article */ trim(line); if (split(line, fields, 3, "") != 3) { errno = 0; warning("malformed article line: %s", line); } else { msgid = strsave(fields[0]); path = strsave(fields[1]); size = strsave(fields[2]); lsize = atol(size); } if (debug) (void) fprintf(stderr, "%s: new article %s %s %s\n", progname, msgid, path, size); break; case 'F': case 'f': case 'n': case 'I': trim(line); if (msgid == NULL) { errno = 0; warning( "batch file line before article line: %s", line); } else { for (name = line+1; isascii(*name) && isspace(*name); name++) ; bf = bfopen(name); if (!bfappend(bf, *line, name, path, msgid, lsize)) error("error writing %s", name); } break; default: errno = 0; warning("bad input line: %s", line); break; } free(line); } }