[comp.sources.misc] grabheaders - update to news/misc submission

paul@nessus.UUCP (/dev/null) (06/25/87)

The following program was originally distributed with news2.11 in the
misc directory.  I have updated it so that it will work with USG machines
and also the new history file format.  I have also added some comments
to the start of the program so that one doesn't have to have ESP to make
it run.

Why is this program useful?

It is often nice to be able to get all of the message headers from news
so that one can produce nice statistics (i.e. Rick Adams' usenet activity
reports).  This program will dump all of the headers it can get to stdout.

It has only been tested on a System V release 2.0 system running news 2.11.
Please inform me if you have problems running under bsd [do you know anyone
doing an Intel 386 bsd port?] or any other configuration.

						Paul Traina
						paul@nessus.uucp

-*- cut here for maximum consumer satisfaction -*-
/*
 *	grabheaders: dump to stdout the headers of all the news-items
 *		     available through the history database.
 *
 *	Original Author: ?? (distributed in news2.11/misc directory)
 *	Kludgemonger:	 Paul Traina (paul@nessus.UUCP / pst@ai.ai.mit.edu)
 *
 *	This program has been kludged a tad to:
 *	1) work on USG systems
 *	2) work with the new "hashed" history file
 *
 *	If your news history file is "hashed" (in news 2.11, the history
 *	file has been broken into 10 smaller files and stored in "history.d")
 *	then you should compile this with -DHASHED.  Otherwise the program
 *	will assume you are using an old version of news that has one file
 *	just called "history".  This may also be true of systems that run
 *	with DBM (? I don't know ?).
 *
 *	If you are running a USG machine (SystemV), then add -DUSG to
 *	the compile line -- this will:
 *		a) define index -> strchr
 *		b) add timeb information
 *
 *	You will also need (if your system does not have them directly
 *	in some library) fdate.o and getdate.o.  These are supplied
 *	with the news distribution (ftime.c and getdate.y).
 *
 *	This has only been tested on news2.11 patch level 8 with a
 *	system running System V release 2.0.  Please notify me of
 *	any problems you may have.
 *
 */

#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#include <ctype.h>
#include <sys/time.h>

#ifdef HASHED
#define HISTDIR	"/usr/lib/news/history.d"
#else
#define HISTORY	"/usr/lib/news/history"
#endif

#define SPOOL	"/usr/spool/news"

#ifndef USG
#include <sys/timeb.h>
#else
struct timeb
{
	time_t	time;
	unsigned short millitm;
	short	timezone;
	short	dstflag;
};
#define index strchr
#define rindex strrchr
#endif

#define DAYSEC (24L*60L*60L)


main()
{
	FILE *infile;

#ifdef HASHED
	char histfile[15];	/* name of current history file */
	int  histindex;

	for (histindex = 0; histindex < 10; histindex++) {
	  sprintf(histfile, "%s/%01d", HISTDIR, histindex);
	  infile = fopen(histfile, "r");
	  getheaders(infile, histfile);
	}
#else
	infile = fopen(HISTORY, "r");
	getheaders(infile, HISTORY);
#endif
}

getheaders(Hfile, name)
FILE *Hfile;
char *name;
{
	FILE *Afile;
	char buffer[BUFSIZ], datestr[BUFSIZ];
	char *index();
	struct stat stbuf;
	struct timeb now;
	long t;

	if (Hfile == NULL) {
		perror(name);
		exit(1);
	}

	if (chdir(SPOOL) < 0) {
		perror(SPOOL);
		exit(1);
	}

	(void) ftime(&now);

	while (fgets(buffer, BUFSIZ, Hfile) != NULL) {
		register char *p, *file;

		p = index(buffer, '\t');
		if (p == NULL)
			continue;
		file = index(p+1, '\t');
		if (file == NULL || file[1] == '\n')
			continue;
		*file = '\0';
		t = getdate(p, &now);
		/* if ( (t+DAYSEC*14L) < now.time)
			continue; */
		strcpy(datestr, p);
		p = file;
		while (*++p != ' ' && *p != '\n')
			if (*p == '.')
				*p = '/';
		*p = '\0';
		file++;
		if (       strncmp(file, "net", 3)  && strncmp(file, "mod", 3)
			&& strncmp(file, "comp", 4) && strncmp(file, "sci", 3)
			&& strncmp(file, "news", 4) && strncmp(file, "rec", 3)
			&& strncmp(file, "talk", 4) && strncmp(file, "misc", 4)
			&& strncmp(file, "soc", 3)
			)
			continue;
		Afile = fopen(file, "r");
		if (Afile == NULL)
			continue;
		while (fgets(buffer, BUFSIZ, Afile) != NULL &&
		    buffer[0] != '\n') {
		if (strncmp(buffer, "From: ", 5) == 0) {
			register char *cp = index(buffer, '@');
			if (cp)
				while (*++cp && *cp != '.' && *cp != ' ')
					if (isupper(*cp))
						*cp = tolower(*cp);
				cp--;
				while (*++cp && *cp != ' ')
					if (islower(*cp))
						*cp = toupper(*cp);
		    }
		    fputs(buffer, stdout);
		}
		fstat(fileno(Afile), &stbuf);
		printf("Date-Received: %s\n", datestr);
		printf("Bytes: %ld\n\n", stbuf.st_size - ftell(Afile));
		fclose(Afile);
	}
	printf("\n");
	fclose(Hfile);
}
-*- this is the end -- STOP YOUR CUT NOW SILLY! -- fnord -*-

-- 
arpa:	pst@ai.ai.mit.edu
bitnet: paul%nessus@sbitp
uucp:   {ucbvax|sdcsvax|pyramid}!ucsbcsl!nessus!paul