rick@seismo.CSS.GOV (Rick Adams) (12/04/87)
Description: This is patch #14 for news 2.11 src. It is expected to be stable and does not introduce major new features. Many minor cleanups. Changes to Makefile to make $(DESTDIR) work completely. sendbatch now supports MINDISKFREE and will not batch up news if there is not a least that much free space on /usr/spool. LOCKING is an acceptable define for those with the locking() call. recnews now avoids using popen and has its own routine to exec the command. This avoids having the shell interpreting special characters that we don't want it to. Fix: cd to the src directory and apply the following patch. Index: Makefile.dst Prereq: 1.28 *** .d/Makefile.dst Mon Nov 23 19:13:12 1987 --- Makefile.dst Tue Dec 1 18:51:32 1987 *************** *** 1,2 **** ! # '@(#)Makefile.dst 1.28 11/19/87' # Generic Makefile. --- 1,2 ---- ! # '@(#)Makefile.dst 1.30 12/1/87' # Generic Makefile. *************** *** 31,32 **** --- 31,34 ---- MAXPERBATCH = 1000000000 + MINDISKFREE = 0 + SPOOL_DISK = /usr/spool *************** *** 49,53 **** ! DEFS = -DRNEWS=\"$(BINDIR)/rnews\" -DSPOOLDIR=\"$(SPOOLDIR)\" \ ! -DBATCHDIR=\"$(BATCHDIR)\" -DLIBDIR=\"$(LIBDIR)\" \ ! -DBINDIR=\"$(BINDIR)\" -DNEWSUSR=\"$(NEWSUSR)\" \ -DNEWSGRP=\"$(NEWSGRP)\" ${SERVER} ${NFSCLIENT} --- 51,56 ---- ! DEFS = -DRNEWS=\"$(DESTDIR)$(BINDIR)/rnews\" \ ! -DSPOOLDIR=\"$(DESTDIR)$(SPOOLDIR)\" \ ! -DBATCHDIR=\"$(DESTDIR)$(BATCHDIR)\" -DLIBDIR=\"$(DESTDIR)$(LIBDIR)\" \ ! -DBINDIR=\"$(DESTDIR)$(BINDIR)\" -DNEWSUSR=\"$(NEWSUSR)\" \ -DNEWSGRP=\"$(NEWSGRP)\" ${SERVER} ${NFSCLIENT} *************** *** 71,73 **** #USG LIBS = ! #USG LINTFLAGS = ${DEFS} ${NETINCLUDE} #V7 CFLAGS = ${DEBUG} -DDBM ${DEFS} ${SCCSID} ${VFORK} ${NETINCLUDE} --- 74,76 ---- #USG LIBS = ! #USG LINTFLAGS = -DUSG ${DEFS} ${NETINCLUDE} #V7 CFLAGS = ${DEBUG} -DDBM ${DEFS} ${SCCSID} ${VFORK} ${NETINCLUDE} *************** *** 90,92 **** #VMS VFORK= ! #VMS FIXACTIVE = /etc/vmstounix $(LIBDIR)/active --- 93,95 ---- #VMS VFORK= ! #VMS FIXACTIVE = /etc/vmstounix $(DESTDIR)$(LIBDIR)/active *************** *** 191,194 **** fullupdate: install.sh makeactive.sh ! sh install.sh $(SPOOLDIR) $(LIBDIR) $(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE) ! chmod 6755 $(LIBDIR)/inews --- 194,197 ---- fullupdate: install.sh makeactive.sh ! sh install.sh $(DESTDIR)$(SPOOLDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(NEWSUSR) $(DESTDIR)$(NEWSGRP) $(DESTDIR)$(OSTYPE) ! chmod 6755 $(DESTDIR)$(LIBDIR)/inews *************** *** 195,199 **** nfsupdate: install.sh ! sh install.sh $(SPOOLDIR) $(LIBDIR) $(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE) $(NFSSPOOLDIR) $(NFSLIBDIR) ! chown root $(LIBDIR)/inews ! chmod 6755 $(LIBDIR)/inews --- 198,202 ---- nfsupdate: install.sh ! sh install.sh $(DESTDIR)$(SPOOLDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(BINDIR) $(DESTDIR)$(NEWSUSR) $(DESTDIR)$(NEWSGRP) $(DESTDIR)$(OSTYPE) $(DESTDIR)$(NFSSPOOLDIR) $(DESTDIR)$(NFSLIBDIR) ! chown root $(DESTDIR)$(LIBDIR)/inews ! chmod 6755 $(DESTDIR)$(LIBDIR)/inews *************** *** 205,215 **** lint: ilint vlint rlint elint plint olint ! ilint: defs.h params.h iparams.h header.h $(ISRCS) pathinit.c lint $(LINTFLAGS) $(ISRCS) -DINEW pathinit.c ! vlint: defs.h params.h rparams.h header.h $(VSRCS) pathinit.c lint $(LINTFLAGS) $(VSRCS) -DREAD pathinit.c ! rlint: defs.h params.h rparams.h header.h $(RSRCS) pathinit.c lint $(LINTFLAGS) $(RSRCS) -DREAD pathinit.c ! elint: defs.h params.h iparams.h header.h $(ESRCS) pathinit.c lint $(LINTFLAGS) $(ESRCS) -DEXP pathinit.c ! plint: defs.h params.h iparams.h header.h $(PSRCS) pathinit.c lint $(LINTFLAGS) $(PSRCS) -DREAD pathinit.c --- 208,218 ---- lint: ilint vlint rlint elint plint olint ! ilint: defs.h params.h iparams.h header.h patchlevel.h $(ISRCS) pathinit.c lint $(LINTFLAGS) $(ISRCS) -DINEW pathinit.c ! vlint: defs.h params.h rparams.h header.h patchlevel.h $(VSRCS) pathinit.c lint $(LINTFLAGS) $(VSRCS) -DREAD pathinit.c ! rlint: defs.h params.h rparams.h header.h patchlevel.h $(RSRCS) pathinit.c lint $(LINTFLAGS) $(RSRCS) -DREAD pathinit.c ! elint: defs.h params.h iparams.h header.h patchlevel.h $(ESRCS) pathinit.c lint $(LINTFLAGS) $(ESRCS) -DEXP pathinit.c ! plint: defs.h params.h iparams.h header.h patchlevel.h $(PSRCS) pathinit.c lint $(LINTFLAGS) $(PSRCS) -DREAD pathinit.c *************** *** 226,228 **** readnews: $(P) $(ROBJECTS) ! $(CC) $(LFLAGS) $(ROBJECTS) -o readnews $(LIBS) $(NETLIB) #VMS mv readnews.exe readnews --- 229,231 ---- readnews: $(P) $(ROBJECTS) ! $(CC) $(LFLAGS) $(ROBJECTS) -o readnews $(NETLIB) $(LIBS) #VMS mv readnews.exe readnews *************** *** 258,260 **** postnews: $(P) $(POBJECTS) ! $(CC) $(CFLAGS) $(LFLAGS) $(POBJECTS) -o postnews $(NETLIB) #VMS mv postnews.exe postnews --- 261,263 ---- postnews: $(P) $(POBJECTS) ! $(CC) $(CFLAGS) $(LFLAGS) $(POBJECTS) -o postnews $(NETLIB) $(LIBS) #VMS mv postnews.exe postnews *************** *** 283,285 **** vnews: $(P) $(VOBJECTS) ! $(CC) $(LFLAGS) $(VOBJECTS) -o $@ $(TERMLIB) $(LIBS) $(NETLIB) #VMS mv vnews.exe vnews --- 286,288 ---- vnews: $(P) $(VOBJECTS) ! $(CC) $(LFLAGS) $(VOBJECTS) -o $@ $(TERMLIB) $(NETLIB) $(LIBS) #VMS mv vnews.exe vnews *************** *** 302,304 **** uurec: uurec.c defs.h Makefile ! $(CC) $(CFLAGS) $(LFLAGS) uurec.c -o uurec #VMS mv uurec.exe uurec --- 305,307 ---- uurec: uurec.c defs.h Makefile ! $(CC) $(CFLAGS) $(LFLAGS) uurec.c -o uurec $(LIBS) #VMS mv uurec.exe uurec *************** *** 306,308 **** recnews: recnews.c defs.h header.h params.h Makefile ! $(CC) $(CFLAGS) $(LFLAGS) recnews.c -o recnews #VMS mv recnews.exe recnews --- 309,311 ---- recnews: recnews.c defs.h header.h params.h Makefile ! $(CC) $(CFLAGS) $(LFLAGS) recnews.c -o recnews $(LIBS) #VMS mv recnews.exe recnews *************** *** 310,312 **** sendnews: sendnews.o defs.h ! $(CC) $(LFLAGS) sendnews.o -o sendnews #VMS mv sendnews.exe sendnews --- 313,315 ---- sendnews: sendnews.o defs.h ! $(CC) $(LFLAGS) sendnews.o -o sendnews $(LIBS) #VMS mv sendnews.exe sendnews *************** *** 314,316 **** batch: batch.c Makefile defs.h ! $(CC) $(CFLAGS) $(LFLAGS) batch.c -o batch #VMS mv batch.exe batch --- 317,319 ---- batch: batch.c Makefile defs.h ! $(CC) $(CFLAGS) $(LFLAGS) batch.c -o batch $(LIBS) #VMS mv batch.exe batch *************** *** 318,320 **** encode: encode.c ! $(CC) $(CFLAGS) $(LFLAGS) encode.c -o encode #VMS mv encode.exe encode --- 321,323 ---- encode: encode.c ! $(CC) $(CFLAGS) $(LFLAGS) encode.c -o encode $(LIBS) #VMS mv encode.exe encode *************** *** 322,324 **** decode: decode.c ! $(CC) $(CFLAGS) $(LFLAGS) decode.c -o decode #VMS mv decode.exe decode --- 325,327 ---- decode: decode.c ! $(CC) $(CFLAGS) $(LFLAGS) decode.c -o decode $(LIBS) #VMS mv decode.exe decode *************** *** 326,328 **** caesar: caesar.c Makefile ! $(CC) $(CFLAGS) $(LFLAGS) caesar.c -o caesar -lm #VMS mv caesar.exe caesar --- 329,331 ---- caesar: caesar.c Makefile ! $(CC) $(CFLAGS) $(LFLAGS) caesar.c -o caesar -lm $(LIBS) #VMS mv caesar.exe caesar *************** *** 330,332 **** compress: compress.c ! $(CC) $(CFLAGS) $(LFLAGS) -o compress compress.c #VMS mv compress.exe compress --- 333,335 ---- compress: compress.c ! $(CC) $(CFLAGS) $(LFLAGS) -o compress compress.c $(LIBS) #VMS mv compress.exe compress *************** *** 334,336 **** recmail: recmail.c defs.h params.h header.h ! $(CC) $(CFLAGS) $(LFLAGS) recmail.c -o recmail #VMS mv recmail.exe recmail --- 337,339 ---- recmail: recmail.c defs.h params.h header.h ! $(CC) $(CFLAGS) $(LFLAGS) recmail.c -o recmail $(LIBS) #VMS mv recmail.exe recmail *************** *** 341,343 **** checknews: $(P) checknews.o process.o cpathinit.o rextern.o $(NNTP) $(CLIENTLIB) ! $(CC) $(LFLAGS) checknews.o process.o cpathinit.o rextern.o $(NNTP) $(CLIENTLIB) -o checknews $(NETLIB) #VMS mv checknews.exe checknews --- 344,346 ---- checknews: $(P) checknews.o process.o cpathinit.o rextern.o $(NNTP) $(CLIENTLIB) ! $(CC) $(LFLAGS) checknews.o process.o cpathinit.o rextern.o $(NNTP) $(CLIENTLIB) -o checknews $(NETLIB) $(LIBS) #VMS mv checknews.exe checknews *************** *** 345,347 **** sendbatch: sendbatch.sh Makefile ! sed -e "s%LIBDIR%$(LIBDIR)%g" \ -e "s%UUXFLAGS%$(UUXFLAGS)%g" \ --- 348,350 ---- sendbatch: sendbatch.sh Makefile ! sed -e "s%LIBDIR%$(DESTDIR)$(LIBDIR)%g" \ -e "s%UUXFLAGS%$(UUXFLAGS)%g" \ *************** *** 348,350 **** -e "s%MAXPERBATCH%$(MAXPERBATCH)%g" \ ! -e "s%BATCHDIR%$(BATCHDIR)%g" sendbatch.sh > sendbatch #VMS /etc/unixtovms sendbatch --- 351,355 ---- -e "s%MAXPERBATCH%$(MAXPERBATCH)%g" \ ! -e "s%MINDISKFREE%$(MINDISKFREE)%g" \ ! -e "s%SPOOL_DISK%$(SPOOL_DISK)%g" \ ! -e "s%BATCHDIR%$(DESTDIR)$(BATCHDIR)%g" sendbatch.sh > sendbatch #VMS /etc/unixtovms sendbatch *************** *** 352,356 **** rmgroup: rmgroup.sh Makefile ! sed -e "s%LIBDIR%$(LIBDIR)%g" \ -e "s%FIXACTIVE%$(FIXACTIVE)%g" \ ! -e "s%SPOOLDIR%$(SPOOLDIR)%g" rmgroup.sh > rmgroup #VMS /etc/unixtovms rmgroup --- 357,361 ---- rmgroup: rmgroup.sh Makefile ! sed -e "s%LIBDIR%$(DESTDIR)$(LIBDIR)%g" \ -e "s%FIXACTIVE%$(FIXACTIVE)%g" \ ! -e "s%SPOOLDIR%$(DESTDIR)$(SPOOLDIR)%g" rmgroup.sh > rmgroup #VMS /etc/unixtovms rmgroup *************** *** 358,360 **** checkgroups: checkgroups.sh Makefile ! sed -e "s%LIBDIR%$(LIBDIR)%g" checkgroups.sh > checkgroups #VMS /etc/unixtovms checkgroups --- 363,365 ---- checkgroups: checkgroups.sh Makefile ! sed -e "s%LIBDIR%$(DESTDIR)$(LIBDIR)%g" checkgroups.sh > checkgroups #VMS /etc/unixtovms checkgroups *************** *** 400,411 **** ! $(LIBDIR): ! mkdir $(LIBDIR) ! chmod 755 $(LIBDIR) ! chown $(NEWSUSR) $(LIBDIR) ! chgrp $(NEWSGRP) $(LIBDIR) ! $(BINDIR): ! mkdir $(BINDIR) ! chmod 755 $(BINDIR) ! chown $(NEWSUSR) $(BINDIR) ! chgrp $(NEWSGRP) $(BINDIR) --- 405,416 ---- ! $(DESTDIR)$(LIBDIR): ! mkdir $(DESTDIR)$(LIBDIR) ! chmod 755 $(DESTDIR)$(LIBDIR) ! chown $(NEWSUSR) $(DESTDIR)$(LIBDIR) ! chgrp $(NEWSGRP) $(DESTDIR)$(LIBDIR) ! $(DESTDIR)$(BINDIR): ! mkdir $(DESTDIR)$(BINDIR) ! chmod 755 $(DESTDIR)$(BINDIR) ! chown $(NEWSUSR) $(DESTDIR)$(BINDIR) ! chgrp $(NEWSGRP) $(DESTDIR)$(BINDIR) Index: batch.c Prereq: 1.19 *** .d/batch.c Thu Oct 8 00:19:06 1987 --- batch.c Mon Nov 30 18:47:06 1987 *************** *** 34,36 **** #ifdef SCCSID ! static char *SccsId = "@(#)batch.c 1.19 10/7/87"; #endif /* SCCSID */ --- 34,36 ---- #ifdef SCCSID ! static char *SccsId = "@(#)batch.c 1.20 11/30/87"; #endif /* SCCSID */ *************** *** 113,116 **** *cp = '\n'; ! if (sbuf.st_size == 0) continue; nbytes += sbuf.st_size; --- 113,118 ---- *cp = '\n'; ! if (sbuf.st_size == 0) { ! (void) fclose(nfd); continue; + } nbytes += sbuf.st_size; *************** *** 213,215 **** ! #if !defined(BSD4_2) rename(from, to) --- 215,217 ---- ! #ifndef RENAMESUB rename(from, to) *************** *** 224,225 **** } ! #endif /* !BSD4_2 */ --- 226,227 ---- } ! #endif /* !RENAMESUB */ Index: checknews.c Prereq: 2.30 *** .d/checknews.c Sun Oct 18 18:02:57 1987 --- checknews.c Mon Nov 30 18:47:07 1987 *************** *** 18,20 **** #ifdef SCCSID ! static char *SccsId = "@(#)checknews.c 2.30 10/15/87"; #endif /* SCCSID */ --- 18,20 ---- #ifdef SCCSID ! static char *SccsId = "@(#)checknews.c 2.31 11/30/87"; #endif /* SCCSID */ *************** *** 266,275 **** continue; - if (index(rcbuf, ',') != NULL) { - if (verbose > 1) - printf("Comma in %s newsrc line\n", bfr); - else { - isnews++; - continue; - } - } while (*ptr) --- 266,267 ---- *************** *** 296,298 **** } ! contin:; } --- 288,297 ---- } ! if (index(rcbuf, ',') != NULL) { ! if (verbose > 1) ! printf("Comma in %s newsrc line\n", bfr); ! else { ! isnews++; ! continue; ! } ! } } Index: defs.dist Prereq: 2.60 *** .d/defs.dist Mon Nov 23 19:13:15 1987 --- defs.dist Mon Nov 30 18:46:35 1987 *************** *** 16,18 **** ! /* @(#)defs.dist 2.60 11/19/87 */ --- 16,18 ---- ! /* @(#)defs.dist 2.61 11/30/87 */ *************** *** 70,71 **** --- 70,72 ---- /* #define LOCKF /* If you have the lockf() sys call */ + /* #define LOCKING /* If you have the locking() sys call */ /* #define DOGETUSER /* Always do 'getuser' so can't fake name */ *************** *** 74,75 **** --- 75,77 ---- /* #define READDIR /* your system has readdir() in libc */ + /* #define RENAMESUB /* your system has rename() in libc */ /* #define ALWAYSALIAS /* temporary kludge for conversion */ Index: expire.c Prereq: 2.56 *** .d/expire.c Wed Nov 4 14:56:58 1987 --- expire.c Mon Nov 30 18:47:10 1987 *************** *** 19,21 **** #ifdef SCCSID ! static char *SccsId = "@(#)expire.c 2.56 11/4/87"; #endif /* SCCSID */ --- 19,21 ---- #ifdef SCCSID ! static char *SccsId = "@(#)expire.c 2.57 11/30/87"; #endif /* SCCSID */ *************** *** 97,99 **** struct hbuf h; ! int rmlock(); time_t today; --- 97,99 ---- struct hbuf h; ! int xxit(); time_t today; *************** *** 114,116 **** ! uid = pw->pw_uid; if ((gp = getgrnam(NEWSGRP)) == NULL) --- 114,116 ---- ! duid = uid = pw->pw_uid; if ((gp = getgrnam(NEWSGRP)) == NULL) *************** *** 117,119 **** xerror("Cannot get NEWSGRP gr entry"); ! gid = gp->gr_gid; (void) setgid(gid); --- 117,119 ---- xerror("Cannot get NEWSGRP gr entry"); ! dgid = gid = gp->gr_gid; (void) setgid(gid); *************** *** 122,126 **** if (signal(SIGHUP, SIG_IGN) != SIG_IGN) ! signal(SIGHUP, rmlock); if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! signal(SIGINT, rmlock); expincr = DFLTEXP; --- 122,128 ---- if (signal(SIGHUP, SIG_IGN) != SIG_IGN) ! signal(SIGHUP, xxit); if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! signal(SIGINT, xxit); ! if (signal(SIGTERM, SIG_IGN) != SIG_IGN) ! signal(SIGTERM, xxit); expincr = DFLTEXP; *************** *** 1205,1206 **** --- 1207,1220 ---- { + if (i) { + #ifdef DBM + char tempname[BUFLEN]; + (void) UNLINK(NARTFILE); + (void) sprintf(tempname,"%s.pag", NARTFILE); + (void) UNLINK(tempname); + (void) sprintf(tempname,"%s.dir", NARTFILE); + (void) UNLINK(tempname); + #else /* !DBM */ + (void) UNLINK(ARTFILE); + #endif /* !DBM */ + } rmlock(); Index: funcs.c Prereq: 2.37 *** .d/funcs.c Mon Nov 23 19:13:17 1987 --- funcs.c Mon Nov 30 18:46:37 1987 *************** *** 18,20 **** #ifdef SCCSID ! static char *SccsId = "@(#)funcs.c 2.37 11/19/87"; #endif /* SCCSID */ --- 18,20 ---- #ifdef SCCSID ! static char *SccsId = "@(#)funcs.c 2.38 11/30/87"; #endif /* SCCSID */ *************** *** 25,27 **** #include <errno.h> ! #if defined(USG) || defined(BSD4_2) || defined(BSD4_1C) #include <fcntl.h> --- 25,27 ---- #include <errno.h> ! #if defined(USG) || defined(BSD4_2) #include <fcntl.h> *************** *** 432,434 **** if (access(logfname, 0) == 0 && (logfile = fopen(logfname, "a")) != NULL) { ! #if defined(USG) || defined(BSD4_2) || defined(BSD4_1C) int flags; --- 432,434 ---- if (access(logfname, 0) == 0 && (logfile = fopen(logfname, "a")) != NULL) { ! #if defined(USG) || defined(BSD4_2) int flags; *************** *** 522,524 **** ! #if !defined(BSD4_2) && !defined(BSD4_1C) /* --- 522,524 ---- ! #ifdef MKDIRSUB /* *************** *** 581,583 **** } ! #endif /* !BSD4_2 && ! BSD4_1C */ #ifndef USG --- 581,597 ---- } ! #endif /* !BSD4_2 */ ! ! #ifndef RENAMESUB ! rename(from,to) ! register char *from, *to; ! { ! (void) unlink(to); ! if (link(from, to) < 0) ! return -1; ! ! (void) unlink(from); ! return 0; ! } ! #endif /* !RENAMESUB */ ! #ifndef USG Index: funcs2.c Prereq: 1.23 *** .d/funcs2.c Wed Nov 4 14:57:12 1987 --- funcs2.c Mon Nov 30 18:47:13 1987 *************** *** 19,21 **** #ifdef SCCSID ! static char *SccsId = "@(#)funcs2.c 1.23 11/4/87"; #endif /* SCCSID */ --- 19,21 ---- #ifdef SCCSID ! static char *SccsId = "@(#)funcs2.c 1.24 11/30/87"; #endif /* SCCSID */ *************** *** 681,695 **** #endif - - #if !defined(BSD4_2) - rename(from,to) - register char *from, *to; - { - (void) unlink(to); - if (link(from, to) < 0) - return -1; - - (void) unlink(from); - return 0; - } - #endif /* !BSD4_2 */ --- 681,682 ---- Index: getdate.y Prereq: 2.16 *** .d/getdate.y Wed Oct 7 16:51:38 1987 --- getdate.y Mon Nov 30 18:47:14 1987 *************** *** 5,7 **** /* University of North Carolina at Chapel Hill */ ! /* @(#)getdate.y 2.16 9/24/87 */ --- 5,7 ---- /* University of North Carolina at Chapel Hill */ ! /* @(#)getdate.y 2.17 11/30/87 */ *************** *** 559,561 **** ! return sdate; } --- 559,565 ---- ! /* ! ** Have to do *something* with a legitimate -1 so it's distinguishable ! ** from the error return value. (Alternately could set errno on error.) ! */ ! return (sdate == -1) ? 0 : sdate; } Index: ifuncs.c Prereq: 2.67 *** .d/ifuncs.c Mon Nov 23 19:13:21 1987 --- ifuncs.c Tue Dec 1 16:29:57 1987 *************** *** 18,20 **** #ifdef SCCSID ! static char *SccsId = "@(#)ifuncs.c 2.67 11/19/87"; #endif /* SCCSID */ --- 18,20 ---- #ifdef SCCSID ! static char *SccsId = "@(#)ifuncs.c 2.69 12/1/87"; #endif /* SCCSID */ *************** *** 407,409 **** } else { ! ofp = xfopen(mktemp(TRANS), "w"); if (afmt) { --- 407,410 ---- } else { ! MKTEMP(TRANS); ! ofp = xfopen(TRANS, "w"); if (afmt) { *************** *** 726,728 **** (void) strcpy(tempname, "/tmp/LTMP.XXXXXX"); ! (void) mktemp(tempname); (void) strcpy(lockname, "/tmp/L"); --- 727,729 ---- (void) strcpy(tempname, "/tmp/LTMP.XXXXXX"); ! MKTEMP(tempname); (void) strcpy(lockname, "/tmp/L"); *************** *** 1112,1114 **** free(ngs[i]); ! if (ngsbug[i] < tbuf || ngsbug[i] > &tbuf[sizeof tbuf - 1]) free(ngsbug[i]); --- 1113,1116 ---- free(ngs[i]); ! if (ngsbug[i] != NULL && ! (ngsbug[i] < tbuf || ngsbug[i] > &tbuf[sizeof tbuf - 1])) free(ngsbug[i]); *************** *** 1140,1145 **** mfd = fopen(mfn, "r"); ! if (mfd != NULL) ! while ((!ret) && fscanf(mfd, "%[^:]:%s\n", mgrp, mlist) != EOF) { ! if (feof(mfd)) break; ! if (mgrp[0] == '#') continue; if (!STRCMP(ngname, mgrp)) { --- 1142,1150 ---- mfd = fopen(mfn, "r"); ! if (mfd == NULL) ! return FALSE; ! while ((!ret) && fscanf(mfd, "%[^:]:%s\n", mgrp, mlist) != EOF) { ! if (feof(mfd)) ! break; ! if (mgrp[0] == '#') ! continue; if (!STRCMP(ngname, mgrp)) { *************** *** 1147,1161 **** && (ret == FALSE)) { ! if (*p == ',') { *p = '\0'; - p++; - } - if (*p == '\\') { - *p = '\0'; - p++; - if (!grplist) - grplist = getgrplist(user); - if (ngmatch(p,grplist)) ret = TRUE; - } else if (!STRCMP(p, user)) - ret = TRUE; - *p = '\0'; } --- 1152,1164 ---- && (ret == FALSE)) { ! if (*p == ',') ! *p++ = '\0'; ! if (*p == '\\') { ! *p++ = '\0'; ! if (!grplist) ! grplist = getgrplist(user); ! if (ngmatch(p,grplist)) ! ret = TRUE; ! } else if (!STRCMP(p, user)) ! ret = TRUE; *p = '\0'; } *************** *** 1303,1306 **** break; /* fits in buffer */ ! if (!tfilename) ! tfilename = mktemp("/tmp/unbnewsXXXXXX"); if ((fd = creat(tfilename, 0666)) < 0) { --- 1306,1311 ---- break; /* fits in buffer */ ! if (!tfilename) { ! tfilename = "/tmp/unbnewsXXXXXX"; ! MKTEMP(tfilename); ! } if ((fd = creat(tfilename, 0666)) < 0) { *************** *** 1385,1387 **** while ((wpid = wait(&exstat)) >= 0 && wpid != pid); ! (void) unlink(tfilename); } while (fgets(cmd, BUFLEN, infp) != NULL); --- 1390,1393 ---- while ((wpid = wait(&exstat)) >= 0 && wpid != pid); ! if (tfilename) ! (void) unlink(tfilename); } while (fgets(cmd, BUFLEN, infp) != NULL); Index: inews.c Prereq: 2.84 *** .d/inews.c Mon Nov 23 19:13:24 1987 --- inews.c Mon Nov 30 18:46:43 1987 *************** *** 19,21 **** #ifdef SCCSID ! static char *SccsId = "@(#)inews.c 2.84 11/19/87"; #endif /* SCCSID */ --- 19,21 ---- #ifdef SCCSID ! static char *SccsId = "@(#)inews.c 2.85 11/30/87"; #endif /* SCCSID */ *************** *** 100,102 **** FILE *mailhdr(); ! extern int errno; --- 100,102 ---- FILE *mailhdr(); ! extern int errno, xxit(); *************** *** 187,188 **** --- 187,189 ---- } + (void) signal(SIGTERM, xxit); if (argc > 1 && !STRCMP(*(argv+1), "-U")) { *************** *** 676,678 **** (void) sprintf(sfile, "%s/.spXXXXXX", SPOOL); ! sp = xfopen(mktemp(sfile), "w"); if (batchcmd != NULL) { --- 677,680 ---- (void) sprintf(sfile, "%s/.spXXXXXX", SPOOL); ! MKTEMP(sfile); ! sp = xfopen(sfile, "w"); if (batchcmd != NULL) { *************** *** 933,935 **** /* Write article to temp file. */ ! tfp = xfopen(mktemp(ARTICLE), "w"); --- 935,938 ---- /* Write article to temp file. */ ! MKTEMP(ARTICLE); ! tfp = xfopen(ARTICLE, "w"); *************** *** 1157,1159 **** ! tmpfp = xfopen(mktemp(INFILE), "w"); for ( ; ; ) { --- 1160,1163 ---- ! MKTEMP(INFILE); ! tmpfp = xfopen(INFILE, "w"); for ( ; ; ) { Index: nntp.c Prereq: 2.3 *** .d/nntp.c Wed Nov 4 14:57:39 1987 --- nntp.c Mon Nov 30 18:47:16 1987 *************** *** 16,18 **** #ifdef SCCSID ! static char *SccsId = "@(#)nntp.c 2.3 11/4/87"; #endif /* SCCSID */ --- 16,18 ---- #ifdef SCCSID ! static char *SccsId = "@(#)nntp.c 2.4 11/30/87"; #endif /* SCCSID */ *************** *** 79,81 **** strcpy(active_file_name, "/tmp/nsact.XXXXXX"); ! (void) mktemp(active_file_name); /* make a temporary name */ openfp = fopen(active_file_name, "w+"); /* and get ready */ --- 79,81 ---- strcpy(active_file_name, "/tmp/nsact.XXXXXX"); ! MKTEMP(active_file_name); /* make a temporary name */ openfp = fopen(active_file_name, "w+"); /* and get ready */ *************** *** 236,237 **** --- 236,238 ---- */ + void sync_server() Index: params.h Prereq: 2.27 *** .d/params.h Mon Nov 23 19:13:28 1987 --- params.h Mon Nov 30 18:46:45 1987 *************** *** 4,6 **** ! /* @(#)params.h 2.27 11/19/87 */ --- 4,6 ---- ! /* @(#)params.h 2.28 11/30/87 */ *************** *** 16,18 **** ! #if defined(BSD4_2) || defined(BSD4_1C) #include <sys/time.h> --- 16,18 ---- ! #ifdef BSD4_2 #include <sys/time.h> *************** *** 87,89 **** extern struct passwd *getpwnam(), *getpwuid(), *getpwent(); ! extern struct group *getgrnam(); extern time_t time(), getdate(), cgtdate(); --- 87,90 ---- extern struct passwd *getpwnam(), *getpwuid(), *getpwent(); ! extern struct group *getgrnam(), *getgrent(); ! extern void setgrent(); extern time_t time(), getdate(), cgtdate(); *************** *** 127,128 **** --- 128,136 ---- #ifdef M_XENIX + #define LOCKING + #endif M_XENIX + + #ifdef LOCKING + # ifndef LOCKF + # define LOCKF + # endif /* LOCKF */ /* fake SVID adivsory locking with xenix routines */ *************** *** 132,134 **** #define F_TLOCK 4 ! #endif /* M_XENIX */ --- 140,142 ---- #define F_TLOCK 4 ! #endif /* LOCKING */ *************** *** 135,137 **** #ifdef IHCC ! #define DOGETUSERS #define LOGDIR --- 143,145 ---- #ifdef IHCC ! #define DOGETUSER #define LOGDIR *************** *** 140,143 **** #ifdef BSD4_2 ! #define MKDIR_SUB #define READDIR #endif /* BSD4_2 */ --- 148,152 ---- #ifdef BSD4_2 ! #define MKDIRSUB #define READDIR + #define RENAMESUB #endif /* BSD4_2 */ *************** *** 161,162 **** --- 170,172 ---- #define PREFIX(a,b) ((charmap[*(a)] != charmap[*(b)]) ? FALSE : prefix((a)+1, (b)+1)) + #define MKTEMP(a) {if (mktemp(a) == 0) xerror("mktemp(%s): ", a);} Index: postnews.c Prereq: 1.35 *** .d/postnews.c Mon Nov 23 19:13:31 1987 --- postnews.c Mon Nov 30 18:46:47 1987 *************** *** 19,21 **** #ifdef SCCSID ! static char *SccsId = "@(#)postnews.c 1.35 11/19/87"; #endif /* SCCSID */ --- 19,21 ---- #ifdef SCCSID ! static char *SccsId = "@(#)postnews.c 1.36 11/30/87"; #endif /* SCCSID */ *************** *** 449,451 **** (void) strcpy(tempfname, "/tmp/postXXXXXX"); ! (void) mktemp(tempfname); --- 449,451 ---- (void) strcpy(tempfname, "/tmp/postXXXXXX"); ! MKTEMP(tempfname); *************** *** 887,889 **** ! mktemp(temp2fname); --- 887,889 ---- ! MKTEMP(temp2fname); *************** *** 1115,1118 **** ! (void) mktemp(headerfile); ! (void) mktemp(codedfile); --- 1115,1118 ---- ! MKTEMP(headerfile); ! MKTEMP(codedfile); *************** *** 1201,1214 **** } - - #if !defined(BSD4_2) - rename(from,to) - register char *from, *to; - { - (void) unlink(to); - if (link(from, to) < 0) - return -1; - - (void) unlink(from); - return 0; - } - #endif /* !BSD4_2 && ! BSD4_1C */ --- 1201 ---- Index: process.c Prereq: 2.18 *** .d/process.c Mon Nov 23 19:13:32 1987 --- process.c Mon Nov 30 18:46:48 1987 *************** *** 18,20 **** #ifdef SCCSID ! static char *SccsId = "@(#)process.c 2.18 11/19/87"; #endif /* SCCSID */ --- 18,20 ---- #ifdef SCCSID ! static char *SccsId = "@(#)process.c 2.19 11/30/87"; #endif /* SCCSID */ *************** *** 40,42 **** 'h', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL, - 'A', '\0', FALSE, OPTION, UNKNOWN, UNKNOWN,(char *)NULL, #ifdef TMAIL --- 40,41 ---- *************** *** 50,51 **** --- 49,51 ---- 'K', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL, + 'A', '\0', FALSE, OPTION, UNKNOWN, UNKNOWN,(char *)NULL, '\0', '\0', 0, 0, 0, 0, (char *)NULL Index: readr.c Prereq: 2.65 *** .d/readr.c Wed Nov 4 14:58:08 1987 --- readr.c Mon Nov 30 18:47:21 1987 *************** *** 18,20 **** #ifdef SCCSID ! static char *SccsId = "@(#)readr.c 2.65 11/4/87"; #endif /* SCCSID */ --- 18,20 ---- #ifdef SCCSID ! static char *SccsId = "@(#)readr.c 2.66 11/30/87"; #endif /* SCCSID */ *************** *** 118,120 **** (void) umask(022); ! (void) mktemp(outfile); /* get "unique" file name */ (void) close(creat(outfile,0666)); --- 118,120 ---- (void) umask(022); ! MKTEMP(outfile); /* get "unique" file name */ (void) close(creat(outfile,0666)); *************** *** 776,778 **** (void) strcpy(tf, tft); ! (void) mktemp(tf); --- 776,778 ---- (void) strcpy(tf, tft); ! MKTEMP(tf); Index: recnews.c Prereq: 2.16 *** .d/recnews.c Mon Nov 23 19:13:33 1987 --- recnews.c Fri Dec 4 02:47:46 1987 *************** *** 50,52 **** #ifdef SCCSID ! static char *SccsId = "@(#)recnews.c 2.16 11/19/87"; #endif /* SCCSID */ --- 50,52 ---- #ifdef SCCSID ! static char *SccsId = "@(#)recnews.c 2.18 12/4/87"; #endif /* SCCSID */ *************** *** 96,98 **** int fromset; /* from passed on command line */ ! char cmdbuf[BFSZ]; /* command to popen */ --- 96,98 ---- int fromset; /* from passed on command line */ ! char cmdbuf[BFSZ]; /* command to pipeopen */ *************** *** 99,101 **** extern char *strcat(), *strcpy(), *index(); ! extern FILE *popen(); char *any(); --- 99,101 ---- extern char *strcat(), *strcpy(), *index(); ! FILE *pipeopen(); char *any(); *************** *** 183,186 **** case INCLUSIVE: ! sprintf(cmdbuf,"exec %s%s -p", inews, not_this_site); ! pipe = popen(cmdbuf,"w"); if (pipe == NULL){ --- 183,186 ---- case INCLUSIVE: ! sprintf(cmdbuf,"%s%s -p", inews, not_this_site); ! pipe = pipeopen(cmdbuf); if (pipe == NULL){ *************** *** 203,205 **** sprintf(cmdbuf, ! "exec %s -t \"%s\" -n \"%s\" -f \"%s\"%s%s", inews, *subject ? subject : "(none)", --- 203,205 ---- sprintf(cmdbuf, ! "%s -t \"%s\" -n \"%s\" -f \"%s\"%s%s", inews, *subject ? subject : "(none)", *************** *** 210,214 **** #else ! pipe = popen(cmdbuf, "w"); if (pipe == NULL) { ! perror("recnews: popen failed"); exit(1); --- 210,214 ---- #else ! pipe = pipeopen(cmdbuf); if (pipe == NULL) { ! perror("recnews: pipeopen failed"); exit(1); *************** *** 231,233 **** sprintf(cmdbuf, ! "exec \"%s\" -t \"%s\" -n \"%s\" -f \"%s\"%s%s", inews, subject, newsgroup, from, approved, --- 231,233 ---- sprintf(cmdbuf, ! "%s -t \"%s\" -n \"%s\" -f \"%s\"%s%s", inews, subject, newsgroup, from, approved, *************** *** 238,240 **** #else ! pipe = popen(cmdbuf, "w"); if (pipe == NULL) { --- 238,240 ---- #else ! pipe = pipeopen(cmdbuf); if (pipe == NULL) { *************** *** 251,252 **** --- 251,253 ---- } + pipeclose(pipe); exit(0); *************** *** 340,341 **** --- 341,436 ---- return(NULL); + } + + /* + * This is similar to open, but made more secure. Rather than + * forking off a shell, you get a bare process. + * You can use "" to get white space into an argument, but + * nothing else is recognized + */ + + #define RDR 0 + #define WTR 1 + #define MAXARGS 20 + static int mopen_pid[20]; + + FILE * + pipeopen(cmd) + register char *cmd; + { + int p[2]; + register myside, hisside, pid; + + if(pipe(p) < 0) + return NULL; + myside = p[WTR]; + hisside = p[RDR]; + if ((pid = vfork()) == 0) { + char *args[MAXARGS]; + register char **ap = args; + + /* myside and hisside reverse roles in child */ + (void) close(myside); + (void) close(0); + (void) dup(hisside); + (void) close(hisside); + (void) setgid(getgid()); + (void) setuid(getuid()); + + while (isspace(*cmd)) + cmd++; + + while (*cmd != '\0') { + *ap++ = cmd; + if (ap >= &args[MAXARGS]) { + fprintf(stderr, "Too many args to %s", args[0]); + _exit(2); + } + while (*cmd && !isspace(*cmd)) { + if (*cmd++ == '"') { + register char *bcp = cmd-1; + while (*cmd && *cmd != '"') + *bcp++ = *cmd++; + *bcp = '\0'; + cmd++; + } + } + if (*cmd) + *cmd++ = '\0'; + while (isspace(*cmd)) + cmd++; + } + *ap = (char *)NULL; + + execv(args[0], args); + perror("pipeopen exec:"); + _exit(1); + } + + if(pid == -1) + return NULL; + + mopen_pid[myside] = pid; + (void) close(hisside); + return fdopen(myside, "w"); + } + + pipeclose(ptr) + FILE *ptr; + { + register f, r, (*hstat)(), (*istat)(), (*qstat)(); + int status; + + f = fileno(ptr); + (void) fclose(ptr); + istat = signal(SIGINT, SIG_IGN); + qstat = signal(SIGQUIT, SIG_IGN); + hstat = signal(SIGHUP, SIG_IGN); + while((r = wait(&status)) != mopen_pid[f] && r != -1) + ; + if(r == -1) + status = -1; + signal(SIGINT, istat); + signal(SIGQUIT, qstat); + signal(SIGHUP, hstat); + return status; } Index: rfuncs.c Prereq: 2.43 *** .d/rfuncs.c Wed Nov 4 14:58:24 1987 --- rfuncs.c Mon Nov 30 18:47:24 1987 *************** *** 18,20 **** #ifdef SCCSID ! static char *SccsId = "@(#)rfuncs.c 2.43 11/4/87"; #endif /* SCCSID */ --- 18,20 ---- #ifdef SCCSID ! static char *SccsId = "@(#)rfuncs.c 2.44 11/30/87"; #endif /* SCCSID */ *************** *** 253,255 **** ! ofp = xfopen(mktemp(outfile), "w"); if (aflag && *datebuf) --- 253,256 ---- ! MKTEMP(outfile); ! ofp = xfopen(outfile, "w"); if (aflag && *datebuf) *************** *** 332,334 **** (void) signal(SIGTERM, catchterm); ! (void) sprintf(bfr, "%s -f %s -T %s", TMAIL, outfile, mktemp(infile)); fwait(fsubr(ushell, bfr, (char *)NULL)); --- 333,336 ---- (void) signal(SIGTERM, catchterm); ! MKTEMP(infile); ! (void) sprintf(bfr, "%s -f %s -T %s", TMAIL, outfile, infile); fwait(fsubr(ushell, bfr, (char *)NULL)); *************** *** 632,634 **** /* make a new sorted copy of ACTIVE */ ! nfp = fopen(mktemp(newactivename), "w"); (void) chmod(newactivename, 0600); --- 634,637 ---- /* make a new sorted copy of ACTIVE */ ! MKTEMP(newactivename); ! nfp = fopen(newactivename, "w"); (void) chmod(newactivename, 0600); Index: rfuncs2.c Prereq: 1.35 *** .d/rfuncs2.c Tue Mar 24 13:51:56 1987 --- rfuncs2.c Mon Nov 30 18:47:25 1987 *************** *** 18,20 **** #ifdef SCCSID ! static char *SccsId = "@(#)rfuncs2.c 1.35 3/21/87"; #endif /* SCCSID */ --- 18,20 ---- #ifdef SCCSID ! static char *SccsId = "@(#)rfuncs2.c 1.36 11/30/87"; #endif /* SCCSID */ *************** *** 365,367 **** strcpy(TRANS, "/tmp/trXXXXXX"); ! ofp = xfopen(mktemp(TRANS), "w"); if (index(sp->s_flags, 'A') == NULL) --- 365,368 ---- strcpy(TRANS, "/tmp/trXXXXXX"); ! MKTEMP(TRANS); ! ofp = xfopen(TRANS, "w"); if (index(sp->s_flags, 'A') == NULL) Index: sendbatch.sh Prereq: 1.14 *** .d/sendbatch.sh Wed Nov 4 14:58:27 1987 --- sendbatch.sh Tue Dec 1 18:51:34 1987 *************** *** 1,2 **** ! : '@(#)sendbatch.sh 1.14 11/4/87' --- 1,2 ---- ! : '@(#)sendbatch.sh 1.16 12/1/87' *************** *** 4,6 **** --- 4,8 ---- LIM=50000 + MINDF=MINDISKFREE MAXBATCH=MAXPERBATCH + SPOOLDISK=SPOOL_DISK CMD='LIBDIR/batch BATCHDIR/$rmt $BLIM' *************** *** 38,40 **** ! if [ -s /tmp/uuq.output ] ; then q=`echo "$rmt" | sed 's/\(.......\).*/\1/'` --- 40,51 ---- ! df=`df $SPOOLDISK | awk "\\$6 == \\"$SPOOLDISK\" {print \\$4} ! \\$1 == \\"$SPOOLDISK\\" {print \\$3}"` ! if test ! -z "$df" -a \( "$df" -lt $MINDF \) ! then ! echo not enough space on $SPOOLDISK: $df ! continue ! fi ! ! if test -s /tmp/uuq.output ! then q=`echo "$rmt" | sed 's/\(.......\).*/\1/'` *************** *** 41,43 **** q=`awk "\\$1 == \\"$q:\\" { print \\$4;exit}" </tmp/uuq.output` ! if [ ! -z "$q" -a \( "$q" -gt $MAXBATCH \) ] ; then --- 52,54 ---- q=`awk "\\$1 == \\"$q:\\" { print \\$4;exit}" </tmp/uuq.output` ! if test ! -z "$q" -a \( "$q" -gt $MAXBATCH \) then Index: visual.c Prereq: 1.39 *** .d/visual.c Wed Nov 4 14:58:50 1987 --- visual.c Mon Nov 30 18:47:31 1987 *************** *** 6,8 **** #ifdef SCCSID ! static char *SccsId = "@(#)visual.c 1.39 11/4/87"; #endif /* SCCSID */ --- 6,8 ---- #ifdef SCCSID ! static char *SccsId = "@(#)visual.c 1.40 11/30/87"; #endif /* SCCSID */ *************** *** 191,193 **** xxit(1); ! (void) mktemp(tfname); (void) close(creat(tfname,0666)); --- 191,193 ---- xxit(1); ! MKTEMP(tfname); (void) close(creat(tfname,0666)); *************** *** 1005,1007 **** (void) strcpy(tf, tft); ! (void) mktemp(tf); (void) close(creat(tf,0600)); --- 1005,1007 ---- (void) strcpy(tf, tft); ! MKTEMP(tf); (void) close(creat(tf,0600)); *************** *** 2608,2610 **** (void) strcpy(temp, "/tmp/vnXXXXXX"); ! (void) mktemp(temp); fname = temp; --- 2608,2610 ---- (void) strcpy(temp, "/tmp/vnXXXXXX"); ! MKTEMP(temp); fname = temp; Index: patchlevel.h Prereq: 13 *** .d/patchlevel.h Mon Nov 23 19:13:35 1987 --- patchlevel.h Mon Nov 30 18:47:32 1987 *************** *** 1,3 **** ! #define PATCHLEVEL 13 ! #define NEWS_VERSION "B 2.11 11/19/87" --- 1,3 ---- ! #define PATCHLEVEL 14 ! #define NEWS_VERSION "B 2.11 12/1/87"
paul@devon.UUCP (Paul Sutcliffe Jr.) (12/07/87)
In article <44204@beno.seismo.CSS.GOV>, rick@seismo.CSS.GOV (Rick Adams) writes: > Description: > This is patch #14 for news 2.11 src. It is expected to be stable > and does not introduce major new features. In the file "funcs.c", there is the following code fragment: #ifdef MKDIRSUB /* * make a directory. Also make sure that the directory is owned * by the right userid */ mkdir(path, perm) char *path; int perm; { [ code deleted ] } #endif /* !BSD4_2 */ The MKDIRSUB feature was introduced in a previous patch, and has worked correctly for me until patch 14. A careful look at the above fragment tells me that the code for mkdir() will only be included if MKDIRSUB is defined (in defs.h). It *should* say #ifndef MKDIRSUB ^ so that the mkdir() function is included in the source if mkdir is *not* in libc.a. I have included a context diff at the end of this article that corrects this, and corrects the bad comment on the #endif, too. This problem "found itself" when compiling news, as ld complained that _mkdir was an unreferenced external. Rick also said: > LOCKING is an acceptable define for those with the locking() call. I found that if I defined LOCKING (with or without defining LOCKF) in defs.h, every .c file compiled with the warning that LOCKING was redefined. That's because in params.h, the following occurs: #ifdef M_XENIX #define LOCKING #endif M_XENIX (Yes, I'm on a Xenix machine.) Do any other un*xes (sp?) have the locking() call? If so, then something like: #ifdef M_XENIX # ifndef LOCKING # define LOCKING # endif LOCKING #endif M_XENIX would be more appropriate. If only Xenix has it, perhaps the define should be removed from defs.h as it will surely be defined anyway by params.h. Context diffs for the MKDIRSUB bug follow: *** funcs.c- Sat Dec 5 20:16:55 1987 --- funcs.c Sat Dec 5 21:02:13 1987 *************** *** 520,526 } #endif /* VMS */ ! #ifdef MKDIRSUB /* * make a directory. Also make sure that the directory is owned * by the right userid --- 520,526 ----- } #endif /* VMS */ ! #ifndef MKDIRSUB /* * make a directory. Also make sure that the directory is owned * by the right userid *************** *** 579,585 #endif return status; } ! #endif /* !BSD4_2 */ #ifndef RENAMESUB rename(from,to) --- 579,585 ----- #endif return status; } ! #endif /* !MKDIRSUB */ #ifndef RENAMESUB rename(from,to) -- Paul Sutcliffe, Jr. UUCP (smart): paul@devon.UUCP UUCP (dumb): ...{rutgers,ihnp4,cbosgd}!bpa!vu-vlsi!devon!paul