/* * histinfo - print history file lines for articles named on stdin */ #include #include #include /* for modified time (date received) */ #include #include "config.h" #include "fgetmfs.h" #include "alloc.h" #include "case.h" #define STRLEN(s) (sizeof(s) - 1) /* s must be a char array */ char *progname; int debug; FILE *efopen(); char *spdir; int spdirlen; /* * main - parse arguments and handle options */ main(argc, argv) int argc; char *argv[]; { int c; int errflg = 0; FILE *in; char *inname; register int i; extern int optind; extern char *optarg; progname = argv[0]; while ((c = getopt(argc, argv, "d")) != EOF) switch (c) { case 'd': ++debug; break; default: errflg++; break; } if (optind < argc || errflg) { (void) fprintf(stderr, "usage: %s [-d]\n", progname); exit(2); } spdir = artfile((char *)NULL); spdirlen = strlen(spdir); while ((inname = fgetms(stdin)) != NULL) { i = strlen(inname); if (i > 0) inname[i-1] = '\0'; /* kill newline */ if (strchr(inname, '.') == NULL) { /* skip dot names */ in = efopen(inname, "r"); process(in, inname); (void) fclose(in); } free(inname); } exit(0); } /* * process - process input file */ process(in, inname) FILE *in; char *inname; { char *name; char *line; char *msgid; char *expiry; time_t datercv; struct stat statb; static char msgidnm[] = "Message-ID:"; static char expnm[] = "Expires:"; register char *p; register int i; expiry = strsave("-"); msgid = NULL; /* read until EOF or blank line (end of headers) */ while ((line = fgetms(in)) != NULL && strcmp(line, "\n") != 0) { i = strlen(line); if (i > 0) line[i-1] = '\0'; /* trim newline */ if (CISTREQN(line, msgidnm, STRLEN(msgidnm))) { if (msgid != NULL) free(msgid); p = line + STRLEN(msgidnm); msgid = strsave(p + strspn(p, " \t")); } else if (CISTREQN(line, expnm, STRLEN(expnm))) { free(expiry); p = line + STRLEN(expnm); expiry = strsave(p + strspn(p, " \t")); } free(line); } if (line != NULL) free(line); /* generate the file name */ name = inname; if (strncmp(name, spdir, spdirlen) == 0 && name[spdirlen] == '/') name += spdirlen + 1; /* skip spool dir. & slash */ /* generate the date received */ (void) fstat(fileno(in), &statb); datercv = statb.st_mtime; /* deal with empty and trash articles */ if (msgid == NULL || strchr(msgid, '\t') != NULL || msgid[0] != '<' || msgid[strlen(msgid)-1] != '>' || strchr(expiry, '\t') != NULL || strchr(expiry, '~') != NULL) { if (msgid != NULL) free(msgid); msgid = str3save("<", name, "@trash>"); datercv = 0; free(expiry); expiry = strsave("0"); } /* whomp out the history line */ (void) fputs(msgid, stdout); printf("\t%ld~", (long)datercv); (void) fputs(expiry, stdout); (void) putchar('\t'); (void) fputs(name, stdout); (void) putchar('\n'); (void) fflush(stdout); free(msgid); free(expiry); } /* * unprivileged - no-op to keep pathname stuff happy */ void unprivileged(reason) char *reason; { }