ARPAVAX:usenet (06/08/82)
ed - man/checknews.1 << '-*-END-*-' 55,56c inews(1), postnews(1), readnews(1) . 51,52d 48a ~/.newsrc . 40c .IR readnews (1) . 5c .BR checknews " [ " ynqevv " ] [ " .IR "readnews options" " ] " . w q -*-END-*- ed - man/expire.8 << '-*-END-*-' 83c possible to do .I "uux \-c". . 80c (by adding a .B \-e option to expire and having different invocations) . 76c recnews(8), sendnews(8), uurec(8) . 73,74d 71a checknews(1), . 31c .BR all . . 28,29c is normally started up by .IR cron (8) every night to remove all expired news. . 5,24c .BR /usr/lib/news/expire " [ " \-n .IR newsgroups " ] [ " .BR \-i " ] [ " \-I " ] [ " \-v " [ " .IR level " ] ] [ " .BI \-e days " ] " . w q -*-END-*- ed - man/inews.1 << '-*-END-*-' 90,91d 88a uucp(1), . 86a news(5), newsrc(5) readnews(1), . 82,84c Mail(1), binmail(1), . 56a (This happens on ours.) .LP If the file /usr/lib/news/recording is present, it is taken as a list of "recordings" to be shown to users posting news. (This is by analogy to the recording you hear when you dial information in some parts of the country, asking you if you really wanted to do this.) The file contains lines of the form: .br newsgroups <tab> filename .br for example: .br net.all /usr/lib/news/net.recording fa.all /usr/lib/news/fa.recording .br Any user posting an article to a newsgroup matching the pattern on the left will be shown the contents of the file on the right. The user is then told to hit DEL to abort or RETURN to proceed. The intent of this feature is to help companies keep proprietary information from accidently leaking out. . 34c will default to something line .IR general . (On ours, it is .IR general .) If you wish to submit . 31,32c belongs to a list of newsgroups. If the .B \-n . 28,29c input. A .I title . 20,22c .BI "inews \-C " newsgroup . 15,18c .B "inews \-p" .RI " [ " filename " ] " . 5,13c .B "inews \-t " .IR title " [ " .B \-n .IR newsgroups " ] [ " .B \-e .IR "expiration date" " ]" . w q -*-END-*- ed - man/news.5 << '-*-END-*-' 110,113c are a set of keys describing how the article should be transmitted. The default is no flags. . w q -*-END-*- ed - man/newsrc.5 << '-*-END-*-' 25a .br .B fa.info-vax! 1-5 .br .LP If the : is replaced with an ! (as in info-vax above) the newsgroup is not subscribed to and will not be shown to the user. . w q -*-END-*- ed - man/postnews.1 << '-*-END-*-' 66c uucp(1), . 63a readnews(1), . 61,62c expire(8), inews(1), mail(1), . 57,59c Mail(1), . 53c .IR inews (1). . 39a (Our local set of newsgroups is .IR megatest.all .) . 38c (In this case, .I ucb newsgroups circulate among machines at the . 36c .IR ucb.all , . 33c .IR net.news , . 30c .IR net.general , . 28c .IR btl.general , . 25c .I general . 23c .IR general . . 14c .IR inews (1) . 6,10c .BR postnews " [ " .IR article " ]" . w q -*-END-*- ed - man/readnews.1 << '-*-END-*-' 268d 253c .IR msgs (1) . 248,250d 229c .IR Mail (1) . 219c .IR ed (1) . 212c .IR msgs (1) . 186a .IP u Unsubscribe from this newsgroup. Also goes on to the next newsgroup. .IP v Print the current version of the news software. . 163c Cancel the article. Only the author or the super user can do this. . 160c Quit. The .newsrc . 151c .ta 2.5i . 142c Paging may be disabled by setting .B PAGER to a null value. . 137c for articles. The environment parameter .B PAGER should be set to . 130c .IR msgs "(1) or " /bin/mail (1) . 97a If the environment variable NEWSRC is present, it should be the path name of a file to be used in place of .newsrc. . 83d 81c .IR getdate (3) . 77c .BI "\-a " "\fR[\fP date \fR]\fP" . 63a .B \-f flag prevents any followup articles from being printed. The . 49,50c invoked. The name of the temporary file is referenced with a ``%''. Thus, ``mail \-f %'' will invoke mail on a temporary file consisting of all . 44c .IR /bin/mail (1)\-like . 40c .IR Mail (1). . 35c .IR msgs (1) . 23,24c .B "readnews \-s" . 14,21c .IR titles " ] [ " .BR \-lprxhf " ] [ " .BR \-c " [ " .IR mailer " ] ]" . 11,12c .IR newsgroups " ] [ " . 5,9c .BR readnews " [ " \-a .IR date " ] [ " . w q -*-END-*- ed - misc/spool << '-*-END-*-' 46c for file in `ls -rt` . w q -*-END-*- ed - src/Makefile.usg << '-*-END-*-' 41c rm -f core index all errs getdate.c . 1c # @(#) Makefile.usg 2.4 6/1/82 . w q -*-END-*- ed - src/Makefile.v7 << '-*-END-*-' 40c rm -f core index errs getdate.c . 1c # @(#) Makefile.v7 2.4 6/1/82 . w q -*-END-*- ed - src/checknews.c << '-*-END-*-' 306a contin:; . 270a if (saveptr == '!') goto contin; . 268a saveptr = *ptr; . 266c while (*ptr != ':' && *ptr != '!' && *ptr) . 245a char saveptr; . 221c while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) { . 155c while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) { . 5c static char *SccsId = "@(#) checknews.c 2.8 6/1/82"; . w q -*-END-*- ed - src/control.c << '-*-END-*-' 628a if (sendto[0] <= ' ') { log("nasty mail name %s from %s", sendto, header.path); xxit(1); } . 420c fprintf(f, "Currently running news B version %s.\n\n", news_version); . 404c fprintf(f, "Currently running news B version %s.\n\n", news_version); . 390a * Send the version number to the right person. */ c_version(h, ctlmsgtext) struct hbuf *h; char *ctlmsgtext; { FILE *f; f = mailhdr(h->path, "Our news version"); if (f == NULL) xerror("Cannot send back error message"); fprintf(f, "Sent-by: USENET Site %s\n\n", SYSNAME); fprintf(f, "Currently running news B version %s.\n\n", news_version); fprintf(f, "The header of the message follows:\n"); hwrite(h, f); mclose(f); } /* . 295a ss = index(s, ' '); if (ss) *ss = 0; . 286a rr = index(r, ' '); if (rr) *rr = 0; . 261a return; } . 260c else { . 247c char *line, *p, *q, *r, *s, *rr, *ss; . 216c if (groupname[0] == '.' || groupname[0] <= ' ') . 53a else if (eq("version")) c_version(cargc, cargv); . 6c static char *SccsId = "@(#) control.c 2.8 6/5/82 (this is NOT the netnews version!)"; . 3a * * See defs.h "news_version" for the real version of netnews. . w q -*-END-*- ed - src/defs.h << '-*-END-*-' 28c /* Default xmit command - remove -z if */ #define DFTXMIT "uux - -z -r %s\\!rnews < %s" /* your uux can't do it */ . 13c static char *news_version = "@(#) defs.h 2.7 6/7/82"; . 10c * to be news_version below. . w q -*-END-*- ed - src/expire.c << '-*-END-*-' 188c if (verbose > 1) printf("link %s to %s\n", newname, filename); . 180a p = index(artlist, ','); } if (p == 0) { last = 1; . 170c while (*artlist == ' ' || *artlist == '\n' || *artlist == ',') . 135c if (h.expdate[0]) h.exptime = cgtdate(h.expdate); newtime = cgtdate(h.recdate) + expincr; . 110,111d 94c if (verbose > 2) . 83d 64c while (argc > 1 && argv[1][0] != '-') { . 20a time_t cgtdate(), time(); . 15c extern char filename[]; . 6c static char *SccsId = "@(#) expire.c 2.9 6/1/82"; . w q -*-END-*- ed - src/funcs.c << '-*-END-*-' 486a } static int hascaught = 0; static catchintr() { hascaught = 1; printf("\n"); fflush(stdout); } /* * Print a recorded message warning the poor luser what he is doing * and demand that he understands it before proceeding. Only do * this for newsgroups listed in LIBDIR/recording. */ recording(ngrps) char *ngrps; { char recbuf[100]; FILE *fd; char nglist[100], fname[100]; char lngrps[100]; char *oldsig; int c, n, yes; sprintf(recbuf, "%s/%s", LIB, "recording"); fd = fopen(recbuf, "r"); if (fd == NULL) return 0; strcpy(lngrps, ngrps); ngcat(lngrps); while ((fgets(recbuf, sizeof recbuf, fd)) != NULL) { sscanf(recbuf, "%s %s", nglist, fname); ngcat(nglist); if (ngmatch(lngrps, nglist)) { fclose(fd); fd = fopen(fname, "r"); while ((c = getc(fd)) != EOF) putc(c, stderr); hascaught = 0; oldsig = (char *) signal(SIGINT, catchintr); fprintf(stderr, "Do you understand this? Hit <return> to proceed, <DEL> to abort: "); n = read(2, recbuf, 100); c = recbuf[0]; yes = (c=='y' || c=='Y' || c=='\n' || c=='\n' || c==0); signal(SIGINT, oldsig); if (hascaught || n <= 0 || !yes) return -1; } } return 0; . 373c if (fgets(p, LBUFLEN, sysfile) == NULL) . 42,88d 5c static char *SccsId = "@(#) funcs.c 2.5 6/1/82"; . w q -*-END-*- ed - src/header.c << '-*-END-*-' 250a for (iu=0; iu<NUNREC; iu++) { if (hp->unrec[iu][0]) fprintf(fp, "%s", &hp->unrec[iu][0]); } . 233a int iu; . 199c if (!strncmp(ptr, "Control: ", 9)) . 134a if (unreccnt < NUNREC) { strcpy(&hp->unrec[unreccnt][0], bfr); unreccnt++; } . 94a #else getfield(&fromflag, hp->path); #endif . 92c sprintf(hp->path, "%s@%s", uname, site); . 90c #ifdef ATSIGN /* * This old code understood the "user at site" * notation but threw away all but the first * word of names (like your full name) so has * been taken out. */ sscanf(bfr, "%s %s %s %s", wordfrom, uname, at, site); . 86c curpos = ftell(fp); . 80a int unreccnt = 0; . 45c fgets(hp->title, BUFLEN, fp); /* title */ . 39c fgets(hp->path, BUFLEN, fp); /* source path */ . 35c fgets(hp->nbuf, BUFLEN, fp); /* newsgroup list */ . 27c if (((fgets(bfr, PATHLEN, fp) != NULL && *bfr >= 'A' && *bfr <= 'Z') && index(bfr, ':')) || !strncmp(bfr, "From ", 5)) . 5c static char *SccsId = "@(#) header.c 2.9 6/5/82"; . w q -*-END-*- ed - src/header.h << '-*-END-*-' 21a char unrec[NUNREC][BUFLEN]; /* unrecognized lines */ . 6a #define NUNREC 10 . 5c static char *Header = "@(#) header.h 2.5 6/5/82"; . w q -*-END-*- ed - src/iextern.c << '-*-END-*-' 39c char bfr[LBUFLEN]; /* general-use scratch area */ . 5c static char *SccsId = "@(#) iextern.c 2.2 6/1/82"; . w q -*-END-*- ed - src/ifuncs.c << '-*-END-*-' 388a } /* * Figure out who is sending the message and sign it. * We attempt to look up the user in the gecos field of /etc/passwd. * The Berkeley conventions (name first, & expands to login name) are * assumed. If a site stores weird stuff in gecos, like some account * number, too bad - local mods may be in order. */ char * gensender(un) char *un; { static char outbuf[100]; char inbuf[100]; struct passwd *pw; pw = getpwnam(un); if (pw == NULL) return un; buildfname(pw->pw_gecos, un, inbuf); if (inbuf[0] == 0) return un; sprintf(outbuf, "%s (%s)", un, inbuf); return outbuf; } /* ** BUILDFNAME -- build full name from gecos style entry. ** (routine lifted from sendmail) ** ** This routine interprets the strange entry that would appear ** in the GECOS field of the password file. ** ** Parameters: ** p -- name to build. ** login -- the login name of this user (for &). ** buf -- place to put the result. ** ** Returns: ** none. ** ** Side Effects: ** none. */ buildfname(p, login, buf) register char *p; char *login; char *buf; { register char *bp = buf; if (*p == '*') p++; while (*p != '\0' && *p != ',' && *p != ';' && *p != ':') { if (*p == '&') { strcpy(bp, login); *bp = toupper(*bp); while (*bp != '\0') bp++; p++; } else *bp++ = *p++; } *bp = '\0'; } /* * Check if header.nbuf contains only valid newsgroup names; * exit with error if not valid. * * a == TRUE means header.nbuf is subscription list * a == FALSE means header.nbuf is newsgroup list */ ngfcheck(a) int a; { char ngcheck[NGFSIZ]; /* Hold NGFILE newsgroups */ char tbuf[BUFLEN]; /* hold single header.nbuf news group */ register char *s1, *s2; register FILE *f; s1 = ngcheck; f = xfopen(NGFILE, "r"); while (fgets(bfr, BUFLEN, f) != NULL) { for (s2 = bfr; *s2 != '\0' && *s2 != ' ' && *s2 != '\t' && *s2 != ':' && *s2 != '\n';) { if (s1 >= &ngcheck[NGFSIZ-2]) xerror("NGFILE too long"); *s1++ = *s2++; } *s1++ = NGDELIM; } *s1 = '\0'; fclose(f); for (s1 = header.nbuf; *s1 != '\0';) { if (*s1 == NEGCHAR) s1++; s2 = tbuf; while ((*s2++ = *s1++) != NGDELIM) if (s1[-1] == ':') xerror("Newsgroup cannot contain ':'"); *s2 = '\0'; s2 = tbuf; if (!ngmatch(s2, ngcheck) && (!a || !ngmatch(ngcheck, s2))) { ngdel(s2); sprintf(bfr, "Bad news group \"%s\"", s2); newssave(stdin, NULL); xerror(bfr); } } . 380a if (access(logfname, 0)) { unlock(0); return; } . 321a char lockname[80]; idlock(str) char *str; { register int i; char tempname[80]; long now; struct stat sbuf; sprintf(tempname, "/tmp/LTMP.%d", getpid()); sprintf(lockname, "/tmp/L%s", str); close(creat(tempname, 0666)); i = 10*60; /* Keep trying for 10 minutes */ while (link(tempname, lockname)) { if (--i < 0) { unlink(tempname); sprintf(tempname, "Article %s locked up", str); xerror(tempname); } time(&now); i = stat(lockname, &sbuf); if (i < 0) { xerror("Directory permission problem in /tmp"); } if (sbuf.st_mtime + 10*60 < now) unlink(lockname); sleep((unsigned)60); } unlink(tempname); } idunlock() { unlink(lockname); } . 226c if (fd == NULL) from = xfopen(INFILE, "r"); else from = fd; . 217,218c newssave(fd, dummy) FILE *fd, *dummy; . 211a idunlock(); . 190a idlock(file); . 130,134c sprintf(bfr, DFTXMIT, sp->s_name, TRANS); . 112a if (ptr == 0) ptr = h.path-1; . 110d 5c static char *SccsId = "@(#) ifuncs.c 2.10 6/8/82"; . w q -*-END-*- ed - src/inews.c << '-*-END-*-' 505a setuid(duid); #endif . 503a setuid(getuid()); . 502c * to the setuid call above. The directories we just made are owned * by our real uid, so we have to temporarily set our effective uid * the same to allow the chown. Fortunately, USG lets us setuid back. . 498a #ifdef USG . 435c if (isprint(*cp) || isspace(*cp) || *cp=='\b') . 292,296c if (i == 0) exit(0); } /* Do the actual insertion. */ insert(); . 289d 208c strcpy(header.path, gensender(username)); . 200c if (strncmp(whatever, header.path, strlen(whatever)) && uid != ROOTID && uid != geteuid() && uid) . 198a if (!Dflag) { if (recording(header.nbuf)) { if (!tty) fwait(fsubr(newssave, stdin, NULL)); xerror("aborted due to recording"); } } if (!tty && mode != PROC) { i = fork(); if (i == 0) exit(0); } . 40a #define Dflag options[8].flag 'D', '\0', FALSE, UNPROC, UNKNOWN, filename, . 5c static char *SccsId = "@(#) inews.c 2.9 6/1/82"; . w q -*-END-*- ed - src/params.h << '-*-END-*-' 48c extern char bfr[LBUFLEN],username[BUFLEN],userhome[BUFLEN]; . 5c static char *Params = "@(#) params.h 2.2 6/1/82"; . w q -*-END-*- ed - src/postnews.usg << '-*-END-*-' 25c trap "sleep 1; rm -f $t; exit" 0 1 2 . 19c if test x$EDITOR = x . 14c if test x$ng = x ; then . 6c if test $# -eq 1 -a ! -r "$1" ; then . 1,2c : '@(#) postnews.usg 2.4 6/1/82' if test $# -gt 1 ; then . w q -*-END-*- ed - src/postnews.v7 << '-*-END-*-' 31c inews -t "$title" -n $ng < $1 . 27c inews -t "$title" -n $ng <$t . 25c trap "sleep 1; rm -f $t; exit" 0 1 2 . 19c if test x$EDITOR = x . 14c if test x$ng = x ; then . 6c if test $# -eq 1 -a ! -r "$1" ; then . 1,2c : '@(#) postnews.v7 2.4 6/1/82' if test $# -gt 1 ; then . w q -*-END-*- ed - src/process.c << '-*-END-*-' 69c len = LBUFLEN; . 53c fprintf(stderr, "Usage: readnews [ -a [ date ]] [ -n newsgroups ] [ -t titles ] [ -lprxhfM ]\n"); . 26c 'f', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL, . 24d 5c static char *SccsId = "@(#) process.c 2.4 6/7/82"; . w q -*-END-*- ed - src/readnews.c << '-*-END-*-' 194c while (!sigtrap && fgets(rcbuf, LBUFLEN, rcfp) != NULL) { . 151a rcreadok = TRUE; . 117c rcreadok = FALSE; while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) { . 115c myrc = getenv("NEWSRC"); if (myrc == NULL) myrc = NEWSRC; sprintf(newsrc, "%s/%s", userhome, myrc); . 37a char *myrc; . 5c static char *SccsId = "@(#) readnews.c 2.5 6/1/82"; . w q -*-END-*- ed - src/readr.c << '-*-END-*-' 928c sprintf(bfr, DFTXMIT, sp->s_name, TRANS); . 796c if (!isprogram) . 679c (c)ancel -[n] +[n] (f)ollowup (N)ext (u)nsubscribe (v)ersion\n"); . 606a if (recording(hptr->nbuf, 0)) break; . 604c signal(SIGINT, oldsig); . 600c oldsig = (char *) signal(SIGINT, catchintr); . 578c sprintf(bfr, "%s -D -F '%s' -n %s -t \'", INEWS, folbuf, ptr2); . 570a tfilename = hptr->title; ptr2 = hptr->nbuf; folbuf[0] = 0; if (hptr->followid) { strcpy(folbuf, hptr->followid); strcat(folbuf, " "); } strcat(folbuf, hptr->ident); . 564,568c hptr = &hbuf1; . 560,562c hptr = &h; . 449c sprintf(rcbuf, MAILER, hptr->title); sprintf(bfr, "%s %s", rcbuf, address); . 439a /* Strip off all but first word, to avoid * the full name (Joe Blow). */ ptr = index(rcbuf, ' '); if (ptr) *ptr = 0; . 420a /* * Play games stripping off multiple berknet * addresses (: or .) here. Should also strip * off multiple @ arpanet addresses, but I * think we should just wait for the sane world * of internet absolute addreses. */ . 416a *curberk = '\0'; . 410a tfilename = hptr->path; . 408,409d 406a hptr = &hbuf1; . 405c hptr = &h; . 380c strcpy(rcbuf, hptr->path); ptr1 = index(rcbuf, ' '); if (ptr1) *ptr1 = 0; i = strcmp(username, rcbuf); . 254a /* * Unsubscribe to the newsgroup and go on to next group */ case 'u': obit = -1; if (fp != NULL) { fclose(fp); fp = NULL; } if (cflag) clear(bit); else putc('\n', ofp); rfq = 0; zapng = TRUE; saveart; if (nextng()) { if (actdirect == BACKWARD) fprintf(ofp, "Can't back up.\n"); else goto getout; } break; /* Print the current version of news */ case 'v': fprintf(ofp, "News version: %s\n", news_version); break; . 252a fflush(ofp); } . 251c if (hflag) { . 143c if (access(filename, 4) || ((fp = fopen(filename, "r")) == NULL) || (hread(&h, fp) == NULL) || (!rfq && !select(&h))) { . 132a if (!rcreadok) xxit(0); . 41a char *oldsig; . 36c char folbuf[160]; . 5c static char *SccsId = "@(#) readr.c 2.10 6/8/82"; . w q -*-END-*- ed - src/rextern.c << '-*-END-*-' 65a int rcreadok = FALSE; /* NEWSRC has been read OK */ int zapng = FALSE; /* ! out this newsgroup on next updaterc */ . 38c char bfr[LBUFLEN]; /* general-use scratch area */ . 5c static char *SccsId = "@(#) rextern.c 2.2 6/1/82"; . w q -*-END-*- ed - src/rfuncs.c << '-*-END-*-' 306a } /* * Return TRUE if this article is a followup to something. */ isfol(hp) register struct hbuf *hp; { if (hp->followid[0]) return TRUE; if (strncmp(hp->title, "Re:", 3) == 0) return TRUE; return FALSE; . 305a if (fflag && isfol(hp)) return FALSE; . 296a /* * Return TRUE if the user has not ruled out this article. */ . 232c ptr[0] = oldptr; ptr[1] = ' '; . 223c ptr[0] = oldptr; ptr[1] = ' '; . 220c ptr--; oldptr = *ptr; ptr[0] = ':'; ptr[1] = '\0'; . 218d 216c if (index(rcbuf, ',') != NULL) ngdel(rcbuf); else if (index(rcbuf, '!') == NULL) . 198c sprintf(rcbuf, "%s%c ", groupdir, zapng ? '!' : ':'); zapng = FALSE; . 196a char oldptr; . 194c updaterc() { . 116c Mail() { . 72a if (oldptr == '!') { groupdir[0] = 0; return 1; } . 70a oldptr = *ptr; . 68c while (*ptr != ':' && *ptr != '!' && *ptr) . 62a } . 61c if (stat(groupdir, &statbuf)) { groupdir[0] = 0; . 56a char oldptr; . 5c static char *SccsId = "@(#) rfuncs.c 2.6 6/1/82"; . w q -*-END-*- ed - src/rparams.h << '-*-END-*-' 52c extern int actdirect, rcreadok, zapng; . 20a #define fflag options[11].flag . 5c static char *Rparams = "@(#) rparams.h 2.2 6/1/82"; . w q -*-END-*-