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

  1. Newsgroups: comp.sources.misc
  2. From: berg@pool.informatik.rwth-aachen.de (Stephen R. van den Berg)
  3. Subject: v35i026:  procmail - mail processing package v2.80, Part05/11
  4. Message-ID: <1993Feb5.020428.16527@sparky.imd.sterling.com>
  5. X-Md4-Signature: 036de9ceec6c4d9abd9091886ddb041e
  6. Date: Fri, 5 Feb 1993 02:04:28 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 26
  11. Archive-name: procmail/part05
  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 5 (of 11)."
  22. # Contents:  procmail280/mailinglist/Manual procmail280/man/formail.man
  23. #   procmail280/src/includes.h procmail280/src/manconf.c
  24. #   procmail280/src/pipes.c
  25. # Wrapped by berg@hathi on Thu Feb  4 15:27:59 1993
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'procmail280/mailinglist/Manual' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'procmail280/mailinglist/Manual'\"
  29. else
  30. echo shar: Extracting \"'procmail280/mailinglist/Manual'\" \(8524 characters\)
  31. sed "s/^X//" >'procmail280/mailinglist/Manual' <<'END_OF_FILE'
  32. X$Id: Manual,v 1.4 1993/01/29 13:32:44 berg Exp $
  33. X
  34. X        Written by Stephen R. van den Berg.
  35. X                    berg@pool.informatik.rwth-aachen.de
  36. X                    berg@physik.tu-muenchen.de
  37. X
  38. XContents:
  39. X---------    1. Creating and removing mailinglists
  40. X        2. Remote maintenance of mailinglists
  41. X        3. Customisation
  42. X        4. The archive server
  43. X        5. The format of the dist file
  44. X
  45. X
  46. X1. Creating and removing mailinglists
  47. X   ----------------------------------
  48. X
  49. XMake sure that the .bin directory is in your PATH.  Now you can issue
  50. Xcommands like:
  51. X
  52. X    createlist testing
  53. X    createlist testing joe@somewhere.edu
  54. X    removelist testing
  55. X
  56. XThe first command creates a mailinglist with two useful addresses:
  57. X
  58. X    testing
  59. X    testing-request
  60. X
  61. XThe second command does the same, but it also specifies joe@somewhere.edu
  62. Xto be the responsible contact person for this list.
  63. X
  64. XThe third command removes all traces of the "testing" mailinglist again.
  65. X
  66. XThere is one other convenience-utility that can be used: "delink"
  67. XIt will unlink a file from its hardlinked counterpart(s).
  68. X
  69. X
  70. X2. Remote maintenance of mailinglists
  71. X   ----------------------------------
  72. X
  73. XTo facilitate remote maintenance of some mailinglists by their maintainers
  74. XI have created the .bin/x_command script.  It parses mails sent to the
  75. X-request address and can execute some administrative commands.
  76. X
  77. XThe mail should be sent to the -request address of a mailinglist and
  78. Xshould contain a field in the header looking like this:
  79. X
  80. XX-Command: joe@somewhere.edu password command
  81. X
  82. X"command" can be anything of the following:
  83. X
  84. X    subscribe mailaddress
  85. X    unsubscribe mailaddress
  86. X    showdist            To list the distfile
  87. X    showlog                To list the log
  88. X    wipelog                To clear the log
  89. X    help                To show this command summary
  90. X    info                Ditto
  91. X
  92. XThe exact fieldname defaults to "X-Command", but can be customised to
  93. Xwhatever you want.
  94. X
  95. XThe password defaults to "password", but can/should be changed.
  96. X
  97. XThe "joe@somewhere.edu" is always the mail address of the maintainer.  Note
  98. Xthat this has to match what was specified on the command line of
  99. X"createlist" when the list was created.
  100. X
  101. XNote that the X-Command: field has to be part of the header, when it's
  102. Xin the body of the mail, it has no effect.
  103. X
  104. XAnytime an X-Command: mail has been processed, the results will be
  105. Xmailed back to the maintainer of the list, and the X-Command: field
  106. Xwill have been renamed to X-Processed:.
  107. X
  108. XAlthough this remote-facility is convenient, some might argue that it
  109. Xpresents a security hole.  Well, in order to make this hole as small as
  110. Xpossible, you can keep the password secret.  Also, the exact mailaddress
  111. Xof the maintainer might not be publicly known.    You can simply change
  112. Xthe X-Command field into something else like X-MyCommand.  Above all, since
  113. Xfaking mail is a well known possibility it would be ridiculous to take
  114. Xmore precautions than these.
  115. X
  116. X
  117. X3. Customisation
  118. X   -------------
  119. X
  120. XThe mailinglists can be customised in several ways:
  121. X
  122. X- For all the lists:
  123. X    - Since all the lists share the same help.txt, subscibe.txt, rc.init,
  124. X      rc.submit and rc.request files (hardlinked), any change to them
  125. X      will affect all lists.
  126. X    - Since all the lists have the .bin directory in their PATH, any
  127. X      change to one of the Bourne shell scripts in there will affect
  128. X      them all.
  129. X- Per list:
  130. X    - Every list directory contains an "rc.custom" rcfile which can
  131. X      be edited to your hearts content to customise certain parameters
  132. X      for this list only.
  133. X    - For graver customisation you can remove the hardlink (using
  134. X      .bin/delink for example) to any of the files in a list directory and
  135. X      provide that list with its own copy in order to edit that to taste.
  136. X    - Since the current directory is in the PATH before the .bin
  137. X      directory you can create per-list copies of any of the Bourne shell
  138. X      scripts in .bin which can then be changed without affecting the
  139. X      other lists.
  140. X- Per group of lists:
  141. X    - The same applies as when customising per list, but you should
  142. X      then hardlink the appropriate files among the group of list
  143. X      directories.
  144. X
  145. XIf you are not using the remote-maintenance facility and you start editing
  146. Xor customising scripts/files by hand, then you should make sure that there
  147. Xdoesn't arrive any mail to those lists that are affected by your changes.
  148. X
  149. XIf you are editing while the system is running you can temporarily put
  150. Xincoming mails on hold;     you can do this:
  151. X
  152. X- for all the lists by creating the file:    .etc/rc.lock
  153. X- only for one list by creating the file:    rc.lock
  154. X  in the list directory of that list.
  155. X
  156. XThe .bin/flist command checks to see if these rc.lock files exist AND are
  157. Xnot older than 17 minutes before delivering the mail.  So, if you create
  158. Xan rc.lock file, mails to that (or all) lists will stall for the next
  159. X17 minutes.  If you need more time, touch the file every so often.
  160. XYou should remove the rc.lock files again after finishing your editing.
  161. X
  162. X
  163. X4. The archive server
  164. X   ------------------
  165. X
  166. XAll mail (except mail being forwarded from another mailinglist) sent to any
  167. Xof the lists is archived.  The archiving is fairly straightforward.
  168. XE.g. if you have a list called "scuba", then all submissions are archived
  169. Xin scuba/archive/latest/.  The mails will be stored one-mail-per-file each.
  170. XThe files will be numbered.
  171. X
  172. XNow, normally, only the last two mails will be kept around, the others
  173. Xare periodically removed.  This in order to keep down the archiving costs
  174. Xfor people with limited diskspace.  To disable archiving completely,
  175. Xedit the rc.submit file.  To simply make the archive-history longer,
  176. Xedit the rc.custom file.  To get more sophisticated archiving, like grouping
  177. Xsubmissions monthly, you should either create a cron job or edit the
  178. X.bin/arch_trunc file.
  179. X
  180. XThe archive server can be accessed per mailinglist by sending mail
  181. Xto the -request address with the following Subject:
  182. X
  183. X    Subject: archive
  184. X
  185. XThe body of the mail or the rest of the subject line can then be
  186. Xfiled with requests to the archive server.  It basically understands
  187. Xthree commands:
  188. X
  189. X    get file ...
  190. X    ls directory ...
  191. X    help
  192. X
  193. XThe archive server does a thorough check on the commands and the files
  194. Xthat are requested.  This to ensure that it does not access any files
  195. Xoutside the "scuba/archive" directory.    Any text-file that you put below
  196. Xthe "scuba/archive" directory can now be retrieved by the archive commands.
  197. X
  198. XThe whole archive server can be found in the .bin/arch_retrieve script.
  199. X
  200. X
  201. X5. The format of the dist file
  202. X   ---------------------------
  203. X
  204. XYou do not need to know this, unless you edit the dist file by hand or want
  205. Xto incorporate an existing list of addresses.
  206. X
  207. XIn order to distribute incoming submissions the dist file is fed to sendmail
  208. Xwith the regular :include: alias.  So the format of this file must
  209. Xbe in accordance with what sendmail would expect.  In addition to that
  210. Xthis file is searched and edited by multigram in order to find particular
  211. Xsubscribers.  The format which multigram expects is a bit more rigid than
  212. Xwhat sendmail allows.
  213. X
  214. XThe following conditions apply:
  215. X- One subscriber per line.
  216. X- Empty lines are allowed.
  217. X- The mail address of the subscriber must be the first word on the line.
  218. X- Comments may follow the address (but separated from the address by
  219. X  at least one whitespace character).
  220. X- Everything preceding the line containing:
  221. X    (Only addresses below this line can be automatically removed)
  222. X  is write protected from changes by multigram (i.e. these addresses can
  223. X  never be automatically/accidentally unsubscribed).
  224. X- If the line:
  225. X    (Only addresses below this line can be automatically removed)
  226. X  is not present at all, automatic unsubscriptions to this list are impossible.
  227. X- Whenever multigram automatically removes an address from the list, it
  228. X  rewrites the dist file `in situ'.  This means that the dist file will be
  229. X  contracted at that point, any excess slack at the end will be overwritten
  230. X  by newlines (i.e. the dist file never shrinks, this because ANSI-C does not
  231. X  provide a truncate() command of some kind).  I choose to write in situ in
  232. X  order to avoid copying the dist file every time it changes (a real life
  233. X  saver if the list grows too big).
  234. X- Multigram always adds new subscribers on the line immediately following the
  235. X  last filled entry in the dist file.
  236. X
  237. XSome sample entries (the preferred format):
  238. X    joe@some.where
  239. X    joe@some.where (some comment)
  240. X    joe@some.where (some comment) (some more comment)
  241. X
  242. XDepreciated, but allowed:
  243. X    <joe@some.where>
  244. X    <joe@some.where> some comment
  245. X    <joe@some.where> (some comment)
  246. X
  247. XNot allowed by multigram (although sendmail doesn't mind):
  248. X    (some comment) joe@some.where
  249. X    some comment <joe@some.where>
  250. END_OF_FILE
  251. if test 8524 -ne `wc -c <'procmail280/mailinglist/Manual'`; then
  252.     echo shar: \"'procmail280/mailinglist/Manual'\" unpacked with wrong size!
  253. fi
  254. # end of 'procmail280/mailinglist/Manual'
  255. fi
  256. if test -f 'procmail280/man/formail.man' -a "${1}" != "-c" ; then 
  257.   echo shar: Will not clobber existing file \"'procmail280/man/formail.man'\"
  258. else
  259. echo shar: Extracting \"'procmail280/man/formail.man'\" \(7358 characters\)
  260. sed "s/^X//" >'procmail280/man/formail.man' <<'END_OF_FILE'
  261. X.Id $Id: formail.man,v 1.8 1993/01/22 13:42:11 berg Exp $
  262. X.TH FORMAIL 1 \*(Dt BuGless
  263. X.na
  264. X.SH NAME
  265. Xformail \- mail (re)formatter
  266. X.SH SYNOPSIS
  267. X.B formail
  268. X.RI [ "\fB\+FM_SKIP+\fPskip" ]
  269. X.RI [ "\fB\+FM_TOTAL+\fPtotal" ]
  270. X.RB [ \-+FM_BOGUS++FM_CONCATENATE++FM_FORCE++FM_REPLY++FM_KEEPB++FM_TRUST++FM_NOWAIT++FM_EVERY++FM_DIGEST++FM_QUIET+ ]
  271. X.RB [ \-+FM_MINFIELDS+
  272. X.IR "min fields" ]
  273. X.if n .ti +0.5i
  274. X.RB [ \-+FM_EXTRACT+
  275. X.IR "header field" ]
  276. X.RB [ \-+FM_EXTRC_KEEP+
  277. X.IR "header field" ]
  278. X.if n .ti +0.5i
  279. X.RB [ \-+FM_ADD_IFNOT+
  280. X.IR "header field" ]
  281. X.RB [ \-+FM_ADD_ALWAYS+
  282. X.IR "header field" ]
  283. X.if n .ti +0.5i
  284. X.RB [ \-+FM_REN_INSERT+
  285. X.IR "header field" ]
  286. X.RB [ \-+FM_DEL_INSERT+
  287. X.IR "header field" ]
  288. X.if n .ti +0.5i
  289. X.RB [ \-+FM_ReNAME+
  290. X.I "oldfield"
  291. X.IR "newfield" ]
  292. X.RB [ \-+FM_SPLIT+
  293. X.I command
  294. X.I arg
  295. X\&.\|.\|.\|]
  296. X.ad
  297. X.Sh DESCRIPTION
  298. X.B formail
  299. Xis a filter that can be used to force mail into mailbox format, perform
  300. X`+FROM+' escaping, generate auto-replying headers, do simple
  301. Xheader munging/extracting or split up a
  302. Xmailbox/digest/articles file.  The mail/mailbox/article contents will be
  303. Xexpected on stdin.
  304. X.PP
  305. XIf formail is supposed to determine the sender of the mail, but is unable
  306. Xto find any, it will substitute `+UNKNOWN+'.
  307. X.PP
  308. XIf formail is started without any command line options, it will force any
  309. Xmail coming from stdin into mailbox format and will escape
  310. X.B all
  311. Xbogus `+FROM+' lines with a `+ESCAP+'.
  312. X.Sh OPTIONS
  313. X.Tp 0.5i
  314. X.B \-+FM_BOGUS+
  315. XDon't escape any bogus mailbox headers (i.e. lines starting with `+FROM+').
  316. X.Tp
  317. X.B \-+FM_CONCATENATE+
  318. XConcatenate continued fields in the header.  Might be convenient when
  319. Xpostprocessing mail with standard (line oriented) text utilities.
  320. X.Tp
  321. X.B \-+FM_FORCE+
  322. XForce formail to simply pass along any non-mailbox format (i.e. don't
  323. Xgenerate a `+FROM+' line as the first line).
  324. X.Tp
  325. X.B \-+FM_REPLY+
  326. XGenerate an auto-reply header.  This will normally throw away all the existing
  327. Xfields in the original message, fields you wish to preserve need to be named
  328. Xusing the
  329. X.B \-+FM_REN_INSERT+
  330. Xoption.
  331. X.Tp
  332. X.B \-+FM_KEEPB+
  333. XWhen generating the auto-reply header, keep the body as well.  If used
  334. Xtogether with the
  335. X.B \-+FM_BOGUS+
  336. Xoption then the body will not be escaped.
  337. X.Tp
  338. X.B \-+FM_TRUST+
  339. XTrust the sender to have used a valid return address in his header.  This
  340. Xoption will be most useful when generating auto-reply headers from news
  341. Xarticles.  If this option is not turned on, formail tends to favour
  342. Xmachine-generated addresses in the header.
  343. X.Tp
  344. X.B \-+FM_SPLIT+
  345. XThe input will be split up into separate mail messages, and piped into
  346. Xa program one by one (a new program is started for every part).
  347. X.B \-+FM_SPLIT+
  348. Xhas to be the last option specified, the first argument following it
  349. Xis expected to be the name of a program, any other arguments will be passed
  350. Xalong to it.
  351. X.Tp
  352. X.B \-+FM_NOWAIT+
  353. XTell formail not to wait for every program to finish before starting the next.
  354. X.Tp
  355. X.B \-+FM_EVERY+
  356. XDo not require empty lines preceding the header of a new message (i.e. the
  357. Xmessages could start on every line).
  358. X.Tp
  359. X.B \-+FM_DIGEST+
  360. XTell formail that the messages it is supposed to split need not be in strict
  361. Xmailbox format (i.e. allows you to split digests/articles or non-standard
  362. Xmailbox formats).
  363. X.Tp
  364. X.I "\fB\-+FM_MINFIELDS+\fP min fields"
  365. XAllows you to specify the number of consecutive fields formail needs to find
  366. Xbefore it decides it found the start of a new message, it defaults to
  367. X+DEFminfields+.
  368. X.Tp
  369. X.B \-+FM_QUIET+
  370. XTells formail to ignore any write errors on stdout.
  371. X.Tp
  372. X.I "\fB\-+FM_EXTRACT+\fP header field"
  373. XExtract the contents of this
  374. X.I header field
  375. Xfrom the header, display it as a single line.
  376. X.Tp
  377. X.I "\fB\-+FM_EXTRC_KEEP+\fP header field"
  378. XSame as
  379. X.BR \-+FM_EXTRACT+ ,
  380. Xbut also preserves the field name.
  381. X.Tp
  382. X.I "\fB\-+FM_ADD_IFNOT+\fP header field"
  383. XAppend a custom
  384. X.I header field
  385. Xonto the header; but only if a similar field does not exist yet.
  386. X.Tp
  387. X.I "\fB\-+FM_ADD_ALWAYS+\fP header field"
  388. XAppend a custom
  389. X.I header field
  390. Xonto the header in any case.
  391. X.Tp
  392. X.I "\fB\-+FM_REN_INSERT+\fP header field"
  393. XSame as
  394. X.BR \-+FM_ADD_IFNOT+ ,
  395. Xexcept that any existing similar fields are renamed by prepending
  396. Xan ``+OLD_PREFIX+'' prefix.  If
  397. X.I header field
  398. Xconsists only of a field-name, it will not be appended.
  399. X.Tp
  400. X.I "\fB\-+FM_DEL_INSERT+\fP header field"
  401. XSame as
  402. X.BR \-+FM_REN_INSERT+ ,
  403. Xexcept that any existing similar fields are simply removed.
  404. X.Tp
  405. X.I "\fB\-+FM_ReNAME+\fP oldfield newfield"
  406. XRenames all occurrences of the fieldname
  407. X.I oldfield
  408. Xinto
  409. X.IR newfield .
  410. X.Tp
  411. X.I "\fB\+FM_SKIP+\fPskip"
  412. XSkip the first
  413. X.I skip
  414. Xmessages while splitting.
  415. X.Tp
  416. X.I "\fB\+FM_TOTAL+\fPtotal"
  417. XOutput at most
  418. X.I total
  419. Xmessages while splitting.
  420. X.Sh EXAMPLES
  421. XTo split up a digest one usually uses:
  422. X.Rs
  423. Xformail +FM_SKIP+1 \-+FM_DIGEST++FM_SPLIT+ cat >>the_mailbox_of_your_choice
  424. X.Re
  425. Xor
  426. X.Rs
  427. Xformail +FM_SKIP+1 \-+FM_DIGEST++FM_SPLIT+ procmail
  428. X.Re
  429. X.PP
  430. XTo supersede the Reply-To: field in a header you could use:
  431. X.Rs
  432. Xformail \-+FM_REN_INSERT+ "Reply-To: foo@bar"
  433. X.Re
  434. X.PP
  435. XTo convert a non-standard mailbox file into a standard mailbox file you can
  436. Xuse:
  437. X.Rs
  438. Xformail \-+FM_DIGEST++FM_SPLIT+ cat <old_mailbox >>new_mailbox
  439. X.Re
  440. X.PP
  441. XOr, alternatively, if you have a very tolerant mailer:
  442. X.Rs
  443. Xformail \-+FM_ADD_IFNOT+ Date: \-+FM_DIGEST++FM_SPLIT+ cat <old_mailbox >>new_mailbox
  444. X.Re
  445. X.Sh MISCELLANEOUS
  446. XThe regular expression that is used to find `real' postmarks is:
  447. X.Rs
  448. X"\en\en+FROM+[\et ]*[^\et\en ]+[\et ]+[^\en\et ]"
  449. X.Re
  450. X.Sh "SEE ALSO"
  451. X.na
  452. X.nh
  453. X.BR mail (1),
  454. X.BR binmail (1),
  455. X.BR sendmail (8),
  456. X.BR procmail (1),
  457. X.BR sh (1)
  458. X.hy
  459. X.ad
  460. X.Sh DIAGNOSTICS
  461. X.Tp 2.3i
  462. XCan't fork
  463. XToo many processes on this machine.
  464. X.Tp
  465. XCouldn't write to stdout
  466. XThe program that formail was trying to pipe into didn't accept all the data
  467. Xformail sent to it; this diagnostic can be disabled by the
  468. X.B \-+FM_QUIET+
  469. Xoption.
  470. X.Tp
  471. XFailed to execute "x"
  472. XProgram not in path, or not executable.
  473. X.Tp
  474. XFile table full
  475. XToo many open files on this machine.
  476. X.Tp
  477. XInvalid field-name: "x"
  478. XThe specified field-name "x" does not contain a colon or contains control
  479. Xcharacters.
  480. X.Sh WARNINGS
  481. XYou can save yourself and others a lot of mischief if you try to avoid using
  482. Xthis autoreply feature on mails coming through mailinglists.  Depending
  483. Xon the format of the incoming mail (which in turn depends on both the
  484. Xoriginal sender's mail agent and the mailinglist setup) formail could
  485. Xdecide to generate an autoreply header that replies to the list (if
  486. Xthe original sender was careful enough though, formail will be able to pick
  487. Xhis/her address, instead of the list's).  Now if the list is not intelligent
  488. Xenough (most aren't) this autoreply will be widely distributed.
  489. X.Sh BUGS
  490. XWhen formail has to generate a leading `+FROM+' line it normally will contain
  491. Xthe current date.  If formail is given the option `\-+FM_ADD_IFNOT+ Date:',
  492. Xit will use the date from the `Date:' field in the header (if present).
  493. XHowever, since formail copies it verbatim, the format will differ from that
  494. Xexpected by most mail readers.
  495. X.Sh MISCELLANEOUS
  496. XFormail is eight-bit clean.
  497. X.PP
  498. XWhen formail has to determine the sender's address, every RFC 822 conforming
  499. Xmail address is allowed.  Formail will always strip down the address to
  500. Xits minimal form (deleting excessive comments and whitespace).
  501. X.Sh NOTES
  502. XCalling up formail with the \-+HELPOPT1+ or \-+HELPOPT2+ options will cause
  503. Xit to display a command-line help page.
  504. END_OF_FILE
  505. if test 7358 -ne `wc -c <'procmail280/man/formail.man'`; then
  506.     echo shar: \"'procmail280/man/formail.man'\" unpacked with wrong size!
  507. fi
  508. # end of 'procmail280/man/formail.man'
  509. fi
  510. if test -f 'procmail280/src/includes.h' -a "${1}" != "-c" ; then 
  511.   echo shar: Will not clobber existing file \"'procmail280/src/includes.h'\"
  512. else
  513. echo shar: Extracting \"'procmail280/src/includes.h'\" \(6896 characters\)
  514. sed "s/^X//" >'procmail280/src/includes.h' <<'END_OF_FILE'
  515. X/*$Id: includes.h,v 1.17 1993/02/04 12:44:52 berg Exp $*/
  516. X
  517. X#include "../autoconf.h"
  518. X#include "../config.h"
  519. X    /* not all the "library identifiers" specified here need to be
  520. X       available for all programs in this package; some have substitutes
  521. X       as well (see autoconf); this is just an informal list */
  522. X
  523. X#ifndef _HPUX_SOURCE
  524. X#define _HPUX_SOURCE          /* sad, but needed on HP-UX when compiling -Aa */
  525. X#endif
  526. X#ifndef _CONVEX_SOURCE
  527. X#define _CONVEX_SOURCE              /* same story with Convex and -std */
  528. X#endif
  529. X
  530. X#include <sys/types.h>        /* pid_t mode_t uid_t gid_t */
  531. X#ifndef UNISTD_H_MISSING
  532. X#include <unistd.h>        /* open() read() write() close() dup() pipe()
  533. X                /* fork() getuid() getpid() execve()
  534. X                   execvp() sleep() */
  535. X#endif
  536. X#include <stdio.h>        /* setbuf() fclose() stdin stdout stderr
  537. X                /* fopen() fread() fwrite() fgetc() getc()
  538. X                   fdopen() putc() fputs() FILE EOF */
  539. X#ifndef STDDEF_H_MISSING
  540. X#include <stddef.h>        /* ptrdiff_t size_t */
  541. X#endif
  542. X#ifndef STDLIB_H_MISSING
  543. X#include <stdlib.h>        /* getenv() malloc() realloc() free()
  544. X                /* strtol() exit() */
  545. X#endif
  546. X#include <time.h>        /* time() ctime() time_t */
  547. X#include <fcntl.h>        /* fcntl() struct flock O_RDONLY O_WRONLY
  548. X                /* O_APPEND O_CREAT O_EXCL */
  549. X#include <grp.h>        /* getgrgid() struct group */
  550. X#include <pwd.h>        /* getpwuid() getpwnam() struct passwd */
  551. X#ifndef DIRENT_H_MISSING
  552. X#include <dirent.h>        /* opendir() readdir() closedir() DIR
  553. X                /* struct dirent */
  554. X#endif
  555. X#ifndef SYS_WAIT_H_MISSING
  556. X#include <sys/wait.h>        /* wait() WIFEXITED() WIFSTOPPED()
  557. X                /* WEXITSTATUS() */
  558. X#endif
  559. X#ifndef SYS_UTSNAME_H_MISSING
  560. X#include <sys/utsname.h>    /* uname() utsname */
  561. X#endif
  562. X#include <sys/stat.h>        /* stat() S_ISDIR() S_ISREG() struct stat */
  563. X#include <signal.h>        /* signal() kill() alarm() SIG_IGN SIGHUP
  564. X                /* SIGINT SIGQUIT SIGALRM SIGTERM */
  565. X#ifndef STRING_H_MISSING
  566. X#include <string.h>        /* strcpy() strncpy() strcat() strlen()
  567. X                /* strspn() strcspn() strchr() strcmp()
  568. X                   strncmp() strpbrk() strstr() memmove() */
  569. X#endif
  570. X#include <errno.h>        /* EINTR EEXIST ENFILE EACCES EAGAIN */
  571. X#ifndef SYSEXITS_H_MISSING
  572. X#include <sysexits.h>        /* EX_OK EX_USAGE EX_NOUSER EX_UNAVAILABLE
  573. X                /* EX_OSERR EX_OSFILE EX_CANTCREAT EX_IOERR
  574. X                   EX_TEMPFAIL EX_NOPERM */
  575. X#endif
  576. X
  577. X#ifdef STDLIB_H_MISSING
  578. Xvoid*malloc(),*realloc();
  579. Xconst char*getenv();
  580. X#endif
  581. X#ifdef DIRENT_H_MISSING
  582. X#ifndef NDIR_H_MISSING
  583. X#include <ndir.h>
  584. X#define dirent    direct
  585. X#else
  586. X#ifndef SYS_NDIR_H_MISSING
  587. X#include <sys/ndir.h>
  588. X#define dirent    direct
  589. X#else
  590. X#ifndef SYS_DIR_H_MISSING
  591. X#include <sys/dir.h>
  592. X#define dirent    direct
  593. X#else              /* due to brain-damaged NeXT sys/dirent.h contents */
  594. X#ifndef SYS_DIRENT_H_MISSING         /* sys/dirent.h must be moved down here */
  595. X#include <sys/dirent.h>
  596. X#else
  597. X/* I give up, I can only hope that your system defines DIR and struct dirent */
  598. X#endif
  599. X#endif
  600. X#endif
  601. X#endif
  602. X#endif /* DIRENT_H_MISSING */
  603. X#ifdef STRING_H_MISSING
  604. X#include <strings.h>
  605. X#ifndef strchr
  606. Xchar*strchr();
  607. X#endif
  608. Xchar*strpbrk();
  609. X#endif
  610. X#ifdef SYS_UTSNAME_H_MISSING
  611. X#define NOuname
  612. X#endif
  613. X#ifdef SYSEXITS_H_MISSING
  614. X        /* Standard exit codes, original list maintained
  615. X           by Eric Allman (eric@berkeley, ucbvax!eric)     */
  616. X#define EX_OK        0
  617. X#define EX_USAGE    64
  618. X#define EX_NOUSER    67
  619. X#define EX_UNAVAILABLE    69
  620. X#define EX_OSERR    71
  621. X#define EX_OSFILE    72
  622. X#define EX_CANTCREAT    73
  623. X#define EX_IOERR    74
  624. X#define EX_TEMPFAIL    75
  625. X#define EX_NOPERM    77
  626. X#endif
  627. X
  628. X#if O_SYNC
  629. X#else
  630. X#undef O_SYNC
  631. X#define O_SYNC        0
  632. X#endif
  633. X#ifndef O_RDONLY
  634. X#define O_RDONLY    0
  635. X#define O_WRONLY    1
  636. X#endif
  637. X#ifndef SEEK_SET
  638. X#define SEEK_SET    0
  639. X#define SEEK_CUR    1
  640. X#define SEEK_END    2
  641. X#endif
  642. X#ifndef tell
  643. X#define tell(fd)    lseek(fd,0L,SEEK_CUR)
  644. X#endif
  645. X
  646. X#ifndef EWOULDBLOCK
  647. X#define EWOULDBLOCK    EACCES
  648. X#endif
  649. X#ifndef EAGAIN
  650. X#define EAGAIN        EINTR
  651. X#endif
  652. X
  653. X#ifndef EOF
  654. X#define EOF    (-1)
  655. X#endif
  656. X
  657. X#ifndef S_ISDIR
  658. X#define S_ISDIR(mode)    (((mode)&S_IFMT)==S_IFDIR)
  659. X#ifndef S_IFDIR
  660. X#define S_IFDIR 0040000
  661. X#endif
  662. X#endif
  663. X
  664. X#ifndef S_ISREG
  665. X#define S_ISREG(mode)    (((mode)&S_IFMT)==S_IFREG)
  666. X#ifndef S_IFREG
  667. X#define S_IFREG 0100000
  668. X#endif
  669. X#endif
  670. X
  671. X#ifndef S_ISLNK
  672. X#ifndef S_IFLNK
  673. X#define lstat(path,stbuf)    stat(path,stbuf)
  674. X#define S_ISLNK(mode)    0
  675. X#else
  676. X#define S_ISLNK(mode)    (((mode)&S_IFMT)==S_IFLNK)
  677. X#endif
  678. X#endif
  679. X
  680. X#ifndef S_IFMT
  681. X#define S_IFMT    0170000
  682. X#endif
  683. X
  684. X#ifndef S_IRWXU
  685. X#define S_IRWXU 00700
  686. X#define S_IRWXG 00070
  687. X#define S_IRWXO 00007
  688. X#endif
  689. X#ifndef S_IWUSR
  690. X#ifdef S_IREAD
  691. X#define S_IRUSR     S_IREAD
  692. X#define S_IWUSR     S_IWRITE
  693. X#define S_IXUSR     S_IEXEC
  694. X#else
  695. X#define S_IRUSR     0400
  696. X#define S_IWUSR     0200
  697. X#define S_IXUSR     0100
  698. X#endif /* S_IREAD */
  699. X#define S_IRGRP     0040
  700. X#define S_IWGRP     0020
  701. X#define S_IXGRP     0010
  702. X#define S_IROTH     0004
  703. X#define S_IWOTH     0002
  704. X#define S_IXOTH     0001
  705. X#endif /* S_IWUSR */
  706. X#ifndef S_ISGID
  707. X#define S_ISUID 04000
  708. X#define S_ISGID 02000
  709. X#endif
  710. X
  711. X#ifdef WMACROS_NON_POSIX
  712. X#ifdef WIFEXITED
  713. X#undef WIFEXITED
  714. X#endif
  715. X#ifdef WIFSTOPPED
  716. X#undef WIFSTOPPED
  717. X#endif
  718. X#ifdef WEXITSTATUS
  719. X#undef WEXITSTATUS
  720. X#endif
  721. X#endif /* WMACROS_NON_POSIX */
  722. X
  723. X#ifndef WIFEXITED
  724. X#define WIFEXITED(waitval)    (!((waitval)&255))
  725. X#endif
  726. X#ifndef WIFSTOPPED
  727. X#define WIFSTOPPED(waitval)    (((waitval)&255)==127)
  728. X#endif
  729. X#ifndef WEXITSTATUS
  730. X#define WEXITSTATUS(waitval)    ((waitval)>>8&255)
  731. X#endif
  732. X
  733. Xextern /*const*/char**environ;
  734. Xextern errno;
  735. X
  736. X#ifndef STDIN_FILENO
  737. X#define STDIN    0
  738. X#define STDOUT    1
  739. X#define STDERR    2
  740. X#else
  741. X#define STDIN    STDIN_FILENO
  742. X#define STDOUT    STDOUT_FILENO
  743. X#define STDERR    STDERR_FILENO
  744. X#endif
  745. X
  746. X#ifdef NO_fcntl_LOCK
  747. X#ifndef NOfcntl_lock
  748. X#define NOfcntl_lock
  749. X#endif
  750. X#endif
  751. X#ifdef NO_lockf_LOCK
  752. X#ifdef USElockf
  753. X#undef USElockf
  754. X#endif
  755. X#endif
  756. X#ifdef NO_flock_LOCK
  757. X#ifdef USEflock
  758. X#undef USEflock
  759. X#endif
  760. X#endif
  761. X
  762. X#ifndef NOuname
  763. X#ifndef P          /* SINIX V5.23 has the wrong prototype for uname() */
  764. Xextern int uname();                     /* so we fix it :-) */
  765. X#define Uname(name)        ((int(*)(struct utsname*))uname)(name)
  766. X#else
  767. X#define Uname(name)        uname(name)            /* no fix needed */
  768. X#endif /* P */
  769. X#endif /* NOuname */
  770. X                 /* NEWS OS 5.X has the wrong prototype here */
  771. X#define Fdopen(fd,type)        ((FILE*)fdopen(fd,type))
  772. X
  773. X#ifndef strchr           /* for very old K&R compatible include files with */
  774. X#ifdef P                        /* new K&R libraries */
  775. X#ifdef const
  776. Xextern char*strchr();
  777. Xextern char*strpbrk();
  778. Xextern char*strstr();
  779. Xextern void*memmove();
  780. X#endif
  781. X#endif
  782. X#endif
  783. X
  784. X#define Const            /*const*/     /* Convex cc doesn't grok this */
  785. X
  786. X#ifdef NOrename
  787. X#define rename(old,new) (-(link(old,new)||unlink(old)))
  788. X#endif
  789. X
  790. X#ifdef NOmemmove
  791. X#define memmove(to,from,count) smemmove(to,from,count)
  792. X#endif
  793. X
  794. X#ifndef P
  795. X#define P(args)        args
  796. X#endif
  797. X#define Q(args)        () /* needed until function definitions are ANSI too */
  798. X
  799. X#ifdef oBRAIN_DAMAGE
  800. X#undef offsetof
  801. X#endif
  802. X#ifndef offsetof
  803. X#define offsetof(s,m) ((char*)&(((s*)sizeof(s))->m)-(char*)sizeof(s))
  804. X#endif
  805. X
  806. X#define PROGID        const char progid[]="Stephen R. van den Berg"
  807. X#define maxindex(x)    (sizeof(x)/sizeof((x)[0])-1)
  808. X#define STRLEN(x)    (sizeof(x)-1)
  809. X#define ioffsetof(s,m)    ((int)offsetof(s,m))
  810. X
  811. X#define mx(a,b)        ((a)>(b)?(a):(b))
  812. END_OF_FILE
  813. if test 6896 -ne `wc -c <'procmail280/src/includes.h'`; then
  814.     echo shar: \"'procmail280/src/includes.h'\" unpacked with wrong size!
  815. fi
  816. # end of 'procmail280/src/includes.h'
  817. fi
  818. if test -f 'procmail280/src/manconf.c' -a "${1}" != "-c" ; then 
  819.   echo shar: Will not clobber existing file \"'procmail280/src/manconf.c'\"
  820. else
  821. echo shar: Extracting \"'procmail280/src/manconf.c'\" \(7000 characters\)
  822. sed "s/^X//" >'procmail280/src/manconf.c' <<'END_OF_FILE'
  823. X/* A sed script generator (for transmogrifying the man pages automagically) */
  824. X
  825. X/*$Id: manconf.c,v 1.14 1993/01/28 15:18:33 berg Exp $*/
  826. X
  827. X#include "../patchlevel.h"
  828. X#include "procmail.h"
  829. X
  830. X#define pn(name,val)    pnr(name,(long)(val))
  831. X
  832. Xstatic char pm_version[]=VERSION;
  833. Xconst char dirsep[]=DIRSEP;
  834. Xstatic const char*const keepenv[]=KEEPENV,*const prestenv[]=PRESTENV,
  835. X *const trusted_ids[]=TRUSTED_IDS,
  836. X *const krnllocks[]={
  837. X#ifndef NOfcntl_lock
  838. X  "fcntl(2)",
  839. X#endif
  840. X#ifdef USElockf
  841. X  "lockf(3)",
  842. X#endif
  843. X#ifdef USEflock
  844. X  "flock(2)",
  845. X#endif
  846. X  0};
  847. X
  848. Xstatic char*skltmark(nl,current)char**current;
  849. X{ char*from= *current,*p;
  850. X  while(nl--)                     /* skip some newlines first */
  851. X     from=strchr(from,'\n')+1;
  852. X  while(*from=='\t')
  853. X     from++;
  854. X  *(p=strchr(from,'\n'))='\0';*current=p+1;return from;
  855. X}
  856. X
  857. Xstatic void putcesc(i)
  858. X{ switch(i)
  859. X   { case '|':printf("\\\\h'-\\\\w' 'u' ");break;
  860. X     case '\\':i='e';goto twoesc;
  861. X     case '\1':i='\n';goto singesc;
  862. X     case '\t':i='t';goto fin;
  863. X     case '\n':i='n';
  864. Xfin:    putchar('\\');putchar('\\');
  865. Xtwoesc: putchar('\\');
  866. Xsingesc:
  867. X     case '&':case '/':putchar('\\');
  868. X   }
  869. X  putchar(i);
  870. X}
  871. X
  872. Xstatic void putsesc(a)const char*a;
  873. X{ while(*a)
  874. X     putcesc(*a++);
  875. X}
  876. X
  877. Xstatic void pname(name)const char*const name;
  878. X{ putchar('s');putchar('/');putchar('\\');putchar('+');putsesc(name);
  879. X  putchar('\\');putchar('+');putchar('/');
  880. X}
  881. X
  882. Xstatic void pnr(name,value)const char*const name;const long value;
  883. X{ pname(name);printf("%ld/g\n",value);
  884. X}
  885. X
  886. Xstatic void plist(name,preamble,list,postamble,ifno,andor)
  887. X const char*const name,*const preamble,*const postamble,*const ifno,
  888. X *const andor;const char*const*list;
  889. X{ pname(name);
  890. X  if(!*list)
  891. X     putsesc(ifno);
  892. X  else
  893. X   { putsesc(preamble);goto jin;
  894. X     do
  895. X      { putsesc(list[1]?", ":andor);
  896. Xjin:    putsesc(*list);
  897. X      }
  898. X     while(*++list);
  899. X     putsesc(postamble);
  900. X   }
  901. X  puts("/g");
  902. X}
  903. X
  904. Xstatic void ps(name,value)const char*const name,*const value;
  905. X{ pname(name);putsesc(value);puts("/g");
  906. X}
  907. X
  908. Xstatic void pc(name,value)const char*const name;const int value;
  909. X{ pname(name);putcesc(value);puts("/g");
  910. X}
  911. X
  912. Xmain P((void))
  913. X{ char*p,*q;
  914. X#ifdef CF_no_procmail_yet
  915. X  ps("CF_procmail","If procmail is\1\
  916. X.I not\1\
  917. Xinstalled globally as the default mail delivery agent (ask your system \
  918. Xadministrator), you have to make sure it is invoked when your mail arrives.");
  919. X#else
  920. X  ps("CF_procmail","Instead of using the system provided invocation of \
  921. Xprocmail when mail arrives, you can control the invokation of procmail \
  922. Xyourself.");
  923. X#endif
  924. X#ifndef MAILBOX_SEPARATOR
  925. X  ps("DOT_FORWARD",".forward");
  926. X  ps("FW_content",
  927. X   "\"|IFS=' ';exec /usr/local/bin/procmail #YOUR_LOGIN_NAME\"");
  928. X#else
  929. X  ps("DOT_FORWARD",".maildelivery");
  930. X  ps("FW_content",
  931. X   "* - | ? \"IFS=' ';exec /usr/local/bin/procmail #YOUR_LOGIN_NAME\"");
  932. X#endif
  933. X  plist("PRESTENV","\1.PP\1Other preset environment variables are "
  934. X   ,prestenv,".",""," and ");
  935. X  plist("KEEPENV",", except for the values of ",keepenv,"",""," and ");
  936. X  plist("TRUSTED_IDS",
  937. X   ", and procmail is invoked with one of the following user or group ids: ",
  938. X   trusted_ids,",",""," or ");
  939. X  plist("KERNEL_LOCKING",
  940. X   "consistenly uses the following kernel locking strategies: ",krnllocks,"",
  941. X   "doesn't use any additional kernel locking strategies"," and ");
  942. X#ifdef LD_ENV_FIX
  943. X  ps("LD_ENV_FIX","\1.PP\1For security reasons, procmail will wipe out all\
  944. X environment variables starting with LD_ upon startup.");
  945. X#else
  946. X  ps("LD_ENV_FIX","");
  947. X#endif
  948. X#ifdef NO_USER_TO_LOWERCASE_HACK
  949. X  ps("UPPERCASE_USERNAMES","\1.PP\1If the standard\1.BR getpwnam() (3)\1\
  950. Xis case sensitive, and some users have login names with uppercase letters in\
  951. X them, procmail will be unable to deliver mail to them, unless started with\
  952. X their uid.");
  953. X#else
  954. X  ps("UPPERCASE_USERNAMES","");
  955. X#endif
  956. X  ps("SYSTEM_MBOX",SYSTEM_MBOX);
  957. X#ifdef console
  958. X  ps("pconsole","appear on\1.BR ");
  959. X  ps("console",console);
  960. X  ps("aconsole"," .");
  961. X#else
  962. X  ps("pconsole","be mailed back to the ");
  963. X  ps("console","sender");
  964. X  ps("aconsole",".");
  965. X#endif
  966. X  pname("INIT_UMASK");printf("0%lo/g\n",INIT_UMASK);
  967. X  pn("DEFlinebuf",DEFlinebuf);
  968. X  ps("BOGUSprefix",BOGUSprefix);
  969. X  ps("PROCMAILRC",PROCMAILRC);
  970. X  pn("HOSTNAMElen",HOSTNAMElen);
  971. X  pn("DEFsuspend",DEFsuspend);
  972. X  pn("DEFlocksleep",DEFlocksleep);
  973. X  ps("TOkey",TOkey);
  974. X  ps("TOsubstitute",TOsubstitute);
  975. X  ps("FROMDkey",FROMDkey);
  976. X  ps("FROMDsubstitute",FROMDsubstitute);
  977. X  ps("DEFshellmetas",DEFshellmetas);
  978. X  ps("DEFmaildir",DEFmaildir);
  979. X  ps("DEFdefault",DEFdefault);
  980. X  ps("DEFdefaultlock",strchr(DEFdefaultlock,'=')+1);
  981. X  ps("DEFmsgprefix",DEFmsgprefix);
  982. X  ps("DEFsendmail",DEFsendmail);
  983. X  ps("DEFlockext",DEFlockext);
  984. X  ps("DEFshellflags",DEFshellflags);
  985. X  pn("DEFlocktimeout",DEFlocktimeout);
  986. X  pn("DEFtimeout",DEFtimeout);
  987. X  pn("DEFnoresretry",DEFnoresretry);
  988. X  ps("COMSAThost",COMSAThost);
  989. X  ps("COMSATservice",COMSATservice);
  990. X  ps("COMSATprotocol",COMSATprotocol);
  991. X  ps("COMSATxtrsep",COMSATxtrsep);
  992. X  pc("SERV_ADDRsep",SERV_ADDRsep);
  993. X  ps("DEFcomsat",DEFcomsat);
  994. X  ps("BinSh",BinSh);
  995. X  ps("RootDir",RootDir);
  996. X  pc("MCDIRSEP",*MCDIRSEP);
  997. X  pc("chCURDIR",chCURDIR);
  998. X  pc("HELPOPT1",HELPOPT1);
  999. X  pc("HELPOPT2",HELPOPT2);
  1000. X  pc("VERSIONOPT",VERSIONOPT);
  1001. X  pc("PRESERVOPT",PRESERVOPT);
  1002. X  pc("TEMPFAILOPT",TEMPFAILOPT);
  1003. X  pc("FROMWHOPT",FROMWHOPT);
  1004. X  pc("ALTFROMWHOPT",ALTFROMWHOPT);
  1005. X  pc("DELIVEROPT",DELIVEROPT);
  1006. X  pn("MINlinebuf",MINlinebuf);
  1007. X  ps("FROM",FROM);
  1008. X  pc("HEAD_GREP",RECFLAGS[HEAD_GREP]);
  1009. X  pc("BODY_GREP",RECFLAGS[BODY_GREP]);
  1010. X  pc("DISTINGUISH_CASE",RECFLAGS[DISTINGUISH_CASE]);
  1011. X  pc("ALSO_NEXT_RECIPE",RECFLAGS[ALSO_NEXT_RECIPE]);
  1012. X  pc("ALSO_N_IF_SUCC",RECFLAGS[ALSO_N_IF_SUCC]);
  1013. X  pc("PASS_HEAD",RECFLAGS[PASS_HEAD]);
  1014. X  pc("PASS_BODY",RECFLAGS[PASS_BODY]);
  1015. X  pc("FILTER",RECFLAGS[FILTER]);
  1016. X  pc("CONTINUE",RECFLAGS[CONTINUE]);
  1017. X  pc("WAIT_EXIT",RECFLAGS[WAIT_EXIT]);
  1018. X  pc("WAIT_EXIT_QUIET",RECFLAGS[WAIT_EXIT_QUIET]);
  1019. X  pc("IGNORE_WRITERR",RECFLAGS[IGNORE_WRITERR]);
  1020. X  ps("FROM_EXPR",FROM_EXPR);
  1021. X  pc("UNIQ_PREFIX",UNIQ_PREFIX);
  1022. X  pc("ESCAP",ESCAP);
  1023. X  ps("UNKNOWN",UNKNOWN);
  1024. X  ps("OLD_PREFIX",OLD_PREFIX);
  1025. X  pc("FM_SKIP",FM_SKIP);
  1026. X  pc("FM_TOTAL",FM_TOTAL);
  1027. X  pc("FM_BOGUS",FM_BOGUS);
  1028. X  pc("FM_CONCATENATE",FM_CONCATENATE);
  1029. X  pc("FM_FORCE",FM_FORCE);
  1030. X  pc("FM_REPLY",FM_REPLY);
  1031. X  pc("FM_KEEPB",FM_KEEPB);
  1032. X  pc("FM_TRUST",FM_TRUST);
  1033. X  pc("FM_SPLIT",FM_SPLIT);
  1034. X  pc("FM_NOWAIT",FM_NOWAIT);
  1035. X  pc("FM_EVERY",FM_EVERY);
  1036. X  pc("FM_MINFIELDS",FM_MINFIELDS);
  1037. X  pn("DEFminfields",DEFminfields);
  1038. X  pc("FM_DIGEST",FM_DIGEST);
  1039. X  pc("FM_QUIET",FM_QUIET);
  1040. X  pc("FM_EXTRACT",FM_EXTRACT);
  1041. X  pc("FM_EXTRC_KEEP",FM_EXTRC_KEEP);
  1042. X  pc("FM_ADD_IFNOT",FM_ADD_IFNOT);
  1043. X  pc("FM_ADD_ALWAYS",FM_ADD_ALWAYS);
  1044. X  pc("FM_REN_INSERT",FM_REN_INSERT);
  1045. X  pc("FM_DEL_INSERT",FM_DEL_INSERT);
  1046. X  pc("FM_ReNAME",FM_ReNAME);
  1047. X  pn("EX_OK",EX_OK);
  1048. X  *(p=strchr(strchr(q=strchr(pm_version,' ')+1,' ')+1,' '))='\0';p++;
  1049. X  ps("PM_VERSION",q);
  1050. X  ps("MY_MAIL_ADDR",skltmark(1,&p));
  1051. X  ps("MY_ALT_MAIL_ADDR",skltmark(0,&p));
  1052. X  ps("PM_MAILINGLIST",skltmark(2,&p));
  1053. X  ps("PM_MAILINGLISTR",skltmark(2,&p));
  1054. X  return EX_OK;
  1055. X}
  1056. END_OF_FILE
  1057. if test 7000 -ne `wc -c <'procmail280/src/manconf.c'`; then
  1058.     echo shar: \"'procmail280/src/manconf.c'\" unpacked with wrong size!
  1059. fi
  1060. # end of 'procmail280/src/manconf.c'
  1061. fi
  1062. if test -f 'procmail280/src/pipes.c' -a "${1}" != "-c" ; then 
  1063.   echo shar: Will not clobber existing file \"'procmail280/src/pipes.c'\"
  1064. else
  1065. echo shar: Extracting \"'procmail280/src/pipes.c'\" \(7343 characters\)
  1066. sed "s/^X//" >'procmail280/src/pipes.c' <<'END_OF_FILE'
  1067. X/************************************************************************
  1068. X *    Routines related to setting up pipes and filters        *
  1069. X *                                    *
  1070. X *    Copyright (c) 1990-1992, S.R. van den Berg, The Netherlands    *
  1071. X *    #include "README"                        *
  1072. X ************************************************************************/
  1073. X#ifdef RCS
  1074. Xstatic /*const*/char rcsid[]=
  1075. X "$Id: pipes.c,v 1.12 1993/01/19 11:55:20 berg Exp $";
  1076. X#endif
  1077. X#include "procmail.h"
  1078. X#include "robust.h"
  1079. X#include "shell.h"
  1080. X#include "misc.h"
  1081. X#include "pipes.h"
  1082. X#include "common.h"
  1083. X#include "cstdio.h"
  1084. X#include "goodies.h"
  1085. X#include "mailfold.h"
  1086. X
  1087. Xpid_t pidchild;
  1088. Xvolatile time_t alrmtime;
  1089. Xstatic char*lastexec,*backblock;
  1090. Xstatic long backlen;           /* length of backblock, filter recovery block */
  1091. Xstatic pid_t pidfilt;
  1092. Xstatic pipw,pbackfd[2];                   /* the emergency backpipe :-) */
  1093. X
  1094. Xvoid inittmout(progname)const char*const progname;
  1095. X{ lastexec=cstr(lastexec,progname);
  1096. X  alrmtime=timeoutv?time((time_t*)0)+(unsigned)timeoutv:0;
  1097. X  alarm((unsigned)timeoutv);
  1098. X}
  1099. X
  1100. Xvoid ftimeout P((void))
  1101. X{ alarm(0);alrmtime=0;
  1102. X  if(pidchild>0&&!kill(pidchild,SIGTERM))       /* careful, killing again */
  1103. X    nlog("Timeout, terminating"),logqnl(lastexec);
  1104. X  signal(SIGALRM,(void(*)())ftimeout);
  1105. X}
  1106. X
  1107. Xstatic void stermchild P((void))
  1108. X{ if(pidfilt>0)            /* don't kill what is not ours, we might be root */
  1109. X     kill(pidfilt,SIGTERM);
  1110. X  if(!Stdout)
  1111. X   { nlog("Rescue of unfiltered data ");
  1112. X     if(dump(PWRB,backblock,backlen))      /* pump data back via the backpipe */
  1113. X    elog("failed\n");
  1114. X     else
  1115. X    elog("succeeded\n");
  1116. X   }
  1117. X  exit(lexitcode);
  1118. X}
  1119. X
  1120. Xstatic void childsetup P((void))
  1121. X{ lexitcode=EX_UNAVAILABLE;signal(SIGTERM,(void(*)())stermchild);
  1122. X  signal(SIGINT,(void(*)())stermchild);signal(SIGHUP,(void(*)())stermchild);
  1123. X  signal(SIGQUIT,(void(*)())stermchild);closerc();
  1124. X}
  1125. X
  1126. Xstatic void getstdin(pip)const int pip;
  1127. X{ rclose(STDIN);rdup(pip);rclose(pip);
  1128. X}
  1129. X
  1130. Xstatic void callnewprog(newname)const char*const newname;
  1131. X{ if(sh)                     /* should we start a shell? */
  1132. X   { const char*newargv[4];
  1133. X     yell(executing,newname);newargv[3]=0;newargv[2]=newname;
  1134. X     newargv[1]=tgetenv(shellflags);*newargv=tgetenv(shell);shexec(newargv);
  1135. X   }
  1136. X  ;{ register const char*p;int argc;const char**newargv;
  1137. X     argc=1;p=newname;         /* If no shell, chop up the arguments ourselves */
  1138. X     if(verbose)
  1139. X      { nlog(executing);elog(oquote);goto no_1st_comma;
  1140. X      }
  1141. X     do                         /* show chopped up command line */
  1142. X      { if(verbose)
  1143. X     { elog(",");
  1144. Xno_1st_comma:
  1145. X       elog(p);
  1146. X     }
  1147. X    while(*p++);
  1148. X      }
  1149. X     while(argc++,*p!=TMNATE);
  1150. X     if(verbose)
  1151. X    elog(cquote);                      /* allocate argv array */
  1152. X     newargv=malloc(argc*sizeof*newargv);p=newname;argc=0;
  1153. X     do
  1154. X      { newargv[argc++]=p;
  1155. X    while(*p++);
  1156. X      }
  1157. X     while(*p!=TMNATE);
  1158. X     newargv[argc]=0;shexec(newargv);
  1159. X   }
  1160. X}
  1161. X
  1162. Xpipthrough(line,source,len)char*line,*source;const long len;
  1163. X{ int pinfd[2],poutfd[2];
  1164. X  if(Stdout)
  1165. X     PWRB=PRDB= -1;
  1166. X  else
  1167. X     rpipe(pbackfd);
  1168. X  rpipe(pinfd);                         /* main pipes setup */
  1169. X  if(!(pidchild=sfork()))            /* create a sending procmail */
  1170. X   { backblock=source;backlen=len;childsetup();rclose(PRDI);rclose(PRDB);
  1171. X     rpipe(poutfd);rclose(STDOUT);
  1172. X     if(!(pidfilt=sfork()))                /* create the filter */
  1173. X      { rclose(PWRB);rclose(PWRO);rdup(PWRI);rclose(PWRI);getstdin(PRDO);
  1174. X    callnewprog(line);
  1175. X      }
  1176. X     rclose(PWRI);rclose(PRDO);
  1177. X     if(forkerr(pidfilt,line))
  1178. X    rclose(PWRO),stermchild();
  1179. X     if(dump(PWRO,source,len)&&!ignwerr)  /* send in the text to be filtered */
  1180. X    writeerr(line),lexitcode=EX_IOERR,stermchild();
  1181. X     if(pwait&&waitfor(pidfilt)!=EX_OK)     /* check the exitcode of the filter */
  1182. X      { pidfilt=0;
  1183. X    if(!(pwait&2))                  /* do we put it on report? */
  1184. X       progerr(line);
  1185. X    stermchild();
  1186. X      }
  1187. X     rclose(PWRB);exit(EX_OK);              /* allow parent to proceed */
  1188. X   }
  1189. X  rclose(PWRB);rclose(PWRI);getstdin(PRDI);
  1190. X  if(forkerr(pidchild,procmailn))
  1191. X     return 1;
  1192. X  if(Stdout)
  1193. X   { retStdout(readdyn(Stdout,&Stdfilled));
  1194. X     if(pwait)
  1195. X    return pipw;
  1196. X   }
  1197. X  return 0;            /* we stay behind to read back the filtered text */
  1198. X}
  1199. X
  1200. Xlong pipin(line,source,len)char*const line;char*source;long len;
  1201. X{ int poutfd[2];
  1202. X  rpipe(poutfd);
  1203. X  if(!(pidchild=sfork()))                    /* spawn program */
  1204. X     rclose(PWRO),closerc(),getstdin(PRDO),callnewprog(line);
  1205. X  rclose(PRDO);
  1206. X  if(forkerr(pidchild,line))
  1207. X     return 1;                        /* dump mail in the pipe */
  1208. X  if((len=dump(PWRO,source,len))&&(!ignwerr||(len=0)))
  1209. X     writeerr(line);               /* pipe was shut in our face, get mad */
  1210. X  if(pwait&&waitfor(pidchild)!=EX_OK)        /* optionally check the exitcode */
  1211. X   { if(!(pwait&2))                  /* do we put it on report? */
  1212. X    progerr(line);
  1213. X     len=1;
  1214. X   }
  1215. X  pidchild=0;
  1216. X  if(!sh)
  1217. X     concatenate(line);
  1218. X  if(asgnlastf)
  1219. X     asgnlastf=0,lastfolder=cstr(lastfolder,line);
  1220. X  return len;
  1221. X}
  1222. X
  1223. Xchar*readdyn(bf,filled)char*bf;long*const filled;
  1224. X{ int i;long oldsize;
  1225. X  oldsize= *filled;goto jumpin;
  1226. X  do
  1227. X   { *filled+=i;                /* change listed buffer size */
  1228. Xjumpin:
  1229. X#ifdef SMALLHEAP
  1230. X     if((size_t)*filled>=(size_t)(*filled+BLKSIZ))
  1231. X    lcking|=lck_MEMORY,nomemerr();
  1232. X#endif
  1233. X     bf=realloc(bf,*filled+BLKSIZ);    /* dynamically adjust the buffer size */
  1234. Xjumpback:;
  1235. X   }
  1236. X  while(0<(i=rread(STDIN,bf+*filled,BLKSIZ)));            /* read mail */
  1237. X  if(pidchild>0)
  1238. X   { if(!Stdout)
  1239. X      { getstdin(PRDB);                   /* filter ready, get backpipe */
  1240. X    if(1==rread(STDIN,buf,1))              /* backup pipe closed? */
  1241. X     { bf=realloc(bf,(*filled=oldsize+1)+BLKSIZ);bf[oldsize]= *buf;
  1242. X       if(pwait)
  1243. X          waitfor(pidchild);
  1244. X       pidchild=0;goto jumpback;           /* filter goofed, rescue data */
  1245. X     }
  1246. X      }
  1247. X     if(pwait)
  1248. X    pipw=waitfor(pidchild);              /* reap your child in any case */
  1249. X   }
  1250. X  pidchild=0;                    /* child must be gone by now */
  1251. X  if(!*filled)
  1252. X     return realloc(bf,1);             /* +1 for housekeeping purposes */
  1253. X  return realloc(bf,*filled+1);            /* minimise the buffer space */
  1254. X}
  1255. X
  1256. Xchar*fromprog(name,dest,max)char*name;char*const dest;size_t max;
  1257. X{ int pinfd[2],poutfd[2];int i;char*p;
  1258. X  concon('\n');rpipe(pinfd);inittmout(name);
  1259. X  if(!(pidchild=sfork()))            /* create a sending procmail */
  1260. X   { Stdout=name;childsetup();rclose(PRDI);rpipe(poutfd);rclose(STDOUT);
  1261. X     if(!(pidfilt=sfork()))                 /* spawn program/filter */
  1262. X    rclose(PWRO),rdup(PWRI),rclose(PWRI),getstdin(PRDO),callnewprog(name);
  1263. X     rclose(PWRI);rclose(PRDO);
  1264. X     if(forkerr(pidfilt,name))
  1265. X    rclose(PWRO),stermchild();
  1266. X     dump(PWRO,themail,filled);waitfor(pidfilt);exit(lexitcode);
  1267. X   }
  1268. X  rclose(PWRI);p=dest;
  1269. X  if(!forkerr(pidchild,name))
  1270. X   { name=tstrdup(name);
  1271. X     while(0<(i=rread(PRDI,p,max))&&(p+=i,max-=i));        /* read its lips */
  1272. X     if(0<rread(PRDI,p,1))
  1273. X    nlog("Excessive output quenched from"),logqnl(name);
  1274. X     rclose(PRDI);free(name);
  1275. X     while(--p>=dest&&*p=='\n');    /* trailing newlines should be discarded */
  1276. X     p++;waitfor(pidchild);
  1277. X   }
  1278. X  else
  1279. X     rclose(PRDI);
  1280. X  pidchild=0;*p='\0';return p;
  1281. X}
  1282. X
  1283. Xvoid exectrap(tp)const char*const tp;
  1284. X{ if(*tp)
  1285. X   { int newret;
  1286. X     metaparse(tp);inittmout(buf);
  1287. X     if(!(pidchild=sfork()))         /* connect stdout to stderr before exec */
  1288. X      { signal(SIGTERM,SIG_DFL);signal(SIGINT,SIG_DFL);signal(SIGHUP,SIG_DFL);
  1289. X    signal(SIGQUIT,SIG_DFL);rclose(STDOUT);rdup(STDERR);callnewprog(buf);
  1290. X      }
  1291. X     if(!forkerr(pidchild,buf)&&(newret=waitfor(pidchild))!=EX_OK)
  1292. X    retval=newret;                   /* supersede the return value */
  1293. X   }
  1294. X}
  1295. END_OF_FILE
  1296. if test 7343 -ne `wc -c <'procmail280/src/pipes.c'`; then
  1297.     echo shar: \"'procmail280/src/pipes.c'\" unpacked with wrong size!
  1298. fi
  1299. # end of 'procmail280/src/pipes.c'
  1300. fi
  1301. echo shar: End of archive 5 \(of 11\).
  1302. cp /dev/null ark5isdone
  1303. MISSING=""
  1304. for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
  1305.     if test ! -f ark${I}isdone ; then
  1306.     MISSING="${MISSING} ${I}"
  1307.     fi
  1308. done
  1309. if test "${MISSING}" = "" ; then
  1310.     echo You have unpacked all 11 archives.
  1311.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1312. else
  1313.     echo You still need to unpack the following archives:
  1314.     echo "        " ${MISSING}
  1315. fi
  1316. ##  End of shell archive.
  1317. exit 0
  1318. -- 
  1319. Sincerely,                                  berg@pool.informatik.rwth-aachen.de
  1320.            Stephen R. van den Berg (AKA BuGless).    berg@physik.tu-muenchen.de
  1321.  
  1322. "Be spontaneous!"
  1323.  
  1324. exit 0 # Just in case...
  1325.