|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "%W% (Berkeley) %G%";
3: #endif
4:
5: /*
6: * Make a list of newsgroups which are "new" in the file NGDATE_FILE.
7: * "New" means having an entry in the active file, and having
8: * a message numbered "1" in the appropriate news directory.
9: * Since this involves a stat of all the newsgroups, we try
10: * to be intelligent about things -- if the active file's size
11: * since we last ran -- stored in STAT_FILE -- hasn't changed
12: * since last time, we assume things are ok, and exit without
13: * doing anything. This could fail in extreme circumstances,
14: * but is "too painful to do right".
15: *
16: * Output in NGDATE_FILE is of the form
17: *
18: * date newsgroup
19: *
20: * where "date" is the date the newsgroup was created, expressed as
21: * the number of seconds since 000000 Jan 1, 1970, GMT. This file
22: * winds up sorted in cronological order.
23: *
24: * Phil Lapsley
25: * College of Engineering
26: * University of California, Berkeley
27: * (ARPA: [email protected]; UUCP: ...!ucbvax!phil)
28: */
29:
30: #include <stdio.h>
31: #include <sys/types.h>
32: #include <sys/time.h>
33: #include <sys/stat.h>
34: #include "../common/conf.h"
35:
36: #define MODE 0644 /* Better be readable by nntpd! */
37:
38: extern int linecmp();
39: extern char *index(), *malloc(), *strcpy(), *strcat();
40:
41: main(argc, argv)
42: int argc;
43: char *argv[];
44: {
45: char *groups[MAX_GROUPS];
46: char line[MAX_STRLEN], gr_name[MAX_STRLEN];
47: char *cp;
48: int i, j;
49: long lastsize, crntsize;
50: long birthtime;
51: struct tm *tmptr;
52: FILE *stat_fp, *active_fp, *date_fp;
53: long birthof();
54:
55: stat_fp = fopen(STAT_FILE, "r");
56:
57: if (stat_fp != NULL) {
58: (void) fscanf(stat_fp, "%d", &lastsize);
59: (void) fclose(stat_fp);
60: }
61:
62: active_fp = fopen(ACTIVE_FILE, "r");
63: if (active_fp == NULL) {
64: fprintf(stderr, "Can't read active file?\n");
65: perror(ACTIVE_FILE);
66: exit(1);
67: }
68:
69: /* Check length; if it's the same as last time, quit */
70:
71: (void) fseek(active_fp, (long) 0, 2);
72: crntsize = ftell(active_fp);
73: if (crntsize == lastsize) {
74: (void) fclose(active_fp);
75: exit(0);
76: }
77:
78: /* Ok, time to rebuild the date file */
79:
80: date_fp = fopen(NGDATE_FILE, "w");
81:
82: if (date_fp == NULL) {
83: perror(NGDATE_FILE);
84: (void) fclose(active_fp);
85: exit(1);
86: }
87:
88: rewind(active_fp);
89:
90: i = 0;
91: while (fgets(line, sizeof(line), active_fp) != NULL) {
92: if ((cp = index(line, ' ')) != NULL)
93: *cp = '\0';
94: (void) strcpy(gr_name, line);
95: birthtime = birthof(line, atoi(cp + 1));
96:
97: if (birthtime == 0) /* Skip ancient newsgroups */
98: continue;
99:
100: (void) sprintf(line, "%ld %s", birthtime, gr_name);
101: groups[i] = malloc(strlen(line)+1);
102: if (groups[i] != NULL)
103: (void) strcpy(groups[i++], line);
104: else {
105: perror("malloc");
106: exit(1);
107: }
108: }
109:
110: (void) fclose(active_fp);
111:
112: qsort((char *) groups, i, sizeof(char *), linecmp);
113:
114: for (j = 0; j < i; ++j)
115: fprintf(date_fp, "%s\n", groups[j]);
116:
117: (void) fclose(date_fp);
118:
119: (void) chmod(NGDATE_FILE, MODE);
120:
121: stat_fp = fopen(STAT_FILE, "w");
122: if (stat_fp == NULL) {
123: perror(STAT_FILE);
124: exit(1);
125: }
126:
127: fprintf(stat_fp, "%d\n", crntsize);
128:
129: (void) fclose(stat_fp);
130:
131: (void) chmod(STAT_FILE, MODE);
132:
133: exit(0);
134: }
135:
136: linecmp(line1, line2)
137: char **line1, **line2;
138: {
139: return(0 - strcmp(*line1, *line2));
140: }
141:
142:
143: /* return creation time of newsgroup */
144:
145: long
146: birthof(group, highart)
147: char *group;
148: int highart;
149: {
150: char *cp, *index();
151: char tst[128];
152: struct stat statbuf;
153:
154: while ((cp = index(group, '.')))
155: *cp = '/';
156:
157: (void) strcpy(tst, SPOOLDIR);
158: (void) strcat(tst, group);
159: if (highart)
160: (void) strcat(tst, "/1");
161: if (stat(tst, &statbuf) < 0)
162: return 0L; /* not there, assume ancient */
163: else
164: return(statbuf.st_mtime);
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.