/*
 * histinfo - print history file lines for articles named on stdin
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>		/* for modified time (date received) */
#include <string.h>
#include <errno.h>
#include "fixerrno.h"
#include "config.h"
#include "fgetfln.h"
#include "alloc.h"
#include "case.h"

#define STRLEN(s) (sizeof(s) - 1)	/* s must be a char array */

char *progname;
int debug;


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 = fgetline(stdin, (size_t *)NULL)) != NULL)
		if (strchr(inname, '.') == NULL) {	/* skip dot names */
			errno = 0;
			in = fopen(inname, "r");
			if (in == NULL && errno != ENOENT)
				error("cannot open file `%s'", inname);
			if (in != NULL) {
				process(in, inname);
				(void) fclose(in);
			}
		}
	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 char *lastp;
	register int i;

	expiry = strsave("-");
	msgid = NULL;

	/* read until EOF or blank line (end of headers) */
	while ((line = fgetline(in, (size_t *)NULL)) != NULL && line[0] != '\0')
		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"));
		}

	/* generate the "filename" */
	name = inname;
	lastp = NULL;
	for (p = name; *p != '\0'; p++)
		if (*p == '/') {
			*p = '.';
			lastp = p;
		}
	if (lastp != NULL)
		*lastp = '/';

	/* 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;
{
}


syntax highlighted by Code2HTML, v. 0.9.1