home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume28 / procmail / part01 next >
Text File  |  1992-02-02  |  54KB  |  1,596 lines

  1. Newsgroups: comp.sources.misc
  2. From: berg@messua.informatik.rwth-aachen.de (Stephen R. van den Berg)
  3. Subject:  v28i001:  procmail - mail processing program v2.61, Part01/05
  4. Message-ID: <csm-v28i001=procmail.210239@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 18ee4f8730f5ec5d63ada487fcb09570
  6. Date: Sun, 2 Feb 1992 03:04:26 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: berg@messua.informatik.rwth-aachen.de (Stephen R. van den Berg)
  10. Posting-number: Volume 28, Issue 1
  11. Archive-name: procmail/part01
  12. Environment: UNIX, sendmail, smail, MMDF
  13. Supersedes: procmail: Volume 25, Issue 01-04
  14.  
  15. The procmail mail processing program. (v2.61 1991/01/31)
  16.  
  17. Can be used to create mail-servers, mailing lists, sort your incoming mail
  18. into separate folders/files (real convenient when subscribing to one or more
  19. mailing lists or for prioritising your mail), preprocess your mail, start
  20. any programs upon mail arrival (e.g. to generate different chimes on your
  21. workstation for different types of mail) or selectively forward certain
  22. incoming mail automatically to someone.
  23.  
  24. The accompanying formail program enables you to generate autoreplies, split up
  25. digests/mailboxes into the original messages, do some very simple
  26. header-munging/extraction, or force mail into mail-format (with leading From
  27. line).
  28.  
  29. Sincerely,                                berg@messua.informatik.rwth-aachen.de
  30.            Stephen R. van den Berg (AKA BuGless).    berg@physik.tu-muenchen.de
  31.  ----------------------
  32. A recent version can be picked up at various comp.sources.misc archives.
  33. The latest version can be obtained directly from the ftp-archive at:
  34.  
  35.     amaru.informatik.rwth-aachen.de (137.226.112.31)
  36.  
  37.     as compressed tar file:        pub/unix/procmail.tar.Z        <100KB
  38.     or in compressed shar format:    pub/unix/procmail.0?.Z
  39.  ----------------------
  40. Feature summary for procmail:
  41.     + It's small
  42.     + Very easy to install (rated PG6 :-)
  43.     + Simple to maintain and configure because
  44.       all you need is actually only ONE executable (procmail)
  45.       and ONE configuration file (.procmailrc)
  46.     + Is event driven (i.e. gets invoked automagically when mail arrives)
  47.     + Does not use *any* temporary files
  48.     + Uses standard egrep regular expressions
  49.     + Allows for very-easy-to-use yes-no decisions on where the mail
  50.       should go
  51.     + Filters, delivers and forwards mail *reliably*
  52.     + Provides a reliable hook (you might even say anchor :-) for any
  53.       programs or shell scripts you may wish to start upon mail arrival
  54.     + Performs heroically under even the worst conditions
  55.       (file system full, out of swap space, process table full,
  56.       file table full, missing support files, unavailable executables,
  57.       denied permissions) and tries to deliver the mail somehow anyway
  58.     + Absolutely undeliverable mail (after trying every trick in the book)
  59.       will bounce back to the sender (or not, your choice)
  60.     + Is one of the few mailers to perform reliable mailbox locking across
  61.       NFS as well (DON'T use NFS mounted mailboxes WITHOUT installing
  62.       procmail, you may use valuable mail one day)
  63.     + Supports four mailfolder standards: single file folders (standard
  64.       and nonstandard VNIX format), directory folders that contain one file
  65.       per message, or the similar MH directory folders (numbered files)
  66.     + Variable assignment and substitution is an extremely complete subset
  67.       of the standard /bin/sh syntax
  68.     + Provides a mail log file, which logs all mail arrival, shows
  69.       in summary whence it came from, what it was about, where it went
  70.       (what folder) and how long (in bytes) it was
  71.     + Uses this log file to display a wide range of diagnostic and error
  72.       messages (if something went wrong)
  73.     + Processed mail can contain arbitrary 8-bit characters (including
  74.       '\0'); i.e. binary mailings can be processed if the rest of the
  75.       mailing system knew how to handle them too
  76.     + It has a man page (boy, does *it* have a man page)
  77.     + procmail can be used as a local delivery agent (a completely
  78.       integrated substitute for /bin/mail)
  79.     + It runs on virtually all (old and future) operating systems which
  80.       names start with a 'U' or end in an 'X' :-) (i.e. extremely portable
  81.       code; POSIX,ANSI C and K&R conforming)
  82.     + Works with (among others?) sendmail, smail and MMDF
  83.  
  84. Feature summary for formail:
  85.     + Can generate auto-reply headers
  86.     + Can force mail into mailbox format (so that you can process it with
  87.       standard mail programs)
  88.     + Can split up mailboxes into the individual messages
  89.     + Can split up digests into the individual messages
  90.     + Can split up saved articles into the individual articles
  91.     + Can do simple header munging/extraction
  92.  
  93. Feature summary for lockfile:
  94.     + Provides NFS-secure lockfiles to shell script programmers
  95. ----------------------
  96. #! /bin/sh
  97. # This is a shell archive.  Remove anything before this line, then unpack
  98. # it by saving it into a file and typing "sh file".  To overwrite existing
  99. # files, type "sh file -c".  You can also feed this as standard input via
  100. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  101. # will see the following message at the end:
  102. #        "End of archive 1 (of 5)."
  103. # Contents:  procmail procmail/FEATURES procmail/HISTORY
  104. #   procmail/Manifest procmail/common.c procmail/examples
  105. #   procmail/examples/1procmailrc procmail/examples/1rmail
  106. #   procmail/examples/2procmailrc procmail/examples/2rmail
  107. #   procmail/examples/3procmailrc procmail/examples/3rmail
  108. #   procmail/examples/forward procmail/examples/listrc
  109. #   procmail/exopen.c procmail/exopen.h procmail/include
  110. #   procmail/include/stddef.h procmail/include/stdlib.h
  111. #   procmail/include/string.h procmail/include/sys
  112. #   procmail/include/sys/file.h procmail/include/sys/utsname.h
  113. #   procmail/include/sys/wait.h procmail/include/sysexits.h
  114. #   procmail/include/unistd.h procmail/includes.h procmail/lockfile.c
  115. #   procmail/man procmail/man/lockfile.1 procmail/man/mansed
  116. #   procmail/patchlevel.h procmail/procmail.h procmail/shell.h
  117. # Wrapped by berg@tabaqui on Fri Jan 31 14:16:29 1992
  118. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  119. if test ! -d 'procmail' ; then
  120.     echo shar: Creating directory \"'procmail'\"
  121.     mkdir 'procmail'
  122. fi
  123. if test -f 'procmail/FEATURES' -a "${1}" != "-c" ; then 
  124.   echo shar: Will not clobber existing file \"'procmail/FEATURES'\"
  125. else
  126. echo shar: Extracting \"'procmail/FEATURES'\" \(2862 characters\)
  127. sed "s/^X//" >'procmail/FEATURES' <<'END_OF_FILE'
  128. XFeature summary for procmail:
  129. X    + It's small
  130. X    + Very easy to install (rated PG6 :-)
  131. X    + Simple to maintain and configure because
  132. X      all you need is actually only ONE executable (procmail)
  133. X      and ONE configuration file (.procmailrc)
  134. X    + Is event driven (i.e. gets invoked automagically when mail arrives)
  135. X    + Does not use *any* temporary files
  136. X    + Uses standard egrep regular expressions
  137. X    + Allows for very-easy-to-use yes-no decisions on where the mail
  138. X      should go
  139. X    + Filters, delivers and forwards mail *reliably*
  140. X    + Provides a reliable hook (you might even say anchor :-) for any
  141. X      programs or shell scripts you may wish to start upon mail arrival
  142. X    + Performs heroically under even the worst conditions
  143. X      (file system full, out of swap space, process table full,
  144. X      file table full, missing support files, unavailable executables,
  145. X      denied permissions) and tries to deliver the mail somehow anyway
  146. X    + Absolutely undeliverable mail (after trying every trick in the book)
  147. X      will bounce back to the sender (or not, your choice)
  148. X    + Is one of the few mailers to perform reliable mailbox locking across
  149. X      NFS as well (DON'T use NFS mounted mailboxes WITHOUT installing
  150. X      procmail, you may use valuable mail one day)
  151. X    + Supports four mailfolder standards: single file folders (standard
  152. X      and nonstandard VNIX format), directory folders that contain one file
  153. X      per message, or the similar MH directory folders (numbered files)
  154. X    + Variable assignment and substitution is an extremely complete subset
  155. X      of the standard /bin/sh syntax
  156. X    + Provides a mail log file, which logs all mail arrival, shows
  157. X      in summary whence it came from, what it was about, where it went
  158. X      (what folder) and how long (in bytes) it was
  159. X    + Uses this log file to display a wide range of diagnostic and error
  160. X      messages (if something went wrong)
  161. X    + Processed mail can contain arbitrary 8-bit characters (including
  162. X      '\0'); i.e. binary mailings can be processed if the rest of the
  163. X      mailing system knew how to handle them too
  164. X    + It has a man page (boy, does *it* have a man page)
  165. X    + procmail can be used as a local delivery agent (a completely
  166. X      integrated substitute for /bin/mail)
  167. X    + It runs on virtually all (old and future) operating systems which
  168. X      names start with a 'U' or end in an 'X' :-) (i.e. extremely portable
  169. X      code; POSIX,ANSI C and K&R conforming)
  170. X    + Works with (among others?) sendmail, smail and MMDF
  171. X
  172. XFeature summary for formail:
  173. X    + Can generate auto-reply headers
  174. X    + Can force mail into mailbox format (so that you can process it with
  175. X      standard mail programs)
  176. X    + Can split up mailboxes into the individual messages
  177. X    + Can split up digests into the individual messages
  178. X    + Can split up saved articles into the individual articles
  179. X    + Can do simple header munging/extraction
  180. X
  181. XFeature summary for lockfile:
  182. X    + Provides NFS-secure lockfiles to shell script programmers
  183. END_OF_FILE
  184. if test 2862 -ne `wc -c <'procmail/FEATURES'`; then
  185.     echo shar: \"'procmail/FEATURES'\" unpacked with wrong size!
  186. fi
  187. # end of 'procmail/FEATURES'
  188. fi
  189. if test -f 'procmail/HISTORY' -a "${1}" != "-c" ; then 
  190.   echo shar: Will not clobber existing file \"'procmail/HISTORY'\"
  191. else
  192. echo shar: Extracting \"'procmail/HISTORY'\" \(3524 characters\)
  193. sed "s/^X//" >'procmail/HISTORY' <<'END_OF_FILE'
  194. X1990/12/07: v1.00
  195. X1990/12/12: v1.01
  196. X1991/02/04: v1.02
  197. X1991/02/13: v1.10
  198. X1991/02/21: v1.20
  199. X1991/02/22: v1.21
  200. X1991/03/01: v1.30
  201. X1991/03/15: v1.35
  202. X        Started using RCS to manage the source
  203. X1991/06/04: v1.99
  204. X1991/06/10: v2.00
  205. X1991/06/11: v2.01
  206. X1991/06/12: v2.02
  207. X1991/06/20: v2.03
  208. X1991/07/04: v2.10
  209. X1991/07/12: v2.11
  210. X1991/10/02: v2.20 (never released)
  211. X1991/10/18: v2.30
  212. X        Implemented a custom regular expression library (fully egrep
  213. X           compatible), should eliminate the annoyances with incompatible
  214. X           egreps
  215. X        Changed the formatting (indenting) style in all the source files
  216. X           (which blows up all diffs beyond proportion of course)
  217. X        Accomplished the doubtful milestone of having a source file
  218. X           (regexp.c) which provokes a compiler error on an old compiler
  219. X           (if using the optimiser)
  220. X        Threw out the GREP environment variable
  221. X        Ignoring leading spaces on condition lines now (means that
  222. X           everything can be indented in the rcfile)
  223. X        Rewrote some parts to use the regexp lib, making the code smaller
  224. X1991/10/22: v2.31
  225. X        Added answers to FAQ list
  226. X        Fixed portability problem with missing strpbrk and strchr
  227. X        Cleaned up the lockfile creation when in explicit delivery mode
  228. X1991/12/05: v2.40
  229. X        Cleaned the example rcfiles
  230. X        Updated the FAQ list
  231. X        Updated the man pages to fully correspond to the program again
  232. X           (beautified them in the process)
  233. X        Made a clear debugging-aid entry in the INSTALL file
  234. X        Added the -a option to formail
  235. X        Added an IFS environment variable override in procmail
  236. X        Fixed regression bug in formail, it did not terminate if the mail
  237. X           which was piped in did not contain an end of header mark
  238. X        Made the -aiI options of formail work while splitting as well
  239. X        Fixed bug in the new regexp lib (caused core dumps if the mail had
  240. X           a null body)
  241. X        Made procmail capable of healing the recipient's mail spool file
  242. X        Corrected all the docs (fixed a spelling error)
  243. X        Tricked NFS into supplying an access_time<modification_time for the
  244. X           folders written
  245. X        Added the 'a' flag to procmail
  246. X1991/12/13: v2.50
  247. X        Fixed portability problems onto ISC in the autoconf script
  248. X        Fixed bug in procmail evaluating $- and $$
  249. X        Added -x option to formail
  250. X        Made formail operate as orthogonal as possible with combinated
  251. X           options
  252. X1992/01/22: v2.60
  253. X        Complete overhaul of the regexp lib (reduced size, and fixed some
  254. X           portability problems to buggy compilers)
  255. X        Fixed lockfile not to modify argv[]
  256. X        Removed superfluous escapes in the example files
  257. X        Extended the portability of the autoconf script
  258. X        Enhanced the response to signals (SIGTERM and SIGQUIT now have
  259. X           different meanings)
  260. X        Improved autoconfiguration for 16-bit machines
  261. X        Updated the man pages/FAQ-list/INSTALL-file for MMDF support
  262. X1991/01/31: v2.61
  263. X        Updated the directions for .forward file contents
  264. X        Fixed the EDQUOT define (some machines didn't define it)
  265. X        Eliminated a rare (no report of it occuring yet) inconvenience,
  266. X           a temporary file could be left lying around if procmail would
  267. X           be killed in a very small window after an open()
  268. X        Kludge the username into lowercase after the -d option
  269. X        Added specific directions for sites running smail (see
  270. X           examples/advanced)
  271. X        Added a search for sendmail in autoconf
  272. X        Fixed a problem in the implicit-lockfile-searching code
  273. X        Added the ARCHITECTURE variable to the makefile (for convenience)
  274. END_OF_FILE
  275. if test 3524 -ne `wc -c <'procmail/HISTORY'`; then
  276.     echo shar: \"'procmail/HISTORY'\" unpacked with wrong size!
  277. fi
  278. # end of 'procmail/HISTORY'
  279. fi
  280. if test -f 'procmail/Manifest' -a "${1}" != "-c" ; then 
  281.   echo shar: Will not clobber existing file \"'procmail/Manifest'\"
  282. else
  283. echo shar: Extracting \"'procmail/Manifest'\" \(2163 characters\)
  284. sed "s/^X//" >'procmail/Manifest' <<'END_OF_FILE'
  285. XMakefile    We all know what that is.
  286. XREADME        Important, read it.
  287. XINSTALL        A description of what has to be done to install procmail.
  288. XFAQ        Lists the things you are too lazy to figure out yourself.
  289. XHISTORY        Recent and ancient changes, features (or bugs) documented.
  290. XFEATURES    A summary of all the things procmail is particularly good at.
  291. Xlockfile.c    main program for lockfile
  292. Xformail.c    main program for formail
  293. XManifest    You guessed it.
  294. Xprocmail.c    main program for procmail.
  295. Xnonint.c    Collection of routines that don't return ints.
  296. Xretint.c    Collection of routines that return ints.
  297. Xgoodies.c    Some real nice routines, deserve to be put in a library.
  298. Xregexp.c    Custom regular expression library, *fully* egrep compatible.
  299. Xcommon.c    Some routines that are used by procmail and formail.
  300. Xexopen.c    Collection of routines about an NFS secure excl. open.
  301. Xexopen.h    The very same.
  302. Xprocmail.h    Include file with all declarations.
  303. X
  304. Xincludes.h    System include files are all referenced here.
  305. Xconfig.h    The file to edit if you want to change, yes, the configuration.
  306. Xautoconf    The shell script that seizes your compiler and machine,
  307. X        and then creates a file called autoconf.h describing the
  308. X        kludges that are going to be applied for your installation.
  309. X
  310. Xshell.h        Defines a few 'shell' macros for malloc and the like.
  311. Xman/*        Yes, the man pages (made in a labour camp) and two additional
  312. X        files which makes these man pages auto-adapting.
  313. Xinclude/*    A few files that are supposed to fool your compiler into
  314. X        thinking that it has ANSI and POSIX conforming include files.
  315. Xexamples/?procmailrc
  316. X        Sample .procmailrc files.
  317. Xexamples/?rmail
  318. X        Sample shell scripts that demonstrate how to use
  319. X        lockfiles while reading the mail (to ensure mail integrity
  320. X        as soon as you exit the mail program).
  321. Xexamples/forward
  322. X        A sample .forward file (MMDF users should disregard this file
  323. X        and look in the man page).
  324. Xexamples/advanced
  325. X        Some extra info for network mounted mailboxes, examples of
  326. X        advanced .procmailrc expressions and using procmail as
  327. X        a local delivery agent.
  328. Xexamples/mailinglist
  329. X        Comprehensive instructions on maintaining a mailinglist.
  330. Xexamples/listrc Model-rcfile for use in mailinglists.
  331. END_OF_FILE
  332. if test 2163 -ne `wc -c <'procmail/Manifest'`; then
  333.     echo shar: \"'procmail/Manifest'\" unpacked with wrong size!
  334. fi
  335. # end of 'procmail/Manifest'
  336. fi
  337. if test -f 'procmail/common.c' -a "${1}" != "-c" ; then 
  338.   echo shar: Will not clobber existing file \"'procmail/common.c'\"
  339. else
  340. echo shar: Extracting \"'procmail/common.c'\" \(1976 characters\)
  341. sed "s/^X//" >'procmail/common.c' <<'END_OF_FILE'
  342. X/************************************************************************
  343. X *    A some common routines for procmail and formail            *
  344. X *                                    *
  345. X *    Copyright (c) 1990-1992, S.R. van den Berg, The Netherlands    *
  346. X *    The sources can be freely copied for non-commercial use.    *
  347. X *    #include "README"                        *
  348. X *                                    *
  349. X ************************************************************************/
  350. X#ifdef RCS
  351. Xstatic char rcsid[]="$Id: common.c,v 2.9 1992/01/09 17:23:14 berg Rel $";
  352. X#endif
  353. X#include "includes.h"
  354. X
  355. Xvoid*tmalloc();
  356. Xextern const char binsh[];
  357. X
  358. X#ifdef NOmemmove
  359. Xvoid*smemmove(To,From,count)void*To,*From;register size_t count;
  360. X#ifdef NObcopy
  361. X{ register char*to=To,*from=From;/*void*old;*/      /* silly compromise, throw */
  362. X  /*old=to;*/count++;--to;--from;  /* away space to be syntactically correct */
  363. X  if(to<=from)
  364. X   { goto jiasc;
  365. X     do
  366. X      { *++to= *++from;                      /* copy from above */
  367. Xjiasc:;
  368. X      }
  369. X     while(--count);
  370. X   }
  371. X  else
  372. X   { to+=count;from+=count;goto jidesc;
  373. X     do
  374. X      { *--to= *--from;                      /* copy from below */
  375. Xjidesc:;
  376. X      }
  377. X     while(--count);
  378. X   }
  379. X  return To/*old*/;
  380. X#else
  381. X{ bcopy(From,To,count);return To;
  382. X#endif
  383. X}
  384. X#endif
  385. X
  386. X#include "shell.h"
  387. X
  388. Xshexec(argv)const char*const*argv;
  389. X{ int i;const char**newargv,**p;
  390. X#ifdef SIGXCPU
  391. X  signal(SIGXCPU,SIG_DFL);signal(SIGXFSZ,SIG_DFL);
  392. X#endif
  393. X  signal(SIGPIPE,SIG_DFL);execvp(*argv,argv);    /* or is it a shell script ? */
  394. X  for(p=(const char**)argv,i=1;i++,*p++;);          /* count the arguments */
  395. X  newargv=malloc(i*sizeof*p);
  396. X  for(*(p=newargv)=binsh;*++p= *argv++;);
  397. X  execve(*newargv,newargv,environ);          /* no shell script? -> trouble */
  398. X  log("Failed to execute");logqnl(*argv);exit(EX_UNAVAILABLE);
  399. X}
  400. X
  401. Xchar*pstrspn(whole,sub)const char*whole,*const sub;
  402. X{ while(strchr(sub,*whole))
  403. X     whole++;
  404. X  return(char*)whole;
  405. X}
  406. X
  407. X#ifdef NOstrcspn
  408. Xstrcspn(whole,sub)const char*const whole,*const sub;
  409. X{ const register char*p;
  410. X  p=whole;
  411. X  while(!strchr(sub,*p))
  412. X     p++;
  413. X  return p-whole;
  414. X}
  415. X#endif
  416. END_OF_FILE
  417. if test 1976 -ne `wc -c <'procmail/common.c'`; then
  418.     echo shar: \"'procmail/common.c'\" unpacked with wrong size!
  419. fi
  420. # end of 'procmail/common.c'
  421. fi
  422. if test ! -d 'procmail/examples' ; then
  423.     echo shar: Creating directory \"'procmail/examples'\"
  424.     mkdir 'procmail/examples'
  425. fi
  426. if test -f 'procmail/examples/1procmailrc' -a "${1}" != "-c" ; then 
  427.   echo shar: Will not clobber existing file \"'procmail/examples/1procmailrc'\"
  428. else
  429. echo shar: Extracting \"'procmail/examples/1procmailrc'\" \(600 characters\)
  430. sed "s/^X//" >'procmail/examples/1procmailrc' <<'END_OF_FILE'
  431. X# Please check if all the paths in PATH are reachable, remove the ones that
  432. X# are not.
  433. X
  434. XPATH=$HOME/bin:/usr/bin:/usr/ucb:/bin:/usr/local/bin:
  435. XMAILDIR=$HOME/Mail    # You'd better make sure it exists
  436. XDEFAULT=$MAILDIR/mbox
  437. XLOGFILE=$MAILDIR/from
  438. XLOCKFILE=$HOME/.lockmail
  439. X
  440. X:                # Anything from thf
  441. X^From.*thf@somewhere.someplace
  442. Xtodd                # will go to $MAILDIR/todd
  443. X
  444. X:                # Anything from people at uunet
  445. X^From.*@uunet
  446. Xuunetbox            # will go to $MAILDIR/uunetbox
  447. X
  448. X:                # Anything from Henry
  449. X^From.*henry
  450. Xhenries                # will go to $MAILDIR/henries
  451. X
  452. X# Anything that has not been delivered by now will go to $DEFAULT
  453. END_OF_FILE
  454. if test 600 -ne `wc -c <'procmail/examples/1procmailrc'`; then
  455.     echo shar: \"'procmail/examples/1procmailrc'\" unpacked with wrong size!
  456. fi
  457. # end of 'procmail/examples/1procmailrc'
  458. fi
  459. if test -f 'procmail/examples/1rmail' -a "${1}" != "-c" ; then 
  460.   echo shar: Will not clobber existing file \"'procmail/examples/1rmail'\"
  461. else
  462. echo shar: Extracting \"'procmail/examples/1rmail'\" \(400 characters\)
  463. sed "s/^X//" >'procmail/examples/1rmail' <<'END_OF_FILE'
  464. X#!/bin/sh
  465. X#
  466. X# specify the mailbox file you want to read on the command line
  467. X#
  468. XMAILDIR=$HOME/Mail
  469. Xcd $MAILDIR
  470. XLOCKFILE=$HOME/.lockmail
  471. Xif lockfile -! -r1 $LOCKFILE
  472. Xthen
  473. X echo Mail is currently arriving, please wait...
  474. X while
  475. X   lockfile -! -4 -r2 $LOCKFILE
  476. X do
  477. X echo Mail is still arriving...
  478. X done
  479. Xfi
  480. Xtrap "rm -f $LOCKFILE;exit 0" 0 1 2 3 15
  481. X#
  482. X# Call you favourite mailer here.
  483. X#
  484. X/usr/ucb/mail -f $*
  485. END_OF_FILE
  486. if test 400 -ne `wc -c <'procmail/examples/1rmail'`; then
  487.     echo shar: \"'procmail/examples/1rmail'\" unpacked with wrong size!
  488. fi
  489. # end of 'procmail/examples/1rmail'
  490. fi
  491. if test -f 'procmail/examples/2procmailrc' -a "${1}" != "-c" ; then 
  492.   echo shar: Will not clobber existing file \"'procmail/examples/2procmailrc'\"
  493. else
  494. echo shar: Extracting \"'procmail/examples/2procmailrc'\" \(2176 characters\)
  495. sed "s/^X//" >'procmail/examples/2procmailrc' <<'END_OF_FILE'
  496. X# Please check if all the paths in PATH are reachable, remove the ones that
  497. X# are not.
  498. X
  499. XPATH=$HOME/bin:/usr/bin:/usr/ucb:/bin:/usr/local/bin:
  500. XMAILDIR=$HOME/Mail    # You'd better make sure it exists
  501. XDEFAULT=$MAILDIR/mbox
  502. X            # We don't use a global lockfile here now.
  503. X            # Instead we use local lockfiles everywhere.
  504. X            # This allows mail to arrive in all mailboxes
  505. X            # concurrently, or allows you to read one mailbox
  506. X            # while mail arrives in another.
  507. X
  508. X# The next recipe will split up Digests into their individual messages.
  509. X# Don't do this if you use a global lockfile before this recipe (deadlock)
  510. X
  511. X:
  512. X^Subject:.*Digest
  513. X|formail +1 -d -s procmail
  514. X
  515. XLOGFILE=$MAILDIR/from        # Put it here, in order to avoid logging
  516. X                # the arrival of the digest.
  517. X
  518. X# An alternative and probably more efficient solution to splitting up a digest
  519. X# would be (only works for standard format mailbox files though):
  520. X
  521. X::
  522. X^Subject:.*Other Digest
  523. X|formail +1 -ds cat >>this_lists_mailbox
  524. X
  525. X# Notice the double : in the next recipe, this will cause a lockfile
  526. X# named "$MAILDIR/todd.lock" to be used if and only if this mail is going
  527. X# into the file "todd".
  528. X
  529. X::                # Anything from thf
  530. X^From.*thf@somewhere.someplace
  531. Xtodd                # will go to $MAILDIR/todd
  532. X
  533. X
  534. X# The next recipe will likewise use $MAILDIR/uunetbox.lock as a lock file.
  535. X
  536. X::                # Anything from people at uunet
  537. X^From.*@uunet
  538. Xuunetbox            # will go to $MAILDIR/uunetbox
  539. X
  540. X
  541. X# And here the lockfile will be $MAILDIR/henries.lock of course.
  542. X
  543. X::                # Anything from Henry
  544. X^From.*henry
  545. Xhenries                # will go to $MAILDIR/henries
  546. X
  547. X
  548. X# But you can specify any lockfile you want, like "myfile".  The following
  549. X# recipe will use "$MAILDIR/myfile" as the lock file.
  550. X
  551. X::myfile            # All 'questions' will go to
  552. X^Subject:.*questions
  553. Xtoread                # $MAILDIR/toread
  554. X
  555. X# Anything that has not been delivered by now will go to $DEFAULT
  556. X# BUT, since we have not specified any global lock file because we
  557. X# were working with local lock files, and since we are sending the mail to
  558. X# $DEFAULT now, we need to specify a lockfile for that too.  We use
  559. X# a global lockfile for that  (it won't be created until procmail
  560. X# has parsed (needed to parse) up till here).
  561. X
  562. XLOCKFILE=$DEFAULT.lock
  563. END_OF_FILE
  564. if test 2176 -ne `wc -c <'procmail/examples/2procmailrc'`; then
  565.     echo shar: \"'procmail/examples/2procmailrc'\" unpacked with wrong size!
  566. fi
  567. # end of 'procmail/examples/2procmailrc'
  568. fi
  569. if test -f 'procmail/examples/2rmail' -a "${1}" != "-c" ; then 
  570.   echo shar: Will not clobber existing file \"'procmail/examples/2rmail'\"
  571. else
  572. echo shar: Extracting \"'procmail/examples/2rmail'\" \(392 characters\)
  573. sed "s/^X//" >'procmail/examples/2rmail' <<'END_OF_FILE'
  574. X#!/bin/sh
  575. X#
  576. X# specify the mailbox file you want to read on the command line
  577. X#
  578. XMAILDIR=$HOME/Mail
  579. Xcd $MAILDIR
  580. XLOCKFILE=$1.lock
  581. Xif lockfile -! -r1 $LOCKFILE
  582. Xthen
  583. X echo Mail is currently arriving, please wait...
  584. X while
  585. X   lockfile -! -4 -r2 $LOCKFILE
  586. X do
  587. X echo Mail is still arriving...
  588. X done
  589. Xfi
  590. Xtrap "rm -f $LOCKFILE;exit 0" 0 1 2 3 15
  591. X#
  592. X# Call you favourite mailer here.
  593. X#
  594. X/usr/ucb/mail -f $*
  595. END_OF_FILE
  596. if test 392 -ne `wc -c <'procmail/examples/2rmail'`; then
  597.     echo shar: \"'procmail/examples/2rmail'\" unpacked with wrong size!
  598. fi
  599. # end of 'procmail/examples/2rmail'
  600. fi
  601. if test -f 'procmail/examples/3procmailrc' -a "${1}" != "-c" ; then 
  602.   echo shar: Will not clobber existing file \"'procmail/examples/3procmailrc'\"
  603. else
  604. echo shar: Extracting \"'procmail/examples/3procmailrc'\" \(1479 characters\)
  605. sed "s/^X//" >'procmail/examples/3procmailrc' <<'END_OF_FILE'
  606. X# Please check if all the paths in PATH are reachable, remove the ones that
  607. X# are not.
  608. X
  609. XPATH=$HOME/bin:/usr/bin:/global/bin:/usr/ucb:/bin:/usr/local/bin:
  610. XMAILDIR =    $HOME/Mail    # You'd better make sure it exists
  611. XDEFAULT =    $MAILDIR/mbox
  612. XLOGFILE =    $MAILDIR/from
  613. XLOCKFILE=    $HOME/.lockmail
  614. X
  615. X            # This will create a local lockfile named todd.lock
  616. X::            # *if* the condition matches
  617. X^From.*thf
  618. Xtodd
  619. X
  620. XLOCKFILE=$MAILDIR/whatever    # This will remove the global lockfile
  621. X                # $HOME/.lockmail and the new lockfile
  622. X                # will be $MAILDIR/whatever
  623. X
  624. X
  625. X                # The next recipe will
  626. X                # filter out all messages from "at"
  627. X                # jobs and will put them in a terse format
  628. X                # (only the date and the body) in
  629. X                # a file called $MAILDIR/atjunk
  630. X: 2 fh
  631. X^From root
  632. X^Subject: Output from "at" job
  633. X|egrep "^Date:"
  634. X                # The next recipe will only be used if
  635. X                # the previous one matched
  636. X:A
  637. Xatjunk
  638. X
  639. X
  640. X
  641. XMAILDIR=$HOME/News    # This will change the current directory
  642. X
  643. X
  644. X            # The next recipe will create a local lockfile
  645. X            # named $HOME/News/dustbin.lock (*if* the condition
  646. X            # matches), and will feed the body of the message
  647. X            # through `sort` (sorry, couldn't come up with anything
  648. X            # better :-), after which the result will be
  649. X            # appended to $HOME/News/dustbin
  650. X:b:
  651. X^Subject:.*rubbish
  652. X|sort >>dustbin
  653. X
  654. X            # The next recipe will use the play directory as a MH
  655. X            # folder (of course you need MH to read the mail then)
  656. X:
  657. X^Subject:.*games
  658. Xgames/.
  659. X
  660. X# Anything not delivered by now will go to $HOME/Mail/mbox
  661. END_OF_FILE
  662. if test 1479 -ne `wc -c <'procmail/examples/3procmailrc'`; then
  663.     echo shar: \"'procmail/examples/3procmailrc'\" unpacked with wrong size!
  664. fi
  665. # end of 'procmail/examples/3procmailrc'
  666. fi
  667. if test -f 'procmail/examples/3rmail' -a "${1}" != "-c" ; then 
  668.   echo shar: Will not clobber existing file \"'procmail/examples/3rmail'\"
  669. else
  670. echo shar: Extracting \"'procmail/examples/3rmail'\" \(757 characters\)
  671. sed "s/^X//" >'procmail/examples/3rmail' <<'END_OF_FILE'
  672. X#!/bin/sh
  673. X#
  674. X# specify the mailbox file you want to read on the command line
  675. X# Use a relative path from your $HOME directory
  676. X#
  677. X# For this kind of chaotic procmailrc there is no uniform neat solution
  678. X# to determine which lockfiles to use.    I'll give just one (suboptimal)
  679. X# solution here.  Use your imagination to extend it :-).
  680. X#
  681. XMAILDIR=$HOME/Mail
  682. Xcd $HOME            # this means all paths are relative to $HOME
  683. XLOCKFILE=$HOME/.lockmail
  684. XLOCKFILE2=$HOME/Mail/whatever
  685. Xif lockfile -! -r1 $LOCKFILE $LOCKFILE2
  686. Xthen
  687. X echo Mail is currently arriving, please wait...
  688. X while
  689. X   lockfile -! -4 -r2 $LOCKFILE $LOCKFILE2
  690. X do
  691. X echo Mail is still arriving...
  692. X done
  693. Xfi
  694. Xtrap "rm -f $LOCKFILE $LOCKFILE2;exit 0" 0 1 2 3 15
  695. X#
  696. X# Call you favourite mailer here.
  697. X#
  698. X/usr/ucb/mail -f $*
  699. END_OF_FILE
  700. if test 757 -ne `wc -c <'procmail/examples/3rmail'`; then
  701.     echo shar: \"'procmail/examples/3rmail'\" unpacked with wrong size!
  702. fi
  703. # end of 'procmail/examples/3rmail'
  704. fi
  705. if test -f 'procmail/examples/forward' -a "${1}" != "-c" ; then 
  706.   echo shar: Will not clobber existing file \"'procmail/examples/forward'\"
  707. else
  708. echo shar: Extracting \"'procmail/examples/forward'\" \(57 characters\)
  709. sed "s/^X//" >'procmail/examples/forward' <<'END_OF_FILE'
  710. X"|IFS=' ';exec /usr/local/bin/procmail #YOUR_LOGIN_NAME"
  711. END_OF_FILE
  712. if test 57 -ne `wc -c <'procmail/examples/forward'`; then
  713.     echo shar: \"'procmail/examples/forward'\" unpacked with wrong size!
  714. fi
  715. # end of 'procmail/examples/forward'
  716. fi
  717. if test -f 'procmail/examples/listrc' -a "${1}" != "-c" ; then 
  718.   echo shar: Will not clobber existing file \"'procmail/examples/listrc'\"
  719. else
  720. echo shar: Extracting \"'procmail/examples/listrc'\" \(1852 characters\)
  721. sed "s/^X//" >'procmail/examples/listrc' <<'END_OF_FILE'
  722. XPATH=/bin:/usr/bin:/usr/local/bin    # add more if appropriate
  723. XSHELL=/bin/sh
  724. X
  725. X# list        should contain the submitting address of the list
  726. X# listreq    should contain the request address of the list
  727. X# subscribers    should name the file which contains the list of subscribers
  728. X#        separated by whitespace
  729. X
  730. X:3wfh
  731. X!^Subject:.*((add|remove).*list|subscribe)
  732. X!^From +(postmaster|Mailer)
  733. X!^X-Loop: loop
  734. X| formail -b -IReturn-Receipt-To: -I"Errors-To: $listreq" \
  735. X  -I "Sender: $listreq" -I"Precedence: bulk" -IReceived: -I"X-Loop: loop"\
  736. X# -i "Reply-To: $list"            # uncomment if you want, many people
  737. X                    # consider this a bad idea.
  738. X
  739. X# If memberlist is longer than 2048 bytes, you will have to insert a
  740. X# LINEBUF=some_big_number here because procmail uses a buffer of size
  741. X# $LINEBUF to expand the inline 'cat'
  742. X
  743. X:Aw
  744. X! -f$listreq `cat $subscribers`        # the -f and -oi are sendmail options
  745. X                    # omit if not applicable
  746. X    # the -f flag will only take effect if the sender is not local
  747. X
  748. X# Alternatively you could have put the burden on the shell for expanding the
  749. X# 'cat' by providing the following action line instead:
  750. X# | $SENDMAIL -oi `cat $subscribers`;    # the ; forces the procmail to pass
  751. X                    # on the line to the shell unparsed
  752. X
  753. X# Anything not delivered yet (either because it was from the postmaster
  754. X# or mailer-daemon, or because it might be a request-message) will be forwarded
  755. X# to the list maintainer:
  756. X:0w
  757. X! -oi $listreq
  758. X
  759. X# In case not even this works, the mail will be appended to the
  760. X# following last-resort files
  761. X
  762. XUMASK=666    # this is probably inevitable since procmail (in this case)
  763. X        # could be running under the local-sender's uid or the
  764. X        # daemon or mailer-uid (in the remote-sender's case)
  765. X
  766. XDEFAULT=/tmp/${listreq}s        # first-choice
  767. XORGMAIL=/var/tmp/${listreq}s        # a last-last-resort-file in case the
  768. X            # filesystem for /tmp/mylist-request should be full
  769. END_OF_FILE
  770. if test 1852 -ne `wc -c <'procmail/examples/listrc'`; then
  771.     echo shar: \"'procmail/examples/listrc'\" unpacked with wrong size!
  772. fi
  773. # end of 'procmail/examples/listrc'
  774. fi
  775. if test -f 'procmail/exopen.c' -a "${1}" != "-c" ; then 
  776.   echo shar: Will not clobber existing file \"'procmail/exopen.c'\"
  777. else
  778. echo shar: Extracting \"'procmail/exopen.c'\" \(2102 characters\)
  779. sed "s/^X//" >'procmail/exopen.c' <<'END_OF_FILE'
  780. X/************************************************************************
  781. X *    Collection of NFS secure exclusive open routines        *
  782. X *                                    *
  783. X *    Copyright (c) 1990-1992, S.R. van den Berg, The Netherlands    *
  784. X *    The sources can be freely copied for non-commercial use.    *
  785. X *    #include "README"                        *
  786. X *                                    *
  787. X ************************************************************************/
  788. X#ifdef RCS
  789. Xstatic char rcsid[]="$Id: exopen.c,v 2.7 1992/01/21 17:27:04 berg Rel $";
  790. X#endif
  791. X#include "config.h"
  792. X#include "includes.h"
  793. X#include "exopen.h"
  794. X
  795. Xconst char*hostname();
  796. Xextern pid_t thepid;
  797. X
  798. Xconst char*hostname()
  799. X{ static char name[HOSTNAMElen+1];
  800. X#ifdef    NOuname
  801. X  gethostname(name,HOSTNAMElen+1);
  802. X#else
  803. X  struct utsname names;
  804. X  uname(&names);strncpy(name,names.nodename,HOSTNAMElen);
  805. X#endif
  806. X  name[HOSTNAMElen]='\0';return name;
  807. X}
  808. X
  809. Xultoan(val,dest)unsigned long val;char*dest;          /* convert to a number */
  810. X{ register i;                     /* within the set [0-9A-Za-z-_] */
  811. X  do
  812. X   { i=val&0x3f;
  813. X     *dest++=i+(i<10?'0':i<10+26?'A'-10:i<10+26+26?'a'-10-26:
  814. X      i==10+26+26?'-'-10-26-26:'_'-10-26-27);
  815. X   }
  816. X  while(val>>=6);
  817. X  *dest='\0';
  818. X}
  819. X
  820. Xunique(full,p,mode)const char*const full;char*const p;const mode_t mode;
  821. X{ unsigned long retry=3;int i;              /* create unique file name */
  822. X  do
  823. X   { ultoan(SERIALmask&(retry<<16)+(unsigned long)thepid,p+1);
  824. X     *p=UNIQ_PREFIX;strcat(p,hostname());
  825. X   }
  826. X#ifndef O_CREAT
  827. X#define ropen(path,type,mode)    creat(path,mode)
  828. X#endif
  829. X  while(0>(i=ropen(full,O_WRONLY|O_CREAT|O_EXCL|O_SYNC,mode))&&errno==EEXIST&&
  830. X   retry--);        /* casually check if it already exists (highly unlikely) */
  831. X  if(i<0)
  832. X   { writeerr(full);return 0;
  833. X   }
  834. X  rclose(i);return 1;
  835. X}
  836. X                     /* rename MUST fail if already existent */
  837. Xmyrename(old,new)const char*const old,*const new;
  838. X{ int i,serrno;struct stat stbuf;
  839. X  link(old,new);serrno=errno;i=stat(old,&stbuf);unlink(old);errno=serrno;
  840. X  return stbuf.st_nlink==2?i:-1;
  841. X}
  842. X
  843. X#ifdef NOstrpbrk
  844. Xchar*strpbrk(st,del)const char*const st,*del;
  845. X{ const char*f=0,*t;
  846. X  for(f=0;*del;)
  847. X     if((t=strchr(st,*del++))&&(!f||t<f))
  848. X    f=t;
  849. X  return(char*)f;
  850. X}
  851. X#endif
  852. END_OF_FILE
  853. if test 2102 -ne `wc -c <'procmail/exopen.c'`; then
  854.     echo shar: \"'procmail/exopen.c'\" unpacked with wrong size!
  855. fi
  856. # end of 'procmail/exopen.c'
  857. fi
  858. if test -f 'procmail/exopen.h' -a "${1}" != "-c" ; then 
  859.   echo shar: Will not clobber existing file \"'procmail/exopen.h'\"
  860. else
  861. echo shar: Extracting \"'procmail/exopen.h'\" \(211 characters\)
  862. sed "s/^X//" >'procmail/exopen.h' <<'END_OF_FILE'
  863. X/*$Id: exopen.h,v 2.1 1991/10/22 15:31:26 berg Rel $*/
  864. X#define SERIALchars    3
  865. X#define UNIQnamelen    (1+SERIALchars+HOSTNAMElen+1)
  866. X#define SERIALmask    ((1L<<6*SERIALchars)-1)
  867. X
  868. X#ifdef NOstrpbrk
  869. Xchar*strpbrk();
  870. X#endif
  871. END_OF_FILE
  872. if test 211 -ne `wc -c <'procmail/exopen.h'`; then
  873.     echo shar: \"'procmail/exopen.h'\" unpacked with wrong size!
  874. fi
  875. # end of 'procmail/exopen.h'
  876. fi
  877. if test ! -d 'procmail/include' ; then
  878.     echo shar: Creating directory \"'procmail/include'\"
  879.     mkdir 'procmail/include'
  880. fi
  881. if test -f 'procmail/include/stddef.h' -a "${1}" != "-c" ; then 
  882.   echo shar: Will not clobber existing file \"'procmail/include/stddef.h'\"
  883. else
  884. echo shar: Extracting \"'procmail/include/stddef.h'\" \(31 characters\)
  885. sed "s/^X//" >'procmail/include/stddef.h' <<'END_OF_FILE'
  886. X/* Intentionally left empty */
  887. END_OF_FILE
  888. if test 31 -ne `wc -c <'procmail/include/stddef.h'`; then
  889.     echo shar: \"'procmail/include/stddef.h'\" unpacked with wrong size!
  890. fi
  891. # end of 'procmail/include/stddef.h'
  892. fi
  893. if test -f 'procmail/include/stdlib.h' -a "${1}" != "-c" ; then 
  894.   echo shar: Will not clobber existing file \"'procmail/include/stdlib.h'\"
  895. else
  896. echo shar: Extracting \"'procmail/include/stdlib.h'\" \(47 characters\)
  897. sed "s/^X//" >'procmail/include/stdlib.h' <<'END_OF_FILE'
  898. Xvoid*malloc(),*realloc();
  899. Xconst char*getenv();
  900. END_OF_FILE
  901. if test 47 -ne `wc -c <'procmail/include/stdlib.h'`; then
  902.     echo shar: \"'procmail/include/stdlib.h'\" unpacked with wrong size!
  903. fi
  904. # end of 'procmail/include/stdlib.h'
  905. fi
  906. if test -f 'procmail/include/string.h' -a "${1}" != "-c" ; then 
  907.   echo shar: Will not clobber existing file \"'procmail/include/string.h'\"
  908. else
  909. echo shar: Extracting \"'procmail/include/string.h'\" \(75 characters\)
  910. sed "s/^X//" >'procmail/include/string.h' <<'END_OF_FILE'
  911. X#include <strings.h>
  912. X
  913. X#ifndef strchr
  914. Xchar*strchr();
  915. X#endif
  916. Xchar*strpbrk();
  917. END_OF_FILE
  918. if test 75 -ne `wc -c <'procmail/include/string.h'`; then
  919.     echo shar: \"'procmail/include/string.h'\" unpacked with wrong size!
  920. fi
  921. # end of 'procmail/include/string.h'
  922. fi
  923. if test ! -d 'procmail/include/sys' ; then
  924.     echo shar: Creating directory \"'procmail/include/sys'\"
  925.     mkdir 'procmail/include/sys'
  926. fi
  927. if test -f 'procmail/include/sys/file.h' -a "${1}" != "-c" ; then 
  928.   echo shar: Will not clobber existing file \"'procmail/include/sys/file.h'\"
  929. else
  930. echo shar: Extracting \"'procmail/include/sys/file.h'\" \(31 characters\)
  931. sed "s/^X//" >'procmail/include/sys/file.h' <<'END_OF_FILE'
  932. X/* Intentionally left empty */
  933. END_OF_FILE
  934. if test 31 -ne `wc -c <'procmail/include/sys/file.h'`; then
  935.     echo shar: \"'procmail/include/sys/file.h'\" unpacked with wrong size!
  936. fi
  937. # end of 'procmail/include/sys/file.h'
  938. fi
  939. if test -f 'procmail/include/sys/utsname.h' -a "${1}" != "-c" ; then 
  940.   echo shar: Will not clobber existing file \"'procmail/include/sys/utsname.h'\"
  941. else
  942. echo shar: Extracting \"'procmail/include/sys/utsname.h'\" \(16 characters\)
  943. sed "s/^X//" >'procmail/include/sys/utsname.h' <<'END_OF_FILE'
  944. X#define NOuname
  945. END_OF_FILE
  946. if test 16 -ne `wc -c <'procmail/include/sys/utsname.h'`; then
  947.     echo shar: \"'procmail/include/sys/utsname.h'\" unpacked with wrong size!
  948. fi
  949. # end of 'procmail/include/sys/utsname.h'
  950. fi
  951. if test -f 'procmail/include/sys/wait.h' -a "${1}" != "-c" ; then 
  952.   echo shar: Will not clobber existing file \"'procmail/include/sys/wait.h'\"
  953. else
  954. echo shar: Extracting \"'procmail/include/sys/wait.h'\" \(31 characters\)
  955. sed "s/^X//" >'procmail/include/sys/wait.h' <<'END_OF_FILE'
  956. X/* Intentionally left empty */
  957. END_OF_FILE
  958. if test 31 -ne `wc -c <'procmail/include/sys/wait.h'`; then
  959.     echo shar: \"'procmail/include/sys/wait.h'\" unpacked with wrong size!
  960. fi
  961. # end of 'procmail/include/sys/wait.h'
  962. fi
  963. if test -f 'procmail/include/sysexits.h' -a "${1}" != "-c" ; then 
  964.   echo shar: Will not clobber existing file \"'procmail/include/sysexits.h'\"
  965. else
  966. echo shar: Extracting \"'procmail/include/sysexits.h'\" \(275 characters\)
  967. sed "s/^X//" >'procmail/include/sysexits.h' <<'END_OF_FILE'
  968. X        /* Standard exit codes, original list maintained
  969. X           by Eric Allman (eric@berkeley, ucbvax!eric)     */
  970. X#define EX_OK        0
  971. X#define EX_USAGE    64
  972. X#define EX_UNAVAILABLE    69
  973. X#define EX_OSERR    71
  974. X#define EX_OSFILE    72
  975. X#define EX_CANTCREAT    73
  976. X#define EX_IOERR    74
  977. X#define EX_TEMPFAIL    75
  978. END_OF_FILE
  979. if test 275 -ne `wc -c <'procmail/include/sysexits.h'`; then
  980.     echo shar: \"'procmail/include/sysexits.h'\" unpacked with wrong size!
  981. fi
  982. # end of 'procmail/include/sysexits.h'
  983. fi
  984. if test -f 'procmail/include/unistd.h' -a "${1}" != "-c" ; then 
  985.   echo shar: Will not clobber existing file \"'procmail/include/unistd.h'\"
  986. else
  987. echo shar: Extracting \"'procmail/include/unistd.h'\" \(31 characters\)
  988. sed "s/^X//" >'procmail/include/unistd.h' <<'END_OF_FILE'
  989. X/* Intentionally left empty */
  990. END_OF_FILE
  991. if test 31 -ne `wc -c <'procmail/include/unistd.h'`; then
  992.     echo shar: \"'procmail/include/unistd.h'\" unpacked with wrong size!
  993. fi
  994. # end of 'procmail/include/unistd.h'
  995. fi
  996. if test -f 'procmail/includes.h' -a "${1}" != "-c" ; then 
  997.   echo shar: Will not clobber existing file \"'procmail/includes.h'\"
  998. else
  999. echo shar: Extracting \"'procmail/includes.h'\" \(3158 characters\)
  1000. sed "s/^X//" >'procmail/includes.h' <<'END_OF_FILE'
  1001. X/*$Id: includes.h,v 2.13 1992/01/14 17:32:53 berg Rel $*/
  1002. X
  1003. X#include "autoconf.h"
  1004. X    /* not all the "library identifiers" specified here need to be
  1005. X       available for all programs in this package; some have substitutes
  1006. X       as well (see autoconf); this is just an informal list */
  1007. X
  1008. X#include <sys/types.h>        /* pid_t mode_t uid_t gid_t */
  1009. X#include <unistd.h>        /* open() read() write() close() dup() pipe()
  1010. X                   fork() getuid() getpid() execve()
  1011. X                   execvp() sleep() */
  1012. X#include <stdio.h>        /* setbuf() fclose() stdin stdout stderr
  1013. X                   fopen() fread() fwrite() fgetc() getc()
  1014. X                   putc() fputs() FILE EOF */
  1015. X#include <stddef.h>        /* ptrdiff_t size_t sigatomic_t */
  1016. X#include <stdlib.h>        /* getenv() malloc() realloc() free()
  1017. X                   strtol() */
  1018. X#include <time.h>        /* time() ctime() time_t */
  1019. X#include <fcntl.h>        /* O_RDONLY O_WRONLY O_APPEND O_CREAT O_EXCL */
  1020. X#include <pwd.h>        /* getpwuid() getpwnam() struct passwd */
  1021. X#include <sys/wait.h>        /* wait() */
  1022. X#include <sys/utsname.h>    /* uname() utsname */
  1023. X#include <sys/stat.h>        /* stat() S_ISDIR() struct stat */
  1024. X#include <signal.h>        /* signal() kill() alarm() SIG_IGN SIGHUP
  1025. X                   SIGINT SIGQUIT SIGALRM SIGTERM */
  1026. X#include <string.h>        /* strcpy() strncpy() strcat() strlen()
  1027. X                   strspn() strcspn() strchr() strcmp()
  1028. X                   strncmp() strpbrk() strstr() memmove() */
  1029. X#include <errno.h>        /* EINTR EEXIST EMFILE ENFILE */
  1030. X#include <sysexits.h>        /* EX_OK EX_UNAVAILABLE EX_OSERR EX_OSFILE
  1031. X                   EX_CANTCREAT EX_IOERR EX_TEMPFAIL */
  1032. X#ifdef KERNEL_LOCKS
  1033. X#include <sys/file.h>
  1034. X#endif
  1035. X
  1036. X#if O_SYNC
  1037. X#else
  1038. X#undef O_SYNC
  1039. X#define O_SYNC        0
  1040. X#endif
  1041. X#ifndef O_RDONLY
  1042. X#define O_RDONLY    0
  1043. X#define O_WRONLY    1
  1044. X#endif
  1045. X#ifndef SEEK_SET
  1046. X#define SEEK_SET    0
  1047. X#define SEEK_END    2
  1048. X#endif
  1049. X
  1050. X#ifndef EOF
  1051. X#define EOF    (-1)
  1052. X#endif
  1053. X
  1054. X#ifndef S_ISDIR
  1055. X#define S_ISDIR(mode)    (((mode)&S_IFMT)==S_IFDIR)
  1056. X#ifndef S_IFDIR
  1057. X#define S_IFDIR 0040000
  1058. X#endif
  1059. X#endif
  1060. X
  1061. X#ifndef S_ISLNK
  1062. X#ifndef S_IFLNK
  1063. X#define lstat(path,stbuf)    stat(path,stbuf)
  1064. X#define S_ISLNK(mode)    0
  1065. X#else
  1066. X#define S_ISLNK(mode)    (((mode)&S_IFMT)==S_IFLNK)
  1067. X#endif
  1068. X#endif
  1069. X
  1070. X#ifndef S_IFMT
  1071. X#define S_IFMT    0170000
  1072. X#endif
  1073. X
  1074. X#ifndef S_IRWXU
  1075. X#define S_IRWXU 00700
  1076. X#define S_IRWXG 00070
  1077. X#define S_IRWXO 00007
  1078. X#endif
  1079. X#ifndef S_IWUSR
  1080. X#ifdef S_IREAD
  1081. X#define S_IRUSR     S_IREAD
  1082. X#define S_IWUSR     S_IWRITE
  1083. X#define S_IXUSR     S_IEXEC
  1084. X#else
  1085. X#define S_IRUSR     0400
  1086. X#define S_IWUSR     0200
  1087. X#define S_IXUSR     0100
  1088. X#endif
  1089. X#define S_IRGRP     0040
  1090. X#define S_IWGRP     0020
  1091. X#define S_IXGRP     0010
  1092. X#define S_IROTH     0004
  1093. X#define S_IWOTH     0002
  1094. X#define S_IXOTH     0001
  1095. X#endif
  1096. X
  1097. Xextern /*const*/char**environ;
  1098. Xextern errno;
  1099. X
  1100. X#ifndef STDIN_FILENO
  1101. X#define STDIN    0
  1102. X#define STDOUT    1
  1103. X#define STDERR    2
  1104. X#else
  1105. X#define STDIN    STDIN_FILENO
  1106. X#define STDOUT    STDOUT_FILENO
  1107. X#define STDERR    STDERR_FILENO
  1108. X#endif
  1109. X
  1110. X#ifdef NOrename
  1111. X#define rename(old,new) (-(link(old,new)||unlink(old)))
  1112. X#endif
  1113. X
  1114. X#ifdef NOmemmove
  1115. X#define memmove(to,from,count) smemmove(to,from,count)
  1116. X#endif
  1117. X
  1118. X#ifdef oBRAIN_DAMAGE
  1119. X#undef offsetof
  1120. X#endif
  1121. X#ifndef offsetof
  1122. X#define offsetof(s,m) ((char*)&(((s*)0)->m)-(char*)0)
  1123. X#endif
  1124. X
  1125. X#define maxindex(x)    (sizeof(x)/sizeof((x)[0])-1)
  1126. X#define STRLEN(x)    (sizeof(x)-1)
  1127. X#define ioffsetof(s,m)    ((int)offsetof(s,m))
  1128. X
  1129. X#define mx(a,b)        ((a)>(b)?(a):(b))
  1130. END_OF_FILE
  1131. if test 3158 -ne `wc -c <'procmail/includes.h'`; then
  1132.     echo shar: \"'procmail/includes.h'\" unpacked with wrong size!
  1133. fi
  1134. # end of 'procmail/includes.h'
  1135. fi
  1136. if test -f 'procmail/lockfile.c' -a "${1}" != "-c" ; then 
  1137.   echo shar: Will not clobber existing file \"'procmail/lockfile.c'\"
  1138. else
  1139. echo shar: Extracting \"'procmail/lockfile.c'\" \(2790 characters\)
  1140. sed "s/^X//" >'procmail/lockfile.c' <<'END_OF_FILE'
  1141. X/************************************************************************
  1142. X *    lockfile.c    a conditional semaphore-file creator        *
  1143. X *                                    *
  1144. X *    Seems to be perfect.                        *
  1145. X *                                    *
  1146. X *    Created by S.R. van den Berg, The Netherlands            *
  1147. X *    This file can be freely copied for any use.            *
  1148. X ************************************************************************/
  1149. X#ifdef RCS
  1150. Xstatic char rcsid[]="$Id: lockfile.c,v 2.10 1992/01/09 17:53:18 berg Rel $";
  1151. X#endif
  1152. Xstatic char rcsdate[]="$Date: 1992/01/09 17:53:18 $";
  1153. X#include "config.h"               /* overkill, I know, only need DIRSEP */
  1154. X#include "includes.h"
  1155. X#include "exopen.h"
  1156. X
  1157. Xvolatile int exitflag;
  1158. Xpid_t thepid;
  1159. Xconst char dirsep[]=DIRSEP;
  1160. X
  1161. Xvoid failure()
  1162. X{ exitflag=1;
  1163. X}
  1164. X
  1165. Xmain(argc,argv)const char*const argv[];
  1166. X{ const char*const*p,*cp;int sleepsec,retries,invert,force,suspend,retval=0;
  1167. X  static char usage[]=
  1168. X   "Usage: lockfile -nnn | -rnnn | -! | -lnnn | -snnn | file ...\n";
  1169. X  sleepsec=8;force=retries=invert=0;suspend=16;thepid=getpid();
  1170. X  if(--argc<=0)
  1171. X   { putse(usage);return EX_USAGE;
  1172. X   }
  1173. Xagain:
  1174. X  p=argv;signal(SIGHUP,failure);signal(SIGINT,failure);
  1175. X  signal(SIGQUIT,failure);signal(SIGTERM,failure);
  1176. X  while(argc--)
  1177. X     if(*(cp= *++p)=='-')
  1178. X    switch(cp[1])
  1179. X     { case '!':invert=1;break;
  1180. X       case 'r':retries=strtol(cp+2,(char**)0,10);break;
  1181. X       case 'l':force=strtol(cp+2,(char**)0,10);break;
  1182. X       case 's':suspend=strtol(cp+2,(char**)0,10);break;
  1183. X       default:
  1184. X          if(cp[1]-'0'>(unsigned)9)
  1185. X           { putse(usage);retval=EX_USAGE;goto lfailure;
  1186. X           }
  1187. X          if(sleepsec>=0)
  1188. X         sleepsec=strtol(cp+1,(char**)0,10);
  1189. X     }
  1190. X     else if(sleepsec<0)
  1191. X    unlink(cp);
  1192. X     else
  1193. X      { while(0>NFSxopen(cp))
  1194. X     { struct stat buf;time_t t;
  1195. X       if(exitflag||retries==1)
  1196. X        {
  1197. Xlfailure:     sleepsec= -1;argc=p-argv-1;goto again;
  1198. X        }
  1199. X       if(force&&(t=time((time_t*)0),!stat(cp,&buf))&&force<t-buf.st_mtime)
  1200. X        { unlink(cp);putse("lockfile: Forcing lock on \"");putse(cp);
  1201. X          putse("\"\n");sleep(suspend);
  1202. X        }
  1203. X       else
  1204. X          sleep(sleepsec);
  1205. X       if(retries)
  1206. X          retries--;
  1207. X     }
  1208. X      }
  1209. X  return retval?retval:invert^(sleepsec<0)?EX_CANTCREAT:EX_OK;
  1210. X}
  1211. X
  1212. Xputse(a)char*a;
  1213. X{ char*b;
  1214. X  b=a-1;
  1215. X  while(*++b);
  1216. X  write(STDERR,a,(size_t)(b-a));
  1217. X}
  1218. X
  1219. XNFSxopen(name)char*name;
  1220. X{ char*p,*q;int j= -1,i;
  1221. X  for(q=name;p=strpbrk(q,dirsep);q=p+1);
  1222. X  i=q-name;
  1223. X  if(!(p=malloc(i+UNIQnamelen)))
  1224. X     return exitflag=1;
  1225. X  strncpy(p,name,i);
  1226. X  if(unique(p,p+i,0))
  1227. X    j=myrename(p,name);
  1228. X  free(p);return j;
  1229. X}
  1230. X
  1231. Xvoid*tmalloc(len)const size_t len;                     /* stub */
  1232. X{ return malloc(len);
  1233. X}
  1234. X
  1235. Xropen(name,mode,mask)const char*const name;const int mode;const mode_t mask;
  1236. X{ return open(name,mode,mask);                         /* stub */
  1237. X}
  1238. X
  1239. Xrclose(fd)const int fd;                             /* stub */
  1240. X{ return close(fd);
  1241. X}
  1242. X
  1243. Xwriteerr(a)const char*const a;                         /* stub */
  1244. X{
  1245. X}
  1246. END_OF_FILE
  1247. if test 2790 -ne `wc -c <'procmail/lockfile.c'`; then
  1248.     echo shar: \"'procmail/lockfile.c'\" unpacked with wrong size!
  1249. fi
  1250. # end of 'procmail/lockfile.c'
  1251. fi
  1252. if test ! -d 'procmail/man' ; then
  1253.     echo shar: Creating directory \"'procmail/man'\"
  1254.     mkdir 'procmail/man'
  1255. fi
  1256. if test -f 'procmail/man/lockfile.1' -a "${1}" != "-c" ; then 
  1257.   echo shar: Will not clobber existing file \"'procmail/man/lockfile.1'\"
  1258. else
  1259. echo shar: Extracting \"'procmail/man/lockfile.1'\" \(2804 characters\)
  1260. sed "s/^X//" >'procmail/man/lockfile.1' <<'END_OF_FILE'
  1261. X.de Id
  1262. X.ds Rv \\$3
  1263. X.ds Dt \\$4
  1264. X..
  1265. X.Id $Id: lockfile.1,v 2.3 1992/01/31 12:07:40 berg Rel $
  1266. X.de Sh
  1267. X.br
  1268. X.ne 11
  1269. X.SH "\\$1"
  1270. X..
  1271. X.de Ss
  1272. X.br
  1273. X.ne 10
  1274. X.SS "\\$1"
  1275. X..
  1276. X.de Tp
  1277. X.br
  1278. X.ne 9
  1279. X.TP "\\$1"
  1280. X..
  1281. X.de Rs
  1282. X.na
  1283. X.nf
  1284. X.RS
  1285. X..
  1286. X.de Re
  1287. X.RE
  1288. X.fi
  1289. X.ad
  1290. X..
  1291. X.TH LOCKFILE 1 \*(Dt BuGless
  1292. X.SH NAME
  1293. X.na
  1294. Xlockfile \- conditional semaphore-file creator
  1295. X.SH SYNOPSIS
  1296. X.B lockfile
  1297. X.I "\fB\-\fPsleeptime"
  1298. X|
  1299. X.I "\fB\-r\fPretries"
  1300. X|
  1301. X.B "\-!"
  1302. X|
  1303. X.if n .ti +0.5i
  1304. X.I "\fB\-l\fPlocktimeout"
  1305. X|
  1306. X.I "\fB\-s\fPsuspend"
  1307. X|
  1308. X.I filename
  1309. X\&.\|.\|.
  1310. X.ad
  1311. X.Sh DESCRIPTION
  1312. X.B lockfile
  1313. Xcan be used to create one or more
  1314. X.I semaphore
  1315. X.IR files .
  1316. XIf lockfile can't create all the specified files (in the specified order),
  1317. Xit waits
  1318. X.I sleeptime
  1319. X(defaults to 8) seconds and retries the last file that didn't succeed.
  1320. XYou can specify the number of
  1321. X.I retries
  1322. Xto do until failure is returned.
  1323. XIf the number of
  1324. X.I retries
  1325. Xis 0 (default) lockfile will retry forever.
  1326. X.LP
  1327. XIf the number of
  1328. X.I retries
  1329. Xexpires before all files have been created, lockfile returns failure and
  1330. Xremoves all the files it created up till that point.
  1331. X.LP
  1332. XThe return value of lockfile can be easily inverted by specifying
  1333. X.B \-!
  1334. Xas an argument (comes in handy in shell scripts).
  1335. X.LP
  1336. XAll flags can be specified anywhere on the command line, they will be
  1337. Xprocessed when encountered.  The command line is simply parsed from
  1338. Xleft to right.
  1339. X.LP
  1340. XAll files created by lockfile will have access permission 0, and therefore
  1341. Xwill have to be removed with
  1342. X.B rm
  1343. X.BR \-f .
  1344. X.LP
  1345. XIf you specify a
  1346. X.I locktimeout
  1347. Xthen a lockfile will be removed by force after locktimeout seconds have
  1348. Xpassed since the lockfile was last modified/created.  After a lockfile is
  1349. Xremoved by  force, a suspension of
  1350. X.I suspend
  1351. Xseconds (defaults to 16) is taken into account, in order to prevent the
  1352. Xinadvertent immediate removal of any newly created lockfile by another program
  1353. X(compare
  1354. X.BR SUSPEND
  1355. Xin
  1356. X.BR procmail (1)).
  1357. X.Sh "SEE ALSO"
  1358. X.na
  1359. X.BR rm (1),
  1360. X.BR mail (1),
  1361. X.BR binmail (1),
  1362. X.BR sendmail (8),
  1363. X.BR procmail (1)
  1364. X.ad
  1365. X.Sh DIAGNOSTICS
  1366. X.Tp 2.3i
  1367. XForcing lock on "x"
  1368. XSpecified lockfile is going to be removed by force because of a timeout
  1369. X(compare
  1370. X.BR LOCKTIMEOUT
  1371. Xin
  1372. X.BR procmail (1)).
  1373. X.Sh BUGS
  1374. Xlockfile is only a simple program and can't process concatenated options.
  1375. X.Sh NOTES
  1376. XMultiple
  1377. X.B \-!
  1378. Xflags will toggle the return status.
  1379. X.LP
  1380. XSince flags can occur anywhere on the command line, any filename starting
  1381. Xwith a '-' has to be preceded by './'.
  1382. X.LP
  1383. XThe number of
  1384. X.I retries
  1385. Xis global.  That is, it is not reset when a new file is being created.
  1386. XIt can, however, be reset by specifying
  1387. X.RI \-r newretries
  1388. Xafter every file on the command line.
  1389. X.LP
  1390. Xlockfile performs the locking in an NFS-secure way.
  1391. X.Sh AUTHOR
  1392. XStephen R. van den Berg at RWTH-Aachen, Germany
  1393. X.Rs
  1394. Xberg@messua.informatik.rwth-aachen.de
  1395. X.br
  1396. Xberg@physik.tu-muenchen.de
  1397. X.Re
  1398. END_OF_FILE
  1399. if test 2804 -ne `wc -c <'procmail/man/lockfile.1'`; then
  1400.     echo shar: \"'procmail/man/lockfile.1'\" unpacked with wrong size!
  1401. fi
  1402. # end of 'procmail/man/lockfile.1'
  1403. fi
  1404. if test -f 'procmail/man/mansed' -a "${1}" != "-c" ; then 
  1405.   echo shar: Will not clobber existing file \"'procmail/man/mansed'\"
  1406. else
  1407. echo shar: Extracting \"'procmail/man/mansed'\" \(274 characters\)
  1408. sed "s/^X//" >'procmail/man/mansed' <<'END_OF_FILE'
  1409. X
  1410. X#$Id: mansed,v 2.1 1992/01/31 12:07:40 berg Rel $
  1411. X
  1412. XSHELL=/bin/sh || exec /bin/sh man/mansed $* # we're in a csh, feed myself to sh
  1413. X
  1414. Xif test ! -f "$2"
  1415. Xthen
  1416. X trap "rm -f \"$2\";exit 1" 1 2 3 15
  1417. Xfi
  1418. X
  1419. Xsed -f man/man.sed <"$1" >"$2"
  1420. X
  1421. Xif test -f "$2"
  1422. Xthen
  1423. X exit 0
  1424. Xelse
  1425. X exit 1
  1426. Xfi
  1427. END_OF_FILE
  1428. if test 274 -ne `wc -c <'procmail/man/mansed'`; then
  1429.     echo shar: \"'procmail/man/mansed'\" unpacked with wrong size!
  1430. fi
  1431. # end of 'procmail/man/mansed'
  1432. fi
  1433. if test -f 'procmail/patchlevel.h' -a "${1}" != "-c" ; then 
  1434.   echo shar: Will not clobber existing file \"'procmail/patchlevel.h'\"
  1435. else
  1436. echo shar: Extracting \"'procmail/patchlevel.h'\" \(170 characters\)
  1437. sed "s/^X//" >'procmail/patchlevel.h' <<'END_OF_FILE'
  1438. X#define VERSION \
  1439. X"procmail v2.61 1991/01/31 written by Stephen R. van den Berg\n\
  1440. X\t\t\t\tberg@messua.informatik.rwth-aachen.de\n\
  1441. X\t\t\t\tberg@physik.tu-muenchen.de\n"
  1442. END_OF_FILE
  1443. if test 170 -ne `wc -c <'procmail/patchlevel.h'`; then
  1444.     echo shar: \"'procmail/patchlevel.h'\" unpacked with wrong size!
  1445. fi
  1446. # end of 'procmail/patchlevel.h'
  1447. fi
  1448. if test -f 'procmail/procmail.h' -a "${1}" != "-c" ; then 
  1449.   echo shar: Will not clobber existing file \"'procmail/procmail.h'\"
  1450. else
  1451. echo shar: Extracting \"'procmail/procmail.h'\" \(2483 characters\)
  1452. sed "s/^X//" >'procmail/procmail.h' <<'END_OF_FILE'
  1453. X/*$Id: procmail.h,v 2.13 1992/01/31 11:32:45 berg Rel $*/
  1454. X
  1455. X#include "includes.h"
  1456. X
  1457. Xtypedef unsigned char uschar;         /* sometimes uchar is already typedef'd */
  1458. X#ifdef uchar
  1459. X#undef uchar
  1460. X#endif
  1461. X#define uchar uschar
  1462. X
  1463. X#ifndef console
  1464. X#define console devnull
  1465. X#endif
  1466. X
  1467. X#ifndef DEFsendmail
  1468. X#define DEFsendmail SENDMAIL
  1469. X#endif
  1470. X
  1471. X#ifndef SYSTEM_MBOX
  1472. X#define SYSTEM_MBOX    SYSTEM_MAILBOX
  1473. X#endif
  1474. X
  1475. X#ifdef MAILBOX_SEPARATOR
  1476. X#define mboxseparator(fd)    \
  1477. X (tofolder?rwrite(fd,MAILBOX_SEPARATOR,STRLEN(MAILBOX_SEPARATOR)):0)
  1478. X#else
  1479. X#define mboxseparator(fd)
  1480. X#endif
  1481. X
  1482. X#ifndef KERNEL_LOCKS
  1483. X#define lockfd(fd)    0
  1484. X#define unlockfd()    0
  1485. X#endif
  1486. X
  1487. X#define XTRAlinebuf    2         /* surplus of LINEBUF (see readparse()) */
  1488. X#define TMNATE        '\377'             /* terminator (see readoarse()) */
  1489. X
  1490. X#define PRDO    poutfd[0]
  1491. X#define PWRO    poutfd[1]
  1492. X#define PRDI    pinfd[0]
  1493. X#define PWRI    pinfd[1]
  1494. X#define PRDB    pbackfd[0]
  1495. X#define PWRB    pbackfd[1]
  1496. X#define LENoffset    (TABWIDTH*LENtSTOP)
  1497. X#define MAXfoldlen    (LENoffset-STRLEN(sfolder)-1)
  1498. X#define MCDIRSEP    (dirsep+STRLEN(dirsep)-1)      /* most common DIRSEP */
  1499. X
  1500. Xstruct varval{const char*const name;long val;};
  1501. X#define locksleep    (strenvvar[0].val)
  1502. X#define locktimeout    (strenvvar[1].val)
  1503. X#define suspendv    (strenvvar[2].val)
  1504. X#define noresretry    (strenvvar[3].val)
  1505. X#define timeoutv    (strenvvar[4].val)
  1506. X#define MAXvarvals    maxindex(strenvvar)
  1507. X
  1508. X#ifndef MAIN
  1509. Xextern char*buf,*buf2,*globlock,*loclock,*tolock,*lastfolder;
  1510. Xextern const char shellflags[],shell[],lockext[],newline[],binsh[],
  1511. X unexpeof[],shellmetas[],*const*gargv,*sgetcp,*rcfile,dirsep[],msgprefix[],
  1512. X devnull[],executing[],oquote[],cquote[],whilstwfor[],procmailn[],Mail[];
  1513. Xextern struct varval strenvvar[];
  1514. Xextern long lastdump;
  1515. Xextern sh,pwait,retval,lcking,locknext,verbose,linebuf,rc,tofolder,tofile,
  1516. X ignwerr,fakedelivery;
  1517. Xextern volatile nextexit;
  1518. Xextern volatile time_t alrmtime;
  1519. Xextern pid_t thepid;
  1520. X#endif
  1521. X
  1522. X#ifdef NOmemmove
  1523. Xvoid*smemmove();
  1524. X#endif
  1525. X#ifdef strtol
  1526. X#undef strtol
  1527. X#define NOstrtol
  1528. Xlong strtol();
  1529. X#endif
  1530. X#ifdef NOstrpbrk
  1531. Xchar*strpbrk();
  1532. X#endif
  1533. X
  1534. Xvoid*tmalloc(),*trealloc(),*bregcomp(),srequeue(),slose(),sbounce(),
  1535. X stermchild(),ftimeout();
  1536. Xpid_t sfork();
  1537. Xlong dump(),pipin(),renvint();
  1538. Xchar*readdyn(),*fromprog(),*cat(),*tstrdup(),*cstr(),*pstrspn(),
  1539. X *bregexec(),*egrepin(),*lastdirsep();
  1540. Xconst char*tgetenv(),*hostname();
  1541. Xint sgetc(),getb();
  1542. X
  1543. X/*
  1544. X *    External variables that are checked/changed by the signal handlers:
  1545. X *    volatile time_t alrmtime;
  1546. X *    pid_t pidfilt,pidchild;
  1547. X *    volatile int nextexit;
  1548. X *    int lcking;
  1549. X */
  1550. END_OF_FILE
  1551. if test 2483 -ne `wc -c <'procmail/procmail.h'`; then
  1552.     echo shar: \"'procmail/procmail.h'\" unpacked with wrong size!
  1553. fi
  1554. # end of 'procmail/procmail.h'
  1555. fi
  1556. if test -f 'procmail/shell.h' -a "${1}" != "-c" ; then 
  1557.   echo shar: Will not clobber existing file \"'procmail/shell.h'\"
  1558. else
  1559. echo shar: Extracting \"'procmail/shell.h'\" \(188 characters\)
  1560. sed "s/^X//" >'procmail/shell.h' <<'END_OF_FILE'
  1561. X/*$Id: shell.h,v 2.0 1991/06/10 14:39:08 berg Rel $*/
  1562. X
  1563. X#define malloc(n)    tmalloc((size_t)(n))
  1564. X#define realloc(p,n)    trealloc(p,(size_t)(n))
  1565. X#define tmemmove(t,f,n) memmove(t,f,(size_t)(n))
  1566. END_OF_FILE
  1567. if test 188 -ne `wc -c <'procmail/shell.h'`; then
  1568.     echo shar: \"'procmail/shell.h'\" unpacked with wrong size!
  1569. fi
  1570. # end of 'procmail/shell.h'
  1571. fi
  1572. echo shar: End of archive 1 \(of 5\).
  1573. cp /dev/null ark1isdone
  1574. MISSING=""
  1575. for I in 1 2 3 4 5 ; do
  1576.     if test ! -f ark${I}isdone ; then
  1577.     MISSING="${MISSING} ${I}"
  1578.     fi
  1579. done
  1580. if test "${MISSING}" = "" ; then
  1581.     echo You have unpacked all 5 archives.
  1582.     rm -f ark[1-9]isdone
  1583. else
  1584.     echo You still need to unpack the following archives:
  1585.     echo "        " ${MISSING}
  1586. fi
  1587. ##  End of shell archive.
  1588. exit 0
  1589. -- 
  1590. Sincerely,                                berg@messua.informatik.rwth-aachen.de
  1591.            Stephen R. van den Berg (AKA BuGless).    berg@physik.tu-muenchen.de
  1592.  
  1593. He did a quarter of the work in *half* the time!
  1594.  
  1595. exit 0 # Just in case...
  1596.