home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / reviewed / volume01 / deliver / patch09 < prev    next >
Internet Message Format  |  1992-02-05  |  29KB

  1. From: Chip Salzenberg <chip@tct.com>
  2. Subject:  v01i049:  deliver - (Ver. 2.1) flexible E-Mail delivery, Patch09
  3. Newsgroups: comp.sources.reviewed
  4. Approved: csr@calvin.dgbt.doc.ca
  5.  
  6. Submitted-by: Chip Salzenberg <chip@tct.com>
  7. Posting-number: Volume 1, Issue 49
  8. Archive-name: deliver/patch09
  9. Patch-To: deliver: Volume 1, Issue 09-14
  10.  
  11.  
  12. NOTE:  This patch contains changes for files in subdirectories.
  13.        When you apply it, be sure to use the "-p" option of patch.
  14.  
  15.  
  16. Changes in patch #9 to Deliver 2.1:
  17.  
  18. 1.  There are new supported configurations: HP-UX 8.x and SCO Xenix.
  19.  
  20. 2.  There is a new documentation file: "Using Deliver With MMDF."
  21.  
  22. 3.  New configuration items:
  23.  
  24.       TEMPDIR
  25.         The directory in which Deliver puts temporary files.  The
  26.         default is "/tmp".  Note that if the filesystem containing
  27.         this directory ever fills up, Deliver will go to pieces.
  28.  
  29.       UUX_DASH_A
  30.         If defined, Deliver uses the "-asender" option of the uux
  31.         program, thus sending failure notices to the original sender.
  32.         This option is defined by default.
  33.  
  34. 4.  Preprocessors that can't do "#if defined(x) + defined(y)" are now
  35.     supported (but cursed).
  36.  
  37. 5.  There was a problem with logging of errors in spawning children.
  38.     The symptom was a scrambled error log, in which several processes
  39.     would overwrite each others' log entries.  Thanks to David G.
  40.     McLane <davidg@aegis.or.jp> for reporting this bug.
  41.  
  42. 6.  Lockfile creation now does the sleep/retry dance only on an error
  43.     of EEXIST (file already exists).  Other errors, such as ENOENT (no
  44.     such file or directory), are considered permanent, and therefore
  45.     are not retried.
  46.  
  47. 7.  A few bits of lint have been removed.
  48.  
  49. 8.  The `make install' actions now work even on systems where the
  50.     shell is so badly broken that the "if" statement can't be used.
  51.  
  52. 9.  The README file now enumerates supported systems in a table, which
  53.     should be easy to read and/or pass on to your friends.  ;-)
  54.  
  55.  
  56. Patch and enjoy.
  57.  
  58. NOTE:  This patch contains changes for files in subdirectories.
  59.        When you apply it, be sure to use the "-p" option of patch.
  60.  
  61. This patch contains changes to the following files:
  62.     patchlevel.h
  63.     INSTALL
  64.     MMDF
  65.     Makefile
  66.     README
  67.     config.h
  68.     copymsg.c
  69.     deliver.8
  70.     deliver.h
  71.     lock.c
  72.     log.c
  73.     main.c
  74.     subs.c
  75.     sysdep.c
  76.     unctime.y
  77.     uucp.c
  78.     conf/finish-os.h
  79.     conf/os-hpux8.h
  80.     conf/os-scoxnx.h
  81.  
  82. Index: patchlevel.h
  83. Prereq: 8
  84. ***************
  85. *** 1 ****
  86. ! #define PATCHLEVEL 8
  87. --- 1 ----
  88. ! #define PATCHLEVEL 9
  89.  
  90. Index: INSTALL
  91. Prereq: 1.4
  92. ***************
  93. *** 1,3 ****
  94. ! $Id: INSTALL,v 1.4 1991/08/05 19:06:23 chip Exp $
  95.   
  96.   
  97. --- 1,3 ----
  98. ! $Id: INSTALL,v 1.5 1991/11/25 21:29:01 chip Exp $
  99.   
  100.   
  101. ***************
  102. *** 9,19 ****
  103.   
  104.   Before running "make install", be logged in as root or else su'd to
  105. ! root.  Also, check that the Makefile definitions for BINDIR and GROUP
  106. ! are acceptable.  BINDIR specifies the target directory for program
  107. ! installation.  GROUP specifies the group that should own the installed
  108. ! programs.
  109.   
  110.   Running "make install" copies the "deliver" and "header" binaries to
  111. ! the directory specified by BINDIR.  It also changes the group of the
  112.   installed Deliver binary to the group specified by GROUP.  Finally, it
  113.   changes the permissions on the installed Deliver binary to be setuid
  114. --- 9,19 ----
  115.   
  116.   Before running "make install", be logged in as root or else su'd to
  117. ! root.  Also, check that the Makefile definitions for BIN and GROUP are
  118. ! acceptable.  BIN specifies the target directory for the installed
  119. ! program binaries.  GROUP specifies the group that should own the
  120. ! installed program binaries.
  121.   
  122.   Running "make install" copies the "deliver" and "header" binaries to
  123. ! the directory specified by BIN.  It also changes the group of the
  124.   installed Deliver binary to the group specified by GROUP.  Finally, it
  125.   changes the permissions on the installed Deliver binary to be setuid
  126.  
  127. Index: MMDF
  128. ***************
  129. *** 0 ****
  130. --- 1,44 ----
  131. + $Id: MMDF,v 1.3 1992/01/20 20:37:06 chip Exp $
  132. +                USING DELIVER WITH MMDF
  133. + MMDF can be configured to use Deliver in two distinct ways.  The MMDF
  134. + administrator can set up an alias for each user.  Or, each user can
  135. + create a maildelivery file for herself.
  136. + To use the administrator alias approach, log in as `mmdf' and edit the
  137. + file `table/alias.list'.  For each user, add a line like
  138. +     user    "user|/usr/bin/deliver user"
  139. + where `user' is the name of the user to whom mail will be delivered.
  140. + Next, while still logged in as `mmdf', run `table/dbmbuild'.  Please
  141. + note that Deliver will execute in the user's context.  See the MMDF
  142. + administrators guide for more details.
  143. + The second possibility is for each user to decide for herself whether
  144. + to use Deliver.  Any user may create an MMDF maildelivery file in her
  145. + home directory.  This file is named $HOME/.maildelivery.
  146. + Each line of a user's maildelivery file describes how to handle some
  147. + or all messages addressed to that user.  To use Deliver for personal
  148. + mail delivery, a user's maildeliveryfile must include a line like:
  149. +     * - | A     /usr/bin/deliver user
  150. + The fields are white-space separated.  They tell MMDF to pass all
  151. + messages (*) without exception (-) via pipe (|) to the given program,
  152. + and to accept delivery (A).  Here again, Deliver will execute in the
  153. + user's context.
  154. + Note that in both cases, the MMDF modifies the From_ header line to
  155. + reflect the name of the user who effected delivery.
  156. +         
  157. + [ Jan-Piet Mens <jpm@Logix.DE> originally wrote this document,
  158. +   but it has been heavily edited by Chip Salzenberg <chip@tct.com>. ]
  159.  
  160. Index: Makefile
  161. Prereq: 1.10
  162. ***************
  163. *** 1,3 ****
  164. ! # $Id: Makefile,v 1.10 1991/08/21 22:09:15 chip Exp $
  165.   #
  166.   # Makefile for deliver
  167. --- 1,3 ----
  168. ! # $Id: Makefile,v 1.12 1991/12/25 22:03:19 chip Exp $
  169.   #
  170.   # Makefile for deliver
  171. ***************
  172. *** 101,105 ****
  173.   #
  174.   
  175. ! DOCS    = README INSTALL SENDMAIL deliver.8
  176.   MF    = Makefile
  177.   
  178. --- 101,105 ----
  179.   #
  180.   
  181. ! DOCS    = README INSTALL SENDMAIL MMDF deliver.8
  182.   MF    = Makefile
  183.   
  184. ***************
  185. *** 151,165 ****
  186.   
  187.   install: deliver header uid
  188. !     @if test 2 -ne `./uid -uU | fgrep '(root)' | wc -l`; \
  189. !     then \
  190. !         echo "Sorry!  You must be root to install deliver."; \
  191. !         exit 1; \
  192. !     else \
  193. !         true; \
  194. !     fi
  195. !     @if test -n "$(DELHOME)"; \
  196. !     then \
  197. !         h="$(DELHOME)" ; \
  198. !         for d in $$h $$h/bin $$h/lib $$h/log; \
  199.           do \
  200.               test -d $$d && continue; \
  201. --- 151,162 ----
  202.   
  203.   install: deliver header uid
  204. !     @set -- `./uid -uU | fgrep '(root)' | wc -l`; \
  205. !     case "$$1" in \
  206. !       2) ;; \
  207. !       *)  echo "Sorry!  You must be root to install deliver."; exit 1 ;; \
  208. !      esac
  209. !     @h="$(DELHOME)"; \
  210. !      case "$$h" in \
  211. !       ?*)    for d in $$h $$h/bin $$h/lib $$h/log; \
  212.           do \
  213.               test -d $$d && continue; \
  214. ***************
  215. *** 168,175 ****
  216.                 chgrp $(GROUP) $$d; \
  217.                 chmod 755 $$d ) || exit 1; \
  218. !         done; \
  219. !     else \
  220. !         true; \
  221. !     fi
  222.       $(COPY) deliver $(BIN)/deliver
  223.       chgrp $(GROUP) $(BIN)/deliver
  224. --- 165,170 ----
  225.                 chgrp $(GROUP) $$d; \
  226.                 chmod 755 $$d ) || exit 1; \
  227. !         done ;; \
  228. !      esac
  229.       $(COPY) deliver $(BIN)/deliver
  230.       chgrp $(GROUP) $(BIN)/deliver
  231.  
  232. Index: README
  233. Prereq: 1.9
  234. ***************
  235. *** 1,4 ****
  236. ! $Id: README,v 1.9 1991/10/30 21:55:52 chip Exp $
  237. ! This is the README file for Deliver 2.1.08.
  238.   
  239.   
  240. --- 1,4 ----
  241. ! $Id: README,v 1.10 1991/11/21 15:34:13 chip Exp $
  242. ! This is the README file for Deliver 2.1.09.
  243.   
  244.   
  245. ***************
  246. *** 31,37 ****
  247.   
  248.   
  249. ! Deliver runs under SCO UNIX 3.2, SCO Xenix/286 and Xenix/386 2.x and
  250. ! 3.x, AIX 3.1, SunOS 3.x and 4.x, generic UNIX System V, 4.3 BSD, V7
  251. ! (!) and Coherent (!!).
  252.   
  253.   Configuration headers for various operating systems are found in
  254. --- 31,52 ----
  255.   
  256.   
  257. ! Deliver runs under (in alpabetical order):
  258. !     Op. Sys.              Vendor            Comments
  259. !     ------------------    --------------    ------------------------------
  260. !     3B1 System V          AT&T
  261. !     AIX 3.1               IBM
  262. !     BSD                   generic
  263. !     Coherent              Mark Williams
  264. !     CX/UX                 Harris
  265. !     HP-UX 8.x             HP                using cc or c89
  266. !     NeWS-OS 3.2           Sony
  267. !     NextOS 2.x            NeXT
  268. !     SCO UNIX 3.2          SCO               using cc, rcc or gcc
  269. !     SCO Xenix 2.x, 3.x    SCO               both Xenix/286 and Xenix/386
  270. !     SunOS 3.x, 4.x        Sun
  271. !     System V              (generic)
  272. !     System V r4           (generic)
  273. !     V7                    AT&T
  274.   
  275.   Configuration headers for various operating systems are found in
  276.  
  277. Index: config.h
  278. Prereq: 1.6
  279. ***************
  280. *** 1,3 ****
  281. ! /* $Id: config.h,v 1.6 1991/10/30 21:50:44 chip Exp $
  282.    *
  283.    * Deliver configuration.
  284. --- 1,3 ----
  285. ! /* $Id: config.h,v 1.8 1992/01/20 20:36:05 chip Exp $
  286.    *
  287.    * Deliver configuration.
  288. ***************
  289. *** 4,7 ****
  290. --- 4,14 ----
  291.    *
  292.    * $Log: config.h,v $
  293. +  * Revision 1.8  1992/01/20  20:36:05  chip
  294. +  * Allow for UUX_OPTS to be a list.
  295. +  * Support UUX_DASH_A, so UUCP failure messages are mailed to original sender.
  296. +  *
  297. +  * Revision 1.7  1991/11/26  16:50:42  chip
  298. +  * Add TEMPDIR.
  299. +  *
  300.    * Revision 1.6  1991/10/30  21:50:44  chip
  301.    * Add support for MMDF.
  302. ***************
  303. *** 95,107 ****
  304.    *
  305.    * UUCP_NAMESIZE        Maximum size of a UUCP system name.
  306. -  * UUX_OPTS             Options for uux; "-r" means queue but don't call.
  307.    * UUX_ARGCOUNT         Maximum count of arguments for uux.
  308.    * UUX_ARGSIZE          Maximum total size of arguments for uux.
  309.    */
  310.   
  311.   #define UUCP_NAMESIZE 16
  312. - #define UUX_OPTS      "-r"
  313.   #define UUX_ARGCOUNT  16
  314.   #define UUX_ARGSIZE   512
  315.   
  316.   /*----------------------------------------------------------------------
  317. --- 102,117 ----
  318.    *
  319.    * UUCP_NAMESIZE        Maximum size of a UUCP system name.
  320.    * UUX_ARGCOUNT         Maximum count of arguments for uux.
  321.    * UUX_ARGSIZE          Maximum total size of arguments for uux.
  322. +  * UUX_OPTS             A comma-separated list of options for uux.
  323. +  *                        Option "-r" often means: queue, but don't call.
  324. +  * UUX_DASH_A           Define if your uux understands "-asender".
  325.    */
  326.   
  327.   #define UUCP_NAMESIZE 16
  328.   #define UUX_ARGCOUNT  16
  329.   #define UUX_ARGSIZE   512
  330. + #define UUX_OPTS      "-r"
  331. + #define UUX_DASH_A
  332.   
  333.   /*----------------------------------------------------------------------
  334. ***************
  335. *** 185,188 ****
  336. --- 195,207 ----
  337.   
  338.   /*----------------------------------------------------------------------
  339. +  * Directory for temporary files.
  340. +  *
  341. +  * If the filesystem containing this directory becomes full, Deliver
  342. +  * will fail ungracefully.
  343. +  */
  344. + #define TEMPDIR        "/tmp"
  345. + /*----------------------------------------------------------------------
  346.    * Log file names.
  347.    * Errors and warnings are output to stderr and to the error log file.
  348. ***************
  349. *** 191,194 ****
  350. --- 210,215 ----
  351.    *
  352.    * Define LOGLOCK to be the temp file controlling access to log files.
  353. +  * This macro does not use TEMPDIR because log files may be shared with
  354. +  * other systems; if so, LOGLOCK must also be shared.
  355.    */
  356.   
  357.  
  358. Index: copymsg.c
  359. Prereq: 1.5
  360. ***************
  361. *** 1,3 ****
  362. ! /* $Id: copymsg.c,v 1.5 1991/10/23 20:02:46 chip Exp $
  363.    *
  364.    * Take the message from standard input and write it to two temp files,
  365. --- 1,3 ----
  366. ! /* $Id: copymsg.c,v 1.6 1991/11/12 20:43:30 chip Exp $
  367.    *
  368.    * Take the message from standard input and write it to two temp files,
  369. ***************
  370. *** 5,8 ****
  371. --- 5,11 ----
  372.    *
  373.    * $Log: copymsg.c,v $
  374. +  * Revision 1.6  1991/11/12  20:43:30  chip
  375. +  * Ignore return value of fflush().
  376. +  *
  377.    * Revision 1.5  1991/10/23  20:02:46  chip
  378.    * Use tdup().
  379. ***************
  380. *** 336,340 ****
  381.       for (t = T_HDR; t <= T_BODY; ++t)
  382.       {
  383. !     fflush(dfp[t]);
  384.       if (ferror(dfp[t]))
  385.       {
  386. --- 339,343 ----
  387.       for (t = T_HDR; t <= T_BODY; ++t)
  388.       {
  389. !     (void) fflush(dfp[t]);
  390.       if (ferror(dfp[t]))
  391.       {
  392.  
  393. Index: deliver.8
  394. Prereq: 1.6
  395. ***************
  396. *** 1,26 ****
  397. ! .\" $Id: deliver.8,v 1.6 1991/10/23 20:25:47 chip Exp $
  398.   .\"
  399.   .\" Man page for deliver.
  400.   .\"
  401. ! .\" $Log: deliver.8,v $
  402. ! .\" Revision 1.6  1991/10/23  20:25:47  chip
  403. ! .\" Patch eight.
  404. ! .\"
  405. ! .\" Revision 1.5  1991/08/27  13:43:05  chip
  406. ! .\" New patchlevel (seven).
  407. ! .\"
  408. ! .\" Revision 1.4  1991/08/06  15:03:13  chip
  409. ! .\" Mention new patchlevel (six).
  410. ! .\"
  411. ! .\" Revision 1.3  1991/08/05  19:04:11  chip
  412. ! .\" Improvements suggested by reviewers.
  413. ! .\"
  414. ! .\" Revision 1.2  1991/06/21  12:04:15  chip
  415. ! .\" Patch #5.
  416. ! .\"
  417. ! .\" Revision 1.1  1991/05/13  18:43:49  chip
  418. ! .\" Initial revision
  419. ! .\"
  420. ! .TH DELIVER 8 "Deliver 2.1.08"
  421.   .SH NAME
  422.   deliver \- deliver mail
  423. --- 1,7 ----
  424. ! .\" $Id: deliver.8,v 1.7 1991/11/21 15:34:45 chip Exp $
  425.   .\"
  426.   .\" Man page for deliver.
  427.   .\"
  428. ! .TH DELIVER 8 "Deliver 2.1.09"
  429.   .SH NAME
  430.   deliver \- deliver mail
  431.  
  432. Index: deliver.h
  433. Prereq: 1.7
  434. ***************
  435. *** 1,3 ****
  436. ! /* $Id: deliver.h,v 1.7 1991/10/23 19:47:48 chip Exp $
  437.    *
  438.    * General pull-it-together include file.
  439. --- 1,3 ----
  440. ! /* $Id: deliver.h,v 1.8 1991/11/12 20:44:42 chip Exp $
  441.    *
  442.    * General pull-it-together include file.
  443. ***************
  444. *** 4,7 ****
  445. --- 4,10 ----
  446.    *
  447.    * $Log: deliver.h,v $
  448. +  * Revision 1.8  1991/11/12  20:44:42  chip
  449. +  * Add logsize().
  450. +  *
  451.    * Revision 1.7  1991/10/23  19:47:48  chip
  452.    * Declare errname().
  453. ***************
  454. *** 149,152 ****
  455. --- 152,157 ----
  456.   
  457.   DCLASS addr_class();
  458. + long logsize();
  459.   
  460.   time_t unctime();
  461.  
  462. Index: lock.c
  463. Prereq: 1.5
  464. ***************
  465. *** 1,3 ****
  466. ! /* $Id: lock.c,v 1.5 1991/08/26 18:00:32 chip Exp $
  467.    *
  468.    * Mailbox locking.
  469. --- 1,3 ----
  470. ! /* $Id: lock.c,v 1.6 1991/12/20 18:38:20 chip Exp $
  471.    *
  472.    * Mailbox locking.
  473. ***************
  474. *** 5,8 ****
  475. --- 5,11 ----
  476.    *
  477.    * $Log: lock.c,v $
  478. +  * Revision 1.6  1991/12/20  18:38:20  chip
  479. +  * Lockfile creation only retries if errno is EEXIST.
  480. +  *
  481.    * Revision 1.5  1991/08/26  18:00:32  chip
  482.    * Make minimum name size explicit.
  483. ***************
  484. *** 348,351 ****
  485. --- 351,359 ----
  486.       }
  487.   
  488. +     /* The only error that can be retried is: File exists. */
  489. +     if ((errno_save = errno) != EEXIST)
  490. +         break;
  491.   #else    /* not SAFE_CREATE */
  492.   
  493. ***************
  494. *** 373,379 ****
  495.       }
  496.   
  497. ! #endif    /* not SAFE_CREATE */
  498.   
  499. !     errno_save = errno;
  500.   
  501.       if (verbose && (tries == 0))
  502. --- 381,389 ----
  503.       }
  504.   
  505. !     /* We can't trust errno; so, assume the most benign error. */
  506. !     errno_save = EEXIST;
  507.   
  508. ! #endif    /* not SAFE_CREATE */
  509.   
  510.       if (verbose && (tries == 0))
  511.  
  512. Index: log.c
  513. Prereq: 1.4
  514. ***************
  515. *** 1,3 ****
  516. ! /* $Id: log.c,v 1.4 1991/08/27 15:39:45 chip Exp $
  517.    *
  518.    * Deliver logging.
  519. --- 1,3 ----
  520. ! /* $Id: log.c,v 1.6 1991/11/25 20:49:42 chip Exp $
  521.    *
  522.    * Deliver logging.
  523. ***************
  524. *** 4,7 ****
  525. --- 4,15 ----
  526.    *
  527.    * $Log: log.c,v $
  528. +  * Revision 1.6  1991/11/25  20:49:42  chip
  529. +  * Prettify "Undel.mail" message for home directory of root.
  530. +  *
  531. +  * Revision 1.5  1991/11/12  20:44:47  chip
  532. +  * Use new logsize() function.  Seek to end of log before
  533. +  * writing to it or testing its size, since a child process
  534. +  * might have grown it.
  535. +  *
  536.    * Revision 1.4  1991/08/27  15:39:45  chip
  537.    * Use tmzone().
  538. ***************
  539. *** 69,74 ****
  540.   savelogs()
  541.   {
  542. -     /* If logs weren't kept, forget it. */
  543.       if (!log && !errlog)
  544.       return;
  545. --- 77,80 ----
  546. ***************
  547. *** 76,81 ****
  548.       /* If temporary logs contain anything, append them to real logs. */
  549.   
  550. !     if ((log && ftell(log) > 0)
  551. !     || (errlog && ftell(errlog) > 0))
  552.       {
  553.       if (log_lock() == 0)
  554. --- 82,86 ----
  555.       /* If temporary logs contain anything, append them to real logs. */
  556.   
  557. !     if (logsize(log) || logsize(errlog))
  558.       {
  559.       if (log_lock() == 0)
  560. ***************
  561. *** 120,124 ****
  562.       /* If the file is empty, never mind. */
  563.   
  564. !     if (ftell(fp) == 0)
  565.       {
  566.       (void) fclose(fp);
  567. --- 125,129 ----
  568.       /* If the file is empty, never mind. */
  569.   
  570. !     if (logsize(fp) == 0)
  571.       {
  572.       (void) fclose(fp);
  573. ***************
  574. *** 254,258 ****
  575.       /* If any errors have been logged, record the failed header. */
  576.   
  577. !     if (ftell(errlog) > 0)
  578.       errheader();
  579.   }
  580. --- 259,263 ----
  581.       /* If any errors have been logged, record the failed header. */
  582.   
  583. !     if (logsize(errlog))
  584.       errheader();
  585.   }
  586. ***************
  587. *** 287,293 ****
  588.   
  589.           errstart();
  590. !         (void) fprintf(errlog,
  591. !                "Undelivered mail for %s put in %s/%s\n",
  592. !                d->d_name, home, MBX_UNDEL);
  593.       }
  594.       }
  595. --- 292,298 ----
  596.   
  597.           errstart();
  598. !         (void) fprintf(errlog, "Undelivered mail for %s put in %s/%s\n",
  599. !                d->d_name, (strcmp(home, "/") == 0) ? "" : home,
  600. !                MBX_UNDEL);
  601.       }
  602.       }
  603. ***************
  604. *** 347,353 ****
  605.   errstart()
  606.   {
  607.       /* If we've already written a time stamp, don't do it again. */
  608.   
  609. !     if (!errlog || ftell(errlog) > 0)
  610.       return;
  611.   
  612. --- 352,361 ----
  613.   errstart()
  614.   {
  615. +     if (!errlog)
  616. +     return;
  617.       /* If we've already written a time stamp, don't do it again. */
  618.   
  619. !     if (logsize(errlog))
  620.       return;
  621.   
  622. ***************
  623. *** 367,373 ****
  624.   errdone()
  625.   {
  626.       /* If we never wrote to the error log file, do nothing. */
  627.   
  628. !     if (!errlog || ftell(errlog) == 0)
  629.       return;
  630.   
  631. --- 375,384 ----
  632.   errdone()
  633.   {
  634. +     if (!errlog)
  635. +     return;
  636.       /* If we never wrote to the error log file, do nothing. */
  637.   
  638. !     if (logsize(errlog) == 0)
  639.       return;
  640.   
  641. ***************
  642. *** 422,424 ****
  643. --- 433,456 ----
  644.       if (rec_level == 0)
  645.       (void) fputs("===========================\n\n", fp);
  646. + }
  647. + /*----------------------------------------------------------------------
  648. +  * Report the size of an open log file.
  649. +  * Incidentally, seek to the end.
  650. +  */
  651. + long
  652. + logsize(fp)
  653. + FILE *fp;
  654. + {
  655. +     long pos;
  656. +     if (!fp)
  657. +     return 0L;
  658. +     if (fseek(fp, 0L, 2) == -1)
  659. +     return 0;
  660. +     pos = ftell(fp);
  661. +     return (pos == -1) ? 0 : pos;
  662.   }
  663.  
  664. Index: main.c
  665. Prereq: 1.7
  666. ***************
  667. *** 1,3 ****
  668. ! /* $Id: main.c,v 1.7 1991/10/28 15:45:38 chip Exp $
  669.    *
  670.    * A program to deliver local mail with some flexibility.
  671. --- 1,3 ----
  672. ! /* $Id: main.c,v 1.8 1992/01/20 20:35:14 chip Exp $
  673.    *
  674.    * A program to deliver local mail with some flexibility.
  675. ***************
  676. *** 4,7 ****
  677. --- 4,10 ----
  678.    *
  679.    * $Log: main.c,v $
  680. +  * Revision 1.8  1992/01/20  20:35:14  chip
  681. +  * Eliminate GCC2 warnings about unparenthesized || and &&.
  682. +  *
  683.    * Revision 1.7  1991/10/28  15:45:38  chip
  684.    * Don't throw mail away just because sender address is unsafe.
  685. ***************
  686. *** 383,393 ****
  687.        */
  688.   
  689. !     if (!trusted_user
  690. !     && (strcmp(dfl_sys, sys_deliver) != 0
  691.           || strcmp(dfl_post, post_deliver) != 0
  692.           || strcmp(dfl_err, err_deliver) != 0
  693. !         || strcmp(dfl_user, user_deliver) != 0)
  694. !     || !mailer_user
  695. !     && (hostopt && strcmp(hostopt, hostname) != 0))
  696.       {
  697.       if (eff_uid != real_uid && setuid(real_uid) == -1)
  698. --- 386,396 ----
  699.        */
  700.   
  701. !     if ((!trusted_user
  702. !      && (strcmp(dfl_sys, sys_deliver) != 0
  703.           || strcmp(dfl_post, post_deliver) != 0
  704.           || strcmp(dfl_err, err_deliver) != 0
  705. !         || strcmp(dfl_user, user_deliver) != 0))
  706. !      || (!mailer_user
  707. !      && (hostopt && strcmp(hostopt, hostname) != 0)))
  708.       {
  709.       if (eff_uid != real_uid && setuid(real_uid) == -1)
  710.  
  711. Index: subs.c
  712. Prereq: 1.7
  713. ***************
  714. *** 1,3 ****
  715. ! /* $Id: subs.c,v 1.7 1991/10/23 20:02:03 chip Exp $
  716.    *
  717.    * Miscellaneous subroutines.
  718. --- 1,3 ----
  719. ! /* $Id: subs.c,v 1.8 1991/11/26 16:50:42 chip Exp $
  720.    *
  721.    * Miscellaneous subroutines.
  722. ***************
  723. *** 4,7 ****
  724. --- 4,10 ----
  725.    *
  726.    * $Log: subs.c,v $
  727. +  * Revision 1.8  1991/11/26  16:50:42  chip
  728. +  * Add TEMPDIR.
  729. +  *
  730.    * Revision 1.7  1991/10/23  20:02:03  chip
  731.    * Make all temp files close-on-exec.
  732. ***************
  733. *** 53,60 ****
  734.   tempfile()
  735.   {
  736. !     static char template[] = "/tmp/dl.XXXXXX";
  737.       char *f;
  738.   
  739. !     f = copystr(template);
  740.       if (mktemp(f) == NULL)
  741.       {
  742. --- 56,64 ----
  743.   tempfile()
  744.   {
  745. !     static char template[] = "dl.XXXXXX";
  746.       char *f;
  747.   
  748. !     f = zalloc(sizeof(TEMPDIR) + sizeof(template));
  749. !     (void) sprintf(f, "%s/%s", TEMPDIR, template);
  750.       if (mktemp(f) == NULL)
  751.       {
  752.  
  753. Index: sysdep.c
  754. Prereq: 1.7
  755. ***************
  756. *** 1,3 ****
  757. ! /* $Id: sysdep.c,v 1.7 1991/10/23 19:48:08 chip Exp $
  758.    *
  759.    * Routines which are (or might well be) system-dependant.
  760. --- 1,3 ----
  761. ! /* $Id: sysdep.c,v 1.8 1991/11/12 20:44:14 chip Exp $
  762.    *
  763.    * Routines which are (or might well be) system-dependant.
  764. ***************
  765. *** 6,9 ****
  766. --- 6,12 ----
  767.    *
  768.    * $Log: sysdep.c,v $
  769. +  * Revision 1.8  1991/11/12  20:44:14  chip
  770. +  * Ignore return values of fflush() and sprintf().
  771. +  *
  772.    * Revision 1.7  1991/10/23  19:48:08  chip
  773.    * Add errname().
  774. ***************
  775. *** 116,119 ****
  776. --- 119,123 ----
  777.       (void) vfprintf(errlog, fmt, ap);
  778.       FMT_END;
  779. +     (void) fflush(errlog);
  780.       }
  781.   }
  782. ***************
  783. *** 208,212 ****
  784.       return sys_errlist[e];
  785.   
  786. !     sprintf(ue, "Error %d", e);
  787.       return ue;
  788.   
  789. --- 212,216 ----
  790.       return sys_errlist[e];
  791.   
  792. !     (void) sprintf(ue, "Error %d", e);
  793.       return ue;
  794.   
  795.  
  796. Index: unctime.y
  797. Prereq: 1.4
  798. ***************
  799. *** 1,4 ****
  800.   /*
  801. !  * $Id: unctime.y,v 1.4 1991/08/26 17:41:21 chip Exp $
  802.    *
  803.    * Conversion of ctime-style date string back to a time_t.
  804. --- 1,4 ----
  805.   /*
  806. !  * $Id: unctime.y,v 1.5 1991/11/12 20:43:10 chip Exp $
  807.    *
  808.    * Conversion of ctime-style date string back to a time_t.
  809. ***************
  810. *** 7,10 ****
  811. --- 7,13 ----
  812.    *
  813.    * $Log: unctime.y,v $
  814. +  * Revision 1.5  1991/11/12  20:43:10  chip
  815. +  * Ignore return value of ftime().
  816. +  *
  817.    * Revision 1.4  1991/08/26  17:41:21  chip
  818.    * Prioritize methods for determining timezone.
  819. ***************
  820. *** 454,458 ****
  821.       {
  822.       struct timeb tb;
  823. !     ftime(&tb);
  824.       return (long)tb.timezone * -60;
  825.       }
  826. --- 457,461 ----
  827.       {
  828.       struct timeb tb;
  829. !     (void) ftime(&tb);
  830.       return (long)tb.timezone * -60;
  831.       }
  832.  
  833. Index: uucp.c
  834. Prereq: 1.2
  835. ***************
  836. *** 1,3 ****
  837. ! /* $Id: uucp.c,v 1.2 1991/10/23 20:09:26 chip Exp $
  838.    *
  839.    * Handle mail destined for other hosts via UUCP.
  840. --- 1,3 ----
  841. ! /* $Id: uucp.c,v 1.3 1992/01/20 20:36:05 chip Exp $
  842.    *
  843.    * Handle mail destined for other hosts via UUCP.
  844. ***************
  845. *** 6,9 ****
  846. --- 6,13 ----
  847.    *
  848.    * $Log: uucp.c,v $
  849. +  * Revision 1.3  1992/01/20  20:36:05  chip
  850. +  * Allow for UUX_OPTS to be a list.
  851. +  * Support UUX_DASH_A, so UUCP failure messages are mailed to original sender.
  852. +  *
  853.    * Revision 1.2  1991/10/23  20:09:26  chip
  854.    * Use tdup() to duplicate temp file fds.
  855. ***************
  856. *** 23,26 ****
  857. --- 27,41 ----
  858.   static int uucp_copy();
  859.   
  860. + /*
  861. +  * Local data.
  862. +  */
  863. + #ifdef UUX_OPTS
  864. + static char *uux_opts[] = { UUX_OPTS };
  865. + #define UUX_OPTCOUNT (sizeof(uux_opts) / sizeof(uux_opts[0]))
  866. + #else
  867. + #define UUX_OPTCOUNT 0
  868. + #endif
  869.   /*----------------------------------------------------------------------
  870.    * Send mail to UUCP addresses (if any).
  871. ***************
  872. *** 32,36 ****
  873.   {
  874.       DEST *d;
  875. !     char *uav[UUX_ARGCOUNT + 8];/* arguments for execv() */
  876.       char **av;            /* remote addresses in uav[] */
  877.       DEST *dv[UUX_ARGCOUNT];    /* destinations in av[] */
  878. --- 47,51 ----
  879.   {
  880.       DEST *d;
  881. !     char *uav[UUX_ARGCOUNT + UUX_OPTCOUNT + 8];/* arguments for execv() */
  882.       char **av;            /* remote addresses in uav[] */
  883.       DEST *dv[UUX_ARGCOUNT];    /* destinations in av[] */
  884. ***************
  885. *** 43,49 ****
  886.       av = uav;
  887.       *av++ = "uux";
  888.   #ifdef UUX_OPTS
  889. !     *av++ = UUX_OPTS;
  890.   #endif
  891.       *av++ = "-";
  892.       *av++ = rmail;
  893. --- 58,96 ----
  894.       av = uav;
  895.       *av++ = "uux";
  896.   #ifdef UUX_OPTS
  897. !     {
  898. !     int i;
  899. !     for (i = 0; i < UUX_OPTCOUNT; ++i)
  900. !         *av++ = uux_opts[i];
  901. !     }
  902.   #endif
  903. + #ifdef UUX_DASH_A
  904. +     {
  905. +     char *s, *p;
  906. +     /* Send failure notices to original sender, not local sender. */
  907. +     s = orig_sender;
  908. +     /* Strip smail-generated "hostname!" unless address contains "@". */
  909. +     if (strchr(s, '@') == NULL)
  910. +     {
  911. +         size_t hostlen;
  912. +         hostlen = strlen(hostname);
  913. +         while (strncmp(s, hostname, hostlen) == 0 && s[hostlen] == '!')
  914. +         s += hostlen + 1;
  915. +     }
  916. +     /* Generate "-asender" option. */
  917. +     p = zalloc(sizeof("-a") + strlen(s));
  918. +     strcpy(p, "-a");
  919. +     strcat(p, s);
  920. +     *av++ = p;
  921. +     }
  922. + #endif
  923.       *av++ = "-";
  924.       *av++ = rmail;
  925.  
  926. Index: conf/finish-os.h
  927. Prereq: 1.9
  928. ***************
  929. *** 1,3 ****
  930. ! /* $Id: finish-os.h,v 1.9 1991/10/23 19:20:27 chip Exp $
  931.    *
  932.    * Spell out the implications of a given OS configuration.
  933. --- 1,3 ----
  934. ! /* $Id: finish-os.h,v 1.10 1991/11/21 15:13:29 chip Exp $
  935.    *
  936.    * Spell out the implications of a given OS configuration.
  937. ***************
  938. *** 4,7 ****
  939. --- 4,11 ----
  940.    *
  941.    * $Log: finish-os.h,v $
  942. +  * Revision 1.10  1991/11/21  15:13:29  chip
  943. +  * Simplify test for multiple locks, for HP-UX preprocessor.
  944. +  * Define LOCK_ANY before use.  (!)
  945. +  *
  946.    * Revision 1.9  1991/10/23  19:20:27  chip
  947.    * Always include <fcntl.h>.  Define FD_CLOEXEC if it's missing.
  948. ***************
  949. *** 31,34 ****
  950. --- 35,92 ----
  951.    */
  952.   
  953. + /*------------------------------------------------------------------------
  954. +  * Validate kernel locking configuration.
  955. +  */
  956. + #undef LOCK_ANY
  957. + /* lockf() */
  958. + #ifdef LOCK_LOCKF
  959. + # ifdef LOCK_ANY
  960. + #  define LOCK_MULT
  961. + # else
  962. + #  define LOCK_ANY
  963. + # endif
  964. + #endif
  965. + /* fcntl() */
  966. + #ifdef LOCK_FCNTL
  967. + # ifdef LOCK_ANY
  968. + #  define LOCK_MULT
  969. + # else
  970. + #  define LOCK_ANY
  971. + # endif
  972. + #endif
  973. + /* flock() */
  974. + #ifdef LOCK_FLOCK
  975. + # ifdef LOCK_ANY
  976. + #  define LOCK_MULT
  977. + # else
  978. + #  define LOCK_ANY
  979. + # endif
  980. + #endif
  981. + /* locking() */
  982. + #ifdef LOCK_LOCKING
  983. + # ifdef LOCK_ANY
  984. + #  define LOCK_MULT
  985. + # else
  986. + #  define LOCK_ANY
  987. + # endif
  988. + #endif
  989. + #ifdef LOCK_MULT
  990. + ACK! "Define only one of LOCK_LOCKF, LOCK_FCNTL, LOCK_FLOCK and LOCK_LOCKING.";
  991. + #endif
  992. + /*------------------------------------------------------------------------
  993. +  * Validate time configuration.
  994. +  */
  995. + #if !defined(HAS_TIMEZONE) && !defined(HAS_GETTOD) && !defined(HAS_FTIME)
  996. + ACK! "Define either HAS_TIMEZONE, HAS_GETTOD or HAS_FTIME.";
  997. + #endif
  998.   /*----------------------------------------------------------------------
  999.    * POSIX systems have <unistd.h> which defines lots of interesting
  1000. ***************
  1001. *** 110,114 ****
  1002.   #endif
  1003.   
  1004. ! #if (LOCK_ANY > 0) && defined(SAFE_CREATE)
  1005.   #define SAFE_UPDATE
  1006.   #endif
  1007. --- 168,172 ----
  1008.   #endif
  1009.   
  1010. ! #if defined(LOCK_ANY) && defined(SAFE_CREATE)
  1011.   #define SAFE_UPDATE
  1012.   #endif
  1013. ***************
  1014. *** 270,290 ****
  1015.   #define MBX_DIR     "/usr/spool/mail"
  1016.   #define MBX_MODE    0600
  1017. - #endif
  1018. - /*------------------------------------------------------------------------
  1019. -  * Validate kernel locking configuration.
  1020. -  */
  1021. - #define LOCK_ANY  (defined(LOCK_LOCKF) + defined(LOCK_FCNTL) + \
  1022. -            defined(LOCK_FLOCK) + defined(LOCK_LOCKING))
  1023. - #if LOCK_ANY > 1
  1024. - ACK! "Define only one of LOCK_LOCKF, LOCK_FCNTL, LOCK_FLOCK and LOCK_LOCKING.";
  1025. - #endif
  1026. - /*------------------------------------------------------------------------
  1027. -  * Validate time configuration.
  1028. -  */
  1029. - #if !defined(HAS_TIMEZONE) && !defined(HAS_GETTOD) && !defined(HAS_FTIME)
  1030. - ACK! "Define either HAS_TIMEZONE, HAS_GETTOD or HAS_FTIME.";
  1031.   #endif
  1032. --- 328,330 ----
  1033.  
  1034. Index: conf/os-hpux8.h
  1035. ***************
  1036. *** 0 ****
  1037. --- 1,17 ----
  1038. + /* $Id: os-hpux8.h,v 1.1 1991/11/21 15:14:04 chip Exp $
  1039. +  *
  1040. +  * Deliver configuration for HP-UX 8.x.
  1041. +  *
  1042. +  * $Log: os-hpux8.h,v $
  1043. +  * Revision 1.1  1991/11/21  15:14:04  chip
  1044. +  * Initial revision
  1045. +  *
  1046. +  */
  1047. + /* Mostly it's System V (externally, anyway). */
  1048. + #include <os-sysv.h>
  1049. + /* Then again... */
  1050. + #define HH_UNISTD        /* Has <unistd.h>            */
  1051.  
  1052. Index: conf/os-scoxnx.h
  1053. ***************
  1054. *** 0 ****
  1055. --- 1,33 ----
  1056. + /*
  1057. +  * $Id: os-scoxnx.h,v 1.1 1991/11/21 15:40:45 chip Exp $
  1058. +  *
  1059. +  * Deliver configuration for SCO Xenix System V.
  1060. +  *
  1061. +  * NOTE: If you have a very old version of Xenix, you may have to edit
  1062. +  * "local.h" to include the statement "#define SETVBUF_TYPE_BUF".  If
  1063. +  * this means you, your first clue will probably be a core dump.
  1064. +  *
  1065. +  * $Log: os-scoxnx.h,v $
  1066. +  * Revision 1.1  1991/11/21  15:40:45  chip
  1067. +  * Initial revision
  1068. +  *
  1069. +  */
  1070. + /* Mostly it's System V. */
  1071. + #include <os-sysv.h>
  1072. + /* Then again... */
  1073. + #ifndef lint
  1074. + #define HH_STDARG        /* Has <stdarg.h>            */
  1075. + #undef  HH_VARARGS        /* Has <varargs.h>            */
  1076. + #endif
  1077. + #undef  SYSV_USRMAIL        /* Mailboxes in /usr/mail, as per SysV    */
  1078. + #undef  LOCK_LOCKF        /* Use lockf(F_LOCK, ...)    (SVID)    */
  1079. + #define LOCK_LOCKING        /* Use locking(LK_LOCK, ...) (Xenix)    */
  1080. + #undef  ML_DOTLOCK        /* Create <mailbox>.lock        */
  1081. + #define ML_DOTMLK        /* Create <basename>.mlk     (Xenix)    */
  1082. --------------------------------------------------------------------------
  1083. -- 
  1084. Chip Salzenberg at Teltronics/TCT  <chip@tct.com>, <73717.366@compuserve.com>
  1085.  
  1086. exit 0 # Just in case...
  1087.