allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (07/22/89)
Posting-number: Volume 7, Issue 99 Submitted-by: ron@mlfarm.UUCP (Ronald Florence) Archive-name: bsnews [[A patch for this arrived before this went out; I applied it, so this is effectively at patclevel 1. ++bsa]] [[This cleans out the c.s.m queue, except for one program (indexor) which needs to be split to avoid message length limits. ++bsa]] Bootstrap News is a collection of programs which enable a leaf node to take a news feed without installing a full news package. News articles are accumulated in a Unix-mail type spool file, where they can be read with a mail reader such as `Mail' or `elm'. #--------------------------------CUT HERE------------------------------------- #! /bin/sh # # This is a shell archive. Save this into a file, edit it # and delete all lines above this comment. Then give this # file to sh by executing the command "sh file". The files # will be extracted into the current directory owned by # you with default permissions. # # The files contained herein are: # # -rw-r--r-- 1 allbery 1987 Jul 21 21:14 Readme # -rw-r--r-- 1 allbery 1759 Jul 21 21:14 Makefile # -rw-r--r-- 1 allbery 1890 Jul 21 21:14 rnews.c # -rw-r--r-- 1 allbery 409 Jul 21 21:14 checknews.c # -rw-r--r-- 1 allbery 306 Jul 21 21:14 uurec.proto # -rw-r--r-- 1 allbery 987 Jul 21 21:11 pn.proto # echo 'x - Readme' if test -f Readme; then echo 'shar: not overwriting Readme'; else sed 's/^X//' << '________This_Is_The_END________' > Readme Xbsnews - Bootstrap News Xcopyright 1989 Ronald Florence X XBootstrap News is a collection of programs which enable a leaf node to Xtake a news feed without installing a full news package. News Xarticles are accumulated in a Unix-mail type spool file, where they Xcan be read with a mail reader such as `Mail' or `elm'. X XThe Makefile builds the following programs and files: X X rnews - run by a `uux - yoursys!rnews' command to X read single articles, batched, or batched X and compressed news into the news spool. X X uurec - posts 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 XTo build bootstrap news, make any changes needed in `Makefile', and Xrun `make'. For a `uux' feed, add `rnews' to /usr/lib/uucp/L.cmds or Xthe equivalent. For a `sendnews' feed, create a sendmail alias for Xrnews: "|/usr/bin/uurec", or use cron to run `uurec' periodically with X/usr/spool/mail/rnews as input. Adding the command `checknews' to Xyour `.login' or `.profile' file will give you notification of new Xnews when you log in. X XYou may need to change `pn.proto': X If your `echo' uses `-n' instead of `\c' to suppress the newline, 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, or X To proof outgoing articles with a pager other than `more'. X XPermission is hereby granted for unlimited non-commercial use of these Xprograms, on condition that the copyright notices are left intact and Xany modifications to the source code are noted as such. No warranty Xof any kind is implied or granted for this material. X X XRonald Florence XMaple Lawn Farm, Stonington, CT Xron@mlfarm X...{hsi!aati,rayssd}!mlfarm!ron ________This_Is_The_END________ if test `wc -c < Readme` -ne 1987; then echo 'shar: Readme was damaged during transit (should have been 1987 bytes)' fi fi ; : end of overwriting check echo 'x - Makefile' if test -f Makefile; then echo 'shar: not overwriting Makefile'; else sed 's/^X//' << '________This_Is_The_END________' > Makefile X# Makefile for bootstrap news X# copyright 1989 Ronald Florence (ron@mlfarm, 7/11/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 XSHELL = /bin/sh X Xbsnews: install X @ [ -x $(COMPRESS) ] || { echo "You need $(COMPRESS) for batched & compressed feeds."; } 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 for a uux feed, or create a" X @echo "sendmail alias for rnews: \"|/usr/bin/uurec\" for a mail feed." 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: X echo "$(READER) $(NEWSSPOOL)" > readnews X chmod +x readnews X Xshar: Readme Makefile $(SRCS) X shar -a Readme Makefile $(SRCS) > bsnews.shar X Xclean: X rm $(PGMS) ________This_Is_The_END________ if test `wc -c < Makefile` -ne 1759; then echo 'shar: Makefile was damaged during transit (should have been 1759 bytes)' fi fi ; : end of overwriting check echo 'x - rnews.c' if test -f rnews.c; then echo 'shar: not overwriting rnews.c'; else sed 's/^X//' << '________This_Is_The_END________' > rnews.c X/* X * rnews.c - uux command for bootstrap news X * copyright 1989 Ronald Florence (ron@mlfarm 7/9/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(); 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 fgets(buf, BUFSIZ, stdin); 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} ________This_Is_The_END________ if test `wc -c < rnews.c` -ne 1890; then echo 'shar: rnews.c was damaged during transit (should have been 1890 bytes)' fi fi ; : end of overwriting check echo 'x - checknews.c' if test -f checknews.c; then echo 'shar: not overwriting checknews.c'; else sed 's/^X//' << '________This_Is_The_END________' > checknews.c X/* X * checknews.c - checks for bootstrap news X * copyright 1989 Ronald Florence (ron@mlfarm, 7/7/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 Xmain() X{ X struct stat st; X X if (stat(Newsspool, &st) == -1) X st.st_size = 0; X if (st.st_size && (st.st_atime < st.st_mtime)) X puts("New news has arrived."); X} ________This_Is_The_END________ if test `wc -c < checknews.c` -ne 409; then echo 'shar: checknews.c was damaged during transit (should have been 409 bytes)' fi fi ; : end of overwriting check echo 'x - uurec.proto' if test -f uurec.proto; then echo 'shar: not overwriting uurec.proto'; else sed 's/^X//' << '________This_Is_The_END________' > uurec.proto X: 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 ________This_Is_The_END________ if test `wc -c < uurec.proto` -ne 306; then echo 'shar: uurec.proto was damaged during transit (should have been 306 bytes)' fi fi ; : end of overwriting check echo 'x - pn.proto' if test -f pn.proto; then echo 'shar: not overwriting pn.proto'; else sed 's/^X//' << '________This_Is_The_END________' > pn.proto X: X# pn - news poster for bootstrap news X# Copyright 1989 Ronald Florence (ron@mlfarm, 7/7/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|yes|Yes|YES) uux - -r $Hostname!rnews < $Tmpart ; X echo `expr $ID + 1` > $Seqfile ; X echo "Posted!" ; X break ;; X n|N|no|No|NO) echo "Article cancelled!" ; X break ;; X *) echo "Yes or no? \c" ;; X esac X done Xrm -f $Tmpart ________This_Is_The_END________ if test `wc -c < pn.proto` -ne 987; then echo 'shar: pn.proto was damaged during transit (should have been 987 bytes)' fi fi ; : end of overwriting check exit 0 -- Ronald Florence ...{hsi!aati,rayssd}!mlfarm!ron