|
|
1.1 ! root 1: /* ! 2: * readnews - read news articles. ! 3: */ ! 4: ! 5: #ifdef SCCSID ! 6: static char *SccsId = "@(#)readnews.c 2.28 6/6/85"; ! 7: #endif /* SCCSID */ ! 8: ! 9: #include "rparams.h" ! 10: ! 11: /* ! 12: * readnews - article reading program ! 13: */ ! 14: ! 15: #ifndef SYSBUF ! 16: char SYSBUF[BUFSIZ]; /* to buffer std out */ ! 17: #endif ! 18: ! 19: #define OPTION 0 /* pick up an option string */ ! 20: #define STRING 1 /* pick up a string of arguments */ ! 21: ! 22: int onsig(), cleanup(); ! 23: ! 24: /* ! 25: * Authors: ! 26: * Matt Glickman ucbvax!glickman ! 27: * Mark Horton cbosg!mark ! 28: * Stephen Daniels duke!swd ! 29: * Tom Truscott duke!trt ! 30: */ ! 31: ! 32: main(argc, argv) ! 33: int argc; ! 34: register char **argv; ! 35: { ! 36: register char *ptr; /* pointer to rest of buffer */ ! 37: char *user, *home; ! 38: int optflag = FALSE, space = FALSE; ! 39: struct utsname ubuf; ! 40: char *myrc; ! 41: ! 42: /* set up defaults and initialize. */ ! 43: pathinit(); ! 44: mode = UNKNOWN; ! 45: header.title[0] = header.nbuf[0] = '\0'; ! 46: coptbuf[0] = datebuf[0] = '\0'; ! 47: uname(&ubuf); ! 48: strcpy(FULLSYSNAME, ubuf.nodename); ! 49: ! 50: savmask = umask(N_UMASK); /* set up mask */ ! 51: uid = getuid(); ! 52: gid = getgid(); ! 53: duid = 0; ! 54: dgid = 0; ! 55: ! 56: #ifndef SHELL ! 57: if ((SHELL = getenv("SHELL")) == NULL) ! 58: SHELL = "/bin/sh"; ! 59: #endif ! 60: #ifndef IHCC ! 61: /* ! 62: * IHCC does not allow use of $LOGNAME to prevent forgery. ! 63: * Note that this shouldn't matter in readnews, since inews ! 64: * does all the actual posting of news. ! 65: */ ! 66: if ((user = getenv("USER")) == NULL) ! 67: user = getenv("LOGNAME"); ! 68: if ((home = getenv("HOME")) == NULL) ! 69: home = getenv("LOGDIR"); ! 70: #endif ! 71: if (user == NULL || home == NULL) ! 72: getuser(); ! 73: else { ! 74: username = AllocCpy(user); ! 75: (void) strcpy(header.path, username); ! 76: userhome = AllocCpy(home); ! 77: } ! 78: ! 79: if (!(MAILER = getenv("MAILER"))) ! 80: MAILER = "mail"; /* was /bin/mail */ ! 81: ! 82: #ifdef PAGE ! 83: if (myrc = getenv("PAGER")) ! 84: PAGER = AllocCpy(myrc); ! 85: else { ! 86: # ifdef IHCC ! 87: (void) sprintf(bfr, "%s/bin/%s", logdir(HOME), PAGE); ! 88: PAGER = AllocCpy(bfr); ! 89: # else /* !IHCC */ ! 90: PAGER = PAGE; ! 91: # endif /* !IHCC */ ! 92: } ! 93: #endif /* PAGE */ ! 94: ! 95: if (ptr = getenv("NEWSOPTS")) ! 96: (void) strcpy(rcbuf, ptr); ! 97: else ! 98: *rcbuf = '\0'; ! 99: if (*rcbuf) { ! 100: (void) strcat(rcbuf, " \1"); ! 101: ptr = rcbuf; ! 102: while (*++ptr) ! 103: if (isspace(*ptr)) ! 104: *ptr = '\0'; ! 105: for (ptr = rcbuf; ; ptr++) { ! 106: if (!*ptr) ! 107: continue; ! 108: if (*ptr == '\1') ! 109: break; ! 110: if (++line > LINES) ! 111: xerror("Too many options."); ! 112: if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL) ! 113: xerror("Not enough memory."); ! 114: argvrc[line] = rcline[line]; ! 115: (void) strcpy(rcline[line], ptr); ! 116: while (*ptr) ! 117: ptr++; ! 118: } ! 119: } ! 120: myrc = getenv("NEWSRC"); ! 121: if (myrc == NULL) { ! 122: myrc = NEWSRC; ! 123: (void) sprintf(newsrc, "%s/%s", userhome, myrc); ! 124: } else { ! 125: (void) strcpy(newsrc, myrc); ! 126: } ! 127: if (access(newsrc, 0)) ! 128: newrc(newsrc); ! 129: if ((rcfp = fopen(newsrc, "r")) != NULL) { ! 130: rcreadok = FALSE; ! 131: while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) { ! 132: if (!(space = isspace(*rcbuf))) ! 133: optflag = FALSE; ! 134: if (!strncmp(rcbuf, "options ", 8)) ! 135: optflag = TRUE; ! 136: if (optflag) { ! 137: (void) strcat(rcbuf, "\1"); ! 138: if (space) ! 139: ptr = rcbuf - 1; ! 140: else ! 141: ptr = &rcbuf[7]; ! 142: while (*++ptr) ! 143: if (isspace(*ptr)) ! 144: *ptr = '\0'; ! 145: if (space) ! 146: ptr = rcbuf; ! 147: else ! 148: ptr = &rcbuf[8]; ! 149: for (; ; ptr++) { ! 150: if (!*ptr) ! 151: continue; ! 152: if (*ptr == '\1') ! 153: break; ! 154: if (++line > LINES) ! 155: xerror("Too many options."); ! 156: if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL) ! 157: xerror("Not enough memory."); ! 158: argvrc[line] = rcline[line]; ! 159: (void) strcpy(rcline[line], ptr); ! 160: while (*ptr) ! 161: ptr++; ! 162: } ! 163: } ! 164: } ! 165: (void) fclose(rcfp); ! 166: rcreadok = TRUE; ! 167: } ! 168: if (line != -1) { ! 169: #ifdef DEBUG ! 170: register int i; ! 171: for (i = 0; i <= line; i++) ! 172: fprintf(stderr, "options: %s\n", rcline[i]); ! 173: #endif ! 174: process(line + 2, argvrc); ! 175: do { ! 176: #ifdef DEBUG ! 177: fprintf(stderr, "Freeing %d\n", line); ! 178: #endif ! 179: free(rcline[line]); ! 180: } while (line--); ! 181: } ! 182: ! 183: argv++; ! 184: (void) strcat(header.nbuf, ADMSUB); ! 185: process(argc, argv); ! 186: if (!nflag) ! 187: (void) sprintf(header.nbuf, "%s,%s", DFLTSUB, ADMSUB); ! 188: lcase(header.nbuf); ! 189: makehimask(header.nbuf, "junk"); ! 190: makehimask(header.nbuf, "control"); ! 191: makehimask(header.nbuf, "test"); ! 192: ! 193: setbuf(stdout, SYSBUF); ! 194: SigTrap = FALSE; /* true if a signal has been caught */ ! 195: if (!pflag && !lflag && !eflag) { ! 196: (void) signal(SIGQUIT, SIG_IGN); ! 197: (void) signal(SIGHUP, cleanup); ! 198: (void) signal(SIGINT, onsig); ! 199: (void) signal(SIGPIPE, onsig); ! 200: } ! 201: ! 202: /* ! 203: * ALL of the command line has now been processed. (!) ! 204: */ ! 205: ! 206: if (!*header.nbuf) ! 207: strcpy(header.nbuf, DFLTSUB); ! 208: if (sflag) { ! 209: printf("Subscription list: %s\n", header.nbuf); ! 210: xxit(0); ! 211: } ! 212: if (xflag) ! 213: line = -1; ! 214: rcfp = xfopen(newsrc, "r"); ! 215: while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) { ! 216: if (!nstrip(rcbuf)) ! 217: xerror(".newsrc line too long"); ! 218: if (++line >= LINES) ! 219: xerror("Too many .newsrc lines"); ! 220: if ((rcline[line] = malloc((unsigned)(strlen(rcbuf) + 1))) == NULL) ! 221: xerror("Not enough memory"); ! 222: (void) strcpy(rcline[line], rcbuf); ! 223: } ! 224: fclose(rcfp); ! 225: ! 226: if (SigTrap) { ! 227: if (SigTrap == SIGHUP || !rcreadok) ! 228: xxit(0); ! 229: fprintf(stdout, "Abort (n)? "); ! 230: (void) fflush(stdout); ! 231: if (gets(bfr) == NULL || *bfr == 'y' || *bfr == 'Y') ! 232: xxit(0); ! 233: SigTrap = FALSE; ! 234: } ! 235: sortactive(); ! 236: actfp = xfopen(ACTIVE, "r"); ! 237: ! 238: #ifdef DEBUG ! 239: fprintf(stderr, "header.nbuf = %s\n", header.nbuf); ! 240: #endif ! 241: switch (mode) { ! 242: case UNKNOWN: ! 243: readr(); ! 244: break; ! 245: #ifdef TMAIL ! 246: case MAIL: ! 247: Mail(); ! 248: break; ! 249: #endif ! 250: } ! 251: ! 252: cleanup(); ! 253: /*NOTREACHED*/ ! 254: } ! 255: ! 256: cleanup() ! 257: { ! 258: (void) signal(SIGHUP, SIG_IGN); ! 259: (void) fflush(stdout); ! 260: if (!news || xflag || lflag || tflag) ! 261: xxit(0); ! 262: if (*groupdir && mode != MAIL) ! 263: updaterc(); ! 264: writeoutrc(); ! 265: xxit(0); ! 266: } ! 267: ! 268: /* ! 269: * Write out the .newsrc file. It's already been cleaned up by sortactive() ! 270: * Take care that data is all written, and flushed, before we destroy the ! 271: * old copy. ! 272: */ ! 273: writeoutrc() ! 274: { ! 275: FILE *wrcfp; ! 276: char aline[BUFLEN]; ! 277: register int i; ! 278: ! 279: /* NEVER write it out if xflag */ ! 280: if (xflag || !rcreadok) ! 281: return; ! 282: ! 283: (void) strcpy(aline, newsrc); ! 284: (void) strcat(aline, ".new"); ! 285: ! 286: #ifdef VMS ! 287: (void) vmsdelete(aline); ! 288: #endif ! 289: wrcfp = xfopen(aline, "w"); ! 290: ! 291: for (i = 0; i <= line; i++) { ! 292: if (rcline[i] != NULL) ! 293: if (fprintf(wrcfp, "%s\n", rcline[i]) < 0) ! 294: goto fouled; ! 295: } ! 296: if (fclose(wrcfp) < 0) ! 297: goto fouled; ! 298: ! 299: #ifdef VMS ! 300: (void) vmsdelete(newsrc); ! 301: #endif ! 302: if (rename(aline, newsrc) < 0) ! 303: xerror("Cannot rename %s to %s", aline, newsrc); ! 304: return; ! 305: ! 306: fouled: ! 307: xerror("Error writing new .newsrc file - no changes made\n"); ! 308: return; ! 309: } ! 310: ! 311: /* ! 312: * Forbid newsgroup ng, unless he asked for it in nbuf. ! 313: */ ! 314: makehimask(nbuf, ng) ! 315: char *nbuf, *ng; ! 316: { ! 317: if (!findex(nbuf, ng)) ! 318: (void) sprintf(rindex(nbuf, '\0'), ",!%s", ng); ! 319: } ! 320: ! 321: /* ! 322: * Return true if the string searchfor is in string, but not if preceded by !. ! 323: */ ! 324: findex(string, searchfor) ! 325: char *string, *searchfor; ! 326: { ! 327: register char first; ! 328: register char *p; ! 329: ! 330: first = *searchfor; ! 331: for (p=index(string, first); p; p = index(p+1, first)) { ! 332: if (((p==string) || (p[-1]!='!')) && strncmp(p, searchfor, strlen(searchfor)) == 0) ! 333: return TRUE; ! 334: } ! 335: return FALSE; ! 336: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.