Official Patch #15 for B News 2.11
Arnold D. Robbins
arnold at skeeve.UUCP
Fri Jan 27 13:33:44 AEST 1989
See the announcement in unix-pc.general for what this is and why you
might want it.
----------------------------------------------------------------
>From gatech!ncar!ames!amdcad!sun!pitstop!sundc!seismo!uunet!rick Wed Jan 25 13:15:58 EST 1989
Article 1797 of news.software.b:
Path: emory!gatech!ncar!ames!amdcad!sun!pitstop!sundc!seismo!uunet!rick
>From: rick at uunet.UU.NET (Rick Adams)
Newsgroups: news.software.b
Subject: Patch #15 for news 2.11 source
Message-ID: <47348 at uunet.UU.NET>
Date: 25 Jan 89 03:26:05 GMT
Organization: UUNET Communications Services, Arlington, VA
Lines: 2606
Description:
This single logical patch is being distributed as 3 physical
patches. You MUST install patches 15, 16 and 17 or
things won't compile.
*** You MUST do "make update" after the "make install".
These are patches #15, 16 & 17 for news 2.11 source. They
address the following problems:
better integrates NFS support
better handling of "make install"
checkgroups doesn't generate the leading "|" in
egrep "|whatever" any more.
fixes the 'l' and 'L' commands of vnews and readnews. Formerly,
they were always one less than they should have been.
better handling of errors for compress/uncompress/zcat
rename MANUALLY to NORMGROUPS for consistency.
NONEWGROUPS and NORMGROUPS are now defined as a pattern, so
you can say something like:
#define NONEWGROUPS "comp,sci,news"
and it will send you mail for newgroup messages in those
groups and go ahead and do the newgroup for those that
don't match. You get the old behavior by defining them
as the pattern "all".
control messages that send you mail now include the body of the
control message in the mail.
systems with signals returning void* instead of int* can define
VOIDSIGNALS in defs.h
4.3 BSD based systems can define SYSLOG to use the syslog
facility in place of the usual logging. (Very handy
with a network of machines and 1 admin.)
If ALLOW_LIB_EXECS is not defined (default) arbitrary commands
in /usr/lib/news will not be executable as
batch commands. If it is defined, the previous behavior occurs.
expire is much faster and no longer loses the history of expired
articles when doing a rebuild (expire -r)
expire now accepts arguments expressing time in floating point
days instead of int. So, expire -e 0.5 would expire
things over 12 hours old (Yes there are sites that do this)
fullname now better handles hyphenated names.
many places now do a much better job of checking buffer
overflow, especially when reading in a new article and
parsing the sys file.
when unparsable dates are found, the offending file name is logged.
getdate better handles some forms of dates. It was
previously confusing years with numerical time zone offsets
in some cases.
message-ids now can only contain printing characters.
messages received from OTHER machines with "local" distribution
are rejected. "local" articles should NEVER leave your
machine. local means local to that machine, not your site.
You can now transmit articles based on size. If >XXX or < YYY appear
in the third field of the sys file, then the
article will only be transmitted if the size > XXX.
E.g.
site1:world,comp:IF>50000
site1:world,comp:F
would send all articles > 50,000 bytes via ihave/sendme
and the rest "immediately" via normal batching.
/usr/spool/news isn't clutter up by temporary and failed articles
any more. /usr/spool/news/.tmp and /usr/spool/news/.bad
get the temp and bad articles respectively.
locking is handled a little better.
Inews insists on a followup-to: line being present of you
are following up to an article posted to multiple
groups. This will only affect followups to your followup.
Similarly, postnews asks (but doesn't insist) you
to specify a folloup group.
recnews may finally get quoted arguments right.
sendbatch has lots of new options, all off by default. Look at
the shell script if you want to know what they are.
uurec is a little better at catching forged articles.
define DIRENT if your system uses struct dirent instead of struct direct
Fix:
cd to the src directory and apply the following patch
THEN apply patch 16 as well.
**********************************************************
* You MUST do "make update" after the "make install" *
**********************************************************
Index: Makefile.dst
Prereq: 1.30
*** old/Makefile.dst Fri Dec 4 02:51:51 1987
--- Makefile.dst Thu Jan 19 00:04:22 1989
***************
*** 1,2
! # '@(#)Makefile.dst 1.30 12/1/87'
# Generic Makefile.
--- 1,2 -----
! # '@(#)Makefile.dst 1.33 1/19/89'
# Generic Makefile.
***************
*** 34,36
! #NNTP NNTPDIR = NNTPSRC
--- 34,36 -----
! #NNTP NNTPDIR = NNTPLOC
***************
*** 46,47
#NFSCLIENT INST = nfs
--- 46,48 -----
#NFSCLIENT INST = nfs
+ #NNTP INST = nntp
***************
*** 99,101
OBJECTS = funcs.o funcs2.o header.o ndir.o $(MISC) getdate.o
! IOBJECTS = inews.o ifuncs.o iextern.o control.o fullname.o \
$(OBJECTS) ipathinit.o
--- 100,102 -----
OBJECTS = funcs.o funcs2.o header.o ndir.o $(MISC) getdate.o
! IOBJECTS = inews.o ifuncs.o iextern.o control.o fullname.o elock.o \
$(OBJECTS) ipathinit.o
***************
*** 107,110
$(OBJECTS) visual.o virtterm.o rpathinit.o
! EXPOBJS = expire.o header.o funcs.o getdate.o iextern.o \
! funcs2.o ndir.o $(MISC) epathinit.o
--- 108,111 -----
$(OBJECTS) visual.o virtterm.o rpathinit.o
! EXPOBJS = expire.o header.o funcs.o getdate.o iextern.o elock.o \
! funcs2.o ndir.o $(MISC) epathinit.o
***************
*** 113,115
SRCS = funcs.c funcs2.c header.c
! ISRCS = inews.c ifuncs.c iextern.c control.c fullname.c $(SRCS)
PSRCS = postnews.c rextern.c funcs.c $(CSRCS)
--- 114,116 -----
SRCS = funcs.c funcs2.c header.c
! ISRCS = inews.c ifuncs.c iextern.c control.c fullname.c elock.c $(SRCS)
PSRCS = postnews.c rextern.c funcs.c $(CSRCS)
***************
*** 119,121
visual.c virtterm.c $(CSRCS)
! ESRCS = expire.c header.c funcs.c iextern.c \
funcs2.c
--- 120,122 -----
visual.c virtterm.c $(CSRCS)
! ESRCS = expire.c header.c funcs.c iextern.c elock.c \
funcs2.c
***************
*** 130,131
NFSOTHERS = inews
OTHERS = $(NFSOTHERS) $(UTILS) $(SCRIPTS)
--- 131,133 -----
NFSOTHERS = inews
+ NNTPOTHERS =
OTHERS = $(NFSOTHERS) $(UTILS) $(SCRIPTS)
***************
*** 140,141
install: $(INST)install
--- 142,145 -----
+ nntpall: $(P) $(NNTPOTHERS) $(COMMANDS)
+
install: $(INST)install
***************
*** 147,149
for i in $(COMMANDS); do \
! ./installit -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
$(DESTDIR)$(BINDIR); \
--- 151,153 -----
for i in $(COMMANDS); do \
! ./installit -c -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
$(DESTDIR)$(BINDIR); \
***************
*** 150,152
done
! cp help vnews.help $(DESTDIR)$(LIBDIR)
for i in $(UTILS); do \
--- 154,159 -----
done
! for i in help vnews.help; do \
! ./installit -c -m 644 -o $(NEWSUSR) -g $(NEWSGRP) $$i\
! $(DESTDIR)$(LIBDIR); \
! done
for i in $(UTILS); do \
***************
*** 152,154
for i in $(UTILS); do \
! ./installit -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
$(DESTDIR)$(LIBDIR); \
--- 159,161 -----
for i in $(UTILS); do \
! ./installit -c -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
$(DESTDIR)$(LIBDIR); \
***************
*** 156,158
for i in $(SCRIPTS); do \
! ./installit -m 755 -o $(NEWSUSR) -g $(NEWSGRP) $$i \
$(DESTDIR)$(LIBDIR); \
--- 163,165 -----
for i in $(SCRIPTS); do \
! ./installit -c -m 755 -o $(NEWSUSR) -g $(NEWSGRP) $$i \
$(DESTDIR)$(LIBDIR); \
***************
*** 159,161
done
! ./installit -m 6755 -o $(NEWSUSR) -g $(NEWSGRP) -s inews \
$(DESTDIR)$(LIBDIR)
--- 166,168 -----
done
! ./installit -c -m 6755 -o $(NEWSUSR) -g $(NEWSGRP) -s inews \
$(DESTDIR)$(LIBDIR)
***************
*** 172,174
for i in $(COMMANDS); do \
! ./installit -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
$(DESTDIR)$(BINDIR); \
--- 179,181 -----
for i in $(COMMANDS); do \
! ./installit -c -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
$(DESTDIR)$(BINDIR); \
***************
*** 176,178
cp help vnews.help $(DESTDIR)$(LIBDIR)
! ./installit -m 6755 -o root -g $(NEWSGRP) -s inews \
$(DESTDIR)$(LIBDIR)
--- 183,185 -----
cp help vnews.help $(DESTDIR)$(LIBDIR)
! ./installit -c -m 6755 -o root -g $(NEWSGRP) -s inews \
$(DESTDIR)$(LIBDIR)
***************
*** 181,182
defs.h: defs.dist localize.sh Makefile.dst Makefile
--- 188,200 -----
+ nntpinstall: nntpall help vnews.help
+ chmod 755 ./installit
+ -test -d $(DESTDIR)$(BINDIR) || mkdir $(DESTDIR)$(BINDIR)
+ -test -d $(DESTDIR)$(LIBDIR) || mkdir $(DESTDIR)$(LIBDIR)
+ for i in $(COMMANDS); do \
+ ./installit -m 755 -o $(NEWSUSR) -g $(NEWSGRP) -s $$i \
+ $(DESTDIR)$(BINDIR); \
+ done
+ cp help vnews.help $(DESTDIR)$(LIBDIR)
+ #VMS vms -v @euninstal
+
defs.h: defs.dist localize.sh Makefile.dst Makefile
***************
*** 194,196
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
--- 212,214 -----
fullupdate: install.sh makeactive.sh
! sh install.sh $(DESTDIR)$(SPOOLDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE)
chmod 6755 $(DESTDIR)$(LIBDIR)/inews
***************
*** 198,200
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
--- 216,218 -----
nfsupdate: install.sh
! sh install.sh $(DESTDIR)$(SPOOLDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE) $(DESTDIR)$(NFSSPOOLDIR) $(DESTDIR)$(NFSLIBDIR)
chown root $(DESTDIR)$(LIBDIR)/inews
***************
*** 202,204
!
clean:
--- 220,224 -----
! nntpupdate:
! @echo "There is no update for NNTP clients as yet."
!
clean:
***************
*** 245,247
getdate.o: getdate.y defs.h
! @echo "expect 8 shift/reduce conflicts"
yacc getdate.y
--- 265,267 -----
getdate.o: getdate.y defs.h
! @echo "expect 5 shift/reduce conflicts"
yacc getdate.y
***************
*** 382,384
! digest.o: digest.c Makefile
$(CC) $(CFLAGS) -c digest.c
--- 402,404 -----
! digest.o: digest.c rparams.h defs.h Makefile
$(CC) $(CFLAGS) -c digest.c
***************
*** 384,385
$(CC) $(CFLAGS) -c digest.c
--- 404,408 -----
$(CC) $(CFLAGS) -c digest.c
+
+ elock.o: elock.c params.h defs.h Makefile
+ $(CC) $(CFLAGS) -c elock.c
Index: batch.c
Prereq: 1.20
*** old/batch.c Fri Dec 4 02:51:54 1987
--- batch.c Wed Jan 18 14:28:51 1989
***************
*** 1,2
-
/*
--- 1 -----
/*
***************
*** 2,4
/*
! * This software is Copyright (c) 1985 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1985, 1989 by Rick Adams.
*
***************
*** 34,36
#ifdef SCCSID
! static char *SccsId = "@(#)batch.c 1.20 11/30/87";
#endif /* SCCSID */
--- 33,35 -----
#ifdef SCCSID
! static char *SccsId = "@(#)batch.c 1.23 1/18/89";
#endif /* SCCSID */
***************
*** 62,63
long atol();
char fname[512];
--- 61,63 -----
long atol();
+ int spooldirlen = strlen(SPOOLDIR);
char fname[512];
***************
*** 94,95
if (argc > 2)
--- 94,100 -----
+ if (chdir(SPOOLDIR) < 0) {
+ logerror("chdir(%s): %s", workfile, sys_errlist[errno]);
+ exit(1);
+ }
+
if (argc > 2)
***************
*** 105,107
continue;
! nfd = fopen(fname, "r");
if (nfd == NULL) {
--- 110,117 -----
continue;
! /* this optimization speeds up batching significantly */
! if (fname[0] == '/' && fname[spooldirlen-1] == '/')
! nfd = fopen(&fname[spooldirlen], "r");
! else
! nfd = fopen(fname, "r");
!
if (nfd == NULL) {
***************
*** 172,173
exit(0);
}
--- 182,184 -----
exit(0);
+ /*NOTREACHED*/
}
Index: checkgroups.sh
Prereq: 1.24
*** old/checkgroups.sh Wed Nov 4 14:56:19 1987
--- checkgroups.sh Sun Jan 15 19:48:29 1989
***************
*** 1,3
: check active file for missing or extra newsgroups
! : '@(#)checkgroups 1.24 11/4/87'
--- 1,3 -----
: check active file for missing or extra newsgroups
! : '@(#)checkgroups 1.25 1/15/89'
***************
*** 30,31
cp /dev/null /tmp/$$b
sed -e "s;[ ].*;;" -e "s;\..*;;" -e "s;^!;;" /tmp/$$msg | sort -u |
--- 30,32 -----
cp /dev/null /tmp/$$b
+ pipe=''
sed -e "s;[ ].*;;" -e "s;\..*;;" -e "s;^!;;" /tmp/$$msg | sort -u |
***************
*** 34,36
group=`cat /tmp/$$b`
! group="${group}|^$dist[. ]"
echo "${group}" > /tmp/$$b
--- 35,37 -----
group=`cat /tmp/$$b`
! group="${group}${pipe}^$dist[. ]"
echo "${group}" > /tmp/$$b
***************
*** 36,37
echo "${group}" > /tmp/$$b
done
--- 37,39 -----
echo "${group}" > /tmp/$$b
+ pipe='|'
done
***************
*** 73,75
echo "# You can remove them by executing the commands:"
! echo \ LIBDIR/rmgroup `cat /tmp/$$remove`
echo ""
--- 75,80 -----
echo "# You can remove them by executing the commands:"
! for i in `cat /tmp/$$remove`
! do
! echo " LIBDIR/rmgroup $i"
! done
echo ""
Index: compress.c
Prereq: 1.14
*** old/compress.c Wed Oct 7 16:49:22 1987
--- compress.c Sun Jan 15 19:48:54 1989
***************
*** 1,3
#ifdef SCCSID
! static char *SccsId = "@(#)compress.c 1.14 9/24/87";
#endif /* SCCSID */
--- 1,3 -----
#ifdef SCCSID
! static char *SccsId = "@(#)compress.c 1.15 1/15/89";
#endif /* SCCSID */
***************
*** 438,439
if ((freopen(*fileptr, "r", stdin)) == NULL) {
perror(*fileptr); continue;
--- 438,440 -----
if ((freopen(*fileptr, "r", stdin)) == NULL) {
+ exit_stat = 1;
perror(*fileptr); continue;
***************
*** 446,447
*fileptr);
continue;
--- 447,449 -----
*fileptr);
+ exit_stat = 1;
continue;
***************
*** 456,457
*fileptr, maxbits, BITS);
continue;
--- 458,460 -----
*fileptr, maxbits, BITS);
+ exit_stat = 1;
continue;
***************
*** 470,471
if ((freopen(*fileptr, "r", stdin)) == NULL) {
perror(*fileptr); continue;
--- 473,475 -----
if ((freopen(*fileptr, "r", stdin)) == NULL) {
+ exit_stat = 1;
perror(*fileptr); continue;
***************
*** 528,529
if (freopen(ofname, "w", stdout) == NULL) {
perror(ofname);
--- 532,534 -----
if (freopen(ofname, "w", stdout) == NULL) {
+ exit_stat = 1;
perror(ofname);
Index: control.c
Prereq: 2.57
*** old/control.c Mon Nov 23 19:13:14 1987
--- control.c Sun Jan 15 19:48:55 1989
***************
*** 1,3
/*
! * This software is Copyright (c) 1986 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1986, 1989 by Rick Adams.
*
***************
*** 21,23
#ifdef SCCSID
! static char *SccsId = "@(#)control.c 2.57 11/19/87";
#endif /* SCCSID */
--- 21,23 -----
#ifdef SCCSID
! static char *SccsId = "@(#)control.c 2.58 1/15/89";
#endif /* SCCSID */
***************
*** 33,34
FILE *popen(), *mhopen(), *mailhdr();
--- 33,35 -----
FILE *popen(), *mhopen(), *mailhdr();
+ FILE *controlmail;
***************
*** 189,190
outfp = xfopen(INFILE, "a");
outpos = ftell(outfp);
--- 190,198 -----
outfp = xfopen(INFILE, "a");
+ #ifdef USG
+ /*
+ * When fopening to append, USG systems don't
+ * seek to EOF until write() is called.
+ */
+ fseek(outfp, 0L, 2);
+ #endif
outpos = ftell(outfp);
***************
*** 318,320
if (fp == NULL) {
! logerr("Article %s unopenable as %s.", id, cp);
return;
--- 326,328 -----
if (fp == NULL) {
! log("Article %s unopenable as %s.", id, cp);
return;
***************
*** 349,352
/* local or ORGDISTRIB */
! int can_change = (STRCMP(header.distribution, "local") == 0) ||
! (STRCMP(header.distribution, ORGDISTRIB) == 0);
# else /* ! ORGDISTRIB */
--- 357,361 -----
/* local or ORGDISTRIB */
! int can_change = (STRCMP(header.distribution, "local") == 0)
! || (STRCMP(header.distribution, ORGDISTRIB) == 0)
! || !ngmatch(argv[1], NONEWGROUPS);
# else /* ! ORGDISTRIB */
***************
*** 428,430
}
! (void) mclose(fd);
}
--- 437,440 -----
}
! fprintf(fd, "\n\n%s says:\n", header.path);
! controlmail = fd;
}
***************
*** 513,515
}
! (void) mclose(fd);
}
--- 523,526 -----
}
! fprintf(fd, "\n\n%s says:\n", header.path);
! controlmail = fd;
}
***************
*** 542,544
! #ifdef MANUALLY
#ifdef ORGDISTRIB
--- 553,555 -----
! #ifdef NORMGROUPS
#ifdef ORGDISTRIB
***************
*** 548,550
if (!STRCMP(ORGDISTRIB, header.distribution)
! || !STRCMP("local", header.distribution))
#else /* !ORGDISTRIB */
--- 559,562 -----
if (!STRCMP(ORGDISTRIB, header.distribution)
! || !STRCMP("local", header.distribution)
! || !ngmatch(argv[1], NORMGROUPS))
#else /* !ORGDISTRIB */
***************
*** 552,554
#endif /* !ORGDISTRIB */
! #endif /* MANUALLY */
shouldremove++;
--- 564,566 -----
#endif /* !ORGDISTRIB */
! #endif /* NORMGROUPS */
shouldremove++;
***************
*** 572,574
}
! (void) mclose(fd);
}
--- 584,587 -----
}
! fprintf(fd, "\n\n%s says:\n", header.path);
! controlmail = fd;
}
***************
*** 581,583
*/
! lock();
(void) sprintf(bfr, "%s/rmgroup", LIB);
--- 594,596 -----
*/
! dolock();
(void) sprintf(bfr, "%s/rmgroup", LIB);
***************
*** 594,596
}
! unlock();
if (status)
--- 607,609 -----
}
! rmlock();
if (status)
***************
*** 692,693
(void) unlink(nfilename);
p = q+1;
--- 705,708 -----
(void) unlink(nfilename);
+ if (q == NULL)
+ break;
p = q+1;
***************
*** 729,731
fprintf(f, "It has been sent.\n");
! (void) mclose(f);
}
--- 744,747 -----
fprintf(f, "It has been sent.\n");
! fprintf(f, "\n\n%s says:\n", header.path);
! controlmail = f;
}
***************
*** 889,891
{
! register f, r, (*hstat)(), (*istat)(), (*qstat)();
int status;
--- 905,908 -----
{
! register int f, r;
! SIGNAL_TYPE hstat, istat, qstat;
int status;
Index: defs.dist
Prereq: 2.61
*** old/defs.dist Fri Dec 4 02:51:57 1987
--- defs.dist Tue Jan 24 15:23:59 1989
***************
*** 1,3
/*
! * This software is Copyright (c) 1986 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1986, 1989 by Rick Adams.
*
***************
*** 16,18
! /* @(#)defs.dist 2.61 11/30/87 */
--- 16,18 -----
! /* @(#)defs.dist 2.65 1/24/89 */
***************
*** 49,52
/* #define UUPROG "euuname" /* omit for uuname, put in LIBDIR */
! #define MANUALLY /* Don't execute rmgroups, just notify. */
! /* #define NONEWGROUPS /* Don't create new groups, just notify.*/
/* #define SPOOLNEWS /* Spool incoming rnews, don't process */
--- 49,52 -----
/* #define UUPROG "euuname" /* omit for uuname, put in LIBDIR */
! #define NORMGROUPS "all" /* Don't execute rmgroups, just notify. */
! /* #define NONEWGROUPS "all" /* Don't create new groups, just notify.*/
/* #define SPOOLNEWS /* Spool incoming rnews, don't process */
***************
*** 75,76
/* #define READDIR /* your system has readdir() in libc */
/* #define RENAMESUB /* your system has rename() in libc */
--- 75,77 -----
/* #define READDIR /* your system has readdir() in libc */
+ /* #define DIRENT /* use struct dirent instead of struct direct */
/* #define RENAMESUB /* your system has rename() in libc */
***************
*** 76,77
/* #define RENAMESUB /* your system has rename() in libc */
/* #define ALWAYSALIAS /* temporary kludge for conversion */
--- 77,80 -----
/* #define RENAMESUB /* your system has rename() in libc */
+ /* #define VOID_SIGNALS /* signal returns a void * instead of int * */
+ /* #define SYSLOG /* If you want errors logged via 4.3bsd syslog */
/* #define ALWAYSALIAS /* temporary kludge for conversion */
***************
*** 77,78
/* #define ALWAYSALIAS /* temporary kludge for conversion */
/* #define SENDMAIL "/usr/lib/sendmail" /* command line to run "sendmail" if you have it */
--- 80,82 -----
/* #define ALWAYSALIAS /* temporary kludge for conversion */
+ /* #define ALLOW_LIB_EXECS /* allow news batches to execute commands in LIBDIR */
/* #define SENDMAIL "/usr/lib/sendmail" /* command line to run "sendmail" if you have it */
***************
*** 97,98
/* of the $(LIB)/moderators file */
--- 101,105 -----
/* of the $(LIB)/moderators file */
+ /* #define MINFREE 5000 /* minimum number of free blocks needed in spool*/
+ /* partition before unbatching will take place */
+ /* USG only */
***************
*** 110,111
#define LBUFLEN 1024 /* big buffer size */
#define SBUFLEN 32 /* small buffer size (for system names, etc) */
--- 117,119 -----
#define LBUFLEN 1024 /* big buffer size */
+ #define MBUFLEN 256 /* medium buffer size */
#define SBUFLEN 32 /* small buffer size (for system names, etc) */
***************
*** 124,131
#define NGDELIM ',' /* delimit character in news group line */
-
- /* for NNTP */
- #ifdef SERVER
- # include "NNTPSRC/common/response_codes.h"
- # define SERVER_FILE "SERVERFILE"
- #endif /* SERVER */
--- 132,133 -----
#define NGDELIM ',' /* delimit character in news group line */
Index: elock.c
*** old/elock.c Sun Jan 15 19:53:44 1989
--- elock.c Thu Jan 19 00:17:32 1989
***************
*** 0
--- 1,56 -----
+ #ifndef lint
+ static char *SccsId = "@(#)elock.c 1.3 1/19/89";
+ #endif /* !lint */
+
+ #include "params.h"
+ #include <errno.h>
+
+ #ifdef BSD4_2
+ # include <sys/file.h>
+ #endif /* BSD4_2 */
+
+ #ifdef LOCKF
+ #include <unistd.h>
+ #endif /* LOCKF */
+
+ #if defined(BSD4_2) || defined(LOCKF)
+ static int LockFd = -1;
+ #endif
+
+ extern int errno;
+
+ dolock()
+ {
+ /* set up exclusive locking so inews does not run while expire does */
+ #if defined(BSD4_2) || defined(LOCKF)
+ LockFd = open(ACTIVE, 2);
+ # ifdef LOCKF
+ if (lockf(LockFd, F_LOCK, 0L) < 0)
+ # else /* BSD4_2 */
+ if (flock(LockFd, LOCK_EX) < 0)
+ # endif /* BSD4_2 */
+ xerror("Can't get lock on active file for %s : %s",
+ Progname, errmsg(errno));
+ #else /* !BSD4_2 && !LOCKF */
+ int i = 0;
+ char afline[MBUFLEN];
+ sprintf(afline,"%s.lock", ACTIVE);
+ while (LINK(ACTIVE, afline) < 0 && errno == EEXIST) {
+ if (i++ > 5) {
+ xerror("Can't get lock on active file for %s: %s",
+ Progname, errmsg(errno));
+ }
+ sleep(i*2);
+ }
+ #endif /* !BSD4_2 && !LOCKF */
+ }
+
+ rmlock()
+ {
+ #if defined(BSD4_2) || defined(LOCKF)
+ close(LockFd);
+ #else
+ sprintf(bfr, "%s.lock", ACTIVE);
+ (void) UNLINK(bfr);
+ #endif /* !BSD4_2 */
+ }
Index: expire.c
Prereq: 2.57
*** old/expire.c Fri Dec 4 02:52:00 1987
--- expire.c Thu Jan 19 00:06:40 1989
***************
*** 1,3
/*
! * This software is Copyright (c) 1986 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1986, 1989 by Rick Adams.
*
***************
*** 19,21
#ifdef SCCSID
! static char *SccsId = "@(#)expire.c 2.57 11/30/87";
#endif /* SCCSID */
--- 19,21 -----
#ifdef SCCSID
! static char *SccsId = "@(#)expire.c 2.61 1/19/89";
#endif /* SCCSID */
***************
*** 63,64
int doupdateactive = 0; /* update ACTIVE file */
char baduser[BUFLEN];
--- 63,65 -----
int doupdateactive = 0; /* update ACTIVE file */
+ int dontexec = 0; /* don't exec rnews -U */
char baduser[BUFLEN];
***************
*** 65,66
extern char filename[], nbuf[];
--- 66,68 -----
extern char filename[], nbuf[];
+ double atof();
***************
*** 94,96
int ngpatlen = 0;
! char afline[BUFLEN];
char grpsleft[BUFLEN];
--- 96,98 -----
int ngpatlen = 0;
! char afline[MBUFLEN];
char grpsleft[BUFLEN];
***************
*** 150,152
argc--;
! expincr = atol(argv[1]) * DAYS;
} else if (isdigit(argv[1][2]))
--- 152,154 -----
argc--;
! expincr = atof(argv[1]) * DAYS;
} else if (isdigit(argv[1][2]))
***************
*** 152,154
} else if (isdigit(argv[1][2]))
! expincr = atol(&argv[1][2]) * DAYS;
break;
--- 154,156 -----
} else if (isdigit(argv[1][2]))
! expincr = atof(&argv[1][2]) * DAYS;
break;
***************
*** 158,160
argc--;
! dropincr = atol(argv[1]) * DAYS;
} else if (isdigit(argv[1][2]))
--- 160,162 -----
argc--;
! dropincr = atof(argv[1]) * DAYS;
} else if (isdigit(argv[1][2]))
***************
*** 160,162
} else if (isdigit(argv[1][2]))
! dropincr = atol(&argv[1][2]) * DAYS;
break;
--- 162,164 -----
} else if (isdigit(argv[1][2]))
! dropincr = atof(&argv[1][2]) * DAYS;
break;
***************
*** 252,253
break;
default:
--- 254,258 -----
break;
+ case 'X': /* don't exec rnews -U */
+ dontexec++;
+ break;
default:
***************
*** 310,311
#endif /* PROFILING */
#ifdef LOGDIR
--- 315,320 -----
#endif /* PROFILING */
+ if (dontexec)
+ xxit(0);
+ if (vfork() > 0) /* don't hold up expire while rnews is running */
+ xxit(0);
#ifdef LOGDIR
***************
*** 331,333
DIR *ngdirp = NULL;
! static struct direct *ngdir;
--- 340,342 -----
DIR *ngdirp = NULL;
! static DIRECTORY_STRUCT *ngdir;
***************
*** 385,387
closedir(ngdirp);
! if (fgets(afline, BUFLEN, ohfd) == NULL)
goto out;
--- 394,396 -----
closedir(ngdirp);
! if (fgets(afline, MBUFLEN,ohfd) == NULL)
goto out;
***************
*** 418,420
#ifdef DBM
! if (fgets(afline, BUFLEN, ohfd) == NULL)
break;
--- 427,429 -----
#ifdef DBM
! if (fgets(afline, MBUFLEN, ohfd) == NULL)
break;
***************
*** 421,423
#else
! if (fgets(afline, BUFLEN, ohfd) == NULL)
if (!(ohfd = nexthistfile(ohfd)))
--- 430,432 -----
#else
! if (fgets(afline, MBUFLEN, ohfd) == NULL)
if (!(ohfd = nexthistfile(ohfd)))
***************
*** 429,430
printf("article: %s", afline);
p1 = index(afline, '\t');
--- 438,441 -----
printf("article: %s", afline);
+ if (afline[0] != '<')
+ continue;
p1 = index(afline, '\t');
***************
*** 440,442
(void) strcpy(recdate, p1+1);
! (void) strcat(recdate, " GMT");
rectime = cgtdate(recdate);
--- 451,463 -----
(void) strcpy(recdate, p1+1);
! {
! register char * tp;
!
! tp = recdate;
! if (*tp == ' ')
! ++tp;
! if (strlen(tp) == 14 && tp[2] == '/' &&
! tp[5] == '/' && tp[8] == ' ' &&
! tp[11] == ':')
! (void) strcat(recdate, " GMT");
! }
rectime = cgtdate(recdate);
***************
*** 597,599
tm = gmtime(&rectime);
! if (fprintf(nhfd,
#ifdef USG
--- 618,620 -----
tm = gmtime(&rectime);
! fprintf(nhfd,
#ifdef USG
***************
*** 605,609
tm->tm_mon+1, tm->tm_mday, tm->tm_year,
! tm->tm_hour, tm->tm_min, filename)
! == EOF)
! xerror("History write failed");
(void) fclose(fp);
--- 626,630 -----
tm->tm_mon+1, tm->tm_mday, tm->tm_year,
! tm->tm_hour, tm->tm_min, filename);
! if(ferror(nhfd))
! xerror("History write failed");
(void) fclose(fp);
***************
*** 711,713
h.ident, recdate);
! if (fputs(afline, nhfd) == EOF)
xerror("history write failed");
--- 732,735 -----
h.ident, recdate);
! fputs(afline, nhfd);
! if (ferror(nhfd))
xerror("history write failed");
***************
*** 749,751
tm = gmtime(&rectime);
! if ( fprintf(nhfd,
#ifdef USG
--- 771,773 -----
tm = gmtime(&rectime);
! fprintf(nhfd,
#ifdef USG
***************
*** 757,761
tm->tm_mon+1, tm->tm_mday, tm->tm_year,
! tm->tm_hour, tm->tm_min, mhp->mh_file)
! == EOF )
! xerror("History write failed");
(void) fclose(fp);
--- 779,783 -----
tm->tm_mon+1, tm->tm_mday, tm->tm_year,
! tm->tm_hour, tm->tm_min, mhp->mh_file);
! if (ferror(nhfd))
! xerror("History write failed");
(void) fclose(fp);
***************
*** 763,764
}
(void) pclose(nhfd);
--- 785,822 -----
}
+ /*
+ * lastly, see if we can fish the history of any expired
+ * articles out of the old history file
+ */
+ if (verbose)
+ printf("Trying to extract usable expired article history\n");
+ ohfd = xfopen(ARTFILE, "r");
+ while (fgets(afline, MBUFLEN, ohfd) != NULL) {
+ if (afline[0] != '<') {
+ if (verbose > 4)
+ printf("Skip1: %s\n", afline);
+ continue;
+ }
+ p1 = index(afline, '\t');
+ if (p1++ == NULL) {
+ if (verbose > 4)
+ printf("Skip2: %s\n", afline);
+ continue;
+ }
+ p1 = index(p1, '\t');
+ if (p1++ == NULL) {
+ if (verbose > 4)
+ printf("Skip3: %s\n", afline);
+ continue;
+ }
+ if (*p1 == '\n') {
+ if (verbose > 4)
+ printf("Retain: %s", afline);
+ fputs(afline, nhfd);
+ if (ferror(nhfd))
+ xerror("History write failed");
+ } else {
+ if (verbose > 4)
+ printf("Skip4: %s\n", afline);
+ }
+ }
(void) pclose(nhfd);
***************
*** 764,765
(void) pclose(nhfd);
free ((char *)multhist);
--- 822,824 -----
(void) pclose(nhfd);
+ (void) fclose(ohfd);
free ((char *)multhist);
***************
*** 788,826
- #if defined(BSD4_2) || defined(LOCKF)
- static int LockFd = -1;
- #endif
-
- dolock()
- {
- /* set up exclusive locking so inews does not run while expire does */
- #if defined(BSD4_2) || defined(LOCKF)
- LockFd = open(ACTIVE, 2);
- # ifdef LOCKF
- if (lockf(LockFd, F_LOCK, 0L) < 0)
- # else /* BSD4_2 */
- if (flock(LockFd, LOCK_EX) < 0)
- # endif /* BSD4_2 */
- xerror("Can't get lock for expire: %s", errmsg(errno));
- #else /* !BSD4_2 && !LOCKF */
- int i = 0;
- sprintf(afline,"%s.lock", ACTIVE);
- while (LINK(ACTIVE, afline) < 0 && errno == EEXIST) {
- if (i++ > 5) {
- xerror("Can't get lock for expire");
- }
- sleep(i*2);
- }
- #endif /* !BSD4_2 && !LOCKF */
- }
-
- rmlock()
- {
- #if defined(BSD4_2) || defined(LOCKF)
- close(LockFd);
- #else
- sprintf(bfr, "%s.lock", ACTIVE);
- (void) UNLINK(bfr);
- #endif /* !BSD4_2 */
- }
-
updateactive()
--- 847,848 -----
updateactive()
***************
*** 827,829
{
! register char *p1;
FILE *ohfd, *nhfd;
--- 849,851 -----
{
! register char *p1, *p2;
FILE *ohfd, *nhfd;
***************
*** 830,832
DIR *ngdirp = NULL;
! static struct direct *ngdir;
--- 852,854 -----
DIR *ngdirp = NULL;
! static DIRECTORY_STRUCT *ngdir;
***************
*** 839,843
long maxart, minart;
! char cansub;
! int gdsize, hassubs;
! struct stat stbuf;
--- 861,864 -----
long maxart, minart;
! int lineno = 0;
! char c, cansub, groupname[BUFLEN];
***************
*** 843,845
! if (fgets(afline, BUFLEN, ohfd) == NULL)
continue;
--- 864,866 -----
! if (fgets(afline, MBUFLEN, ohfd) == NULL)
continue;
***************
*** 845,849
continue;
! if (sscanf(afline,"%s %ld %ld %c",nbuf,&maxart, &minart,
! &cansub) < 4)
! xerror("Active file corrupt");
if (verbose > 3)
--- 866,873 -----
continue;
! lineno++;
! if (sscanf(afline,"%s %ld %ld %c", groupname, &maxart, &minart,
! &cansub) < 4) {
! xerror("Line %d in active file invalid: %s",
! lineno, afline);
! }
if (verbose > 3)
***************
*** 850,853
printf("looking at group %s\n", nbuf);
! if (!ngmatch(nbuf, ngpat)) {
! if (fputs(afline, nhfd) == EOF)
xerror("active file write failed");
--- 874,878 -----
printf("looking at group %s\n", nbuf);
! if (!ngmatch(groupname, ngpat)) {
! fputs(afline, nhfd);
! if (ferror(nhfd))
xerror("active file write failed");
***************
*** 857,861
/* Change a group name from a.b.c to a/b/c */
! for (p1=nbuf; *p1; p1++)
! if (*p1 == '.')
! *p1 = '/';
--- 882,892 -----
/* Change a group name from a.b.c to a/b/c */
! p1 = groupname;
! p2 = nbuf;
! while (c = *p1++) {
! if (c == '.')
! *p2++ = '/';
! else
! *p2++ = c;
! }
! *p2 = '\0';
***************
*** 861,864
- hassubs = stat(nbuf, &stbuf) != 0 || stbuf.st_nlink != 2;
- gdsize = strlen(nbuf);
if ((ngdirp = opendir(nbuf)) != NULL) {
--- 892,893 -----
if ((ngdirp = opendir(nbuf)) != NULL) {
***************
*** 865,877
while (ngdir = readdir(ngdirp)) {
! nbuf[gdsize] = '/';
! (void) strcpy(&nbuf[gdsize+1], ngdir->d_name);
! /* We have to do a stat because of micro.6809 */
! if (hassubs && (stat(nbuf, &stbuf) < 0 ||
! !(stbuf.st_mode&S_IFREG)) )
! continue;
! n = atol(ngdir->d_name);
! if (n > 0 && n < minart)
! minart = n;
! if (n > 0 && n > maxart)
! maxart = n;
}
--- 894,912 -----
while (ngdir = readdir(ngdirp)) {
! register char *cp = ngdir->d_name, ch;
! n = 0;
! /* check to see if directory */
! /* articles are all digits */
! do {
! ch = *cp++;
! if (isdigit(ch))
! n = n * 10 + ch - '0';
! else
! n = -1;
! } while (n >= 0 && *cp);
! if (n > 0) {
! if (n < minart)
! minart = n;
! if (n > maxart)
! maxart = n;
! }
}
***************
*** 879,881
}
- afline[gdsize] = '\0';
if (minart > maxart)
--- 914,915 -----
}
if (minart > maxart)
***************
*** 882,883
minart = maxart;
#ifdef USG
--- 916,918 -----
minart = maxart;
+
#ifdef USG
***************
*** 886,889
maxart, minart);
! if (fprintf(nhfd,"%s %5.5ld %5.5ld %c\n", afline, maxart,
! minart, cansub) == EOF)
xerror("Active file write failed");
--- 921,925 -----
maxart, minart);
! fprintf(nhfd,"%s %5.5ld %5.5ld %c\n", groupname, maxart,
! minart, cansub);
! if(ferror(nhfd))
xerror("Active file write failed");
***************
*** 893,896
maxart, minart);
! if (fprintf(nhfd,"%s %05ld %05ld %c\n", afline, maxart,
! minart, cansub) == EOF)
xerror("Active file write failed");
--- 929,933 -----
maxart, minart);
! fprintf(nhfd,"%s %05ld %05ld %c\n", groupname, maxart,
! minart, cansub);
! if (ferror(nhfd))
xerror("Active file write failed");
Index: fullname.c
Prereq: 1.13
*** old/fullname.c Wed Nov 4 14:57:01 1987
--- fullname.c Sun Jan 15 19:48:56 1989
***************
*** 11,12
* where the "junk -" is optional.
*
--- 11,13 -----
* where the "junk -" is optional.
+ * and the character before the '-' is a space, a digit, or a ']'.
*
***************
*** 16,18
#ifdef SCCSID
! static char *SccsId = "@(#)fullname.c 1.13 11/4/87";
#endif /* SCCSID */
--- 17,19 -----
#ifdef SCCSID
! static char *SccsId = "@(#)fullname.c 1.14 1/15/89";
#endif /* SCCSID */
***************
*** 127,129
{
! if (*p == '-' && (isdigit(p[-1]) || isspace(p[-1]))) {
bp = buf;
--- 128,130 -----
{
! if (*p == '-' && (isdigit(p[-1]) || isspace(p[-1]) || p[-1] == ']')) {
bp = buf;
***************
*** 143,144
}
*bp = '\0';
--- 144,147 -----
}
+ while (bp > buf && *(bp - 1) == ' ')
+ --bp;
*bp = '\0';
Index: funcs.c
Prereq: 2.38
*** old/funcs.c Fri Dec 4 02:52:01 1987
--- funcs.c Sun Jan 15 19:48:57 1989
***************
*** 1,3
/*
! * This software is Copyright (c) 1986 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1986, 1989 by Rick Adams.
*
***************
*** 18,20
#ifdef SCCSID
! static char *SccsId = "@(#)funcs.c 2.38 11/30/87";
#endif /* SCCSID */
--- 18,20 -----
#ifdef SCCSID
! static char *SccsId = "@(#)funcs.c 2.39 1/15/89";
#endif /* SCCSID */
***************
*** 29,30
extern char *Progname;
--- 29,37 -----
+ #ifdef SYSLOG
+ #include <sys/syslog.h>
+ #ifndef LOG_NEWS
+ LOG_NEWS is officially facility 7, please update your syslog.h
+ #endif
+ #endif
+
extern char *Progname;
***************
*** 157,159
int status;
! int (*onhup)(), (*onint)();
--- 164,166 -----
int status;
! SIGNAL_TYPE onhup, onint;
***************
*** 425,426
if (which)
--- 432,445 -----
+ #ifdef SYSLOG
+ if (which ) {
+ openlog(Progname, 0, LOG_NEWS);
+ syslog(LOG_ERR, "%s %s\t%s", rmtsys,
+ header.ident[0] ? header.ident : username, msg);
+ } else {
+ openlog(rmtsys, 0, LOG_NEWS);
+ syslog(LOG_INFO, "%s\t%s",
+ header.ident[0] ? header.ident : username, msg);
+ }
+ #else /* !SYSLOG */
+
if (which)
***************
*** 448,449
}
}
--- 467,470 -----
}
+ #endif /* !SYSLOG */
+
}
***************
*** 522,524
! #ifdef MKDIRSUB
/*
--- 543,545 -----
! #ifndef MKDIRSUB
/*
Index: funcs2.c
Prereq: 1.24
*** old/funcs2.c Fri Dec 4 02:52:03 1987
--- funcs2.c Sun Jan 15 19:48:57 1989
***************
*** 1,3
/*
! * This software is Copyright (c) 1985 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1985, 1989 by Rick Adams.
*
***************
*** 19,21
#ifdef SCCSID
! static char *SccsId = "@(#)funcs2.c 1.24 11/30/87";
#endif /* SCCSID */
--- 19,21 -----
#ifdef SCCSID
! static char *SccsId = "@(#)funcs2.c 1.25 1/15/89";
#endif /* SCCSID */
***************
*** 24,25
#ifdef SunIII
--- 24,27 -----
+ extern char filename[];
+
#ifdef SunIII
***************
*** 125,127
! p = fldget(sp->s_name, p);
if (*p++ == '\0')
--- 127,129 -----
! p = fldget(sp->s_name, sizeof(sp->s_name), p);
if (*p++ == '\0')
***************
*** 138,140
}
! p = fldget(sp->s_nbuf, p);
lcase(sp->s_nbuf);
--- 140,142 -----
}
! p = fldget(sp->s_nbuf, sizeof(sp->s_nbuf), p);
lcase(sp->s_nbuf);
***************
*** 143,145
! p = fldget(sp->s_flags, p);
if (*p++ == '\0')
--- 145,147 -----
! p = fldget(sp->s_flags, sizeof(sp->s_flags), p);
if (*p++ == '\0')
***************
*** 147,149
! (void) fldget(sp->s_xmit, p);
return TRUE;
--- 149,151 -----
! (void) fldget(sp->s_xmit, sizeof(sp->s_flags), p);
return TRUE;
***************
*** 152,154
char *
! fldget(q, p)
register char *q, *p;
--- 154,156 -----
char *
! fldget(q, len, p)
register char *q, *p;
***************
*** 154,155
register char *q, *p;
{
--- 156,158 -----
register char *q, *p;
+ register int len;
{
***************
*** 158,159
p++;
*q++ = *p++;
--- 161,168 -----
p++;
+ if (--len <= 0) {
+ logerr("field too long in SYSFILE: %s", p);
+ while (*p && *p++ != ':')
+ /* loop */;
+ break;
+ }
*q++ = *p++;
***************
*** 204,206
if (lasttime < 0) {
! logerr("Unparsable date \"%s\"", datestr);
if (sscanf(datestr, "%s %s %s %s %s", junk, month, day, tod,
--- 213,215 -----
if (lasttime < 0) {
! logerr("%s: Unparsable date \"%s\"", filename, datestr);
if (sscanf(datestr, "%s %s %s %s %s", junk, month, day, tod,
***************
*** 469,471
*p++ = '\0';
! (void) sprintf(oidbuf, "<%s@%s.UUCP>", p, artid);
if (p)
--- 478,480 -----
*p++ = '\0';
! (void) sprintf(oidbuf, "<%s@%s.uucp>", p, artid);
if (p)
***************
*** 478,480
(void) get_server(workspace,sizeof(workspace));
! if (*workspace != CHAR_OK)
return NULL;
--- 487,489 -----
(void) get_server(workspace,sizeof(workspace));
! if (*workspace != '2')
return NULL;
***************
*** 483,485
(void) get_server(workspace,sizeof(workspace)); /* get response */
! if (*workspace != CHAR_OK)
return NULL; /* old style nntp */
--- 492,494 -----
(void) get_server(workspace,sizeof(workspace)); /* get response */
! if (*workspace != '2')
return NULL; /* old style nntp */
***************
*** 497,499
(void) get_server(workspace,sizeof(workspace));
! if (*workspace != CHAR_OK)
return NULL;
--- 506,508 -----
(void) get_server(workspace,sizeof(workspace));
! if (*workspace != '2')
return NULL;
***************
*** 519,521
(void) get_server(workspace,sizeof(workspace));
! if (*workspace != CHAR_OK)
return NULL;
--- 528,530 -----
(void) get_server(workspace,sizeof(workspace));
! if (*workspace != '2')
return NULL;
***************
*** 664,666
called = 1;
! (void) dbminit(name);
}
--- 673,676 -----
called = 1;
! if (dbminit(name))
! logerr("dbminit failed: %s", name);
}
***************
*** 721,724
FILE *
! xart_open (filename,mode)
! char *filename,*mode;
{
--- 731,734 -----
FILE *
! xart_open (fname,mode)
! char *fname,*mode;
{
***************
*** 724,726
{
! FILE *fp = art_open (filename, mode);
extern int errno;
--- 734,736 -----
{
! FILE *fp = art_open (fname, mode);
extern int errno;
***************
*** 728,730
xerror("Cannot open article %s (%s): %s\n",
! filename, mode, errmsg(errno));
return fp;
--- 738,740 -----
xerror("Cannot open article %s (%s): %s\n",
! fname, mode, errmsg(errno));
return fp;
***************
*** 733,736
FILE *
! art_open (filename,mode)
! char *filename,*mode;
{
--- 743,746 -----
FILE *
! art_open (fname,mode)
! char *fname,*mode;
{
***************
*** 739,741
! if ((fp = fopen (filename, mode)) == NULL)
return NULL;
--- 749,751 -----
! if ((fp = fopen (fname, mode)) == NULL)
return NULL;
***************
*** 749,751
/* Clean up dangling link, if we have the power. Ignore error if we don't. */
! (void) unlink (filename);
return fp;
--- 759,761 -----
/* Clean up dangling link, if we have the power. Ignore error if we don't. */
! (void) unlink (fname);
return fp;
***************
*** 778,779
*q = '\0';
--- 788,794 -----
*q = '\0';
+ #ifdef SunIII
+ q = index(senderbuf, '@');
+ if (q)
+ *q = '\0';
+ #endif
***************
*** 781
}
--- 796,797 -----
}
+
Index: getdate.y
Prereq: 2.17
*** old/getdate.y Fri Dec 4 02:52:05 1987
--- getdate.y Tue Jan 17 13:09:29 1989
***************
*** 1,2
! %token ID MONTH DAY MERIDIAN NUMBER UNIT MUNIT SUNIT ZONE DAYZONE AGO
%{
--- 1,2 -----
! %token ID MONTH DAY MERIDIAN SNUMBER UNUMBER UNIT MUNIT SUNIT ZONE DAYZONE AGO
%{
***************
*** 5,7
/* University of North Carolina at Chapel Hill */
! /* @(#)getdate.y 2.17 11/30/87 */
--- 5,7 -----
/* University of North Carolina at Chapel Hill */
! /* @(#)getdate.y 2.19 1/17/89 */
***************
*** 22,24
! #if defined(BSD4_2) || defined (BSD4_1C)
#include <sys/time.h>
--- 22,24 -----
! #if defined(BSD4_2)
#include <sys/time.h>
***************
*** 59,61
! nspec: NUMBER =
{if (timeflag && dateflag && !relflag) year = $1;
--- 59,61 -----
! nspec: UNUMBER =
{if (timeflag && dateflag && !relflag) year = $1;
***************
*** 63,65
! tspec: NUMBER MERIDIAN =
{hh = $1; mm = 0; ss = 0; merid = $2;}
--- 63,65 -----
! tspec: UNUMBER MERIDIAN =
{hh = $1; mm = 0; ss = 0; merid = $2;}
***************
*** 65,67
{hh = $1; mm = 0; ss = 0; merid = $2;}
! | NUMBER ':' NUMBER =
{hh = $1; mm = $3; merid = 24;}
--- 65,67 -----
{hh = $1; mm = 0; ss = 0; merid = $2;}
! | UNUMBER ':' UNUMBER =
{hh = $1; mm = $3; merid = 24;}
***************
*** 67,69
{hh = $1; mm = $3; merid = 24;}
! | NUMBER ':' NUMBER MERIDIAN =
{hh = $1; mm = $3; merid = $4;}
--- 67,69 -----
{hh = $1; mm = $3; merid = 24;}
! | UNUMBER ':' UNUMBER MERIDIAN =
{hh = $1; mm = $3; merid = $4;}
***************
*** 69,71
{hh = $1; mm = $3; merid = $4;}
! | NUMBER ':' NUMBER NUMBER =
{hh = $1; mm = $3; merid = 24;
--- 69,71 -----
{hh = $1; mm = $3; merid = $4;}
! | UNUMBER ':' UNUMBER SNUMBER =
{hh = $1; mm = $3; merid = 24;
***************
*** 72,74
daylight = STANDARD; ourzone = -($4%100 + 60*($4/100));}
! | NUMBER ':' NUMBER ':' NUMBER =
{hh = $1; mm = $3; ss = $5; merid = 24;}
--- 72,74 -----
daylight = STANDARD; ourzone = -($4%100 + 60*($4/100));}
! | UNUMBER ':' UNUMBER ':' UNUMBER =
{hh = $1; mm = $3; ss = $5; merid = 24;}
***************
*** 74,76
{hh = $1; mm = $3; ss = $5; merid = 24;}
! | NUMBER ':' NUMBER ':' NUMBER MERIDIAN =
{hh = $1; mm = $3; ss = $5; merid = $6;}
--- 74,76 -----
{hh = $1; mm = $3; ss = $5; merid = 24;}
! | UNUMBER ':' UNUMBER ':' UNUMBER MERIDIAN =
{hh = $1; mm = $3; ss = $5; merid = $6;}
***************
*** 76,78
{hh = $1; mm = $3; ss = $5; merid = $6;}
! | NUMBER ':' NUMBER ':' NUMBER NUMBER =
{hh = $1; mm = $3; ss = $5; merid = 24;
--- 76,78 -----
{hh = $1; mm = $3; ss = $5; merid = $6;}
! | UNUMBER ':' UNUMBER ':' UNUMBER SNUMBER =
{hh = $1; mm = $3; ss = $5; merid = 24;
***************
*** 89,91
{dayord = 1; dayreq = $1;}
! | NUMBER DAY =
{dayord = $1; dayreq = $2;};
--- 89,91 -----
{dayord = 1; dayreq = $1;}
! | UNUMBER DAY =
{dayord = $1; dayreq = $2;};
***************
*** 92,94
! dtspec: NUMBER '/' NUMBER =
{month = $1; day = $3;}
--- 92,94 -----
! dtspec: UNUMBER '/' UNUMBER =
{month = $1; day = $3;}
***************
*** 94,96
{month = $1; day = $3;}
! | NUMBER '/' NUMBER '/' NUMBER =
{month = $1; day = $3; year = $5;}
--- 94,96 -----
{month = $1; day = $3;}
! | UNUMBER '/' UNUMBER '/' UNUMBER =
{month = $1; day = $3; year = $5;}
***************
*** 96,98
{month = $1; day = $3; year = $5;}
! | MONTH NUMBER =
{month = $1; day = $2;}
--- 96,98 -----
{month = $1; day = $3; year = $5;}
! | MONTH UNUMBER =
{month = $1; day = $2;}
***************
*** 98,100
{month = $1; day = $2;}
! | MONTH NUMBER ',' NUMBER =
{month = $1; day = $2; year = $4;}
--- 98,100 -----
{month = $1; day = $2;}
! | MONTH UNUMBER ',' UNUMBER =
{month = $1; day = $2; year = $4;}
***************
*** 100,102
{month = $1; day = $2; year = $4;}
! | NUMBER MONTH =
{month = $2; day = $1;}
--- 100,102 -----
{month = $1; day = $2; year = $4;}
! | UNUMBER MONTH =
{month = $2; day = $1;}
***************
*** 102,104
{month = $2; day = $1;}
! | NUMBER MONTH NUMBER =
{month = $2; day = $1; year = $3;};
--- 102,104 -----
{month = $2; day = $1;}
! | UNUMBER MONTH UNUMBER =
{month = $2; day = $1; year = $3;};
***************
*** 106,108
! rspec: NUMBER UNIT =
{relsec += 60L * $1 * $2;}
--- 106,108 -----
! rspec: SNUMBER UNIT =
{relsec += 60L * $1 * $2;}
***************
*** 108,110
{relsec += 60L * $1 * $2;}
! | NUMBER MUNIT =
{relmonth += $1 * $2;}
--- 108,110 -----
{relsec += 60L * $1 * $2;}
! | SNUMBER MUNIT =
{relmonth += $1 * $2;}
***************
*** 110,112
{relmonth += $1 * $2;}
! | NUMBER SUNIT =
{relsec += $1;}
--- 110,112 -----
{relmonth += $1 * $2;}
! | SNUMBER SUNIT =
{relsec += $1;}
***************
*** 217,219
extern int yylval;
! int sign;
register char c;
--- 217,219 -----
extern int yylval;
! int sign = 0;
register char c;
***************
*** 232,234
if (!isdigit(*++lptr)) {
! /* yylval = sign; return (NUMBER); */
return yylex(); /* skip the '-' sign */
--- 232,234 -----
if (!isdigit(*++lptr)) {
! /* yylval = sign; return (UNUMBER); */
return yylex(); /* skip the '-' sign */
***************
*** 235,237
}
! } else sign = 1;
yylval = 0;
--- 235,237 -----
}
! }
yylval = 0;
***************
*** 239,241
yylval = 10*yylval + c - '0';
- yylval *= sign;
lptr--;
--- 239,240 -----
yylval = 10*yylval + c - '0';
lptr--;
***************
*** 241,243
lptr--;
! return (NUMBER);
--- 240,247 -----
lptr--;
! if (sign < 0)
! yylval = -yylval;
! if (sign != 0)
! return SNUMBER;
! else
! return UNUMBER;
***************
*** 388,390
{"now", UNIT, 0},
! {"last", NUMBER, -1},
{"this", UNIT, 0},
--- 392,394 -----
{"now", UNIT, 0},
! {"last", UNUMBER, -1},
{"this", UNIT, 0},
***************
*** 390,404
{"this", UNIT, 0},
! {"next", NUMBER, 2},
! {"first", NUMBER, 1},
! /* {"second", NUMBER, 2}, */
! {"third", NUMBER, 3},
! {"fourth", NUMBER, 4},
! {"fifth", NUMBER, 5},
! {"sixth", NUMBER, 6},
! {"seventh", NUMBER, 7},
! {"eigth", NUMBER, 8},
! {"ninth", NUMBER, 9},
! {"tenth", NUMBER, 10},
! {"eleventh", NUMBER, 11},
! {"twelfth", NUMBER, 12},
{"ago", AGO, 1},
--- 394,408 -----
{"this", UNIT, 0},
! {"next", UNUMBER, 2},
! {"first", UNUMBER, 1},
! /* {"second", UNUMBER, 2}, */
! {"third", UNUMBER, 3},
! {"fourth", UNUMBER, 4},
! {"fifth", UNUMBER, 5},
! {"sixth", UNUMBER, 6},
! {"seventh", UNUMBER, 7},
! {"eighth", UNUMBER, 8},
! {"ninth", UNUMBER, 9},
! {"tenth", UNUMBER, 10},
! {"eleventh", UNUMBER, 11},
! {"twelfth", UNUMBER, 12},
{"ago", AGO, 1},
Index: header.c
Prereq: 2.49
*** old/header.c Thu Oct 8 00:20:52 1987
--- header.c Sun Jan 15 19:48:58 1989
***************
*** 1,3
/*
! * This software is Copyright (c) 1986 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1986, 1989 by Rick Adams.
*
***************
*** 19,21
#ifdef SCCSID
! static char *SccsId = "@(#)header.c 2.49 10/7/87";
#endif /* SCCSID */
--- 19,21 -----
#ifdef SCCSID
! static char *SccsId = "@(#)header.c 2.50 1/15/89";
#endif /* SCCSID */
***************
*** 85,87
/* Newsgroup List */
! if (hfgets(hp->nbuf, BUFLEN, fp) == NULL || !nstrip(hp->nbuf))
return NULL;
--- 85,87 -----
/* Newsgroup List */
! if (hfgets(hp->nbuf, MBUFLEN, fp) == NULL || !nstrip(hp->nbuf))
return NULL;
***************
*** 200,203
#endif /* OLD */
! case MESSAGEID:
! getfield(hp->ident, sizeof(hp->ident));
break;
--- 200,210 -----
#endif /* OLD */
! case MESSAGEID: {
! register char *cp;
! getfield(hp->ident, sizeof(hp->ident));
! cp = hp->ident;
! do {
! if (*cp && !isprint(*cp))
! *cp = '?';
! } while (*cp++);
! }
break;
***************
*** 220,223
getfield(hp->distribution, sizeof(hp->distribution));
! if (strcmp(hp->distribution, "net") == 0
! || strcmp(hp->distribution, "world") == 0)
hp->distribution[0] = '\0';
--- 227,230 -----
getfield(hp->distribution, sizeof(hp->distribution));
! if (STRCMP(hp->distribution, "net") == 0
! || STRCMP(hp->distribution, "world") == 0)
hp->distribution[0] = '\0';
***************
*** 223,224
hp->distribution[0] = '\0';
break;
--- 230,238 -----
hp->distribution[0] = '\0';
+ else if (STRCMP(hp->distribution, "local") == 0 &&
+ hp->path[0] != '\0' &&
+ strncmp(hp->path, LOCALPATHSYSNAME,
+ strlen(LOCALPATHSYSNAME)) != 0) {
+ hp->distribution[0] = '\0';
+ xerror("Bogus local distribution rejected");
+ }
break;
***************
*** 445,446
lastsp = 1;
break;
--- 459,464 -----
lastsp = 1;
+ break;
+
+ case '\n':
+ lastsp = 1;
break;
Index: header.h
Prereq: 2.21
*** old/header.h Thu Oct 8 00:20:56 1987
--- header.h Sun Jan 15 19:48:58 1989
***************
*** 4,6
! /* @(#)header.h 2.21 10/7/87 */
--- 4,6 -----
! /* @(#)header.h 2.22 1/15/89 */
***************
*** 12,14
char path[PATHLEN]; /* Path: */
! char nbuf[LBUFLEN]; /* Newsgroups: */
char title[BUFLEN]; /* Subject: */
--- 12,14 -----
char path[PATHLEN]; /* Path: */
! char nbuf[MBUFLEN]; /* Newsgroups: */
char title[BUFLEN]; /* Subject: */
***************
*** 16,18
char replyto[BUFLEN]; /* Reply-To: */
! char followid[BUFLEN]; /* References: */
char subdate[DATELEN]; /* Date: (submission) */
--- 16,18 -----
char replyto[BUFLEN]; /* Reply-To: */
! char followid[MBUFLEN]; /* References: */
char subdate[DATELEN]; /* Date: (submission) */
***************
*** 34,36
#ifdef DOXREFS
! char xref[BUFLEN]; /* Xref: */
#endif /* DOXREFS */
--- 34,36 -----
#ifdef DOXREFS
! char xref[MBUFLEN]; /* Xref: */
#endif /* DOXREFS */
Index: ifuncs.c
Prereq: 2.69
*** old/ifuncs.c Fri Dec 4 02:52:09 1987
--- ifuncs.c Wed Jan 18 14:28:50 1989
***************
*** 1,3
/*
! * This software is Copyright (c) 1986 by Rick Adams.
*
--- 1,3 -----
/*
! * This software is Copyright 1986, 1989 by Rick Adams.
*
***************
*** 18,20
#ifdef SCCSID
! static char *SccsId = "@(#)ifuncs.c 2.69 12/1/87";
#endif /* SCCSID */
--- 18,20 -----
#ifdef SCCSID
! static char *SccsId = "@(#)ifuncs.c 2.72 1/18/89";
#endif /* SCCSID */
***************
*** 231,233
if (nsent)
! log(sentbuf);
s_close();
--- 231,233 -----
if (nsent)
! log("%s", sentbuf);
s_close();
***************
*** 251,253
register int c;
! register char *ptr;
char TRANS[BUFLEN];
--- 251,253 -----
register int c;
! register char *ptr, *size_ptr;
char TRANS[BUFLEN];
***************
*** 284,285
if (notify)
--- 284,297 -----
+ /* allow specification based on size */
+ if ((size_ptr = strpbrk(sp->s_flags, "<>")) != NULL) {
+ struct stat stbuf;
+ if (fstat(fileno(ifp), &stbuf) == 0 && (
+ (*size_ptr == '>' && stbuf.st_size < atol(&size_ptr[1]))
+ || (*size_ptr == '<' && stbuf.st_size > atol(&size_ptr[1]))
+ )) {
+ fclose(ifp);
+ return FALSE;
+ }
+ }
+
if (notify)
***************
*** 337,339
}
! (void) sprintf(TRANS, "%s/trXXXXXX", SPOOL);
}
--- 349,351 -----
}
! (void) sprintf(TRANS, "%s/.tmp/trXXXXXX", SPOOL);
}
***************
*** 359,363
}
! if (sp->s_xmit[0] == '\0')
! sprintf(sp->s_xmit, "%s/%s%s", BATCHDIR, sp->s_name,
! appmsgid ? ".ihave" : "");
#ifdef LOGDIR
--- 371,385 -----
}
!
! /* if filename is an absolute pathname, use it
! * if no filename given, tack system name onto BATCHDIR
! * otherwise, tack filename onto BATCHDIR
! *
! * also, tack ".ihave" onto ihave format files
! * in BATCHDIR (should this be done for all files?)
! */
! if (sp->s_xmit[0] != '/') {
! if (sp->s_xmit[0] == '\0')
! (void) strcpy(TRANS, sp->s_name);
! else
! (void) strcpy(TRANS, sp->s_xmit);
#ifdef LOGDIR
***************
*** 363,366
#ifdef LOGDIR
! (void) sprintf(TRANS, "%s/%s/%s", logdir(HOME), BATCHDIR, sp->s_xmit);
! ofp = fopen(TRANS, "a");
#else /* !LOGDIR */
--- 385,387 -----
#ifdef LOGDIR
! sprintf(sp->s_xmit, "%s/%s/%s%s", logdir(HOME),
#else /* !LOGDIR */
***************
*** 366,368
#else /* !LOGDIR */
! ofp = fopen(sp->s_xmit, "a");
#endif /* !LOGDIR */
--- 387,389 -----
#else /* !LOGDIR */
! sprintf(sp->s_xmit, "%s/%s%s",
#endif /* !LOGDIR */
***************
*** 368,369
#endif /* !LOGDIR */
if (ofp == NULL)
--- 389,393 -----
#endif /* !LOGDIR */
+ BATCHDIR, TRANS, appmsgid ? ".ihave" : "");
+ }
+ ofp = fopen(sp->s_xmit, "a");
if (ofp == NULL)
***************
*** 370,372
xerror("Cannot append to %s", sp->s_xmit);
! fprintf(ofp, "%s", appmsgid ? hh.ident : firstbufname);
#ifdef MULTICAST
--- 394,397 -----
xerror("Cannot append to %s", sp->s_xmit);
! fprintf(ofp, "%s", appmsgid ? hh.ident :
! firstbufname);
#ifdef MULTICAST
***************
*** 716,718
extern int errno;
- #ifdef VMS
int fd;
--- 741,742 -----
extern int errno;
int fd;
***************
*** 718,722
int fd;
! /* The name here is because of the peculiar properties of version numbers
! * in Eunice. We eliminate any troublesome characters also.
! */
(void) sprintf(lockname, "/tmp/%.10s.l.1", str);
--- 742,748 -----
int fd;
! #ifdef VMS
! /*
! * The name here is because of the peculiar properties of version
! * numbers in Eunice. We eliminate any troublesome characters also.
! */
(void) sprintf(lockname, "/tmp/%.10s.l.1", str);
***************
*** 741,744
#endif
! i = creat(tempname, 0666);
! if (i < 0)
xerror("Cannot creat %s: errno %d", tempname, errno);
--- 767,773 -----
#endif
! #ifndef O_EXCL
! (void) strcpy(tempname, "/tmp/LTMP.XXXXXX");
! MKTEMP(tempname);
! fd = creat(tempname, 0666);
! if (fd < 0)
xerror("Cannot creat %s: errno %d", tempname, errno);
***************
*** 744,746
xerror("Cannot creat %s: errno %d", tempname, errno);
- (void) close(i);
while (link(tempname, lockname)) {
--- 773,774 -----
xerror("Cannot creat %s: errno %d", tempname, errno);
while (link(tempname, lockname)) {
***************
*** 746,747
while (link(tempname, lockname)) {
#endif /* !VMS */
--- 774,778 -----
while (link(tempname, lockname)) {
+ #else /* O_EXCL */
+ while ((fd=(open(lockname, O_EXCL|O_CREAT, 0) < 0) {
+ #endif /* O_EXCL */
#endif /* !VMS */
***************
*** 759,761
}
- #ifdef VMS
(void) close(fd);
--- 790,791 -----
}
(void) close(fd);
***************
*** 761,763
(void) close(fd);
! #endif
(void) unlink(tempname);
--- 791,793 -----
(void) close(fd);
! #ifndef O_EXCL
(void) unlink(tempname);
***************
*** 763,764
(void) unlink(tempname);
}
--- 793,795 -----
(void) unlink(tempname);
+ #endif
}
***************
*** 1311,1316
if ((fd = creat(tfilename, 0666)) < 0) {
! fprintf(stderr, "rnews: creat of \"%s\" failed",
! tfilename);
! perror(" ");
! exit(1);
}
--- 1342,1345 -----
if ((fd = creat(tfilename, 0666)) < 0) {
! xerror("rnews: creat of \"%s\" failed: %s",
! tfilename,errmsg(errno));
}
***************
*** 1319,1324
if (wc != rc) {
! fprintf(stderr, "write of %d to \"%s\" returned %d",
! rc, tfilename, wc);
! perror(" ");
! exit(1);
}
--- 1348,1351 -----
if (wc != rc) {
! xerror("write of %d to \"%s\" returned %d: %s",
! rc, tfilename, wc, errmsg(errno));
}
***************
*** 1373,1374
freopen(tfilename, "r", infp);
return; /* from checkbatch as if
--- 1400,1402 -----
freopen(tfilename, "r", infp);
+ (void) free(cp);
return; /* from checkbatch as if
***************
*** 1381,1386
if (wc != rc) {
! fprintf(stderr, "write of %d to pipe returned %d",
! rc, wc);
! perror("rnews: write");
! exit(1);
}
--- 1409,1412 -----
if (wc != rc) {
! xerror("write of %d to pipe returned %d: %s",
! rc, wc, errmsg(errno));
}
***************
*** 1420,1423
if (pipe(piped) != 0) {
! perror("checkbatch: pipe() failed");
! exit(1);
}
--- 1446,1448 -----
if (pipe(piped) != 0) {
! xerror("checkbatch: pipe() failed: %s",errmsg(errno));
}
***************
*** 1425,1427
while ((pid = vfork()) == -1) {
! perror("checkbatch: fork failed, waiting");
sleep(60);
--- 1450,1452 -----
while ((pid = vfork()) == -1) {
! logerr("checkbatch: fork failed, waiting: %s",errmsg(errno));
sleep(60);
***************
*** 1439,1442
execl(cmd, arg0, arg1, arg2, (char *) 0);
! perror("checkbatch");
! xerror("Unable to exec %s to unpack news.", cmd);
} else { /* parent process */
--- 1464,1466 -----
execl(cmd, arg0, arg1, arg2, (char *) 0);
! xerror("Unable to exec \"%s\" to unpack news: %s", cmd, errmsg(errno));
} else { /* parent process */
***************
*** 1472,1473
p++;
--- 1496,1504 -----
p++;
+ if (strncmp(p, "inews", 5) != 0) {
+ #ifdef ALLOW_LIB_EXECS
+ log("Processing incoming batch with command \"%s\"", p);
+ #else /* !ALLOW_LIB_EXECS */
+ xerror("Attempt to execute news batch with command \"%s\"", p);
+ #endif /* !ALLOW_LIB_EXECS */
+ }
***************
*** 1509,1511
(void) execvp(path, args);
! perror(path);
xxit(2);
--- 1540,1542 -----
(void) execvp(path, args);
! logerr("Unable to exec \"%s\" to unpack news: %s", path, errmsg(errno));
xxit(2);
Index: patchlevel.h
Prereq: 14
*** .d/patchlevel.h Fri Dec 4 02:52:37 1987
--- patchlevel.h Sun Jan 15 19:49:02 1989
***************
*** 1,2
! #define PATCHLEVEL 14
--- 1,2 -----
! #define PATCHLEVEL 15
***************
*** 2,3
! #define NEWS_VERSION "B 2.11 12/1/87"
--- 2,3 -----
! #define NEWS_VERSION "B 2.11 1/14/89"
--- end of patch 15 ---
--
"Crack-pot societies of all kinds sprang up everwhere, advocating everything
from absolutism to anarchy. Queer cults arose, preaching free love, the
imminent end of the world, and many other departures from the norm of thought."
E.E. "Doc" Smith, Children of the Lens, 1954 | Arnold Robbins, skeeve!arnold
More information about the Unix-pc.sources
mailing list