1
2# PREFIX is inserted above this line during Make
3
4trap : 2 3
5
6PATH=/bin:$PATH
7
8# The .param file is found in $NNDIR/.param.  Formerly this was
9# hardcoded, but with the nn-directory variable that no longer works.
10
11if [ -z "$NNDIR" ]; then NNDIR=$HOME/.nn; fi
12
13# Paramaters transferred from nn via .param file:
14#	ART_ID		Article id to cancel
15#	GROUP		Group of article to cancel
16#	WORK		Temporary file for response (w initial contents)
17#	FIRST_ACTION	First action to perform
18#	EMPTY_CHECK	[empty-response-check]
19#	EDITOR		[editor]
20#	ED_LINE		First line of body in WORK file
21#	SPELL_CHECKER	[spell-checker]
22#	PAGER		[pager]
23#	APPEND_SIG	[append-signature]
24#	QUERY_SIG	[query-signature]
25#	NOVICE		[expert]
26#	WAIT_PERIOD 	[response-check-pause]
27#	RECORD		[mail/news-record]
28#	MMDF_SEP	[mmdf-format = ^A^A^A^A]
29#	POST		[inews]
30#	POST_PIPE	[inews-pipe-input]
31#	POSTER_ADR	Reply address for follow-ups
32#	MAILER		[mailer]
33#	MAILER_PIPE	[mailer-pipe-input]
34#	DFLT_ANSW	[response-default-answer]
35#	ALIAS_EXPANDER	[mail-alias-expander]
36#	CHSET_NAME	[charset]
37#	CHSET_WIDTH	Charset width
38#	DIST		distribution of cancelled article
39
40CC=""
41
42case "$1" in
43COMPLETE)
44  . $NNDIR/hold.param
45  WORK="$2"
46  EMPTY_CHECK=false
47  cp $NNDIR/hold.work $WORK
48  rm -f $NNDIR/hold.*
49  ;;
50*)
51  . $NNDIR/.param
52  OPERATION=$1
53  ;;
54esac
55
56# first we handle 'cancel'
57
58case "$OPERATION" in
59cancel)
60  TRACE="$2"
61  CAN=${TRACE}can
62
63  echo "Newsgroups: ${GROUP}" > $CAN
64  echo "Subject: cmsg cancel $ART_ID" >> $CAN
65  echo "Control: cancel $ART_ID" >> $CAN
66  if [ $DIST != "none" ] ; then
67    echo "Distribution: $DIST" >> $CAN
68  fi
69  echo "" >> $CAN
70  echo "cancel $ART_ID in newsgroup $GROUP" >> $CAN
71  echo "" >> $CAN
72  echo "This article was cancelled from within NN version $VERSION" >> $CAN
73
74  $INEWS -h < $CAN > $TRACE 2>&1
75
76  x=$?
77  case $x in
78  0)
79    ;;
80  *)
81    echo ''
82    cat $TRACE
83    sleep 2
84    ;;
85  esac
86  rm -f $TRACE
87  exit $x
88  ;;
89post|follow)
90  LOOKFOR="Newsgroups:"
91  SEND="post"
92  SENT="posted"
93  SENDPR="p)ost"
94  MESSAGE="article"
95  ;;
96*)
97  LOOKFOR="To:"
98  SEND="send"
99  SENT="sent"
100  SENDPR="s)end"
101  MESSAGE="letter"
102  ;;
103esac
104
105TRACE=${WORK}T
106FINAL=${WORK}F
107TEMP=${WORK}M
108COPY=""
109
110case "$FIRST_ACTION" in
111send)
112  ;;
113*)
114  COPY=${WORK}C
115  cp $WORK $COPY
116  ;;
117esac
118
119# loop until sent or aborted.
120
121loop=true
122changed=true
123prompt=false
124addchset=false
125
126pr="a)bort"
127case "$POSTER_ADR" in
128?*)
129  pr="$pr c)c"
130  ;;
131esac
132pr="$pr e)dit h)old"
133case "$SPELL_CHECKER" in
134?*)
135  pr="$pr i)spell"
136  ;;
137esac
138pr="$pr S)ign"
139pr="$pr m)ail"
140case "$OPERATION" in
141post|follow)
142  pr="$pr p)ost"
143  ;;
144esac
145pr="$pr r)eedit"
146case "$OPERATION" in
147post|follow)
148  ;;
149*)
150  pr="$pr s)end"
151  ;;
152esac
153pr="$pr v)iew w)rite"
154
155case "$DFLT_ANSW" in
156  p*|s*)
157    pr1=" ($SEND $MESSAGE)"
158    ;;
159  "")
160    pr1=""
161    ;;
162  *)
163    pr1=" ($DFLT_ANSW)"
164    ;;
165esac
166
167while $loop ; do
168  case $changed in
169  true)
170    case "$FIRST_ACTION" in
171    edit)
172      ;;
173    *)
174      # this works for v6/v7/bsd/sysv tr
175      sed -e '1,/^$/d' $WORK | tr -d '[\1-\177]' > $TEMP
176      if test -s $TEMP ; then
177        pr2=" 7)bit"
178        case "$CHSET_WIDTH" in
179	8)
180	  cansend=true
181	  ;;
182	*)
183	  cansend=false
184	  echo
185          echo "Warning: body of $MESSAGE contains 8-bit characters"
186          echo "You must delete them or select an 8-bit character set from nn."
187          echo "In its current form the $MESSAGE cannot be $SENT."
188	  ;;
189	esac
190	case "$CHSET_NAME" in
191	""|unknown)
192	  addchset=false
193	  ;;
194	*)
195	  addchset=true
196	  ;;
197	esac
198      else
199        pr2=""
200	cansend=true
201	addchset=false
202      fi
203      rm -f $TEMP
204      changed=false
205      ;;
206    esac
207    ;;
208  esac
209
210  case "$FIRST_ACTION" in
211  "")
212    case $prompt in
213    true)
214      echo ''
215      echo "$pr$pr2"
216      $AWK 'END{printf "Action:'"$pr1"' "}' < /dev/null
217      read act
218      case "$act" in
219      "")
220        act="$DFLT_ANSW"
221        ;;
222      esac
223      ;;
224    esac
225    ;;
226  *)
227    act="$FIRST_ACTION"
228    FIRST_ACTION=""
229    ;;
230  esac
231  prompt=true
232
233  case "$act" in
234  7*)
235    # this works for v6/v7/bsd/sysv tr
236    sed '1,/^$/d' $WORK | tr '[\201-\377]' '[\1-\177]' >> $TEMP
237    mv $TEMP $WORK
238    changed=true
239    ;;
240
241  a*)
242    $AWK 'END{printf "Confirm abort: (y) "}' < /dev/null
243    read act
244    case "$act" in
245    ""|y*)
246      rm -f $WORK* $COPY
247      exit 22
248      ;;
249    esac
250    ;;
251
252  c*)
253    case "$POSTER_ADR" in
254    "")
255      echo "Not doing follow-up"
256      ;;
257    *)
258      case $cansend in
259      true)
260        $AWK 'END{printf "CC: '"$POSTER_ADR"' (y) "}' </dev/null
261        read act
262        case "$act" in
263        ""|"y*")
264	  echo "Sending copy to poster...."
265	  CC="$POSTER_ADR"
266	  final=true
267	  ;;
268        esac
269	;;
270      false)
271        echo
272	echo "Error: body of $MESSAGE contains 8-bit characters"
273	echo "You must delete them or select an 8-bit character set from nn."
274	echo "In its current form the $MESSAGE cannot be mailed."
275	;;
276      esac
277      ;;
278    esac
279    ;;
280
281  e*)
282    # call editor to enter at line $ED_LINE of work file
283
284    case `basename "${EDITOR-vi}"` in
285    vi|emacs|emacsclient|pico|joe )
286      # Berkeley vi display editor
287      # GNU emacs display editor
288      # pico display editor
289      # joe display editor
290      eval ${EDITOR-vi} +$ED_LINE $WORK
291      ;;
292    ded )
293      # QMC ded display editor
294      $EDITOR -l$ED_LINE $WORK
295      ;;
296    uemacs )
297      # micro emacs
298      $EDITOR -g$ED_LINE $WORK
299      ;;
300    * )
301      # Unknown editor
302      $EDITOR $WORK
303      ;;
304    esac
305
306    if test ! -s $WORK ; then
307      rm -f $WORK* $COPY
308      exit 22
309    fi
310
311    if $EMPTY_CHECK ; then
312      if cmp -s $WORK $COPY ; then
313         rm -f $WORK* $COPY
314        exit 22
315      fi
316    fi
317
318    changed=true
319
320    case "$LOOKFOR" in
321    ?*)
322      if grep "^$LOOKFOR" $WORK > /dev/null ; then
323	:
324      else
325	echo "Warning: no $LOOKFOR line in $MESSAGE"
326      fi
327      ;;
328    esac
329    ;;
330
331  S*)
332    sed -e '/^$/q' < $WORK > $WORK.HDRS
333    awk '{if (S== 1) print $0; if ($0 == "") S=1}' < $WORK > $WORK.BDY
334    pgp -stfaw < $WORK.BDY > $WORK.SGN
335    cat $WORK.HDRS $WORK.SGN > $WORK
336    rm -f $WORK.*
337    ;;
338
339
340  h*)
341    $AWK 'END{printf "Complete response later: (y) "}' < /dev/null
342    read act
343    case "$act" in
344    ""|y*)
345      cp $WORK $NNDIR/hold.work
346      cp $NNDIR/.param $NNDIR/hold.param
347      echo "OPERATION=$OPERATION" >> $NNDIR/hold.param
348      case "$COPY" in
349      ?*)
350        rm -f $COPY
351        ;;
352      esac
353      rm -f $WORK*
354      exit 22
355      ;;
356    esac
357    ;;
358
359  i*)
360    case "$SPELL_CHECKER" in
361    "")
362      echo "spell-checker not defined"
363      ;;
364    *)
365      $SPELL_CHECKER $WORK
366      ;;
367    esac
368    ;;
369
370  m*)
371    case $cansend in
372    true)
373      $AWK 'END{printf "To: "}' </dev/null
374      read CC
375      case "$CC" in
376      ?*)
377        echo "Sending copy...."
378        final=true
379        ;;
380      esac
381      ;;
382    false)
383      echo
384      echo "Error: body of $MESSAGE contains 8-bit characters"
385      echo "You must delete them or select an 8-bit character set from nn."
386      echo "In its current form the $MESSAGE cannot be mailed."
387      ;;
388    esac
389    ;;
390
391  n*)
392    act="abort"
393    prompt=false
394    ;;
395
396  r*)
397    $AWK 'END{printf "Undo all changes? (n) "}' < /dev/null
398    read act
399    case "$act" in
400    [yY]*)
401      cp $COPY $WORK
402      changed=true
403      ;;
404    esac
405    FIRST_ACTION=edit
406    ;;
407
408  p*|s*)
409    case $cansend in
410    true)
411      loop=false
412      final=true
413      ;;
414    *)
415      echo
416      echo "Error: body of $MESSAGE contains 8-bit characters"
417      echo "You must delete them or select an 8-bit character set from nn."
418      echo "In its current form the $MESSAGE cannot be $SENT."
419      ;;
420    esac
421    ;;
422
423  v*)
424    ${PAGER-cat} $WORK
425    ;;
426
427  w*)
428    $AWK 'END{printf "Append '$MESSAGE' to file: "}' < /dev/null
429    read FNAME
430    case "$FNAME" in
431    ?*)
432      { cat $WORK ; echo ; } >> $FNAME
433      ;;
434    esac
435    ;;
436
437  y*)
438    act="$DFLT_ANSW"
439    prompt=false
440    ;;
441
442  ENV)
443    set
444    ;;
445  esac
446
447  case $final in
448  true)
449    cp $WORK $TEMP
450    case $addchset in
451    true)
452      if grep -i -v "^MIME-Version: " $WORK > /dev/null &&
453         grep -i -v "^Content-Type: " $WORK > /dev/null &&
454         grep -i -v "^Content-Transfer-Encoding: " $WORK > /dev/null
455      then
456	echo '/^$/i' > ${TEMP}ed
457	echo "MIME-Version: 1.0" >> ${TEMP}ed
458	echo "Content-Type: text/plain; charset=$CHSET_NAME" >> ${TEMP}ed
459	echo "Content-Transfer-Encoding: 8bit" >> ${TEMP}ed
460	echo "." >> ${TEMP}ed
461	echo "w" >> ${TEMP}ed
462	echo "q" >> ${TEMP}ed
463	ed -s $TEMP < ${TEMP}ed >/dev/null 2>&1
464	rm -f ${TEMP}ed
465      fi
466      ;;
467    esac
468    grep -i -v "^Orig-To: " $TEMP | grep -i -v "^User-Agent: " > $FINAL
469    rm -f $TEMP
470    if $XNEWSREADER ; then
471      echo '/^$/i' > ${TEMP}ed
472      echo "User-Agent: nn/$VERSION" >> ${TEMP}ed
473      echo "." >> ${TEMP}ed
474      echo "w" >> ${TEMP}ed
475      echo "q" >> ${TEMP}ed
476      ed -s $FINAL < ${TEMP}ed >/dev/null 2>&1
477      rm -f ${TEMP}ed
478    fi
479    final=false
480    ;;
481  esac
482
483  case "$CC" in
484  ?*)
485    echo "To: $CC" > $TEMP
486    sed -e "s/^To:/X-To:/" $FINAL >>$TEMP
487    if $MAILER_PIPE ; then
488      $MAILER < $TEMP
489      x=$?
490    else
491      $MAILER $TEMP
492      x=$?
493    fi
494    rm -f $TEMP
495    case $x in
496    0)
497      echo Done
498      ;;
499    *)
500      echo $MAILER failed
501      ;;
502    esac
503    CC=""
504    ;;
505  esac
506done
507
508if test $APPEND_SIG = "true" -a -s $HOME/.signature ; then
509  case $QUERY_SIG in
510  true)
511    $AWK 'END{printf "Append .signature? (y) "}' < /dev/null
512    read ans
513    ;;
514  *)
515    ans=y
516    ;;
517  esac
518  case "$ans" in
519  ""|y*|Y*)
520    echo "-- " >> $FINAL
521    cat $HOME/.signature >> $FINAL
522    ;;
523  esac
524fi
525
526case "$OPERATION" in
527  follow|post)
528    case $NOVICE in
529    true)
530      echo "Be patient! Your new $MESSAGE will not show up immediately."
531      case "${WAIT_PERIOD-0}" in
532	0|1)
533          WAIT_PERIOD=2
534          ;;
535      esac
536      ;;
537    esac
538    ;;
539esac
540
541{
542  trap 'echo SIGNAL' 1 2 3
543
544  LOGNAME="${LOGNAME-$USER}"
545  case "$LOGNAME" in
546  "")
547    set `who am i`
548    LOGNAME="$1"
549    ;;
550  esac
551
552  case "$RECORD" in
553  ?*)
554    {
555      # keep a copy of message in $RECORD (in mail format)
556      set `date`
557      case "$MMDF_SEP" in
558      ?*)
559        echo "$MMDF_SEP"
560        ;;
561      esac
562      case $3 in
563      [0-9])
564        echo From $LOGNAME $1 $2 " $3" $4 $6 $7
565        ;;
566      *)
567        echo From $LOGNAME $1 $2 $3 $4 $6 $7
568        ;;
569      esac
570      echo "From: $LOGNAME"
571      cat $FINAL
572      echo "$MMDF_SEP"
573    } >> "$RECORD"
574    ;;
575  esac
576
577  case "$OPERATION" in
578
579    reply|forward|mail)
580      case "$ALIAS_EXPANDER" in
581      ?*)
582	$ALIAS_EXPANDER $FINAL
583	;;
584      esac
585      case $MAILER_PIPE in
586      true)
587	$MAILER < $FINAL
588	x=$?
589	;;
590      *)
591	$MAILER $FINAL
592	x=$?
593	;;
594      esac
595      case $x in
596      0)
597	;;
598      *)
599	echo $MAILER failed
600	;;
601      esac
602      ;;
603
604    follow|post)
605      {
606	case $POST_PIPE in
607	true)
608          $POST < $FINAL 2>&1
609          x=$?
610          ;;
611	*)
612          $POST $FINAL 2>&1
613          x=$?
614          ;;
615	esac
616	case $x in
617	0)
618          ;;
619	*)
620          echo $INEWS failed
621          ;;
622	esac
623      } | sed \
624		-e "/spooled for later processing/d" \
625		-e "/problem has been taken care of/d" \
626		-e "/mailing your article to/d" \
627		-e "/being mailed to/d" \
628		-e "/mailed to the moderator/d" \
629		-e "/is moderated/d"
630      ;;
631
632    *)
633      echo "Invalid operation: $OPERATION -- help"
634      OPERATION="nn response operation"
635      ;;
636  esac > $TRACE 2>&1
637
638  if test -s $TRACE ; then
639    if test -s $HOME/dead.letter ; then
640      cat $HOME/dead.letter >> $HOME/dead.letters
641      echo '' >> $HOME/dead.letters
642    fi
643    cat $WORK > $HOME/dead.letter
644
645    # Gripe: Error-report is lost if REC_MAIL was the problem
646    {
647      echo "To: $LOGNAME"
648      echo "Subject: $OPERATION failed"
649      echo ""
650      cat $TRACE
651      echo ""
652      echo "Your response has been saved in ~/dead.letter"
653      echo ""
654      echo "Your $MESSAGE follows:"
655      cat $WORK
656    } > $TEMP
657    case $MAILER_PIPE in
658    true)
659      $MAILER < $TEMP
660      ;;
661    *)
662      $MAILER $TEMP
663      ;;
664    esac
665    rm -f $TEMP
666  else
667    # keep TRACE file a little while for test at end of script
668    sleep 3
669  fi
670  rm -f $WORK* $COPY
671
672} > /dev/null 2>&1 &
673
674# if in synchronous mode, then wait untill it's done.  Most useful for INN.
675if $SYNCHRO ; then
676  wait
677else
678  case "${WAIT_PERIOD-0}" in
679  0)
680    ;;
681  *)
682    sleep $WAIT_PERIOD
683    ;;
684  esac
685fi
686
687if test -s "$TRACE" ; then
688  exit 1
689fi
690
691exit 0
692