cluther@supernet.haus.com (Clay Luther) (12/20/90)
I wrote this one afternoon to handle the gating of mail to news and news to mail. It is written in script, and tries not to get too fancy. If you have any questions or *especially* suggestions of improvements, please email me at cluther@supernet.haus.com uunet!supernet!cluther Enjoy. Clay Luther #! /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 the files: # GATE.README # gatenews # gatemail # inews.new # This archive created: Wed Dec 19 21:07:02 1990 export PATH; PATH=/bin:$PATH if test -f 'GATE.README' then echo shar: will not over-write existing file "'GATE.README'" else cat << \SHAR_EOF > 'GATE.README' GATE ---- Verion 1.0 Clay Luther, 1990 Synopsis: Transfer mail to a news group, and news from that news group back to mail. In effect, become a news/mail gateway. [ It's a hack, yes, but it's a nice hack. ] Gate is made up of 2 scripts, and a very slightly hacked version of the C News inews. gatemail: Transfer a mail article (taken from stdin) to a news group via inews. gatenews: Transfer an article from news to a mailing list. inews.new: An inews hack that allows the specification of no signature inclusion (-z). Assumptions ----------- These programs were written with the assumption you are running C News and a mailing program that allows mail to be piped to a program via an alias (aka sendmail or smail via the aliases file). The C News dependency is only reflected in the use of inews.new, which is simply the C News inews script with about 4 lines of code added to suppress the inclusion of the executor's signature file. SETUP ----- [ The directories and file names given are what gatenews and gatemail expect. You may easily edit both scripts to change these values. ] [ Below, I will assume that mail is coming from some mailing list called goof-l@foo.com. ] Copy gatemail, gatenews, and inews.new to /usr/lib/news. Make sure they are +rw to everyone. Next, create some mailing aliases. You should have an incoming mail alias and an outgoing mail alias. They should be set up as: #incoming alias goof:"|/usr/lib/news/gatemail goof-l alt.goof" #outgoing alias goof-l:goof-l@foo.com Create a sys entry for the gateway in /usr/lib/news/sys: goof-l:alt.goof/all:F:/usr/spool/news/gatenews/goof-l [ gatenews looks in /usr/spool/news/gatenews by default ] Next, create a cron entry for gatenews (run by news, preferably): #run gatenews after sendbatches 50 * * * * /usr/lib/news/gatenews goof-l goof-l goof Subscribe to goof-l@foo.com as goof@your.site. Finally: addgroup alt.goof y Your set. What's Going On Here? --------------------- Mail from the mailing list arrives at your site and is handed to the gatemail program via stdin. gatemail goof-l alt.goof < mail The goof-l parameter states the real name of the mailing list. The second parameter states what group to post this article to. Gatemail strips the mail headers off the mail after first grepping out the subject, from, and reply-to lines. It then adds a range of news headers: Newsgroups: [set to alt.goof (aka parameter $2)] From: [set to the From: line of the message] Subject: [set to the Subject: of the message] Reply-To: [set to the From: line of the message] Organization: [set to the string "Gated to News by your.site"] Path: [set to goof-l (aka the group name aka your alias for the mailing list)] Sender: [set to the Reply-To: line of the message] Lines: [set to the number of lines in the message] The Path and Organization headers are especially important. Gatenews (the other script) checks the Organization header to determine if the news article was gated to news from mail (and therefore should not be sent the other way). The Path gives a valid path back through your machine to the mailing list by way of your alias for the mailing list. One last thing, gatenews installs a faux header "X-Gateway:" in articles gated to mail. If gatemail detects this X-Gateway: header (and it is from this host), then the mail is appropriately ignored. Here is a sample of how gatemail would work: A Message comes in from goof-l: From utacfd.utarl.edu!mdaeng!goof-l@supernet.haus.com Wed Dec 19 13:52:06 1990 Return-Path: <utacfd.utarl.edu!mdaeng!goof-l@supernet.haus.com> Received: from supernet.haus.com by enigma.haus.com (4.1/SMI-4.1) id AA00646; Wed, 19 Dec 90 13:52:05 CST Received: by supernet.haus.com (/\=-/\ Smail3.1.18.1 #18.16) id <m0im9kD-0009NeC@supernet.haus.com>; Wed, 19 Dec 90 13:46 CST Received: from mdaeng.UUCP by utacfd.utarl.edu with UUCP (4.0/25-eef) id AA14147; Wed, 19 Dec 90 13:26:02 CST Received: by mdaeng.mdaeng.com (4.0/25-eef) id AA10913; Wed, 19 Dec 90 12:48:50 CST Date: Wed, 19 Dec 90 12:48:50 CST From: mdaeng!rwn@utacfd.utarl.edu (Ralph Noack) Reply-To: mdaeng!goof-l@utacfd.utarl.edu (Goofball Mailing List) Message-Id: <9012191848.AA10913@mdaeng.mdaeng.com> To: goof@enigma.haus.com Subject: Just Testing This is just a friendly sample thingy. This gets intercepted by the goof alias and piped to: gatemail goof-l alt.goof which produces the article: Newsgroup: alt.goof From: mdaeng!rwn@utacfd.utarl.edu (Ralph Noack) Subject: Just Testing Reply-To: mdaeng!rwn@utacfd.utarl.edu (Ralph Noack) Organization: Gated to News by enigma.haus.com Path: goof-l Sender: mdaeng!goof-l@utacfd.utarl.edu (Goofball Mailing List) Lines: 2 This is just a friendly sample thingy. This gets piped to inews -z -h. The -z option supresses the .signature inclusion. Inews will post the article to alt.goof. On the other side, gatenews is pulling stuff off news and sending it to the mailing list. Every hour (or whenever), sendbatches executes and creates the file /usr/spool/news/gatenews/goof-l which contains a list of file names of articles in alt.goof that need to be mailed (or might need to be mailed). After sendbatches is run, gatenews is run gatenews goof-l goof-l goof where the first parameter is the address/alias to mail the articles to, the second parameter is the name of the spool file in /usr/spool/news/gatenews, and goof is the local alias of the mailing list (need to set the From: line of the article viz mail). Gatenews processes the articles in the spool file one by one. First, it checks the message id's of the article against a log file; if the message id is in the log file, then the article is not mailed. Next, the Organization: line is checked. If it is equal to "Gated to News by <this.site>", then the article is not mailed. If the article gets past those tests, then it is assumed to be OK for mailing. The From: and Subject: lines are grepped out of the article and the rest of the headers are trashed. The mailer program is then called, setting the appropriate fields and piping the rest of the article to it. In the original gatenews, fastmail is used. Fastmail is part of the Elm package. Sendmail could be used instead, but you will have to hack the line that performs the mailing in gatenews. Gatenews logs the message in its log file and cleans up. Other Files ----------- /usr/lib/news/gatemail.log /usr/lib/news/gatenews.log If you have any questions or ESPECIALLY enhancements or suggestions, please mail me at cluther@supernet.haus.com uunet!supernet!cluther Clay Luther SHAR_EOF fi # end of overwriting check if test -f 'gatenews' then echo shar: will not over-write existing file "'gatenews'" else cat << \SHAR_EOF > 'gatenews' : # gatenews - a script to gate news from news to mail # Clay Luther, 1990, Version 1 # cluther@supernet.haus.com # Usage: gatenews dest spoolfile from # Defines SPOOL='/usr/spool/news/gatenews' NEWSDIR='/usr/lib/news' if [ $# -ne 3 ] then echo "Usage: gatenews dest spoolfile from" echo " where dest is the address of the destination, and" echo " spoolfile is the name of a file in $SPOOL" echo " from is the local address to set the from line to" exit 1 fi DEST=$1 HIST="$NEWSDIR/gatenews.log" SFILE="$SPOOL/$2" NEWS='news' MAIL='/usr/local/bin/fastmail' TMP="/tmp/gate$$" MAILNAME="$NEWSDIR/mailname" HOST=`cat $MAILNAME` ORG="Gated to News by $HOST" FNAME="$3@$HOST" if [ ! -f "$SFILE" ] then exit 0 fi if [ ! -f "$HIST" ] then echo "" | cat > $HIST chmod +rw $HIST chown $NEWS $HIST fi S=`cat $SFILE` rm -f $SFILE for F in $S do if [ -f "$F" ] then # echo $F MID=`grep "^Message-ID:" $F` # Obtain Message ID if [ "$MID" ] then INSTR="$MID -> $DEST" PREV=`grep "$MID" $HIST` # Check for it in gatehist file if [ -z "$PREV" ] then # he hasn't been mailed before # Get the Organization Line - IMPORTANT FORG=`grep "^Organization:.*$ORG" $F` if [ ! "$FORG" ] then # it's ok, we didn't make this! #more $F # Save the From line FROM=`grep "^From:" $F | awk '{ \ size=split($0,s) for (i=2;i<=size;i++) { printf("%s ",s[i]) } printf("%s","\n") }'` # Save the Subject line SUBJ=`grep "^Subject:" $F | awk '{ \ size=split($0,s) for (i=2;i<=size;i++) { printf("%s ",s[i]) } printf("%s","\n") }'` # Make an entry in $TMP ( echo "X-Gateway: $HOST" ) | cat > $TMP # The above is necessary to catch mail echoed back to us! # Strip away the news headers and store output in $TMP awk '\ BEGIN { x=0 } { if ( x == 0 ) { if ( NF == 0 ) { x=1 } } else { print $0 } }' $F >> $TMP # OK, we have a From line, a Subject Line, and a source file # Time to mail it and log it # This line may need tweaking, depending on your mailer $MAIL -r "$FROM" -s "$SUBJ" -f "$FNAME" $TMP $DEST # Log the message id echo $INSTR | cat >> $HIST fi # we didn't make it fi # wasn't in hist file fi # if grep $MID fi # $F existed done # with loop # Clean up rm -f $TMP # Check the $HIST log for being way too long LEN=`wc -l $HIST | awk '{print $1}'` if [ $LEN -gt 2000 ] then tail -2000 $HIST > $TMP mv $TMP $HIST fi SHAR_EOF chmod +x 'gatenews' fi # end of overwriting check if test -f 'gatemail' then echo shar: will not over-write existing file "'gatemail'" else cat << \SHAR_EOF > 'gatemail' : # gatemail - accept a mail message and gate it to a newsgroup # Clay Luther, 1990, Version 1 # cluther@supernet.haus.com # usage: gatemail group newsgroup < mailfile # Check for a parameter if [ $# -ne 2 ] then echo "Usage: gatemail newsgroup < mailfile" exit 1 fi TMP="/tmp/gm$$" cat > $TMP F="/tmp/GM$$" INEWS='/usr/lib/news/inews.new' GROUPNAME=$1 GROUP=$2 NEWSDIR='/usr/lib/news' LOG="$NEWSDIR/gatemail.log" NEWS='news' MAILNAME="$NEWSDIR/mailname" HOST=`cat $MAILNAME` ORG="Gated to News by $HOST" POST="/tmp/post$$" if [ ! -f $LOG ] then echo "" | cat > $LOG chmod +rw $LOG chown $NEWS $LOG fi XGATE=`grep "^X-Gateway:.*$HOST" $TMP` if [ ! "$XGATE" ] then FROM=`grep "^From:" $TMP | awk '{ \ size=split($0,s) for (i=2;i<=size;i++) { printf("%s ",s[i]) } printf("%s","\n") }'` REPLY=`grep "^Reply-To:" $TMP | awk '{ \ size=split($0,s) for (i=2;i<=size;i++) { printf("%s ",s[i]) } printf("%s","\n") }'` SUBJ=`grep "^Subject:" $TMP | awk '{ \ size=split($0,s) for (i=2;i<=size;i++) { printf("%s ",s[i]) } printf("%s","\n") }'` # Strip away the headers awk '\ BEGIN { x=0 } { if ( x == 0 ) { if ( NF == 0 ) { x=1 } } else { print $0 } }' $TMP > $F # call inews to mail it LINES=`wc -l $F | awk '{print $1}'` LINES=`expr $LINES + 7` ( echo "Newsgroups: $GROUP" echo "From: $FROM" #echo "From: $REPLY" echo "Subject: $SUBJ" #echo "Reply-To: $REPLY" echo "Reply-To: $FROM" echo "Organization: $ORG" echo "Path: $GROUPNAME" echo "Sender: $REPLY" echo "Lines: $LINES" echo "" cat $F ) | cat > $POST $INEWS -z -h $POST DATE=`date` # Log it echo "$DATE $GROUP: $FROM [$SUBJ]" >> $LOG fi # this was gated from news by us and echoed by the target #Clean up rm -f $TMP $F $POST # Clean up the log if it is too long LENGTH=`wc -l $LOG | awk '{print $1}'` if [ $LENGTH -gt 1000 ] then tail -1000 $LOG > $TMP mv $TMP $LOG fi SHAR_EOF chmod +x 'gatemail' fi # end of overwriting check if test -f 'inews.new' then echo shar: will not over-write existing file "'inews.new'" else cat << \SHAR_EOF > 'inews.new' : /bin/sh # inews [-p] [-debug k] [-x site] [-hMD] [-t subj] [-n ng] [-e exp] [-F ref] \ # [-d dist] [-a mod] [-f from] [-o org] [-C ng] [file...] - inject news: # censor locally-posted article and field the "inews -C" kludge; # munge the articles, enforce feeble attempts at Usenet security, # generate lots of silly headers. # # Yes, it's big, slow and awkward. The alternative is casting a lot of # local policy in C. # =()<. ${NEWSCONFIG-@<NEWSCONFIG>@}>()= ${NEWSCONFIG-/usr/lib/news/bin/config} export NEWSCTL NEWSBIN NEWSARTS NEWSPATH NEWSUMASK NEWSMASTER NEWSCONFIG PATH=$NEWSCTL/bin:$NEWSBIN/inject:$NEWSBIN/relay:$NEWSBIN:$NEWSPATH; export PATH PASSEDFROM=''; export PASSEDFROM # passed to anne.jones in environ. debug='' # flags exclusion='' hdrspresent=no autopost=no waitcmd='status=0' relayopts=-i # redirect stdout to log input=/tmp/in$$in # uncensored input inhdrs=/tmp/in$$hdr # generated by tear: headers inbody=/tmp/in$$body # generated by tear: body censart=/tmp/in$$cens # censored input nglist=/tmp/in$$ngs # newsgroups: list modroute=/tmp/in$$route # route to moderator's forwarder exitflag=/tmp/in$$exit # exit status, if present outfile=/tmp/in$$out # relaynews stdout rmlist="$inhdrs $inbody $input $censart $nglist $modroute $exitflag $outfile" grpok=/tmp/in$$grp # flag file: groups okay if present # cluther addition nosig=no umask $NEWSUMASK # "inews -p": invoke rnews case "$1" in -p) shift cat $* | relaynews -r # feed directly to relaynews, seat belts off exit ;; esac # process arguments: for options, cat headers onto $input; cat files onto $input >$input cleanup="test ! -f $HOME/dead.article -o -w $HOME/dead.article && cat $input >>$HOME/dead.article && { echo $0: article in $HOME/dead.article >&2; rm -f $rmlist; }; exit 1" trap "$cleanup" 0 1 2 3 15 while : do case $# in 0) break ;; # arguments exhausted esac case "$1" in # peculiar to C news -z) shift; nosig=yes;; -debug) shift; debug="$1" ;; -A) autopost=yes ;; # wait for free space -V) relayopts= ;; # verbose: don't redirect stdout (or stderr) -W) waitcmd='wait; status=$?' ;; # wait for completion # useful standard options -h) hdrspresent=yes ;; -x) shift; exclusion="-x $1" ;; # you're welcome, erik (2.11) # silly options supplied by newsreaders -a) shift; echo "Approved: $1" >>$input ;; -c) shift; echo "Control: $1" >>$input ;; -d) shift; echo "Distribution: $1" >>$input ;; -e) shift; echo "Expires: $1" >>$input ;; -f) shift; echo "From: $1" >>$input ;; -n) shift; echo "Newsgroups: $1" >>$input ;; -r) shift; echo "Reply-To: $1" >>$input ;; -t) shift; echo "Subject: $1" >>$input ;; # aka Title: -D) # obsolete, undocumented: meant "don't check for recordings". # last present in B 2.10.1, invoked by readnews for followups. ;; -F) # undocumented in B 2.10.1, documented in B 2.11. shift; echo "References: $1" >>$input ;; -M) # this apparently just sets From: to the author of the article # instead of the poster (moderator), by leaving the From: line # alone (under -h); easy to implement. ;; # pass next options as environment variables to anne.jones -o) shift; ORGANIZATION="$1"; export ORGANIZATION ;; -C) cat <<eg >&2 $0: you either want to use addgroup (see newsaux(8)) to make $0: $2 locally, or this to make it network-wide: inews -h <<'!' Control: newgroup $2 Subject: newgroup $2 Newsgroups: $2 Approved: you@hostname Non-empty. ! eg exit 1 ;; -*) echo "$0: bad option $1" >&2 exit 1 ;; *) # is a filename; append file # B 2.11 kludge: assume -h if input starts with headers. # apparently the B 2.11 newsreaders assume this. tear /tmp/in$$ <$1 if test -s $inhdrs; then hdrspresent=yes fi case "$hdrspresent" in no) echo "" >>$input; hdrspresent=yes ;; esac # capture incoming news in case relaynews fails if cat $inhdrs $inbody >>$input; then : far out else echo "$0: lost news; cat status $?" >&2 exit 1 fi fileseen=yes ;; esac shift # pass option or filename (any value was done above) done # if no files named, read stdin case "$fileseen" in yes) ;; *) # B 2.11 kludge: assume -h if input starts with headers # apparently the B 2.11 newsreaders assume this. tear /tmp/in$$ if test -s $inhdrs; then hdrspresent=yes fi case "$hdrspresent" in no) echo "" >>$input; hdrspresent=yes ;; esac # capture incoming news in case relaynews fails if cat $inhdrs $inbody >>$input; then : far out else echo "$0: lost news; cat status $?" >&2 exit 1 fi ;; esac trap '' 1 2 15 # ignore signals to avoid losing articles # run the remainder in the background for the benefit of impatient people # who lack a window system ( trap "$cleanup" 0 tear /tmp/in$$ <$input # output in $inhdrs and $inbody # canonicalise header keyword capitalisation. # greps for Control: and Approved: later assume this, as does defhdrs.awk. canonhdr <$inhdrs >/tmp/in$$realtmp mv /tmp/in$$realtmp $inhdrs # pad zero-line articles, since old B [ir]news are confused by them # and the news readers generate zero-line control messages, alas. if test ! -s $inbody; then (echo ''; echo This article was probably generated by a buggy news reader.) \ >$inbody fi # deduce which tr we have: v6 or v7 case "`echo B | tr A-Z a-z `" in b) trversion=v7 ;; B) trversion=v6 ;; # or System V esac export trversion # post with new headers and .signature (anne.jones <$inhdrs # bash headers # UNCOMMENTED #lines="` # sop to msb, just uncomment to use #(sed 1d $inbody; # take out the first (blank) line #if test -r $HOME/.signature; then # echo '-- ' # sed 4q $HOME/.signature #fi) | wc -l `" #echo Lines: $lines # UNCOMMENTED # strip invisible chars from body, a la B news. bells and escapes are right out. case "$trversion" in v7) tr -d '\1-\7\13\15-\37' ;; v6) tr -d '[\1-\7]\13[\15-\37]' ;; esac <$inbody if test "$nosig" = "no"; then if test -r $HOME/.signature; then echo "-- "; sed 4q $HOME/.signature # glue on first bit of signature fi fi) >$censart ### the article is fully assembled now in $censart ### # to post or to mail? that is the question; whether 'tis nobler in the mind # to suffer the slings and arrows of outrageous mailers - Bill Shakespeare if grep -s '^Control:' $inhdrs >/dev/null; then echo "control" # a dreadful hack around all.all.ctl else sed -n ' /^Newsgroups:[ ]/{ s/^Newsgroups:[ ]*\(.*\)$/\1/p q } ' <$inhdrs fi >$nglist if test ! -s $nglist; then # no Newsgroups: exit 1 # anne.jones will have already complained fi # look up groups in active, to determine disposition of this message. # n, x and (unapproved) m flags are dealt with on the spot; if none are # seen, the article is posted normally. # escape egrep metacharacters. In theory one could add " ' ` \ to the list. egreppat="^(` sed -e 's/[.+*()|[]/\\\\&/g' -e 's/,/|/g' <$nglist `) " egrep "$egreppat" $NEWSCTL/active >/dev/null || { echo "$0: `cat $nglist` matches no groups in $NEWSCTL/active" >&2 exit 1 } rm -f $grpok egrep "$egreppat" $NEWSCTL/active | (while read ng high low flag junk # look at next group's active entry do >>$grpok case "$flag" in [nx]) echo "$0: sorry, $ng may not be posted to locally." >&2 trap 0 # this is a child process - no cleanup here echo 1 >$exitflag exit 1 # dregs in /tmp/in$$* ;; m) if grep -s '^Approved:[ ]' $inhdrs >/dev/null; then : # just post normally else # un-Approved article: mail it to the moderator(s). # look for a route for this group. # a dreadful B 2.11 hack: backbone == all (sed 's/^backbone[ ]/all /' \ $NEWSCTL/mailpaths | gngp -a -r "`cat $nglist`"; echo 'default %s') | sed -n "1{s/^[^ ]*[ ][ ]*// s/%s/` echo $ng | tr . - `/;p;q;}" \ >$modroute moderator="`cat $modroute `" # TODO: next line confuses nn; change to stdout? echo "$0: mailing your article to $moderator" >&2 mail "$moderator" <$censart trap 0 # this is a child process - no cleanup here echo 0 >$exitflag exit 0 fi ;; # "" matches short active entries, # to be backward compatible. # * matches garbage flags, to be cautious. y|""|*) # okay so far, but wait until we see all Newsgroups:. ;; esac done trap 0 # paranoia - no clean up ) if test ! -r $grpok; then echo "$0: no active groups in `cat $nglist`" >&2 exit 1 # abnormal exit - cleans up, makes dead.article fi rm -f $grpok if test -f $exitflag; then exitstatus="`cat $exitflag`" case "$exitstatus" in 0) rm -f $rmlist; trap 0 ;; # normal exit - cleanup, no dead.article esac exit $exitstatus # trap 0 may cleanup, make dead.article fi ### if the article was mailed, that happened above; posting will happen below ### # deal with inadequate free space case "$autopost" in no) if test "`spacefor 1 articles`" -le 0; then echo "$0: too little space free on $NEWSARTS" >&2 exit 1 # dregs in /tmp/in$$* for trap 0 fi ;; *) iter=0 while test "`spacefor 1 articles`" -le 0 -o "`spacefor 1 control`" -le 0 do sleep 30 iter=`expr $iter + 1` case "$iter" in 3) mail "$NEWSMASTER" <<! Subject: free space too low on $NEWSARTS There is too little free space on $NEWSARTS for inews to run comfortably. ! ;; esac done ;; esac # to get here, we must have seen no n, x, nor (unapproved) m flags. # <$censart is used rather than a pipe to work around a bug in the 4.2 sh # which made it sometimes return the wrong exit status (that of anne.jones). # execute relaynews commands on the server, for the sake of locking. # may not use "exec" or sh will leave /tmp/sh* files from here docs in /tmp. me="`hostname`" server=`cat $NEWSCTL/server 2>/dev/null` case "$server" in "") server="$me" ;; # if no server file, assume this is it esac case "$me" in $server) relaynews $relayopts -s $exclusion -d "$debug" <$censart status=$? # echo "status $? from relaynews" >>/tmp/inewsdebug # DEBUG ;; *) # send article+commands to remote shell, including clean up (echo "sed 's/^-//' >/tmp/irsh\$\$ <<'!'" # remove guard sed 's/^[^A-EG-Za-z0-9]/-&/' $censart # prepend guard echo ! cat <<! PATH=$PATH relaynews $relayopts -s $exclusion -d "$debug" </tmp/irsh\$\$ ! echo 'echo status $?' echo 'rm -f /tmp/irsh$$') | rsh $server /bin/sh >$outfile status=`sed -n '/^status /s///p' $outfile ` sed '/^status /d' $outfile # print relaynews's stdout ;; esac case "$status" in 0) rm -f $rmlist # far out, it worked: clean up if test ! -f $NEWSCTL/sys; then echo "$0: $NEWSCTL/sys missing; your news can't leave this machine" >&2 fi trap 0 # normal exit: cleanup done ;; esac exit $status # trap 0 may cleanup, make dead.article ) & eval $waitcmd # wait & get status if -W given trap 0 # let the background run on unmolested exit $status SHAR_EOF chmod +x 'inews.new' fi # end of overwriting check # End of shell archive exit 0 -- Clay Luther, Postmaster cluther@supernet.haus.com Harris Adacom Corporation cluther@enigma.haus.com Voice: 214/386-2356 MS 23, PO Box 809022, Dallas, Tx 75380-9022 Fax: 214/386-2159 Your mileage may vary. Void where prohibited.
rsalz@bbn.com (Rich Salz) (12/22/90)
In <1990Dec20.031515.6249@supernet.haus.com> cluther@supernet.haus.com (Clay Luther) writes: >I wrote this one afternoon to handle the gating of mail to news and news to >mail. It is written in script, and tries not to get too fancy. ... Get the spool file into text, I assume? >S=`cat $SFILE` If your message has some text that looks like mail From: your mother for example, you'll get confused. How about this, instead S=`sed /^$/q <$SFILE` If I'm wrong about the original S=`` line, then never mind. -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net. Use a domain-based address or give alternate paths, or you may lose out.
cluther@supernet.haus.com (Clay Luther) (12/23/90)
rsalz@bbn.com (Rich Salz) writes: >Get the spool file into text, I assume? >>S=`cat $SFILE` >If your message has some text that looks like mail >From: your mother >for example, you'll get confused. How about this, instead > S=`sed /^$/q <$SFILE` >If I'm wrong about the original S=`` line, then never mind. Kinda wrong, sorry. SFILE points to the output of sendbatches: a file that contains the file names of the news articles to be inspected for possible forwarding. Assigning SFILE --> S allows gatenews to execute for F in $S, thus inspecting each file given in SFILE. Is there a better way??? -- Clay Luther, Postmaster cluther@supernet.haus.com Harris Adacom Corporation cluther@enigma.haus.com Voice: 214/386-2356 MS 23, PO Box 809022, Dallas, Tx 75380-9022 Fax: 214/386-2159 Your mileage may vary. Void where prohibited.