/* :ts=4
 * histinfo - print history file lines for articles named on stdin
 *
 *	$Log:	histinfo.c,v $
 * Revision 1.4  90/12/25  15:52:46  crash
 * as of 12-15-90 patches
 * 
 * Revision 1.3  90/05/30  23:44:27  crash
 * updated to CNews patchlevel 25May90
 * 
 */

#ifndef lint
static char RCSid[] =
	"$Id: histinfo.c,v 1.4 90/12/25 15:52:46 crash Exp Locker: crash $";
#endif /* lint */

#include <stdio.h>
#ifdef unix
# include <sys/types.h>
# include <sys/stat.h>		/* for modified time (date received) */
#else
# ifdef AMIGA
#  include <time.h>
#  include <stat.h>
struct stat statb;
# endif /* AMIGA */
#endif /* unix */
#include <string.h>
#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();
void process(FILE *in, char *inname);
void unprivileged(char *reason);

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;
	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);
		return(2);
	}
	spdir = artfile((char *)NULL);
	spdirlen = strlen(spdir);
	
	while ((inname = fgetms(stdin)) != NULL) {
		register char *artname = inname;

		artname[strlen(artname)-1] = '\0';	/* kill newline */
		if (strchr(artname, '.') == NULL) {	/* skip dot names */
			if ( !(in = fopen(artname, "r")) ) {
				artname = artfile(inname);
				in = efopen(artname, "r");
			}
#ifdef AMIGA
			(void) stat(artname, &statb);
#endif
			process(in, inname);
			(void) fclose(in);
		}
		free(inname);
	}
	return(0);
}

/*
 * process - process input file
 */
void 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: ";

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

	/* read until EOF or blank line (end of headers) */
	while ((line = fgetms(in)) != NULL && strcmp(line, "\n") != 0) {
		line[strlen(line)-1] = '\0';		/* trim newline */
		if (CISTREQN(line, msgidnm, STRLEN(msgidnm))) {
			if (msgid != NULL)
				free(msgid);
			msgid = strsave(line+STRLEN(msgidnm));
		} else if (CISTREQN(line, expnm, STRLEN(expnm))) {
			free(expiry);
			expiry = strsave(line+STRLEN(expnm));
		}
		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 */
#ifndef AMIGA
	(void) fstat(fileno(in), &statb);
#endif
	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;
{
}
