allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (08/06/89)
Posting-number: Volume 7, Issue 113 Submitted-by: ron@mlfarm.UUCP (Ronald Florence) Archive-name: bsnews1.1 #! /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 # checknews.c # rnews.c # uurec.proto # pn.proto # readnews.proto # This archive created: Sun Jul 30 16:04:22 1989 # By: Ronald Florence (Maple Lawn Farm, Stonington, CT) export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'Readme'" '(2094 characters)' if test -f 'Readme' then echo shar: "will not over-write existing file 'Readme'" else sed 's/^X//' << \SHAR_EOF > 'Readme' X bsnews - Bootstrap News X copyright 1989 Ronald Florence X X Bootstrap News is a collection of programs which enable a X leaf node to take a news feed without installing a full news X package. News articles are accumulated in a Unix-mail type X spool file, where they can be read with a mail reader such X as Mail or elm. X X The Makefile builds the following programs and files: X X rnews - run by "uux - yoursys!rnews" from a X remote system to read single articles, X batched, or batched and compressed X news into the news spool. X X uurec - reads articles which arrive as mail X via "sendnews" into the news spool. X X pn - a simple news poster. X X checknews - monitors whether new news has arrived. X X readnews - invokes the mail reader. X X /usr/lib/news/seq - last outgoing article number. X X /usr/spool/news/bsnews - the mail spool. X X To build bootstrap news, make any changes needed in the X Makefile, and run make. For a uux feed, add rnews to X /usr/lib/uucp/L.cmds or the equivalent uucp permissions X file. You will need /usr/bin/compress for compressed feeds. X For a sendnews feed, create a sendmail alias for rnews: X "|/usr/bin/uurec", or use cron to run uurec periodically X with /usr/spool/mail/rnews as input. Adding checknews to X your .login or .profile file will give you notification of X new news when you log in. X X You may need to customize "pn": X If your echo uses -n to suppress newlines, X If logname does not give the user's name, X If "uuname -l" does not give the system's uucp name, X To use an editor other than vi to compose outgoing news, X To proof outgoing articles with a pager other than more, X Or to post news by mail. X X Permission is hereby granted for unlimited non-commercial X use of these programs, on condition that the copyright X notices are left intact and any modifications to the source X code are noted as such. No warranty of any kind is implied X or granted for this material. X X Ronald Florence X Maple Lawn Farm, Stonington, CT X ron@mlfarm.uucp X ...{hsi!aati,rayssd}!mlfarm!ron SHAR_EOF if test 2094 -ne "`wc -c < 'Readme'`" then echo shar: "error transmitting 'Readme'" '(should have been 2094 characters)' fi fi echo shar: "extracting 'Makefile'" '(1946 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 Ronald Florence (ron@mlfarm, 7/30/89) X# X# To build bootstrap news: X# 1. Change READER to your favorite mail reader with the option flag X# used to specify a spool file. X# 2. Change HOST to the name of your news feed. If you get news X# from more than one host, select the one to which you feed news, X# and change FEEDER to something like Usenet_news. X# 3. Run make. X# X XREADER = Mail -f XHOST = mlfarm XFEEDER = news@$(HOST).UUCP X XSPOOL = /usr/spool/news XNEWSSPOOL = $(SPOOL)/bsnews XNEWSDIR = /usr/lib/news XSEQFILE = $(NEWSDIR)/seq XBINDIR = /usr/bin XCOMPRESS = $(BINDIR)/compress XCFLAGS = -O -s -DFeeder='"$(FEEDER)"' -DNewsspool='"$(NEWSSPOOL)"' XPGMS = uurec pn checknews rnews readnews XFILES = spoolfile seqfile XSRCS = checknews.c rnews.c uurec.proto pn.proto readnews.proto XSHELL = /bin/sh X Xbsnews: install X Xinstall: $(PGMS) $(FILES) X cp $(PGMS) $(BINDIR) X cd $(BINDIR) X chgrp bin $(PGMS) X chown bin $(PGMS) X @echo X @echo "Add \"rnews\" to /usr/lib/uucp/L.cmds or the equivalent for a" X @echo "uux feed. For a mail feed, create a sendmail alias for rnews:" X @echo "|/usr/bin/uurec or run \"uurec\" periodically from cron with" X @echo "/usr/spool/mail/rnews as input." X @ [ -x $(COMPRESS) ] || { echo "You need $(COMPRESS) for compressed feeds."; } X Xspoolfile: X [ -d $(SPOOL) ] || mkdir $(SPOOL) X [ -f $(NEWSSPOOL) ] || > $(NEWSSPOOL) X chmod 666 $(NEWSSPOOL) X Xseqfile: X [ -f $(SEQFILE) ] || { mkdir $(NEWSDIR); echo "1" > $(SEQFILE); } X chmod 666 $(SEQFILE) X Xuurec: uurec.proto X sed "s|/usr/spool/news/bsnews|$(NEWSSPOOL)|" uurec.proto > uurec X chmod +x uurec X Xpn: pn.proto X sed "s/BigNode/$(HOST)/" pn.proto > pn X chmod +x pn X Xreadnews: readnews.proto X sed "s|Mail -f /usr/spool/news/bsnews|$(READER) $(NEWSSPOOL)|" readnews.proto > readnews X chmod +x readnews X Xshar: Readme Makefile $(SRCS) X shar -a Readme Makefile $(SRCS) > bsnews.shar X Xclean: X rm -f $(PGMS) SHAR_EOF if test 1946 -ne "`wc -c < 'Makefile'`" then echo shar: "error transmitting 'Makefile'" '(should have been 1946 characters)' fi fi echo shar: "extracting 'checknews.c'" '(707 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 Ronald Florence (ron@mlfarm, 7/30/89) 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#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, <) == -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.":\ X "New news has arrived."); X exit(0); X} SHAR_EOF if test 707 -ne "`wc -c < 'checknews.c'`" then echo shar: "error transmitting 'checknews.c'" '(should have been 707 characters)' fi fi echo shar: "extracting 'rnews.c'" '(1918 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 - uux command for bootstrap news X * copyright 1989 Ronald Florence (ron@mlfarm 7/30/89) X */ X X#include <stdio.h> X#include <time.h> X X#ifndef Newsspool X#define Newsspool "/usr/spool/news/bsnews" X#endif X#ifndef Feeder X#define Feeder "Usenet" X#endif X X#define Compress "/usr/bin/compress -dc > " X Xchar *mktemp(), X dcomp[40] = Compress; X Xmain() X{ X FILE *nf, *cf; X char buf[BUFSIZ], X *tmpnews = mktemp("newsart.XXXXXX"); X register c; X int new = 1, n; X X if (!(nf = fopen(Newsspool, "a"))) X { X fprintf(stderr, "rnews: can't write to %s\n", Newsspool); X exit(1); X } X X while (fgets(buf, BUFSIZ, stdin) != NULL) X { X /* batched? */ X if (!strncmp(buf, "#! ", 3)) X { X /* compressed? */ X if (!strncmp(buf+3, "cunbatch", 8)) X { X strcat(dcomp, tmpnews); X if (!(cf = popen(dcomp, "w"))) X { X timestamp(nf); X fprintf(nf, "\nNews lost! Can't uncompress (rnews).\n\n"); X exit(1); X } X /* uncompress */ X while ((c = getchar()) != EOF) X putc(c, cf); X pclose(cf); X /* and loop around to unbatch */ X cf = freopen(tmpnews, "r", stdin); X continue; X } X /* unpack the batch */ X else if (sscanf(buf+3, "rnews %d", &n) == 1) X { X timestamp(nf); X for (c = 0; c < n; c += strlen(buf)) X { X if (fgets(buf, BUFSIZ, stdin) == NULL) X break; X if (!strncmp(buf, "From ", 5)) X putc('>', nf); X fputs(buf, nf); X } X putc('\n', nf); X continue; X } X } X /* it must be unbatched */ X else X { X if (new) X { X timestamp(nf); X new = 0; X } X if (!strncmp(buf, "From ", 5)) X putc('>', nf); X fputs(buf, nf); X } X } X if (!new) X putc('\n', nf); X unlink(tmpnews); X exit(0); X} X X Xtimestamp(newsfile) XFILE *newsfile; X{ X long clock, time(); X char *ctime(); X X time(&clock); X fprintf(newsfile, "From %s %s", Feeder, ctime(&clock)); X} SHAR_EOF if test 1918 -ne "`wc -c < 'rnews.c'`" then echo shar: "error transmitting 'rnews.c'" '(should have been 1918 characters)' fi fi echo shar: "extracting 'uurec.proto'" '(317 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 Ronald Florence (ron@mlfarm, 7/6/89) X XNewsspool=/usr/spool/news/bsnews 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 317 -ne "`wc -c < 'uurec.proto'`" then echo shar: "error transmitting 'uurec.proto'" '(should have been 317 characters)' fi chmod +x 'uurec.proto' fi echo shar: "extracting 'pn.proto'" '(928 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 Ronald Florence (ron@mlfarm, 7/30/89) X# X XHostname=BigNode XSeqfile=/usr/lib/news/seq Xset `date` XDatestr="$3 $2 `expr $6 % 100` $4 $5" XID=`cat $Seqfile` XSys=`uuname -l` XUser=`logname` X Xecho "Newsgroups: \c" Xread Groups rest Xecho "Subject: \c" Xread Subject rest X XTmpart=/tmp/newsart.$$ X Xcat > $Tmpart <<EOH XPath: $Sys!$User XFrom: $User@$Sys.UUCP XNewsgroups: $Groups XSubject: $Subject XMessage-ID: <$ID@$Sys.UUCP> XDate: $Datestr XFollowup-To: XDistribution: XKeywords: XOrganization: XLines: X X XEOH X Xvi +13 $Tmpart X Xcls Xmore $Tmpart Xecho "----------" Xecho "\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 "Yes or no? \c" ;; X esac X done Xrm -f $Tmpart SHAR_EOF if test 928 -ne "`wc -c < 'pn.proto'`" then echo shar: "error transmitting 'pn.proto'" '(should have been 928 characters)' fi fi echo shar: "extracting 'readnews.proto'" '(166 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 Ronald Florence (ron@mlfarm, 7/30/89) X XMail -f /usr/spool/news/bsnews Xtouch $HOME/.lastnews SHAR_EOF if test 166 -ne "`wc -c < 'readnews.proto'`" then echo shar: "error transmitting 'readnews.proto'" '(should have been 166 characters)' fi fi exit 0 # End of shell archive -- Ronald Florence ...{hsi!aati,rayssd}!mlfarm!ron