#ifndef lint static char sccsid[] = "@(#)newgroups.c 1.13 (Berkeley) 2/6/88"; #endif #include "common.h" #include "date.h" /* * NEWGROUPS date time ["GMT"] [] * * Display new newsgroups since a given date and time, but only * for those in . */ void newgroups(argc, argv) int argc; char *argv[]; { char line[NNTP_STRLEN]; register char *cp; static char **dist_list = (char **) NULL; int distcount = 0; int i, low_msg, high_msg; long date; register FILE *date_fp; char *reqlist[2]; if (argc < 3) { printf("%d Usage: NEWGROUPS yymmdd hhmmss [\"GMT\"] [].\r\n", ERR_CMDSYN); (void) fflush(stdout); return; } date_fp = fopen(activetimesfile, "r"); if (date_fp == NULL) { #ifdef SYSLOG syslog(LOG_ERR, "newgroups: fopen %s: %m", activetimesfile); #endif printf("%d Cannot open active.times file.\r\n", ERR_FAULT); (void) fflush(stdout); return; } /* YYMMDD HHMMSS */ if (strlen(argv[1]) != 6 || strlen(argv[2]) != 6) { printf("%d Date/time must be in form YYMMDD HHMMSS.\r\n", ERR_CMDSYN); (void) fflush(stdout); (void) fclose(date_fp); return; } (void) strcpy(line, argv[1]); /* yymmdd */ (void) strcat(line, argv[2]); /* hhmmss */ date = dtol(line); if (date < 0) { printf("%d Invalid date specification.\r\n", ERR_CMDSYN); (void) fflush(stdout); (void) fclose(date_fp); return; } argc -= 3; argv += 3; if (argc > 0 && !strcasecmp(*argv, "GMT")) { /* We store stuff in GMT */ ++argv; /* anyway, so this is */ --argc; /* a "noop" */ } else /* But that means not GMT */ date = local_to_gmt(date); /* is a definite "op" */ if (argc > 0) { distcount = get_distlist(&dist_list, *argv); if (distcount < 0) { printf("%d Bad distribution list: %s\r\n", ERR_CMDSYN, *argv); (void) fflush(stdout); (void) fclose(date_fp); return; } } printf("%d New newsgroups since %s follow.\r\n", OK_NEWGROUPS, line); while (fgets(line, sizeof(line), date_fp) != NULL) { if ((cp = index(line, '\n')) != NULL) *cp = '\0'; if ((cp = index(line, ' ')) != NULL) *cp = '\0'; if (atoi(cp + 1) < date) continue; if (distcount == 0) { reqlist[0] = line; reqlist[1] = NULL; if (ngpermcount) { if (ngmatch(s1strneql, ALLBUT, ngpermlist, ngpermcount, reqlist, 1) == 0) { continue; } } else if (ALLBUT == 0) continue; } else { cp = index(line, '.'); if (cp == NULL) continue; *cp = '\0'; for (i = 0; i < distcount; ++i) { if (strcmp(line, dist_list[i]) == 0) { *cp = '.'; break; } } if (i == distcount) continue; } i = find_group(line, &low_msg, &high_msg); if (i < 0) continue; cp = group_array[i] + strlen(line); while (isdigit(*cp) || isspace(*cp)) cp++; if (*cp == '\0' || *cp == 'x' || *cp == '=') continue; putline(group_array[i]); } putline("."); (void) fflush(stdout); (void) fclose(date_fp); }