|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 3782 (0xec6)
Types: TextFile
Names: »mkgrdates.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦cfd40dc56⟧ »EurOpenD3/news/nntp/nntp.1.5.8.tar.Z«
└─⟦2ec98eca6⟧
└─⟦this⟧ »support/mkgrdates.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦5cced586a⟧ »EurOpenD3/news/nntp/nntp.1.5.7.tar.Z«
└─⟦7340f105e⟧
└─⟦this⟧ »./support/mkgrdates.c«
#ifndef lint
static char *sccsid = "@(#)mkgrdates.c 1.5 (Berkeley) 5/30/89";
#endif
/*
* Make a list of newsgroups which are "new" in the file NGDATE_FILE.
* "New" means having an entry in the active file, and having
* a message numbered "1" in the appropriate news directory.
* Since this involves a stat of all the newsgroups, we try
* to be intelligent about things -- if the active file's size
* since we last ran -- stored in STAT_FILE -- hasn't changed
* since last time, we assume things are ok, and exit without
* doing anything. This could fail in extreme circumstances,
* but is "too painful to do right".
*
* Output in NGDATE_FILE is of the form
*
* date newsgroup
*
* where "date" is the date the newsgroup was created, expressed as
* the number of seconds since 000000 Jan 1, 1970, GMT. This file
* winds up sorted in cronological order.
*
* Phil Lapsley
* College of Engineering
* University of California, Berkeley
* (ARPA: phil@Berkeley.ARPA; UUCP: ...!ucbvax!phil)
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "../common/conf.h"
#ifdef USG
#include <time.h>
#else not USG
#include <sys/time.h>
#endif not USG
#define MODE 0644 /* Better be readable by nntpd! */
#ifndef MAXPATHLEN
#define MAXPATHLEN 1024
#endif
#ifndef MAXGROUPLEN
#define MAXGROUPLEN 256
#endif
extern int linecmp();
extern char *index(), *malloc(), *strcpy(), *strcat();
main(argc, argv)
int argc;
char *argv[];
{
char *groups[1024]; /* XXX 1024 groups max */
char line[MAXPATHLEN], gr_name[MAXGROUPLEN];
char *cp;
int i, j;
long lastsize, crntsize;
long birthtime;
struct tm *tmptr;
FILE *stat_fp, *active_fp, *date_fp;
long birthof();
stat_fp = fopen(STAT_FILE, "r");
if (stat_fp != NULL) {
(void) fscanf(stat_fp, "%d", &lastsize);
(void) fclose(stat_fp);
}
active_fp = fopen(ACTIVE_FILE, "r");
if (active_fp == NULL) {
fprintf(stderr, "Can't read active file?\n");
perror(ACTIVE_FILE);
exit(1);
}
/* Check length; if it's the same as last time, quit */
(void) fseek(active_fp, (long) 0, 2);
crntsize = ftell(active_fp);
if (crntsize == lastsize) {
(void) fclose(active_fp);
exit(0);
}
/* Ok, time to rebuild the date file */
date_fp = fopen(NGDATE_FILE, "w");
if (date_fp == NULL) {
perror(NGDATE_FILE);
(void) fclose(active_fp);
exit(1);
}
rewind(active_fp);
i = 0;
while (fgets(line, sizeof(line), active_fp) != NULL) {
if ((cp = index(line, ' ')) != NULL)
*cp = '\0';
(void) strcpy(gr_name, line);
birthtime = birthof(line, atoi(cp + 1));
if (birthtime == 0) /* Skip ancient newsgroups */
continue;
(void) sprintf(line, "%ld %s", birthtime, gr_name);
groups[i] = malloc(strlen(line)+1);
if (groups[i] != NULL)
(void) strcpy(groups[i++], line);
else {
perror("malloc");
exit(1);
}
}
(void) fclose(active_fp);
qsort((char *) groups, i, sizeof(char *), linecmp);
for (j = 0; j < i; ++j)
fprintf(date_fp, "%s\n", groups[j]);
(void) fclose(date_fp);
(void) chmod(NGDATE_FILE, MODE);
stat_fp = fopen(STAT_FILE, "w");
if (stat_fp == NULL) {
perror(STAT_FILE);
exit(1);
}
fprintf(stat_fp, "%d\n", crntsize);
(void) fclose(stat_fp);
(void) chmod(STAT_FILE, MODE);
exit(0);
}
linecmp(line1, line2)
char **line1, **line2;
{
return(0 - strcmp(*line1, *line2));
}
/* return creation time of newsgroup */
long
birthof(group, highart)
char *group;
int highart;
{
char *cp, *index();
char tst[128];
struct stat statbuf;
while ((cp = index(group, '.')))
*cp = '/';
(void) strcpy(tst, SPOOLDIR);
(void) strcat(tst, "/");
(void) strcat(tst, group);
if (highart)
(void) strcat(tst, "/1");
if (stat(tst, &statbuf) < 0)
return 0L; /* not there, assume ancient */
else
return(statbuf.st_mtime);
}