#ifndef lint static char sccsid[] = "@(#)list.c 1.11 (Berkeley) 5/11/89"; #endif #include "common.h" /* * LIST * * List active newsgroups, newsgroup descriptions, distributions, * active.times, and subscriptions. * */ void list(argc, argv) int argc; char *argv[]; { char line[NNTP_STRLEN]; char *grparray[2]; char *filename; char *items; char *format; register char *cp; register FILE *list_fp; char *wildarg = NULL; int argc_ok = (argc == 2 || argc == 3); if (argc == 1 || (argc_ok && !strcasecmp(argv[1],"active"))){ if (argc == 3) { int first, last; int num = find_group(argv[2], &first, &last); if (num >= 0) { printf("%d list:\r\n%s\r\n.\r\n", OK_GROUPS,group_array[num]); (void) fflush(stdout); return; } wildarg = argv[2]; } num_groups = read_groups(); if (num_groups == 0){ /* can't get a group list */ printf("%d Group update failed. Try later.\r\n", ERR_FAULT); (void) fflush(stdout); #ifdef LOG syslog(LOG_INFO, "%s group update failed in LIST", hostname); #endif exit(1); } filename = activefile; items = "active newsgroups"; format = "Newsgroups in form \"group high low flags\"."; } else if (argc == 2 && !strcasecmp(argv[1],"distributions")){ filename = distributionsfile; items = "newsgroup distributions"; format = "Distributions in form \"area description\"."; } else if (argc_ok && !strcasecmp(argv[1],"newsgroups")){ if (argc == 3) wildarg = argv[2]; filename = newsgroupsfile; items = "newsgroup descriptions"; format = "Descriptions in form \"group description\"."; } else if (argc == 2 && !strcasecmp(argv[1],"subscriptions")){ filename = subscriptionsfile; items = "group subscription list"; format = "New-user subscription list in form \"group\"."; } else if (argc == 2 && !strcasecmp(argv[1],"overview.fmt")){ filename = overviewfmtfile; items = "overview format"; format = "Order of fields in overview database."; } else if (argc == 2 && !strcasecmp(argv[1],"active.times")){ filename = activetimesfile; items = "active times"; format = "Active times in form \"group time email name\"."; } else { printf("%d Usage: LIST [ACTIVE|NEWSGROUPS|DISTRIBUTIONS|SUBSCRIPTIONS|ACTIVE.TIMES]\r\n", ERR_CMDSYN); (void) fflush(stdout); return; } grparray[0] = line; grparray[1] = NULL; list_fp = fopen(filename, "r"); if (list_fp == NULL) { printf("%d No list of %s available.\r\n", ERR_FAULT, items); (void) fflush(stdout); #ifdef SYSLOG syslog(LOG_ERR, "list: fopen %s: %m", filename); #endif return; } printf("%d %s\r\n",OK_GROUPS,format); while (fgets(line, sizeof(line), list_fp) != NULL) { if ((cp = index(line, '\n')) != NULL) *cp = '\0'; for (cp = line; *cp && !isspace(*cp); cp++) ; if (*cp) *cp = '\0'; else cp = NULL; if (ngpermcount) { if (ngmatch(s1strneql, ALLBUT, ngpermlist, ngpermcount, grparray, 1) == 0) continue; } else if (ALLBUT==0) break; /* ngpermcnt==0 && ALLBUT == 0 means * don't print the list, right? */ if (!wildarg || wildmat(line, wildarg)) { if (cp) *cp = ' '; putline(line); } } (void) fclose(list_fp); putline("."); (void) fflush(stdout); } void xgtitle(argc, argv) int argc; char *argv[]; { char *v[3]; if (argc != 2) { printf("%d Usage: XGTITLE pattern\r\n", ERR_CMDSYN); (void) fflush(stdout); return; } v[0] = "list"; v[1] = "newsgroups"; v[2] = argv[1]; list(3, v); }