[comp.sources.misc] v16i018: Bootstrap News v1.3, Part01/01

ron@mlfarm.com (Ronald Florence) (01/05/91)

Submitted-by: ron@mlfarm.com (Ronald Florence)
Posting-number: Volume 16, Issue 18
Archive-name: bsnews1.3/part01

   bsnews - Bootstrap News
   copyright 1989, 1990 Ronald Florence
   version 1.3 (27 Dec 90)

   Bootstrap News is a collection of programs which enable a leaf node to
   take a limited news feed without installing a full news package.  News
   articles are spooled in a Unix-mail-format file, where they can be
   read, printed, forwarded, replied-to or saved with a mail reader such
   as Mail or elm.  In a single-user configuration, articles can be
   deleted by the reader; in the multi-user configuration, news articles
   are expired by a command run from cron.  Portions of bsnews can be
   compiled for ms-dos systems running uucp work-alikes.

   This version (1.3) of bsnews includes an expire command for multi-user
   systems, RFC 822 compliant headers on the news articles, expanded
   functionality in the news poster, and an improved Makefile.  The
   original version of bsnews and a subsequent patch were posted on 
   comp.sources.misc, and from the volume of mail I've gotten, have been 
   popular with users.
--
Ronald Florence			ron@mlfarm.com

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	Readme
#	Makefile
#	bsnews.man
#	checknews.c
#	expire.proto
#	mail.ed
#	myname.c
#	readnews.proto
#	rnews.c
#	pn.proto
#	uurec.proto
# This archive created: Fri Dec 28 11:20:58 1990
# By:	Ronald Florence (Maple Lawn Farm, Stonington, CT)
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'Readme'" '(3768 characters)'
if test -f 'Readme'
then
	echo shar: "will not over-write existing file 'Readme'"
else
sed 's/^X//' << \SHAR_EOF > 'Readme'
Xbsnews - Bootstrap News
Xcopyright 1989, 1990 Ronald Florence
Xversion 1.3 (27 Dec 90)
X
XBootstrap News is a collection of programs which enable a leaf node to
Xtake a limited news feed without installing a full news package.  News
Xarticles are spooled in a Unix-mail-format file, where they can be
Xread, printed, forwarded, replied-to or saved with a mail reader such
Xas Mail or elm.  In a single-user configuration, articles can be
Xdeleted by the reader; in the multi-user configuration, news articles
Xare expired by a command run from cron.  Portions of bsnews can be
Xcompiled for ms-dos systems running uucp work-alikes.
X
XThis version (1.3) of bsnews includes an expire command for multi-user
Xsystems, RFC 822 compliant headers on the news articles, and expanded
Xfunctionality in the news poster.
X
XTo build bsnews for a Unix system:
X
X   1. Change the Makefile defines for READER, HOST, CC, ECHO,
X      CFLAGS, SPOOLPERM, and MANDIR to suit your system.  You 
X      may need to be a privileged user to install bsnews.
X
X   2. For a uux feed, do `make'.  Add `rnews' to the appropriate 
X      uucp permissions file in /usr/lib/uucp.  If you have 
X      /usr/bin/compress, tell your news feed to send you a 
X      compressed, batched feed.  Rnews will also detect and 
X      unpack uncompressed batches or single articles.
X
X   3. For a mail feed (if your host is using sendnews to send 
X      you news articles via mail), do `make mail-bsnews'.  Create
X      a sendmail or execmail alias (`rnews: |/usr/bin/uurec'), or 
X      use cron to run `uurec' with /usr/spool/mail/rnews as input.  
X      
X   4. Use `readnews' to read your news, and `pn' to post news.
X      To receive notification of new news when you log in, add 
X      `checknews' to your .login or .profile file.  You can use
X      environment variables EDITOR and PAGER to override the 
X      defaults of `vi' and `more' in the news poster.  
X
X      To test `pn', use a newsgroup with limited distribution, 
X      which the administrator of your news feed can suggest.  Before
X      you post to Usenet, you should read the file "Standard for 
X      Interchange of USENET Messages," available in newsgroup 
X      news.announce.newusers or from your news feed
X
X   5. For a multi-user site, create a cron entry for `expire n', 
X      where n is the expiration period for news in days.  The expire
X      script requires nawk or gawk.  If you have the old awk, you
X      can modify the script, or write me for a special version of
X      expire. 
X
XTo use Bootstrap News with ms-dos:
X
X   1. Add -DIAM='"yournodename"' to the CFLAGS in the Makefile, 
X      change CC and NEWSDIR to suit your C compiler and system, 
X      and do `make rnews.exe'.  Rnews.exe will unpack compressed 
X      or uncompressed batches or single articles.  You will need 
X      compress.exe for a compressed feed.
X
X   2. If your uucp-clone cannot execute rnews.exe with the incoming
X      news batches as input, have your host install a sendbatch 
X      command file in their /usr/spool/batch directory, with the 
X      nodename of your system in place of `yoursys':
X
X	  :
X          #! /bin/sh
X          # yoursys.cmd
X	  News=/tmp/`date '+%d%H%M%S'`.nws
X	  cat > $News
X	  uucp -rC $News yoursys!~/
X	  rm $News
X
X      After each poll of your host, run rnews.exe with the *.nws 
X      files in your public directory as input.  
X
X   3. To read your news, do `mail -f Newsspool', where
X      `Newsspool' is the spool path compiled into rnews.exe.
X
XPermission is hereby granted for unlimited non-commercial use of
Xthese programs, on condition that the copyright notices are left
Xintact and any modifications to the source code are noted as such.
XNo warranty of any kind is implied or granted for this material.
X
XRonald Florence			
Xron@mlfarm.com
X
SHAR_EOF
if test 3768 -ne "`wc -c < 'Readme'`"
then
	echo shar: "error transmitting 'Readme'" '(should have been 3768 characters)'
fi
fi
echo shar: "extracting 'Makefile'" '(2602 characters)'
if test -f 'Makefile'
then
	echo shar: "will not over-write existing file 'Makefile'"
else
sed 's/^X//' << \SHAR_EOF > 'Makefile'
X# Makefile for Bootstrap News
X# copyright 1989, 1990 Ronald Florence  
X# version 1.3 (ron@mlfarm.com, 23 Dec 90)
X
X# ----- Change the following defines, as needed. -----
X
X# Mail reader, with the option used to name the spool file
XREADER = elm -f
X
X# Your news feed
XHOST = BigNode
X
X# C compiler
XCC = gcc
X
X# If your echo uses `-n' to suppress newlines, use ECHO = -n
XECHO =
X
X# Add -DUNAME to CFLAGS for System V with uname()
X# Add -DGETHOSTNAME to CFLAGS for BSD with gethostname()
X# Add -DIAM='"yournodename"' to CFLAGS to hardcode your node name
XCFLAGS = -O -DNewsspool='"$(NEWSSPOOL)"'
X
X# For a single-user site, SPOOLPERM = 666;  multi-user, SPOOLPERM = 644
XSPOOLPERM = 644
X
X# Directory for man pages
XMANDIR = /usr/man/man.LOCAL
X
X# ----- You may want to change these. -----
X
XNEWSDIR = /usr/spool/news
XLIBDIR = /usr/lib/news
XBIN = bin
XBINDIR = /usr/bin
X
X# ----- You shouldn't need to make changes below here. -----
X
XNEWSSPOOL = $(NEWSDIR)/bsnews
XSEQFILE = $(LIBDIR)/seq
XPGMS = rnews uurec pn checknews readnews expire
XFILES = spoolfile seqfile
XSRCS = Readme Makefile bsnews.man checknews.c expire.proto mail.ed\
X       myname.c readnews.proto rnews.c pn.proto uurec.proto
XSHELL = /bin/sh
X
Xbsnews:	install 
X
Xmail-bsnews: fix-pn install
X
Xinstall: $(PGMS) $(FILES) bsnews.1
X	chgrp $(BIN) $(PGMS) $(NEWSSPOOL) $(SEQFILE)
X	chown $(BIN) $(PGMS) $(NEWSSPOOL) $(SEQFILE)
X	chmod 544 expire
X	chmod 555 readnews pn checknews
X	chmod 6555 rnews uurec
X	mv $(PGMS) $(BINDIR)
X	cp bsnews.1 $(MANDIR)
X
Xfix-pn: pn
X	ed - pn < mail.ed
X
Xbsnews.1: Makefile bsnews.man
X	sed "s|NEWSSPOOL|$(NEWSSPOOL)|" bsnews.man |\
X	sed "s|SEQ|$(SEQFILE)|" > bsnews.1
X
Xexpire: Makefile expire.proto
X	sed "s|NEWSSPOOL|$(NEWSSPOOL)|" expire.proto > expire
X
Xspoolfile:
X	[ -d $(NEWSDIR) ] || mkdir $(NEWSDIR)
X	[ -f $(NEWSSPOOL) ] || > $(NEWSSPOOL)
X	chmod $(SPOOLPERM) $(NEWSSPOOL)
X
Xseqfile:
X	[ -d $(LIBDIR) ] || mkdir $(LIBDIR)
X	[ -f $(SEQFILE) ] || echo "1" > $(SEQFILE)
X	chmod 666 $(SEQFILE)
X
Xuurec:	Makefile uurec.proto
X	sed "s|NEWSSPOOL|$(NEWSSPOOL)|" uurec.proto > uurec
X
Xcheckname: myname.c Makefile
X	$(CC) $(CFLAGS) -DCHECKNAME myname.c -o checkname
X	@./checkname
X
Xrnews:  checkname rnews.o myname.o 
X	$(CC) $(CFLAGS) rnews.o myname.o -o rnews
X
Xpn:	Makefile pn.proto
X	sed "s/BigNode/$(HOST)/" pn.proto |\
X	sed "s/^\(n=\)/\1$(ECHO)/" > pn
X
Xreadnews: Makefile readnews.proto
X	sed "s|READER|$(READER) $(NEWSSPOOL)|" readnews.proto > readnews
X
Xrnews.exe: rnews.c myname.c
X	$(CC) -DDOS $(CFLAGS) rnews.c myname.c -o rnews.exe
X
Xshar:	bsnews.shar 
X
Xbsnews.shar: $(SRCS)
X	shar -a $(SRCS) > bsnews.shar
X
Xclean:
X	rm -f $(PGMS) *.o checkname bsnews.1
SHAR_EOF
if test 2602 -ne "`wc -c < 'Makefile'`"
then
	echo shar: "error transmitting 'Makefile'" '(should have been 2602 characters)'
fi
fi
echo shar: "extracting 'bsnews.man'" '(2665 characters)'
if test -f 'bsnews.man'
then
	echo shar: "will not over-write existing file 'bsnews.man'"
else
sed 's/^X//' << \SHAR_EOF > 'bsnews.man'
X.\" bsnews.1
X.\" man page for bsnews (Bootstrap News)
X.\" Copyright 1990 Ronald Florence (ron@mlfarm.com, 23 Dec 90)
X.\"
X.TH BSNEWS LOCAL
X.SH NAME
Xrnews \- processes news articles received via uux
X.br
Xuurec \- processes news articles received via mail
X.br
Xchecknews \- a daemon to monitor the arrival of new news
X.br
Xexpire \- expires articles from the news spool
X.br
Xpn \- a simple news poster
X.br
Xreadnews \- a shell wrapper for the news reader
X.SH SYNOPSIS
X.B rnews 
X< 
X.I news-batch 
Xor
X.I article
X.br
X.B rnews 
X.I article(s)
Xor 
X.I news-batch(es)
X.br
X.B uurec 
X< 
X.I article
X.br
X.B checknews
X.br
X.B expire 
X.I n
X.br
X.B pn
X.br
X.B readnews
X.SH DESCRIPTION
X.PP
X.I Bsnews 
X(Bootstrap News) is a collection of programs which enable a leaf node
Xto take a limited news feed without installing a full news package.
X.PP
X.I Rnews 
Xprocesses individual news articles, batched, or batched and compressed
Xnews sent from a remote system via uux.  The articles are spooled in a
XUnix-mail-format news spool, with RFC 822 compliant headers.  An
Xinitial
X.I From
Xheader includes the email address of the poster and the date of
Xarrival at the system.  /usr/bin/compress is required for a compressed
Xfeed.
X.PP
X.I Uurec
Xspools news articles sent from a remote system in sendnews format
X(each line prefixed with an
X.IR N ).
X.PP
X.IR Checknews ,
Xnormally used in the
X.I .login
Xor 
X.I .profile
Xfile, notifies the user at login time whether there is new news on the
Xspool.
X.PP
X.I Expire
Xis normally run by cron on a multi-user system to expire news from the
Xnews spool after
X.I n
Xdays.  The expire script uses features of nawk (gawk).  An old-awk
Xversion is available from the author.
X.PP
X.I Pn 
Xis a simple news poster, configured by the bsnews Makefile to post
Xarticles via uux or mail.  
X.I Pn 
Xqueries interactively for the newsgroup(s) and subject, puts the user
Xin an editor (default
X.IR vi ),
Xto compose the article, and a pager (default
X.IR more )
Xto proof the article before posting.  The
X.SM EDITOR
Xand
X.SM PAGER 
Xenvironmental variables can be used to change the defaults.
X.PP
X.I Readnews 
Xis a simple shell-wrapper which adapts a Unix mail reader
X.RI ( elm , 
X.IR Mail ,
Xetc.) for reading news.  News articles can be read, printed,
Xforwarded, saved, replied-to, and (on a single-user system) deleted,
Xusing mailer commands.
X.SH FILES
X.if t .ta 2i
X.if n .ta 3i
XNEWSSPOOL	news spool
X.br
XSEQ	latest article ID
X.br
X$HOME/.lastnews	sentinel file for checknews
X.SH BUGS
X.I Bsnews 
Xis designed for a 
X.I limited 
Xnews feed.  Unless the news spool is expired frequently, a
Xsubscription of more than a few news groups is unwieldy.
X.SH AUTHOR
XRonald Florence (ron\s-2@\s0mlfarm.com).
X
SHAR_EOF
if test 2665 -ne "`wc -c < 'bsnews.man'`"
then
	echo shar: "error transmitting 'bsnews.man'" '(should have been 2665 characters)'
fi
fi
echo shar: "extracting 'checknews.c'" '(728 characters)'
if test -f 'checknews.c'
then
	echo shar: "will not over-write existing file 'checknews.c'"
else
sed 's/^X//' << \SHAR_EOF > 'checknews.c'
X/*
X * checknews.c - checks for bootstrap news
X * copyright 1989, 1990 Ronald Florence 
X * version 1.3 (ron@mlfarm.com, 15 Dec 90)
X */
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#ifndef Newsspool
X#define Newsspool	"/usr/spool/news/bsnews"
X#endif
X
X#define bye(s)	   puts(s), exit(1)
X
Xmain()
X{
X  struct stat nt, lt;
X  char newsmarker[80], *getenv();
X
X  if (!strcpy(newsmarker, getenv("HOME")))
X    bye("checknews: cannot find $HOME.");
X  strcat(newsmarker, "/.lastnews");
X  if (stat(newsmarker, &lt) == -1)
X    lt.st_mtime = 0;
X  if (stat(Newsspool, &nt) == -1)
X    bye("checknews: cannot find Newsspool.");
X  puts(nt.st_mtime < lt.st_mtime ? "No news is good news." : "New news has arrived.");
X  exit(0);
X}
SHAR_EOF
if test 728 -ne "`wc -c < 'checknews.c'`"
then
	echo shar: "error transmitting 'checknews.c'" '(should have been 728 characters)'
fi
fi
echo shar: "extracting 'expire.proto'" '(1447 characters)'
if test -f 'expire.proto'
then
	echo shar: "will not over-write existing file 'expire.proto'"
else
sed 's/^X//' << \SHAR_EOF > 'expire.proto'
X:
X#! /bin/sh
X# expire - expires bsnews spool
X# copyright 1990 Ronald Florence 
X# version 1.3 (ron@mlfarm.com, 22 Dec 90)
X# 
X# This awk script relies on features of nawk/gawk. 
X# Write me if you need an old-awk version.
X
Xwhile [ $# -gt 0 ]
X  do
X    case $1 in
X      -e|-E) shift;;
X          *) exp=`expr $1 : "-*[eE]*\([0-9]*\)"`; break;;
X    esac
X  done
X[ -z "$exp" ] &&  { echo "usage: $0 days"; exit; }
X
XNewsspool=NEWSSPOOL
X[ -f $Newsspool ] || { echo "$0: cannot find $Newsspool"; exit; }
XTmpspool=/tmp/expire.$$
Xtrap 'rm -f $Tmpspool' 1 2 3 15
X
XTimestamp=`awk 'expdays='$exp'
XBEGIN {
X  month["Jan"] = 1
X  month["Feb"] = 2
X  month["Mar"] = 3
X  month["Apr"] = 4
X  month["May"] = 5
X  month["Jun"] = 6
X  month["Jul"] = 7
X  month["Aug"] = 8
X  month["Sep"] = 9
X  month["Oct"] = 10
X  month["Nov"] = 11
X  month["Dec"] = 12
X  expired = 0
X  "ls -l '$Newsspool'" | getline
X  split($8, time, ":")
X  printf "%02d%02d%02d%02d", month[$6], $7, time[1], time[2]
X  "date" | getline
X  now = daynum($6, month[$2], $3)
X}  
X
X/^From / && expired == 0 { 
X  if (daynum($7, month[$4], $5) > now - expdays)
X      expired = 1
X}
Xexpired == 1 { print $0 > "'$Tmpspool'" }
X
Xfunction daynum(y, m, d, days, i, n) {
X  split("31 28 31 30 31 30 31 31 30 31 30 31", days)
X  n = (y - 1901) * 365 + int((y - 1901) / 4)
X  if (y % 4 == 0)
X    days[2]++
X  for (i = 1; i < m; i++)
X    n += days[i]
X  return (n + d)
X}' < $Newsspool`
X
Xtouch $Timestamp $Tmpspool
Xmv $Tmpspool $Newsspool
X
SHAR_EOF
if test 1447 -ne "`wc -c < 'expire.proto'`"
then
	echo shar: "error transmitting 'expire.proto'" '(should have been 1447 characters)'
fi
fi
echo shar: "extracting 'mail.ed'" '(74 characters)'
if test -f 'mail.ed'
then
	echo shar: "will not over-write existing file 'mail.ed'"
else
sed 's/^X//' << \SHAR_EOF > 'mail.ed'
X/uux/s/uux - -r \($H.*ws\) \(< $T.*t\)/sed 's\/\^\/N\/' \2 | mail \1/
Xw
Xq
SHAR_EOF
if test 74 -ne "`wc -c < 'mail.ed'`"
then
	echo shar: "error transmitting 'mail.ed'" '(should have been 74 characters)'
fi
fi
echo shar: "extracting 'myname.c'" '(1576 characters)'
if test -f 'myname.c'
then
	echo shar: "will not over-write existing file 'myname.c'"
else
sed 's/^X//' << \SHAR_EOF > 'myname.c'
X/*
X * myname.c
X * copyright 1989 Ronald Florence 
X * version 1.3 (ron@mlfarm, 15 Dec 90)
X */
X
X#include <stdio.h>
X
X#ifdef CHECKNAME
Xmain()
X{
X  char *myname();
X
X  fprintf(stderr, "\nIf your node name is not `%s' ", myname());
X  fprintf(stderr, "check the CFLAGS in your Makefile.\n\n");
X  exit(0);
X}
X#endif
X
X
Xchar *myname()
X{
X#ifdef IAM
X  return (IAM);
X}
X#else
X#ifdef UNAME
X#include <sys/utsname.h>
X
X  static struct utsname utn;
X
X  (void) uname(&utn);
X  return(utn.nodename);
X}
X#else  /* not UNAME */
X  static char nodename[64];
X
X#ifdef GETHOSTNAME
X  extern int gethostname();
X
X  (void) gethostname(nodename, (int) sizeof(nodename));
X  nodename[sizeof(nodename)] = 0;
X  return(nodename);
X}
X#else   /* not GETHOSTNAME */
X
X  FILE *whoami;
X
X  char *cp, *strchr(), *strpbrk();
X
X  if ((whoami = fopen("/etc/whoami", "r")) || 
X      (whoami = fopen("/etc/systemid", "r"))) 
X    {
X      fgets(nodename, sizeof(nodename), whoami);
X      fclose(whoami);
X      if (cp = strchr(nodename, '\n'))
X	*cp = '\0';
X      return(nodename);
X    }
X  if ((whoami = fopen("/usr/include/whoami.h", "r")) != 0) 
X    {
X      while (!feof(whoami)) 
X	{
X	  char	buf[100];
X	  
X	  if (fgets(buf, 100, whoami) == 0)
X	    break;
X	  if (sscanf(buf, "#define sysname \"%[^\"]\"", nodename))
X	    break;
X	}
X      fclose(whoami);
X      return (nodename);
X    }
X  if ((whoami = popen("uuname -l", "r")) != 0) 
X    {
X      fgets(nodename, sizeof(nodename), whoami);
X      pclose(whoami);
X      if (cp = strpbrk(nodename, " \n"))
X	*cp = '\0';
X      return (nodename);
X    }
X  return("nowhere");
X}
X#endif
X#endif
X#endif
SHAR_EOF
if test 1576 -ne "`wc -c < 'myname.c'`"
then
	echo shar: "error transmitting 'myname.c'" '(should have been 1576 characters)'
fi
fi
echo shar: "extracting 'readnews.proto'" '(169 characters)'
if test -f 'readnews.proto'
then
	echo shar: "will not over-write existing file 'readnews.proto'"
else
sed 's/^X//' << \SHAR_EOF > 'readnews.proto'
X:
X#! /bin/sh
X# readnews - news reader for bootstrap news
X# copyright 1989, 1990 Ronald Florence 
X# version 1.3 (ron@mlfarm.com, 15 Dec 90)
X
XREADER
Xtouch $HOME/.lastnews
SHAR_EOF
if test 169 -ne "`wc -c < 'readnews.proto'`"
then
	echo shar: "error transmitting 'readnews.proto'" '(should have been 169 characters)'
fi
fi
echo shar: "extracting 'rnews.c'" '(2960 characters)'
if test -f 'rnews.c'
then
	echo shar: "will not over-write existing file 'rnews.c'"
else
sed 's/^X//' << \SHAR_EOF > 'rnews.c'
X/*
X * rnews.c 
X * copyright 1989, 1990 Ronald Florence
X * version 1.3  (ron@mlfarm.com, 15 Dec 90)
X */
X
X#include <stdio.h>
X#include <time.h>
X
X#ifndef DOS
X#define Readmode	"r"
X#define Compress	"/usr/bin/compress -dc > %s"
X#define Tmpstr		mktemp("/tmp/newsart.XXXXXX")
Xchar	*mktemp();
X#else
X#include <fcntl.h>
X#define Readmode	"rb"
X#define Compress	"compress -d %s"
X#define Tmpstr		"%08.8lX.Z", time()
X#define pclose		fclose
X#endif
X
X#ifndef Newsspool
X#define Newsspool	"/usr/spool/news/bsnews"
X#endif
X
X#define bye(s)		perror(s), exit(1)
X
Xchar  *iam, tmpnews[80], dcomp[80];
Xlong  time();
XFILE  *nf, *cf;
X
Xmain(argc, argv)
X     int  argc;
X     char **argv;
X{
X  extern char   *myname();
X
X  iam = myname();
X  if (!(nf = fopen(Newsspool, "a")))
X    bye(Newsspool);
X  sprintf(tmpnews, Tmpstr);
X  sprintf(dcomp, Compress, tmpnews);
X
X  if (--argc)
X    while (*++argv)
X      {
X	if ((cf = freopen(*argv, Readmode, stdin)) == NULL)
X	  bye(*argv);
X	parse();
X      }
X  else
X    {
X#ifdef DOS
X      setmode(fileno(stdin), O_BINARY);
X#endif
X      parse();
X    }
X  exit(0);
X}
X
X
Xparse()
X{
X  register  c;
X  int	new = 0, n;
X  char  buf[BUFSIZ];
X
X  while (fgets(buf, BUFSIZ, stdin) != NULL)
X    {
X      if (!strncmp(buf, "#! ", 3))
X	{
X	  if (!strncmp(buf+3, "cunbatch", 8))
X	    {
X#ifndef DOS
X	      if (!(cf = popen(dcomp, "w")))
X		bye(dcomp);
X#else
X	      if (!(cf = fopen(tmpnews, "wb")))
X		bye(tmpnews);
X#endif
X	      while ((c = getchar()) != EOF)
X		putc(c, cf);
X	      pclose(cf);
X#ifdef DOS
X	      tmpnews[8] = '\0';
X	      if (system(dcomp))
X		bye(dcomp);
X#endif
X	      if ((cf = freopen(tmpnews, Readmode, stdin)) == NULL)
X		bye(tmpnews);
X	      continue;
X	    }
X	  else if (sscanf(buf+3, "rnews %d", &n) == 1)
X	    {
X	      for (c = 0, new = 0; c < n; new++)
X		{
X		  if (fgets(buf, BUFSIZ, stdin) == NULL)
X		    break;
X		  c += strlen(buf);
X		  parse_line(buf, new);
X		}
X	      continue;
X	    }
X	}
X      else			/* unbatched news */
X	parse_line(buf, new++);
X    }
X  unlink(tmpnews);
X}
X
X
Xparse_line(buf, cont)
X     char *buf;
X     int  cont;
X{
X  static int h;
X  int    i, eoh = 0;
X  static char *hold[20];
X  char   *sp, *ep, *ctime(), *malloc(), *strchr();
X  long   clock;
X
X  if (!cont)
X    h = 0;
X  if (h >= 0)
X    {
X      hold[h] = malloc(strlen(buf) + 1);
X      strcpy(hold[h++], buf);
X      if (!strncmp(buf, "From: ", 6))
X	{
X	  time(&clock);
X	  if (sp = strchr(buf, '<'))
X	    {
X	      sp++;
X	      ep = strchr(buf, '>');
X	    }
X	  else
X	    {
X	      sp = &buf[6];
X	      ep = strchr(buf, '(');
X	    }
X	  if (ep == NULL)
X	    ep = strchr(buf, '\n');
X	  *ep = '\0';
X	  fprintf(nf, "\nFrom %s %s", sp, ctime(&clock));
X	  eoh = 1;
X	}
X      if (eoh || *buf == '\n')
X	{
X	  for (i = 0; i < h; i++)
X	    {
X	      if (!strncmp(hold[i], "Path: ", 6))
X		fprintf(nf, "Path: %s!%s", iam, &hold[i][6]);
X	      else
X		fputs(hold[i], nf);
X	      free(hold[i]);
X	    }
X	  h = -1;
X	}
X    }
X  else
X    {
X      if (!strncmp(buf, "From ", 5))
X	putc('>', nf);
X      fputs(buf, nf);
X    }
X}
SHAR_EOF
if test 2960 -ne "`wc -c < 'rnews.c'`"
then
	echo shar: "error transmitting 'rnews.c'" '(should have been 2960 characters)'
fi
fi
echo shar: "extracting 'pn.proto'" '(1144 characters)'
if test -f 'pn.proto'
then
	echo shar: "will not over-write existing file 'pn.proto'"
else
sed 's/^X//' << \SHAR_EOF > 'pn.proto'
X:
X#! /bin/sh
X# pn - news poster for bootstrap news 
X# Copyright 1989, 1990 Ronald Florence 
X# version 1.3 (ron@mlfarm.com, 15 Dec 90)
X
Xc='\c'
Xn=
X[ "$n" = "-n" ] && c=''
XHostname=BigNode
Xeditor=${EDITOR:-vi}
Xpager=${PAGER:-more}
XSeqfile=/usr/lib/news/seq
Xset `date`
XDatestr="$3 $2 `expr $6 % 100` $4 $5"
XID=`cat $Seqfile`
XSys=`uuname -l | tr -d "\012\040"`
XUser=`logname`
XName=`sed -n "s/^$User:.*:.*:.*:\(.*\):.*:.*$/\1/p" /etc/passwd`
XSig=$HOME/.signature
X
Xecho $n "Newsgroups: $c"
Xread Groups
Xecho $n "Subject: $c"
Xread Subject
X
XTmpart=/tmp/newsart.$$
Xtrap 'rm -f $Tmpart' 1 2 3 15
X
Xcat > $Tmpart <<EOH
XPath: $Sys!$User
XFrom: $User@$Sys.UUCP ($Name)
XNewsgroups: $Groups
XSubject: $Subject
XMessage-ID: <$ID@$Sys.UUCP>
XDate: $Datestr
X
X
XEOH
X
X$editor +8 $Tmpart
Xcls
X[ -r $Sig ] && (echo "\n--" ; cat $Sig) >> $Tmpart
X$pager $Tmpart
Xecho $n "\n\nPost this article to all of usenet? $c"
Xwhile read yn
X  do case $yn in
X    y*|Y*) uux - -r $Hostname!rnews < $Tmpart
X	   echo `expr $ID + 1` > $Seqfile
X	   echo "Posted!"
X	   break ;;
X    n*|N*) echo "Article cancelled!"
X	   break ;;
X        *) echo $n "Yes or no? $c" ;;
X    esac
X  done
Xrm -f $Tmpart
SHAR_EOF
if test 1144 -ne "`wc -c < 'pn.proto'`"
then
	echo shar: "error transmitting 'pn.proto'" '(should have been 1144 characters)'
fi
fi
echo shar: "extracting 'uurec.proto'" '(332 characters)'
if test -f 'uurec.proto'
then
	echo shar: "will not over-write existing file 'uurec.proto'"
else
sed 's/^X//' << \SHAR_EOF > 'uurec.proto'
X:
X#! /bin/sh
X# uurec - bootstrap news by mail 
X# copyright 1989, 1990 Ronald Florence  
X# version 1.3 (ron@mlfarm.com, 15 Dec 90)
X
XNewsspool=NEWSSPOOL
X
Xsed	'/^Received: .*/d
X	/^	id .*/d
X	/^Subject: .*/d
X	/^To: .*/d
X	/^Message-Id: .*/d
X	/^Date: .*/d
X	/^From: .*/d
X	s/^NFrom />From /
X	s/^N//'  >> $Newsspool
Xecho "\n" >> $Newsspool
X
X
SHAR_EOF
if test 332 -ne "`wc -c < 'uurec.proto'`"
then
	echo shar: "error transmitting 'uurec.proto'" '(should have been 332 characters)'
fi
fi
exit 0
#	End of shell archive

--

Ronald Florence			ron@mlfarm.com



exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.