/* * Checkgroups: script that updates the description of newsgroups * Input file : a checkgroups script that contains the name of * the newsgroup and its description in one line * * Written and copyrighted by Cornelius Krasel, April 1997 * Source code borrows a lot from fetch(1). * * See file COPYING for restrictions on the use of this software. */ #include "leafnode.h" #include "ln_log.h" #include #include #include "system.h" #include #include #include #include #include #include #include #include int debug = 0; int verbose = 0; static void process_input(char *s) { FILE *f; char *l; static time_t now; if (!now) now = time(NULL); f = fopen(s, "r"); if (!f) { fprintf(stderr, "cannot open %s: %s\n", s, strerror(errno)); return; } while ((l = getaline(f))) { char *p; struct newsgroup *g; p = l; if (isalnum((unsigned char)*p)) { while (*p && !isspace((unsigned char)*p)) p++; if (*p) *p++ = '\0'; if ((g = findgroup(l)) != NULL) { fprintf(stderr, "%s\n", l); if (strlen(p) > 0) { if (g->desc) free(g->desc); g->desc = critstrdup(p, "process_input"); } } else { fprintf(stderr, "%s NEW\n", l); insertgroup(l, 1, 0, now); if (*p) newgroupdesc(l, p); } } } fclose(f); mergegroups(); } int main(int argc, char *argv[]) { int fd; myopenlog("checkgroups"); fd = open(".", O_RDONLY); if (fd < 0) { perror("checkgroups: cannot store cwd"); exit(EXIT_FAILURE); } if (!initvars(argv[0])) exit(EXIT_FAILURE); if (fchdir(fd)) { perror("checkgroups: cannot restore cwd"); exit(EXIT_FAILURE); } (void)close(fd); if (argc != 2) { fprintf(stderr, "Usage: %s checkgroupsfile\n", argv[0]); exit(1); } umask(2); if (readconfig(0)) { fprintf(stderr, "cannot read configuration.\n"); exit(EXIT_FAILURE); } if (try_lock(timeout_lock)) { fprintf(stderr, "could not obtain lock.\n"); exit(EXIT_FAILURE); } readactive(); /* read groupinfo file */ if (!active) fakeactive(); /* make sure we have up to date water marks for existing groups */ process_input(argv[1]); if (writeactive()) ln_log(LNLOG_SERR, LNLOG_CTOP, "Error writing groupinfo."); unlink(lockfile); freeactive(active); freegetaline(); exit(0); }