#! /bin/sh
# pnews [prefix] - prepare user's article on stdin for posting via relaynews
#       prefix is for tear; if given, output will also be in
#       ${prefix}hdr & ${prefix}body

# =()<. ${NEWSCONFIG-@<NEWSCONFIG>@}>()=
. ${NEWSCONFIG-/usr/lib/news/bin/config}
export NEWSCTL NEWSBIN NEWSARTS NEWSPATH NEWSUMASK NEWSMASTER NEWSCONFIG
PATH=$NEWSCTL/bin:$NEWSBIN/inject:$NEWSBIN:$NEWSPATH; export PATH
prefix=/tmp/pn$$                # default prefix
hdrs=/tmp/pn$$hdrs              # 1036-conformant headers
rmlist="$inhdrs $inbody $hdrs"  # remove hdr & body files by default

umask $NEWSUMASK
# argument procesing
case $# in
0)      ;;
1)
        prefix="$1"
        rmlist="$hdrs"          # only remove scratch file(s)
        ;;
*)
        echo "usage: $0 [prefix]" >&2
        exit 1
        ;;
esac
inhdrs=${prefix}hdr             # generated by tear: headers
inbody=${prefix}body            # generated by tear: body

tear $prefix            # output in $inhdrs and $inbody ** takes 0.4 seconds

# generate new headers and bash old headers ** takes 2.1 seconds

# touch up headers & rewrite dates to make them 1036-compliant.
# canonicalise header keyword capitalisation;
# greps for Control: and Approved: later assume this, as does defhdrs.awk,
# so $inhdrs needs to stick around and be canonicalised.

if canonhdr -dm <$inhdrs >$hdrs; then   # dredge up defaults ** takes 0.1 secs
        # get time & pid from the server
        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") args= ;;
        *)
                 args="`
                        (echo PATH=$PATH;
                         echo 'echo -p $$ -t';
                         echo getdate now) |
                                ersh $server /bin/sh
                `"
                ;;
        esac

        # POLICY: msgid format; usg gcos?
        # tailor: add -u for USG GCOS fields
        eval ` defaults $args `         # sets def* variables
        case "$defname" in
        "")     fullname="" ;;          # no full name, leave it off
        *)      fullname=" ($defname)" ;;
        esac

        # badsites="pucc.bitnet!"  # tailor, syntax is "host1!host2!...host3!"

        # Ugly hack because Coherent's awk won't do
        # awk -f <progfile> <prog> <input file>
        #
        awkprog="BEGIN {defpath=\"$badsites$defuser\";
                 deffrom=\"$defuser@$defmailname$fullname\";
                         deforg=\"$deforg\";
                        defmsgid=\"$defmsgid\";
                        me=\"$defhostname\"}"
        echo $awkprog > /tmp/defhdrs.$$
        cat $NEWSBIN/inject/defhdrs.awk >> /tmp/defhdrs.$$
        detab < $hdrs | awk  -f /tmp/defhdrs.$$ - > $inhdrs
        rm /tmp/defhdrs.$$

        status=$?
else    status=$? # shouldn't be needed, but some major shells get it wrong
fi

# 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

# output begins here
(
# POLICY: don't generate Lines: because it is optional, munged in transit
# by B News to make the count incorrect, and not pulling its weight.
# If you just *have* to generate Lines: headers, uncomment line A and comment
# out line B.
# . lines                               # NB: reads $inbody # line A
firstline="` sed 1q $inbody `"                  # line B
case "$firstline" in                            # line B
'')     cat $inhdrs $inbody ;;                  # emit the article  # line B
*)      echo | cat $inhdrs - $inbody ;;         # insert blank line # line B
esac                                            # line B

if test -r $HOME/.signature; then
        # POLICY: chop .sigs at 4 lines
        echo "-- "; sed 4q $HOME/.signature     # glue on first bit of signature
fi
) | stripinvis
rm -f $rmlist
exit $status
