home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume35 / procmail / part03 < prev    next >
Text File  |  1993-02-05  |  45KB  |  1,313 lines

  1. Newsgroups: comp.sources.misc
  2. From: berg@pool.informatik.rwth-aachen.de (Stephen R. van den Berg)
  3. Subject: v35i024:  procmail - mail processing package v2.80, Part03/11
  4. Message-ID: <1993Feb5.020259.16360@sparky.imd.sterling.com>
  5. X-Md4-Signature: b3223736cdd692ddc6d3fcc1758c122a
  6. Date: Fri, 5 Feb 1993 02:02:59 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: berg@pool.informatik.rwth-aachen.de (Stephen R. van den Berg)
  10. Posting-number: Volume 35, Issue 24
  11. Archive-name: procmail/part03
  12. Environment: sendmail, smail, MMDF, mailsurr, UNIX, POSIX
  13. Supersedes: procmail: Volume 31, Issue 40-44
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 3 (of 11)."
  22. # Contents:  procmail280/Makefile.1 procmail280/README
  23. #   procmail280/mailinglist/bin/createlist
  24. #   procmail280/mailinglist/etc/rc.init
  25. #   procmail280/mailinglist/etc/rc.request procmail280/src/Makefile.0
  26. #   procmail280/src/fields.c procmail280/src/header.h
  27. #   procmail280/src/robust.c
  28. # Wrapped by berg@hathi on Thu Feb  4 15:27:58 1993
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'procmail280/Makefile.1' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'procmail280/Makefile.1'\"
  32. else
  33. echo shar: Extracting \"'procmail280/Makefile.1'\" \(4219 characters\)
  34. sed "s/^X//" >'procmail280/Makefile.1' <<'END_OF_FILE'
  35. X#$Id: Makefile.1,v 1.9 1993/01/26 14:49:37 berg Exp $
  36. X
  37. XHIDEMAKE=$(MAKE)
  38. X
  39. Xall: bins mans recommend
  40. X
  41. Xmake:
  42. X    @$(SHELL) -c "exit 0"
  43. X
  44. Xbins: config.check src/Makefile
  45. X    cd src; $(MAKE) $(NBINS) multigram
  46. X
  47. Xmans: config.check man/Makefile
  48. X    cd man; $(MAKE) $(NMANS)
  49. X
  50. Xautoconf.h: src/Makefile src/autoconf
  51. X    cd src; $(MAKE) ../$@
  52. X
  53. Xprocmail: config.check src/Makefile man/Makefile
  54. X    cd src; $(MAKE) ../new/$@ ../new/mailstat
  55. X    cd man; $(MAKE) ../new/$@.1 ../new/$@rc.5 ../new/$@ex.5
  56. X
  57. Xmailstat: procmail
  58. X
  59. Xformail lockfile: config.check src/Makefile man/Makefile
  60. X    cd src; $(MAKE) ../new/$@
  61. X    cd man; $(MAKE) ../new/$@.1
  62. X
  63. Xmultigram: config.check src/Makefile man/Makefile
  64. X    cd src; $(MAKE) $@
  65. X
  66. Xconfig.check: config.h
  67. X    @echo Housekeeping file >$@
  68. X    @-if $(FGREP) -n -e '`' config.h $(DEVNULL) | $(FGREP) -v EOFName ; \
  69. X     then \
  70. X     echo;echo '    ^^^^^^^^^^^^^^^^^^^^ WARNING ^^^^^^^^^^^^^^^^^^^^^';\
  71. X          echo '    * Having backquotes in there could be unhealthy! *';\
  72. X     echo;fi;exit 0
  73. X
  74. Xrecommend: src/Makefile
  75. X    @cd src; $(MAKE) $@ >$(DEVNULL)
  76. X    @echo ----------------------------------------------------------------\
  77. X---------------
  78. X    @if $(FGREP) CF_no_procmail_yet autoconf.h >$(DEVNULL); \
  79. X     then echo If you are a system administrator you should consider \
  80. Xintegrating procmail; echo into the mail-delivery system -- for advanced \
  81. Xfunctionality AND SECURITY --.; echo For more information about this topic \
  82. Xyou should look in the examples/advanced; echo file.; elif \
  83. X     cat /usr/lib/sendmail.cf /etc/sendmail.cf 2>$(DEVNULL) | \
  84. X     grep 'Mlocal.*procmail.*F=[a-zA-Z]*u' >$(DEVNULL) ; then \
  85. X     echo The recommendation for the sendmail.cf entry of procmail has \
  86. Xchanged.; echo I suggest you remove the '`u'"'"-flag 'like in:'; echo ; \
  87. X      sed -n 's/.*\(Mlocal.*procmail.*F=[a-zA-Z]*\)u/\1/p' `if test -f \
  88. X     /etc/sendmail.cf; then echo /etc/sendmail.cf; else \
  89. X     echo /usr/lib/sendmail.cf; fi`; fi
  90. X    @echo
  91. X    @echo "Also, HIGHLY RECOMMENDED (type 'make suid' to execute it):"
  92. X    @echo
  93. X    @src/$@ $(BINDIR)/procmail $(BINDIR)/lockfile >suid.sh
  94. X    @src/$@ $(BINDIR)/procmail $(BINDIR)/lockfile
  95. X    @echo ----------------------------------------------------------------\
  96. X---------------
  97. X
  98. Xsuid.sh: recommend
  99. X
  100. Xsuid: suid.sh install.bin
  101. X    @cat $@.sh
  102. X    @$(SHELL) ./$@.sh
  103. X    @cd $(BINDIR); echo Installed in $(BINDIR); ls -l $(BINSS)
  104. X
  105. X$(MANS): mans
  106. X
  107. X$(BINS): bins
  108. X
  109. Xinstall.man: $(MANS)
  110. X    @echo Housekeeping file >install.man
  111. X    @-mkdir $(MANDIR) 2>$(DEVNULL); exit 0
  112. X    @-mkdir $(MAN1DIR) 2>$(DEVNULL); exit 0
  113. X    @-mkdir $(MAN5DIR) 2>$(DEVNULL); exit 0
  114. X    @chmod 0644 $(MANS)
  115. X    @for a in $(MANS1S); \
  116. X      do $(INSTALL) new/$$a.1 $(MAN1DIR)/$$a.$(MAN1SUFFIX); done
  117. X    @for a in $(MANS5S); \
  118. X      do $(INSTALL) new/$$a.5 $(MAN5DIR)/$$a.$(MAN5SUFFIX); done
  119. X
  120. Xinstall.bin: $(BINS)
  121. X    @-mkdir $(BINDIR) 2>$(DEVNULL); exit 0
  122. X    @chmod 0755 $(BINS)
  123. X    @echo Housekeeping file >install.bin
  124. X    $(INSTALL) $(BINS) $(BINDIR)
  125. X
  126. Xinstall: install.man install.bin
  127. X    @echo
  128. X    @cd $(BINDIR); echo Installed in $(BINDIR); ls -l $(BINSS)
  129. X    @cd $(MAN1DIR); echo Installed in $(MAN1DIR); ls -l $(MANS1)
  130. X    @cd $(MAN5DIR); echo Installed in $(MAN5DIR); ls -l $(MANS5)
  131. X    @$(MAKE) recommend
  132. X
  133. Xnew:
  134. X    @-mkdir $@ 2>$(DEVNULL); exit 0
  135. X
  136. Xdeinstall:
  137. X    @echo ----------------------------- Deinstalling the procmail package.
  138. X    @$(RM) install.man install.bin
  139. X    @echo ----------------------------- Checking if everything was removed:
  140. X    @-cd $(BINDIR); $(RM) $(BINSS); ls -l $(BINSS); exit 0
  141. X    @-cd $(MAN1DIR); $(RM) $(MANS1); ls -l $(MANS1); exit 0
  142. X    @-cd $(MAN5DIR); $(RM) $(MANS5); ls -l $(MANS5); exit 0
  143. X    @echo ----------------------------- Ready.
  144. X
  145. Xclean: new
  146. X    -for a in $(SUBDIRS); do cd $$a; $(MAKE) $@; cd ..; done; exit 0
  147. X    $(RM) $(MANS) $(BINS) libcheck install.man install.bin suid.sh \
  148. X     _Makefile core
  149. X
  150. Xrealclean: clean _init
  151. X    -rmdir new; exit 0
  152. X    $(RM) config.check
  153. X    -for a in $(SUBDIRS); do $(MV) $$a/Makefile.init $$a/Makefile; done; \
  154. X     exit 0
  155. X
  156. Xveryclean: realclean
  157. X
  158. X_init:
  159. X    sed -e '/^# Makefile.1 - mark/,$$ d' <Makefile >_Makefile
  160. X    cat Makefile.0 >>_Makefile
  161. X    $(MV) _Makefile Makefile
  162. X    $(RM) Makefile.0
  163. X
  164. Xman/Makefile: man/Makefile.0
  165. X
  166. Xsrc/Makefile: src/Makefile.0
  167. X
  168. Xman/Makefile src/Makefile: Makefile
  169. X    $(MAKE) _init; $(HIDEMAKE) init
  170. X
  171. XMakefile: Makefile.1 initmake
  172. X
  173. Xinit makefiles Makefiles makefile: man/Makefile src/Makefile
  174. END_OF_FILE
  175. if test 4219 -ne `wc -c <'procmail280/Makefile.1'`; then
  176.     echo shar: \"'procmail280/Makefile.1'\" unpacked with wrong size!
  177. fi
  178. # end of 'procmail280/Makefile.1'
  179. fi
  180. if test -f 'procmail280/README' -a "${1}" != "-c" ; then 
  181.   echo shar: Will not clobber existing file \"'procmail280/README'\"
  182. else
  183. echo shar: Extracting \"'procmail280/README'\" \(4757 characters\)
  184. sed "s/^X//" >'procmail280/README' <<'END_OF_FILE'
  185. XFor installation instructions see the INSTALL file.
  186. X----------------------
  187. XProcmail & formail mail processing package.
  188. XCopyright (c) 1990-1993, S.R. van den Berg, The Netherlands.
  189. X
  190. XSome legal stuff:
  191. X
  192. XUse this software package at your own risk.  The programmer cannot
  193. Xbe held liable for any incurred damages, directly or indirectly due to
  194. Xthe use or inability to use this software.
  195. X
  196. XYou are encouraged to distribute this package freely.  This package is
  197. Xhowever not to be sold (minor transfer costs excepted) or included in
  198. Xany commercially sold software package (if you want to do this anyway,
  199. Xcontact me (address below), and we'll work something out).
  200. X
  201. XIf you distribute it, please leave the package intact.    You are allowed to
  202. Xtake parts from this distribution and distribute these separately as long
  203. Xas you retain the copyright messages.  If you redistribute any part of this
  204. Xpackage in a modified form, be sure to mark the parts you changed.
  205. XIf you have some important changes that might be useful to the rest of the
  206. Xworld, contact me instead.
  207. X
  208. X-------------------------- SYSTEM REQUIREMENTS -------------------------------
  209. X
  210. XAny *NIX-alike system.
  211. X
  212. XSendmail, smail, MMDF, mailsurr or compatible mailers (in effect any mailer
  213. Xthat can process RFC-822 compliant mails).
  214. X
  215. XThe most important system calls that need to be supported (among others):
  216. Xdup(),wait(),getpwnam(),fork(),pipe()
  217. X
  218. XFor a more complete list of all library references see "src/includes.h"
  219. X
  220. X------------------------------ DESCRIPTION -----------------------------------
  221. X
  222. XThe procmail mail processing program. (v2.80 1993/02/04)
  223. X
  224. XCan be used to create mail-servers, mailing lists, sort your incoming mail
  225. Xinto separate folders/files (real convenient when subscribing to one or more
  226. Xmailing lists or for prioritising your mail), preprocess your mail, start
  227. Xany programs upon mail arrival (e.g. to generate different chimes on your
  228. Xworkstation for different types of mail) or selectively forward certain
  229. Xincoming mail automatically to someone.
  230. X
  231. XThe accompanying formail program enables you to generate autoreplies, split up
  232. Xdigests/mailboxes into the original messages, do some very simple
  233. Xheader-munging/extraction, or force mail into mail-format (with leading From
  234. Xline).
  235. X
  236. X----------------------
  237. X
  238. XI made the utmost effort to make procmail as robust as any program can be
  239. X(every conceivable system error is caught *and* handled).
  240. X
  241. XProcmail was designed to deliver the mail under the worst conditions
  242. X(file system full, out of swap space, process table full, file table full,
  243. Xmissing support files, unavailable executables; it all doesn't matter).
  244. XShould (in the unlikely event) procmail be unable to deliver your mail
  245. Xsomewhere, the mail will bounce back to the sender or reenter the mailqueue
  246. X(your choice).
  247. X
  248. XFor a more extensive list of features see the FEATURES file.
  249. X
  250. X----------------------
  251. X
  252. XHowever, as with any program, bugs cannot be completely ruled out.
  253. XI tested the program extensively, and believe it should be relatively
  254. Xbug free (no known bug at the time).  Should, however, anyone find any
  255. Xbugs (highly unlikely :-), I would be pleased (well, sort of :-) to hear
  256. Xabout it.  Please send me the patches or bug report.
  257. XI'll look at them and will try to fix it in a future release.
  258. X(BTW, if you should find any spelling or grammar errors in these files,
  259. Xdon't hesitate to point them out to me; I like correct English just as much
  260. Xas you do).
  261. X
  262. X----------------------
  263. X
  264. XI would like to take the opportunity to express my gratitude in particular
  265. Xto three powerusers of the procmail-package.  Without their constant feedback
  266. Xv2.80 would not have looked the same:
  267. X
  268. X    David W. Tamkin        An excellent proofreader and betatester
  269. X     <dattier@gagme.chi.il.us>
  270. X    Josh Laff        For stresstesting procmail (and me :-)
  271. X     <smiley@uiuc.edu>
  272. X    Dan Jacobson        For his many useful suggestions
  273. X     <Dan_Jacobson@ATT.COM>
  274. X
  275. X----------------------
  276. X
  277. XPlease note that this program essentially is supposed to be static, that
  278. Xmeans no extra features (honouring the VNIX spirit) are supposed to be
  279. Xadded (though any useful suggestions will be appreciated and evaluated if
  280. Xtime permits).
  281. X
  282. XCheers,
  283. X       Stephen R. van den Berg    at RWTH-Aachen, Germany.
  284. X
  285. XInternet E-mail:        berg@pool.informatik.rwth-aachen.de
  286. X                berg@physik.tu-muenchen.de
  287. X
  288. XSnail-Mail:    P.O.Box 21074
  289. X        6369 ZG Simpelveld
  290. X        The Netherlands
  291. X
  292. X----------------------
  293. XA recent version can be picked up at various comp.sources.misc archives.
  294. XThe latest version can be obtained directly from the ftp-archive at:
  295. X
  296. X    ftp.informatik.rwth-aachen.de (137.226.112.172)
  297. X
  298. X    as zipped tar file:        pub/unix/procmail.tar.zip    ~128KB
  299. X    as compressed tar file:        pub/unix/procmail.tar.Z        ~192KB
  300. X    in compressed shar format:    pub/unix/procmail.??.Z          11 parts
  301. X----------------------
  302. END_OF_FILE
  303. if test 4757 -ne `wc -c <'procmail280/README'`; then
  304.     echo shar: \"'procmail280/README'\" unpacked with wrong size!
  305. fi
  306. # end of 'procmail280/README'
  307. fi
  308. if test -f 'procmail280/mailinglist/bin/createlist' -a "${1}" != "-c" ; then 
  309.   echo shar: Will not clobber existing file \"'procmail280/mailinglist/bin/createlist'\"
  310. else
  311. echo shar: Extracting \"'procmail280/mailinglist/bin/createlist'\" \(3755 characters\)
  312. sed "s/^X//" >'procmail280/mailinglist/bin/createlist' <<'END_OF_FILE'
  313. X#!/bin/sh
  314. X: &&O= || exec /bin/sh $0 $argv:q # we're in a csh, feed myself to sh
  315. X#########################################################################
  316. X#    createlist    To create mailinglists                #
  317. X#                                    #
  318. X#    Created by S.R. van den Berg, The Netherlands            #
  319. X#########################################################################
  320. X#$Id: createlist,v 1.12 1993/01/28 15:18:25 berg Exp $
  321. X
  322. Xdefaults=.etc
  323. X
  324. Xtest=test        # /bin/test
  325. Xln=ln            # /bin/ln
  326. Xtouch=touch        # /bin/touch
  327. Xmkdir=mkdir        # /bin/mkdir
  328. Xsed=sed            # /bin/sed
  329. Xpwd=pwd            # /bin/pwd
  330. Xcat=cat            # /bin/cat
  331. Xrm=rm            # /bin/rm
  332. Xcp=cp            # /bin/cp
  333. Xls=ls            # /bin/ls
  334. Xchmod=chmod        # /bin/chmod
  335. Xecho=echo        # /bin/echo
  336. Xgrep=grep        # /bin/grep
  337. Xlockfile=lockfile    # /usr/local/bin/lockfile
  338. X
  339. XDEVNULL=/dev/null
  340. XEX_USAGE=64
  341. XEX_UNAVAILABLE=69
  342. X
  343. X( lockfile ) 2>$DEVNULL
  344. Xif $test $? != 64
  345. Xthen
  346. X  echo "Where is \"lockfile\"? It should be installed in your PATH" 1>&2
  347. X  exit $EX_UNAVAILABLE
  348. Xfi
  349. X
  350. Xif $test ! -d $defaults
  351. Xthen
  352. X  if $test -d list
  353. X  then cd ./list
  354. X  else cd ..
  355. X     $test -d $defaults || cd ..
  356. X  fi
  357. Xfi
  358. Xif $test ! -d $defaults
  359. Xthen
  360. X  echo "createlist: You should be near the main list directory to do this" 1>&2
  361. X  exit $EX_USAGE
  362. Xfi
  363. X
  364. Xif $test ! -x .bin/procmail
  365. Xthen
  366. X  OIFS="$IFS"
  367. X  IFS=:"$IFS"
  368. X  procmail=""
  369. X
  370. X  for a in $PATH
  371. X  do $test -z "$procmail" -a -x "$a"/procmail && procmail=$a/procmail
  372. X  done
  373. X
  374. X  IFS="$OIFS"
  375. X  if $test -z "$procmail"
  376. X  then
  377. X     echo "Where is \"procmail\"?" 1>&2
  378. X     echo "The symbolic link .bin/procmail must point to it" 1>&2
  379. X     exit $EX_UNAVAILABLE
  380. X  fi
  381. X  $rm -f .bin/procmail
  382. X  $ln -s $procmail .bin/procmail 2>/dev/null ||
  383. X  $ln $procmail .bin/procmail 2>/dev/null ||
  384. X   ( $cat >.bin/procmail <<HERE
  385. X#! /bin/sh
  386. X:
  387. Xexec $procmail "\$@"
  388. XHERE
  389. X     $chmod 0755 .bin/procmail
  390. X   )
  391. Xfi
  392. X
  393. Xdomain=`$sed -n -e 's/^[^#]*domain= *\([^     ]*\).*$/\1/p' \
  394. X $defaults/rc.init`
  395. X
  396. Xif $test .$domain = .INSERT.YOUR.MAIL.DOMAIN.HERE
  397. Xthen
  398. X  echo "I refuse to do anything useful until you have edited the" 1>&2
  399. X  echo "rc.init file.  \`domain' must be set to some sane value." 1>&2
  400. X  exit $EX_USAGE
  401. Xfi
  402. X
  403. Xif $test $# != 1 -a $# != 2
  404. Xthen echo "Usage: createlist listname [maintainer]" 1>&2; exit $EX_USAGE
  405. Xfi
  406. X
  407. Xlist="$1"
  408. Xmaintainer="$2"
  409. X
  410. Xcase "$list" in
  411. X  "*[/     ]*") echo "createlist: Suspicious listname specified" 1>&2
  412. X     exit $EX_USAGE;;
  413. X  *[@!]*) echo "createlist: Specify listname without domain name appended" \
  414. X     1>&2; exit $EX_USAGE;;
  415. Xesac
  416. X
  417. Xumask `$sed -n -e 's/^[^#]*UMASK=[^0-9]*\([0-9]*\).*$/\1/p' \
  418. X $defaults/rc.init`
  419. X
  420. Xif $mkdir "$list" 2>$DEVNULL
  421. Xthen
  422. X:
  423. Xelse echo "createlist: \"$list\" already exists" 1>&2; exit $EX_USAGE
  424. Xfi
  425. Xcd "$list"
  426. Xfor a in rc.submit rc.init rc.request help.txt subscribe.txt reject
  427. Xdo
  428. X  $cat $DEVNULL >>../$defaults/$a        # to make sure it exists
  429. X  $ln ../$defaults/$a $a
  430. Xdone
  431. X
  432. X$mkdir archive
  433. X$mkdir archive/latest
  434. X
  435. X$sed -e "/^maintainer/ s/=/=    $maintainer/" <../$defaults/rc.custom \
  436. X >rc.custom
  437. Xecho "(Only addresses below this line can be automatically removed)" >>dist
  438. X
  439. X$chmod ugo+x .
  440. X$chmod ugo+r dist
  441. Xcd ..
  442. X
  443. Xecho 1>&2
  444. Xecho "Installed the following files (mostly hardlinked):" 1>&2
  445. Xecho 1>&2
  446. X$ls -ld $list $list/* $list/*/* 1>&2
  447. Xecho 1>&2
  448. X
  449. Xlistuser=`$ls -ld $defaults | ( read a b user d; echo $user )`
  450. X
  451. XTMPF=.uniq.$$
  452. X
  453. Xlistdir=$HOME
  454. X
  455. Xtrap "$rm -f $TMPF" 1 2 3 15
  456. X
  457. X$touch $TMPF
  458. Xtest -f $HOME/$TMPF || listdir=`$pwd`
  459. X
  460. X$rm -f $TMPF
  461. Xtrap 1 2 3 15
  462. X
  463. Xflist=$listdir/.bin/flist
  464. X
  465. Xecho "Now make the following entries in your /usr/lib/aliases file:" 1>&2
  466. Xecho \#########################################################################
  467. Xecho "$list: \"|IFS=' ';exec $flist $list\""
  468. Xecho "$list-request: \"|IFS=' ';exec $flist $list-request\""
  469. Xecho "$list-dist: :include:$listdir/$list/dist"
  470. Xecho \#########################################################################
  471. END_OF_FILE
  472. if test 3755 -ne `wc -c <'procmail280/mailinglist/bin/createlist'`; then
  473.     echo shar: \"'procmail280/mailinglist/bin/createlist'\" unpacked with wrong size!
  474. fi
  475. chmod +x 'procmail280/mailinglist/bin/createlist'
  476. # end of 'procmail280/mailinglist/bin/createlist'
  477. fi
  478. if test -f 'procmail280/mailinglist/etc/rc.init' -a "${1}" != "-c" ; then 
  479.   echo shar: Will not clobber existing file \"'procmail280/mailinglist/etc/rc.init'\"
  480. else
  481. echo shar: Extracting \"'procmail280/mailinglist/etc/rc.init'\" \(4829 characters\)
  482. sed "s/^X//" >'procmail280/mailinglist/etc/rc.init' <<'END_OF_FILE'
  483. X#
  484. X# IMPORTANT variables to check/change:    PATH domain listmaster
  485. X#
  486. X
  487. X# BEFORE editing this file or any rc.* file in the .etc directory
  488. X# you should create the .etc/rc.lock file.  As long as this file
  489. X# exists, mail delivery to any list will stall (fmail checks this file).
  490. X
  491. X# ENVIRONMENT:
  492. X# list        contains the submitting address of the list (sans domain)
  493. X# domain    should contain the domain for the list, so that $list@$domain
  494. X#        can be used to submit to the list
  495. X# maintainer    should contain the fully qualified address of the maintainer
  496. X#        of $list;  maintainter can be left empty
  497. X# listmaster    should contain the fully qualified address of the supervising
  498. X#        list maintainer;  listmaster can be left empty
  499. X# X_ENVELOPE_TO contains the address that the incoming mail was addressed to
  500. X
  501. X# FILES:
  502. X# log        optional logfile (uncomment the LOGFILE assignment to enable
  503. X#        it)
  504. X# dist        the subscriber list, one address per line
  505. X# reject    list of people you definitely do want to subscribe
  506. X# request    all the messages to request that could not be handled
  507. X#        automatically (only if maintainer is empty)
  508. X# help.txt    file sent to help requests
  509. X# subscribe.txt file sent to new subscribers
  510. X# bounces    directory containing the bounce history files
  511. X# rc.submit    rcfile used when distributing submissions
  512. X# rc.request    rcfile used when processing requests
  513. X# rc.custom    rcfile that contains all the customisations per list
  514. X
  515. X#$Id: rc.init,v 1.6 1993/01/27 20:33:00 berg Exp $
  516. X
  517. XPATH=.:../.bin:/bin:/usr/bin:/usr/local/bin    # setup a decent path
  518. XSHELL=/bin/sh                # to prevent surprises
  519. X
  520. Xdefaults=.etc
  521. X
  522. XLOCKTIMEOUT=3660            # set these values this high (1 hour)
  523. XTIMEOUT=3600                # to give sendmail the time to
  524. X                    # resolve big aliases
  525. X
  526. X###############################################################################
  527. X# You have to setup the following two assignments, make sure that the address
  528. X# mentioned in listmaster is *not* the address this script runs under;    if
  529. X# you would end up doing that, then assign listmaster to ""
  530. X# The same applies to the maintainer addresses used for every list, if you
  531. X# would like to alias them back to this script or to the respective -request
  532. X# addresses, then assign maintainer to "" instead.
  533. X#
  534. X# The mail-domain you have to insert below, must be the fully qualified
  535. X# mail-domain for this list;  e.g. if the preferred mail address for this
  536. X# account would be:  list@somemachine.somewhere.universe
  537. X# Then you should assign the following:
  538. X#           domain=somemachine.somewhere.universe
  539. X###############################################################################
  540. X
  541. Xdomain=INSERT.YOUR.MAIL.DOMAIN.HERE    # the common domain for all the lists
  542. Xlistmaster=
  543. X
  544. X#UMASK=077                # group can not touch the files
  545. X UMASK=027                # group can read
  546. X#UMASK=007                # group can write as well
  547. X
  548. Xdefaults=.etc                # the name of the defaults directory
  549. X#LOGFILE=../$defaults/log        # uncomment in case of emergency
  550. X#VERBOSE=yes                # uncomment in case of real emergency
  551. X
  552. X    # The following should catch all the unwanted mailer-daemons bouncing
  553. X    # mail to us unexpectedly.
  554. X
  555. XFROM_MAILER_DAEMON='^(Precedence:.*junk|'\
  556. X'(((Resent-)?(From|Sender)|X-Envelope-From):|From )'\
  557. X'(.*[^.a-z])?('\
  558. X'Post(ma(st(er)?|n)|office)|Mailer|daemon|mmdf|root|uucp|serv(ices?|er)'\
  559. X')([^.a-z]|$))'
  560. X
  561. XRC_INIT                    # clear this one from the environment
  562. X                    # so that we include this file only
  563. X                    # once
  564. X
  565. Xlistaddr=$list@$domain
  566. Xlistreq=$list-request@$domain
  567. Xlistdist=$list-dist@$domain
  568. X
  569. XsendmailOPT="-oem -odb -oi -f$listreq"
  570. X########################
  571. X# sendmail options used:
  572. X#
  573. X# -t    scan the header of the mail for recipients
  574. X# -f    specify the sender envelope address (requires T entry in sendmail.cf)
  575. X# -oi    do not regard a single dot on an otherwise empty line as EOF
  576. X# -om    include myself in any alias expansions
  577. X# -odb    background deliverymode command returns immediately
  578. X# -oem    mail back error messages
  579. X# -oep    print error messages
  580. X########################
  581. X
  582. Xsize_limit    =    524288        # sanity cutoff value for submissions
  583. Xarchive_hist    =    2        # number of messages left archived
  584. Xarchive_log    =    log        # log file for archive retrievals
  585. Xmaxhist        =    8        # bounce history limit
  586. Xminbounce    =    3        # no. of bounces before removal
  587. Xcutoff_bounce    =    256        # lines to keep in bounce processing
  588. Xmatch_threshold =    30730        # for close matches to the list
  589. Xoff_threshold    =    24476        # for loosely finding your name
  590. X
  591. Xreject_threshold=      $match_threshold # to determine if you may subscribe
  592. Xsubmit_threshold=      $match_threshold # to determine if you may submit
  593. Xforeign_submit    =    yes
  594. X#foreign_submit                # uncomment this line if you
  595. X                    # *don't* want to allow
  596. X                    # non-subscribers to submit
  597. X
  598. XX_COMMAND    =    X-Command
  599. XX_COMMAND_PASSWORD =    password    # put the global password for
  600. X                    # X-Command mails here
  601. X                # this password can of course be changed/
  602. X                # customised in the per list rc.custom file
  603. X
  604. XRC_CUSTOM=rc.custom
  605. END_OF_FILE
  606. if test 4829 -ne `wc -c <'procmail280/mailinglist/etc/rc.init'`; then
  607.     echo shar: \"'procmail280/mailinglist/etc/rc.init'\" unpacked with wrong size!
  608. fi
  609. # end of 'procmail280/mailinglist/etc/rc.init'
  610. fi
  611. if test -f 'procmail280/mailinglist/etc/rc.request' -a "${1}" != "-c" ; then 
  612.   echo shar: Will not clobber existing file \"'procmail280/mailinglist/etc/rc.request'\"
  613. else
  614. echo shar: Extracting \"'procmail280/mailinglist/etc/rc.request'\" \(4215 characters\)
  615. sed "s/^X//" >'procmail280/mailinglist/etc/rc.request' <<'END_OF_FILE'
  616. X# BEFORE editing this file, you should make sure that it is not linked to
  617. X# the master version (../.listadmin/listrc.sub) anymore (i.e. make a copy).
  618. X# If the mailinglist is not in active use yet, or if you want to take the
  619. X# chance, you can write out this file without locking.    To do it properly
  620. X# you should create the ../.listadmin/the_lists.lock file with lockfile(1)
  621. X# shortly before writing out the new version of this file (remove the lockfile
  622. X# afterwards of course)
  623. X
  624. X#$Id: rc.request,v 1.7 1993/02/02 15:26:57 berg Exp $
  625. X
  626. XINCLUDERC=$RC_INIT
  627. XINCLUDERC=$RC_CUSTOM
  628. X
  629. XLOCKFILE=tmp.lock    # for reusing tmp.(request|from)
  630. X            # also makes sure that the load doesn't go sky-high
  631. X            # when a lot of mail arrives concurrently
  632. X
  633. X#
  634. X# We now check:
  635. X#    If the length is roughly within bounds.
  636. X#    That it is not a reply or something.
  637. X#    That we didn't send it ourselves.
  638. X#    That it wasn't sent by a daemon of some kind.
  639. X#
  640. X# If everything matches, we extract the sender address into tmp.from
  641. X#
  642. X
  643. X:4whc
  644. X< 8192
  645. X$!^(X-(Loop: $listaddr|Diagnostic:)|$X_COMMAND)
  646. X!^Subject:(.*[^a-z])?(Re:|erro|problem|((can)?not|.*n't)([^a-z]|$))
  647. X!^FROM_DAEMON
  648. X| formail -rt -xTo: >tmp.from
  649. X
  650. X#
  651. X# Store the whole mail in tmp.request, for later reference.
  652. X#
  653. X
  654. X    :Ac
  655. X    | cat >tmp.request
  656. X
  657. X#
  658. X# Is it an archival retrieval command?
  659. X#
  660. X
  661. X    :1A
  662. X    ^Subject:[     ]*archive([^a-z-]|$)
  663. X    | arch_retrieve
  664. X
  665. X#
  666. X# Is it an unsubscription request?
  667. X#
  668. X
  669. X    :1BHA:dist.lock
  670. X    ^((Subject:)?[     ]*(remove|unsub)|(.*[^a-z])?(unsubscri.*|\
  671. X                   (remove .* from|take .* off) .* list)([^a-z]|$))
  672. X    | unsubscribe | $SENDMAIL $sendmailOPT `cat tmp.from`
  673. X
  674. X#
  675. X# Is it a subscription request?     Yes, well, then check if the person
  676. X# subscribing isn't on the reject list.     If not, then let's see if he might
  677. X# already be on the mailinglist.  If not, add him.
  678. X#
  679. X
  680. X    :3BHA:dist.lock
  681. X    ^((Subject:)?[     ]*(add|sub.*[@!])|(.*[^a-z])?(subscri.*|\
  682. X                      (add .* to|put .* on) .* list)([^a-z]|$))
  683. X    !?multigram -b1 -l$reject_threshold reject
  684. X    !?multigram -b1 -l$reject_threshold dist
  685. X    | subscribe | $SENDMAIL $sendmailOPT -t
  686. X
  687. X    :1A
  688. X    ^Subject:(.*[^a-z.])?(help|info((rm)?ation)?)([^a-z]|$)
  689. X    | (formail -i"From: $listreq" -rtA"X-Loop: $listaddr"; \
  690. X       cat help.txt) | $SENDMAIL $sendmailOPT -t
  691. X
  692. X#
  693. X# Could it be a bounce message from a daemon?  Hand it down to procbounce
  694. X# which will evaluate it.
  695. X#
  696. X
  697. X:3wc
  698. X!^Subject:(.*[^a-z])?Re:
  699. X$!^(X-(Loop: $listaddr|Diagnostic:)|$X_COMMAND)
  700. X^FROM_DAEMON
  701. X| sed -e $cutoff_bounce',$ d' >tmp.request
  702. X
  703. X    :Ahfw
  704. X    | procbounce
  705. X
  706. X#
  707. X# Or is it a remote X-Command from our maintainer?
  708. X#
  709. X
  710. X:2wf:dist.lock
  711. X$^$X_COMMAND:.*$maintainer.*$X_COMMAND_PASSWORD
  712. X$!^X-Loop: $listaddr
  713. X| x_command `formail -x$X_COMMAND:`
  714. X
  715. XLOCKFILE                # we don't need the lockfile anymore
  716. X
  717. XLOGFILE=log                # log -request arrivals
  718. X
  719. X#
  720. X# Anything not taken care of yet will be served to the maintainer of the list.
  721. X#
  722. X# To make it easier on him, we include a small hint about what might be the
  723. X# problem (by adding X-Diagnostic: fields to the header).
  724. X#
  725. X
  726. X:wfh
  727. X!< $size_limit
  728. X| formail -A "X-Diagnostic: Submission size exceeds $size_limit bytes"
  729. X
  730. X:wfh
  731. X^FROM_DAEMON
  732. X| formail -A "X-Diagnostic: Mail coming from a daemon, ignored"
  733. X
  734. X:BH wfh
  735. X$^X-Loop: $listaddr
  736. X| formail -A "X-Diagnostic: Possible loopback problem"
  737. X
  738. X:ch
  739. X!^X-(Diagnostic|Processed):
  740. X/dev/null
  741. X
  742. X    :1A wfh
  743. X    $^$X_COMMAND:
  744. X    | formail -A "X-Diagnostic: Suspicious $X_COMMAND format"
  745. X
  746. X    :1A BH wfh
  747. X    ?multigram -b1 -l$reject_threshold reject
  748. X    | formail -A "X-Diagnostic: Found on the reject list" \
  749. X       -A "X-Diagnostic: `multigram -b1 -l$reject_threshold reject`"
  750. X
  751. X    :2A BH wfh
  752. X    ^((Subject:)?[     ]*(add|sub.*[@!])|(.*[^a-z])?(subscri.*|\
  753. X                      (add .* to|put .* on) .* list)([^a-z]|$))
  754. X    ?multigram -b1 -l$reject_threshold dist
  755. X    | formail -A "X-Diagnostic: Already on the subscriber list" \
  756. X       -A "X-Diagnostic: `multigram -b1 -l$reject_threshold dist`"
  757. X
  758. X:0fh
  759. X| formail -A"X-Envelope-To: $X_ENVELOPE_TO"
  760. X
  761. X#
  762. X# If this list does not have a maintainer e-mail address, drop things in
  763. X# the file request.
  764. X#
  765. X
  766. X::
  767. X?test -z "$maintainer"
  768. Xrequest
  769. X
  770. X:0w
  771. X| formail -R"From X-Envelope-From:" -iReturn-Receipt-To: \
  772. X   | $SENDMAIL $sendmailOPT -oep $maintainer
  773. X
  774. X:0wfh
  775. X| formail -A"X-Diagnostic: Maintainer $maintainer could not be reached"
  776. X
  777. XHOST=continue_with_../.etc/rc.post
  778. END_OF_FILE
  779. if test 4215 -ne `wc -c <'procmail280/mailinglist/etc/rc.request'`; then
  780.     echo shar: \"'procmail280/mailinglist/etc/rc.request'\" unpacked with wrong size!
  781. fi
  782. # end of 'procmail280/mailinglist/etc/rc.request'
  783. fi
  784. if test -f 'procmail280/src/Makefile.0' -a "${1}" != "-c" ; then 
  785.   echo shar: Will not clobber existing file \"'procmail280/src/Makefile.0'\"
  786. else
  787. echo shar: Extracting \"'procmail280/src/Makefile.0'\" \(4358 characters\)
  788. sed "s/^X//" >'procmail280/src/Makefile.0' <<'END_OF_FILE'
  789. X
  790. X#$Id: Makefile.0,v 1.8 1992/11/12 11:38:12 berg Exp $
  791. X
  792. XPM_OBJ=cstdio.$(O) common.$(O) exopen.$(O) goodies.$(O) locking.$(O) \
  793. X mailfold.$(O) misc.$(O) pipes.$(O) regexp.$(O) robust.$(O) sublib.$(O)
  794. XLF_OBJ=exopen.$(O) sublib.$(O)
  795. XFM_OBJ=common.$(O) fields.$(O) formisc.$(O) sublib.$(O) ecommon.$(O)
  796. X
  797. Xall:    $(BINSS)
  798. X
  799. Xmake:
  800. X    @$(SHELL) -c "exit 0"            # fake target
  801. X
  802. Xprocmail: procmail.$(O) $(PM_OBJ)
  803. X    $(CC) $(CFLAGS) $@.$(O) $(PM_OBJ) -o $@ $(LDFLAGS)
  804. X
  805. Xlockfile: lockfile.$(O) $(LF_OBJ)
  806. X    $(CC) $(CFLAGS) $@.$(O) $(LF_OBJ) -o $@ $(LDFLAGS)
  807. X
  808. Xformail: formail.$(O) $(FM_OBJ)
  809. X    $(CC) $(CFLAGS) $@.$(O) $(FM_OBJ) -o $@ $(LDFLAGS)
  810. X
  811. Xmailstat: ../examples/mailstat
  812. X    cp ../examples/$@ .
  813. X    chmod 0755 $@
  814. X
  815. Xmultigram: multigram.$(O) sublib.$(O) ecommon.$(O)
  816. X    $(CC) $(CFLAGS) $@.$(O) sublib.$(O) ecommon.$(O) -o $@ $(LDFLAGS)
  817. X
  818. X../new:
  819. X    @-mkdir $@ 2>$(DEVNULL); exit 0
  820. X
  821. X_autotst: _autotst.$(O)
  822. X    $(CC) $(CFLAGS) $@.$(O) -o $@ $(LDFLAGS)
  823. X
  824. X# to fully support "make -n"
  825. XHIDEMAKE = $(MAKE)
  826. X
  827. X../autoconf.h: autoconf Makefile
  828. X    $(SHELL) ./autoconf $(SHELL) "$(RM)" "$(MV)" $(USRINCLUDE) \
  829. X     $(DEVNULL) "$(FGREP)" "$(HIDEMAKE)" $(O) $@
  830. X
  831. Xautoconf.h: ../autoconf.h
  832. X
  833. Xcommon.$(O): ../autoconf.h ../config.h includes.h procmail.h sublib.h robust.h
  834. Xcommon.$(O): shell.h misc.h common.h
  835. X
  836. Xcstdio.$(O): ../autoconf.h ../config.h includes.h procmail.h robust.h cstdio.h
  837. Xcstdio.$(O):  misc.h
  838. X
  839. Xecommon.$(O): ../autoconf.h ../config.h includes.h ecommon.h
  840. X
  841. Xexopen.$(O): ../autoconf.h ../config.h includes.h procmail.h robust.h misc.h
  842. Xexopen.$(O): exopen.h
  843. X
  844. Xfields.$(O): ../autoconf.h ../config.h includes.h formail.h sublib.h shell.h
  845. Xfields.$(O): common.h fields.h ecommon.h formisc.h
  846. X
  847. Xformail.$(O): ../autoconf.h ../config.h includes.h formail.h sublib.h shell.h
  848. Xformail.$(O): common.h fields.h ecommon.h formisc.h header.h
  849. X
  850. Xformisc.$(O): ../autoconf.h ../config.h includes.h formail.h sublib.h shell.h
  851. Xformisc.$(O): common.h ecommon.h formisc.h
  852. X
  853. Xgoodies.$(O): ../autoconf.h ../config.h includes.h procmail.h sublib.h robust.h
  854. Xgoodies.$(O): shell.h misc.h pipes.h common.h cstdio.h goodies.h
  855. X
  856. Xlockfile.$(O): ../autoconf.h ../config.h includes.h sublib.h exopen.h robust.h
  857. Xlockfile.$(O): misc.h
  858. X
  859. Xlocking.$(O): ../autoconf.h ../config.h includes.h procmail.h robust.h shell.h
  860. Xlocking.$(O): misc.h exopen.h locking.h
  861. X
  862. Xmailfold.$(O): ../autoconf.h ../config.h includes.h procmail.h sublib.h
  863. Xmailfold.$(O): robust.h shell.h misc.h pipes.h common.h exopen.h locking.h
  864. Xmailfold.$(O): mailfold.h network.h
  865. X
  866. Xmanconf.$(O): ../patchlevel.h ../autoconf.h ../config.h includes.h procmail.h
  867. X
  868. Xmisc.$(O): ../autoconf.h ../config.h includes.h procmail.h sublib.h robust.h
  869. Xmisc.$(O): shell.h misc.h pipes.h common.h cstdio.h exopen.h regexp.h goodies.h
  870. Xmisc.$(O): locking.h mailfold.h
  871. X
  872. Xmultigram.$(O): ../autoconf.h ../config.h includes.h sublib.h shell.h ecommon.h
  873. X
  874. Xpipes.$(O): ../autoconf.h ../config.h includes.h procmail.h robust.h shell.h
  875. Xpipes.$(O): misc.h pipes.h common.h cstdio.h goodies.h mailfold.h
  876. X
  877. Xprocmail.$(O): ../patchlevel.h ../autoconf.h ../config.h includes.h procmail.h
  878. Xprocmail.$(O): sublib.h robust.h shell.h misc.h pipes.h common.h cstdio.h
  879. Xprocmail.$(O): exopen.h goodies.h locking.h mailfold.h
  880. X
  881. Xregexp.$(O): ../autoconf.h ../config.h includes.h procmail.h robust.h shell.h
  882. Xregexp.$(O): regexp.h
  883. X
  884. Xrobust.$(O): ../autoconf.h ../config.h includes.h procmail.h robust.h shell.h
  885. Xrobust.$(O): misc.h mailfold.h shell.h
  886. X
  887. Xsublib.$(O): ../autoconf.h ../config.h includes.h sublib.h shell.h
  888. X
  889. Xrecommend.$(O): ../autoconf.h ../config.h includes.h
  890. X    @$(CC) -c $(CFLAGS) $*.c
  891. X
  892. X.c.$(O):
  893. X    $(CC) -c $(CFLAGS) $<
  894. X
  895. Xrecommend: recommend.$(O) sublib.$(O)
  896. X    @$(CC) $(CFLAGS) $@.$(O) sublib.$(O) -o $@ $(LDFLAGS)
  897. X
  898. X../man/man.sed: manconf.c ../autoconf.h ../config.h includes.h procmail.h
  899. X../man/man.sed: ../patchlevel.h
  900. X    $(CC) $(CFLAGS) -o _autotst manconf.c $(LDFLAGS)
  901. X    ./_autotst >$@
  902. X    $(RM) _autotst
  903. X
  904. Xclean:
  905. X    $(RM) procmail.$(O) $(PM_OBJ) lockfile.$(O) $(LF_OBJ) formail.$O \
  906. X     $(FM_OBJ) multigram.$(O) $(BINSS) multigram ../autoconf.h _autotst* \
  907. X     lookfor _locktst* grepfor recommend recommend.$(O) manconf _Makefile \
  908. X     lock.log core
  909. X
  910. XMakefile: ../Makefile Makefile.0
  911. X    @echo "You have made changes to the master Makefile, in order for"
  912. X    @echo "these changes to show through, you will have to do first:"
  913. X    @echo "$(MAKE) makefiles"
  914. X
  915. Xmakefiles Makefiles makefile:
  916. X    cd ..; $(MAKE) makefiles
  917. X
  918. Xinit:
  919. X    cd ..; $(MAKE) $@
  920. END_OF_FILE
  921. if test 4358 -ne `wc -c <'procmail280/src/Makefile.0'`; then
  922.     echo shar: \"'procmail280/src/Makefile.0'\" unpacked with wrong size!
  923. fi
  924. # end of 'procmail280/src/Makefile.0'
  925. fi
  926. if test -f 'procmail280/src/fields.c' -a "${1}" != "-c" ; then 
  927.   echo shar: Will not clobber existing file \"'procmail280/src/fields.c'\"
  928. else
  929. echo shar: Extracting \"'procmail280/src/fields.c'\" \(3427 characters\)
  930. sed "s/^X//" >'procmail280/src/fields.c' <<'END_OF_FILE'
  931. X/************************************************************************
  932. X *    Routines to deal with the header-field objects in formail    *
  933. X *                                    *
  934. X *    Copyright (c) 1990-1992, S.R. van den Berg, The Netherlands    *
  935. X *    #include "README"                        *
  936. X ************************************************************************/
  937. X#ifdef RCS
  938. Xstatic /*const*/char rcsid[]=
  939. X "$Id: fields.c,v 1.9 1992/11/12 11:38:21 berg Exp $";
  940. X#endif
  941. X#include "includes.h"
  942. X#include "formail.h"
  943. X#include "sublib.h"
  944. X#include "shell.h"
  945. X#include "common.h"
  946. X#include "fields.h"
  947. X#include "ecommon.h"
  948. X#include "formisc.h"
  949. X
  950. Xstruct field*findf(p,hdr)const struct field*const p,*hdr;
  951. X{ size_t i;char*chp;        /* find a field in the linked list of fields */
  952. X  for(i=p->id_len,chp=(char*)p->fld_text;hdr;hdr=hdr->fld_next)
  953. X     if(i==hdr->id_len&&!strnIcmp(chp,hdr->fld_text,i))     /* case insensitive */
  954. X    return(struct field*)hdr;
  955. X  return(struct field*)0;
  956. X}
  957. X
  958. Xstruct field**addfield(pointer,text,totlen)register struct field**pointer;
  959. X const char*const text;const size_t totlen;    /* add field to a linked list */
  960. X{ register struct field*p;
  961. X  while(*pointer)                  /* skip to the end of the list */
  962. X     pointer= &(*pointer)->fld_next;
  963. X  (*pointer=p=malloc(FLD_HEADSIZ+totlen))->fld_next=0;     /* create the field */
  964. X  p->id_len=breakfield(text,totlen);          /* and copy field contents */
  965. X  tmemmove(p->fld_text,text,p->tot_len=totlen);return pointer;
  966. X}
  967. X
  968. Xvoid concatenate(fldp)struct field*const fldp;
  969. X{ register char*p;register size_t l;        /* concatenate a continued field */
  970. X  l=fldp->tot_len;p=fldp->fld_text;
  971. X  while(l--)
  972. X     if(*p++=='\n'&&l)         /* by substituting all newlines except the last */
  973. X    p[-1]=' ';
  974. X}
  975. X
  976. Xvoid renfield(pointer,oldl,newname,newl)struct field**const pointer;
  977. X const size_t oldl,newl;const char*const newname;        /* rename fields */
  978. X{ struct field*p;size_t i;char*chp;
  979. X  i=(p= *pointer)->tot_len-oldl;          /* length of what we will keep */
  980. X  *pointer=p=realloc(p,FLD_HEADSIZ+(p->tot_len=i+newl));chp=p->fld_text;
  981. X  tmemmove(chp+newl,chp+oldl,i);tmemmove(chp,newname,newl);   /* shove, copy */
  982. X}
  983. X
  984. Xvoid clearfield(pointer)register struct field**pointer;     /* delete the whole */
  985. X{ register struct field*p,*q;                /* linked list of fields */
  986. X  for(p= *pointer,*pointer=0;p;p=q)
  987. X     q=p->fld_next,free(p);
  988. X}
  989. X
  990. Xvoid flushfield(pointer)register struct field**pointer;     /* delete and print */
  991. X{ register struct field*p,*q;                   /* them as you go */
  992. X  for(p= *pointer,*pointer=0;p;p=q)
  993. X     q=p->fld_next,lputssn(p->fld_text,p->tot_len),free(p);
  994. X}
  995. X
  996. Xvoid dispfield(p)register const struct field*p;
  997. X{ for(;p;p=p->fld_next)                 /* print list non-destructively */
  998. X     if(p->id_len<p->tot_len-1)             /* any contents to display? */
  999. X    lputssn(p->fld_text,p->tot_len);
  1000. X}
  1001. X
  1002. Xreadhead P((void))  /* try and append one valid field to rdheader from stdin */
  1003. X{ getline();
  1004. X  if(!eqFrom_(buf))                    /* it's not a From_ line */
  1005. X   { if(!breakfield(buf,buffilled))       /* not the start of a valid field */
  1006. X    return 0;
  1007. X     for(;;getline())              /* get the rest of the continued field */
  1008. X      { switch(buflast)                 /* will this line be continued? */
  1009. X     { case ' ':case '\t':continue;              /* yep, it sure is */
  1010. X     }
  1011. X    break;
  1012. X      }
  1013. X   }
  1014. X  else if(rdheader)
  1015. X     return 0;                       /* the From_ line was a fake! */
  1016. X  addbuf();return 1;          /* phew, got the field, add it to rdheader */
  1017. X}
  1018. X
  1019. Xvoid addbuf P((void))
  1020. X{ addfield(&rdheader,buf,buffilled);buffilled=0;
  1021. X}
  1022. END_OF_FILE
  1023. if test 3427 -ne `wc -c <'procmail280/src/fields.c'`; then
  1024.     echo shar: \"'procmail280/src/fields.c'\" unpacked with wrong size!
  1025. fi
  1026. # end of 'procmail280/src/fields.c'
  1027. fi
  1028. if test -f 'procmail280/src/header.h' -a "${1}" != "-c" ; then 
  1029.   echo shar: Will not clobber existing file \"'procmail280/src/header.h'\"
  1030. else
  1031. echo shar: Extracting \"'procmail280/src/header.h'\" \(3778 characters\)
  1032. sed "s/^X//" >'procmail280/src/header.h' <<'END_OF_FILE'
  1033. X/************************************************************************
  1034. X *                                    *
  1035. X *    Known fields when formail is splitting messages (the first    *
  1036. X *    "-m nnn" fields encountered should be among them or one of    *
  1037. X *    the special From_, Article_ or X- fields).            *
  1038. X *                                    *
  1039. X *    If you need to add one (be sure to update "cdigest" below as    *
  1040. X *    well!), drop me a mail, I might be interested in including    *
  1041. X *    it in the next release.                        *
  1042. X *                                    *
  1043. X ************************************************************************/
  1044. X/*$Id: header.h,v 1.12 1993/01/26 14:49:52 berg Exp $*/
  1045. X
  1046. Xstatic const char
  1047. X returnpath[]=        "Return-Path:",                  /* RFC 822 */
  1048. X received[]=        "Received:",                /* ditto ... */
  1049. X replyto[]=        "Reply-To:",
  1050. X Fromm[]=        "From:",
  1051. X sender[]=        "Sender:",
  1052. X res_replyto[]=        "Resent-Reply-To:",
  1053. X res_from[]=        "Resent-From:",
  1054. X res_sender[]=        "Resent-Sender:",
  1055. X date[]=        "Date:",
  1056. X res_date[]=        "Resent-Date:",
  1057. X to[]=            "To:",
  1058. X res_to[]=        "Resent-To:",
  1059. X cc[]=            "Cc:",
  1060. X res_cc[]=        "Resent-Cc:",
  1061. X bcc[]=            "Bcc:",
  1062. X res_bcc[]=        "Resent-Bcc:",
  1063. X messageid[]=        "Message-ID:",
  1064. X res_messageid[]=    "Resent-Message-ID:",
  1065. X inreplyto[]=        "In-Reply-To:",
  1066. X references[]=        "References:",
  1067. X keywords[]=        "Keywords:",
  1068. X subject[]=        "Subject:",
  1069. X scomments[]=        "Comments:",
  1070. X ncrypted[]=        "Encrypted:",
  1071. X errorsto[]=        "Errors-To:",               /* sendmail extension */
  1072. X retreceiptto[]=    "Return-Receipt-To:",            /* ditto ... */
  1073. X precedence[]=        "Precedence:",
  1074. X fullname[]=        "Full-Name:",
  1075. X postddate[]=        "Posted-Date:",
  1076. X recvddate[]=        "Received-Date:",
  1077. X mssage[]=        "Message:",
  1078. X text[]=        "Text:",
  1079. X via[]=            "Via:",
  1080. X priority[]=        "Priority:",                /* ELM extension */
  1081. X fcc[]=            "Fcc:",                   /* Mush extension */
  1082. X article[]=        "Article:",             /* USENET extension */
  1083. X path[]=        "Path:",                /* ditto ... */
  1084. X summary[]=        "Summary:",
  1085. X organisation[]=    "Organisation:",
  1086. X aorganization[]=    "Organization:",
  1087. X newsgroups[]=        "Newsgroups:",
  1088. X followupto[]=        "Followup-To:",
  1089. X approved[]=        "Approved:",
  1090. X lines[]=        "Lines:",
  1091. X expires[]=        "Expires:",
  1092. X control[]=        "Control:",
  1093. X distribution[]=    "Distribution:",
  1094. X xref[]=        "Xref:",
  1095. X originator[]=        "Originator:",
  1096. X nntppostinghost[]=    "Nntp-Posting-Host:",
  1097. X title[]=        "Title:",          /* antiquated USENET extension */
  1098. X aRticleid[]=        "Article-I.D.:",            /* ditto ... */
  1099. X posted[]=        "Posted:",
  1100. X cnttype[]=        "Content-Type:",           /* Internet extension */
  1101. X encoding[]=        "Encoding:",                /* ditto ... */
  1102. X mimeversion[]=        "MIME-Version:",           /* MIME extension */
  1103. X cnttransferenc[]=    "Content-Transfer-Encoding:",        /* ditto ... */
  1104. X cntid[]=        "Content-ID:",
  1105. X cntdescription[]=    "Content-Description:",
  1106. X transportoptions[]=    "Transport-Options:",        /* SysV mailer extension */
  1107. X defltoptions[]=    "Default-Options:",
  1108. X cntlength[]=        "Content-Length:",
  1109. X status[]=        "Status:";             /* mailer extension */
  1110. X
  1111. Xstatic const struct {const char*hedr;int lnr;}cdigest[]=
  1112. X{ bsl(returnpath),bsl(received),bsl(replyto),bsl(Fromm),bsl(sender),
  1113. X  bsl(res_replyto),bsl(res_from),bsl(res_sender),bsl(date),bsl(res_date),
  1114. X  bsl(to),bsl(res_to),bsl(cc),bsl(res_cc),bsl(bcc),bsl(res_bcc),bsl(messageid),
  1115. X  bsl(res_messageid),bsl(inreplyto),bsl(references),bsl(keywords),bsl(subject),
  1116. X  bsl(scomments),bsl(ncrypted),bsl(errorsto),bsl(retreceiptto),
  1117. X  bsl(precedence),bsl(fullname),bsl(postddate),bsl(recvddate),bsl(mssage),
  1118. X  bsl(text),bsl(via),bsl(priority),bsl(fcc),bsl(article),bsl(path),
  1119. X  bsl(summary),bsl(organisation),bsl(aorganization),bsl(newsgroups),
  1120. X  bsl(followupto),bsl(approved),bsl(lines),bsl(expires),bsl(control),
  1121. X  bsl(distribution),bsl(xref),bsl(originator),bsl(nntppostinghost),bsl(title),
  1122. X  bsl(aRticleid),bsl(posted),bsl(cnttype),bsl(encoding),bsl(mimeversion),
  1123. X  bsl(cnttransferenc),bsl(cntid),bsl(cntdescription),bsl(transportoptions),
  1124. X  bsl(defltoptions),bsl(cntlength),bsl(status)
  1125. X};
  1126. END_OF_FILE
  1127. if test 3778 -ne `wc -c <'procmail280/src/header.h'`; then
  1128.     echo shar: \"'procmail280/src/header.h'\" unpacked with wrong size!
  1129. fi
  1130. # end of 'procmail280/src/header.h'
  1131. fi
  1132. if test -f 'procmail280/src/robust.c' -a "${1}" != "-c" ; then 
  1133.   echo shar: Will not clobber existing file \"'procmail280/src/robust.c'\"
  1134. else
  1135. echo shar: Extracting \"'procmail280/src/robust.c'\" \(4031 characters\)
  1136. sed "s/^X//" >'procmail280/src/robust.c' <<'END_OF_FILE'
  1137. X/************************************************************************
  1138. X *    The fault-tolerant system-interface                *
  1139. X *                                    *
  1140. X *    Copyright (c) 1990-1992, S.R. van den Berg, The Netherlands    *
  1141. X *    #include "README"                        *
  1142. X ************************************************************************/
  1143. X#ifdef RCS
  1144. Xstatic /*const*/char rcsid[]=
  1145. X "$Id: robust.c,v 1.9 1993/01/19 11:55:25 berg Exp $";
  1146. X#endif
  1147. X#include "procmail.h"
  1148. X#include "robust.h"
  1149. X#include "misc.h"
  1150. X#include "mailfold.h"
  1151. X
  1152. X#define nomemretry    noresretry
  1153. X#define noforkretry    noresretry
  1154. X               /* set nextexit to prevent elog() from using malloc() */
  1155. Xstatic void nomemerr P((void))
  1156. X{ nextexit=2;nlog("Out of memory\n");
  1157. X  if(buf2)
  1158. X   { buf[linebuf-1]=buf2[linebuf-1]='\0';elog("buffer 0:");logqnl(buf);
  1159. X     elog("buffer 1:");logqnl(buf2);
  1160. X   }
  1161. X  if(retval!=EX_TEMPFAIL)
  1162. X     retval=EX_OSERR;
  1163. X  terminate();
  1164. X}
  1165. X
  1166. Xvoid*tmalloc(len)const size_t len;    /* this malloc can survive a temporary */
  1167. X{ void*p;int i;                    /* "out of swap space" condition */
  1168. X  lcking|=lck_ALLOCLIB;
  1169. X  if(p=malloc(len))
  1170. X     goto ret;
  1171. X  lcking|=lck_MEMORY;
  1172. X  if(p=malloc(1))
  1173. X     free(p);               /* works on some systems with latent free */
  1174. X  for(i=nomemretry;i<0||i--;)
  1175. X   { suspend();             /* problems?  don't panic, wait a few secs till */
  1176. X     if(p=malloc(len))         /* some other process has paniced (and died 8-) */
  1177. Xret:  { lcking&=~(lck_MEMORY|lck_ALLOCLIB);return p;
  1178. X      }
  1179. X   }
  1180. X  nomemerr();
  1181. X}
  1182. X
  1183. Xvoid*trealloc(old,len)void*const old;const size_t len;
  1184. X{ void*p;int i;
  1185. X  lcking|=lck_ALLOCLIB;
  1186. X  if(p=realloc(old,len))
  1187. X     goto ret;                    /* for comment see tmalloc above */
  1188. X  lcking|=lck_MEMORY;
  1189. X  if(p=malloc(1))
  1190. X    free(p);
  1191. X  for(i=nomemretry;i<0||i--;)
  1192. X   { suspend();
  1193. X     if(p=realloc(old,len))
  1194. Xret:  { lcking&=~(lck_MEMORY|lck_ALLOCLIB);return p;
  1195. X      }
  1196. X   }
  1197. X  nomemerr();
  1198. X}
  1199. X
  1200. Xvoid tfree(p)void*const p;
  1201. X{ lcking|=lck_ALLOCLIB;free(p);lcking&=~lck_ALLOCLIB;
  1202. X}
  1203. X
  1204. X#include "shell.h"
  1205. X
  1206. Xpid_t sfork P((void))            /* this fork can survive a temporary */
  1207. X{ pid_t i;int r;               /* "process table full" condition */
  1208. X  elog("");r=noforkretry;              /* flush log, just in case */
  1209. X  while((i=fork())==-1)
  1210. X   { lcking|=lck_FORK;
  1211. X     if(!(r<0||r--))
  1212. X    break;
  1213. X     suspend();
  1214. X   }
  1215. X  lcking&=~lck_FORK;return i;
  1216. X}
  1217. X
  1218. Xvoid openlog(file)const char*file;
  1219. X{ int i;
  1220. X  if(!*file)                           /* empty LOGFILE? */
  1221. X     file=devnull;                 /* substitute the bitbucket */
  1222. X  if(0>(i=opena(file)))
  1223. X     writeerr(file);                  /* error, keep the old LOGFILE */
  1224. X  else
  1225. X     rclose(STDERR),rdup(i),rclose(i),logopened=1;
  1226. X}
  1227. X
  1228. Xopena(a)const char*const a;
  1229. X{ if(asgnlastf)
  1230. X     asgnlastf=0,lastfolder=cstr(lastfolder,a);
  1231. X  yell("Opening",a);
  1232. X#ifdef O_CREAT
  1233. X  return ropen(a,O_WRONLY|O_APPEND|O_CREAT,NORMperm);
  1234. X#else
  1235. X  ;{ int fd;
  1236. X     return(fd=ropen(a,O_WRONLY,0))<0?creat(a,NORMperm):fd;
  1237. X   }
  1238. X#endif
  1239. X}
  1240. X
  1241. Xropen(name,mode,mask)const char*const name;const int mode;const mode_t mask;
  1242. X{ int i,r;                           /* a SysV secure open */
  1243. X  for(r=noresretry,lcking|=lck_FILDES;0>(i=open(name,mode,mask));)
  1244. X     if(errno!=EINTR&&!(errno==ENFILE&&(r<0||r--)))
  1245. X    break;         /* survives a temporary "file table full" condition */
  1246. X  lcking&=~lck_FILDES;return i;
  1247. X}
  1248. X
  1249. Xrpipe(fd)int fd[2];
  1250. X{ int i,r;                      /* catch "file table full" */
  1251. X  for(r=noresretry,lcking|=lck_FILDES;0>(i=pipe(fd));)
  1252. X     if(!(errno==ENFILE&&(r<0||r--)))
  1253. X      { *fd=fd[1]= -1;break;
  1254. X      }
  1255. X  lcking&=~lck_FILDES;return i;
  1256. X}
  1257. X
  1258. Xrdup(p)const int p;
  1259. X{ int i,r;                      /* catch "file table full" */
  1260. X  for(r=noresretry,lcking|=lck_FILDES;0>(i=dup(p));)
  1261. X     if(!(errno==ENFILE&&(r<0||r--)))
  1262. X    break;
  1263. X  lcking&=~lck_FILDES;return i;
  1264. X}
  1265. X
  1266. Xrclose(fd)const int fd;              /* a SysV secure close (signal immune) */
  1267. X{ int i;
  1268. X  while((i=close(fd))&&errno==EINTR);
  1269. X  return i;
  1270. X}
  1271. X
  1272. Xrread(fd,a,len)const int fd,len;void*const a;           /* a SysV secure read */
  1273. X{ int i;
  1274. X  while(0>(i=read(fd,a,(size_t)len))&&errno==EINTR);
  1275. X  return i;
  1276. X}
  1277. X
  1278. Xrwrite(fd,a,len)const int fd,len;const void*const a;  /* a SysV secure write */
  1279. X{ int i;
  1280. X  while(0>(i=write(fd,a,(size_t)len))&&errno==EINTR);
  1281. X  return i;
  1282. X}
  1283. END_OF_FILE
  1284. if test 4031 -ne `wc -c <'procmail280/src/robust.c'`; then
  1285.     echo shar: \"'procmail280/src/robust.c'\" unpacked with wrong size!
  1286. fi
  1287. # end of 'procmail280/src/robust.c'
  1288. fi
  1289. echo shar: End of archive 3 \(of 11\).
  1290. cp /dev/null ark3isdone
  1291. MISSING=""
  1292. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  1293.     if test ! -f ark${I}isdone ; then
  1294.     MISSING="${MISSING} ${I}"
  1295.     fi
  1296. done
  1297. if test "${MISSING}" = "" ; then
  1298.     echo You have unpacked all 11 archives.
  1299.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1300. else
  1301.     echo You still need to unpack the following archives:
  1302.     echo "        " ${MISSING}
  1303. fi
  1304. ##  End of shell archive.
  1305. exit 0
  1306. -- 
  1307. Sincerely,                                  berg@pool.informatik.rwth-aachen.de
  1308.            Stephen R. van den Berg (AKA BuGless).    berg@physik.tu-muenchen.de
  1309.  
  1310. "Be spontaneous!"
  1311.  
  1312. exit 0 # Just in case...
  1313.