Subject: elm 2.4 Patch #23b
Summary: This is an official patch for elm 2.4 system.  Please apply it.
Priority: HIGH

THIS IS PART 2 OF A 5 PART PATCH

Fix:    From rn, say "| patch -p -N -d DIR", where DIR is your elm source
       directory.  Outside of rn, say "cd DIR; patch -p -N <thisarticle".
       If you don't have the patch program, apply the following by hand,
       or get patch (version 2.0, latest patchlevel).

       After patching:
               Apply patchs 23c, 23d, 23e next

       If patch indicates that patchlevel is the wrong version, you may need
       to apply one or more previous patches, or the patch may already
       have been applied.  See the patchlevel.h file to find out what has or
       has not been applied.  In any event, don't continue with the patch.

       If you are missing previous patches they can be obtained from our:
       archive server.

       Syd Weinstein
       [email protected]

       The patches are available from the dsinc archive server
       Send the following message to [email protected] for
       a list of available patches:

       Subject: patch list
       send index elm

Index: hdrs/defs.h
Prereq: 5.27
*** ../elm2.4/hdrs/defs.h       Sat May  8 15:41:18 1993
--- hdrs/defs.h Sun Sep 19 19:41:00 1993
***************
*** 1,8 ****

! /* $Id: defs.h,v 5.27 1993/05/08 19:41:13 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.27 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! /* $Id: defs.h,v 5.33 1993/09/19 23:40:48 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.33 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,59 ----
  *
  *******************************************************************************
  * $Log: defs.h,v $
+  * Revision 5.33  1993/09/19  23:40:48  syd
+  * Defince SEEK_SET in one of our headers as a last resort
+  * From: Syd
+  *
+  * Revision 5.32  1993/08/23  02:46:51  syd
+  * Test ANSI_C, not __STDC__ (which is not set on e.g. AIX).
+  * From: decwrl!uunet.UU.NET!fin!chip (Chip Salzenberg)
+  *
+  * Revision 5.31  1993/08/23  02:45:29  syd
+  * The macro ctrl(c) did not work correctly for a DEL character
+  * neither did it make the backward mapping from a control char
+  * to the letter that is normally used with an up-arrow prefix
+  * to represent the control character.
+  * From: Jukka Ukkonen <[email protected]>
+  *
+  * Revision 5.30  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
+  * Revision 5.29  1993/08/03  19:05:33  syd
+  * When STDC is used on Convex the feof() function is defined as
+  * a true library routine in the header files and moreover the
+  * library routine also leaks royally. It returns always 1!!
+  * So we have to use a macro. Convex naturally does not provide
+  * you with one though if you are using a STDC compiler. So we
+  * have to include one.
+  * From: Jukka Ukkonen <[email protected]>
+  *
+  * Revision 5.28  1993/07/20  02:59:53  syd
+  * Support aliases both on 64 bit and 32 bit machines at the same time.
+  * From: Dan Mosedale <[email protected]>
+  *
  * Revision 5.27  1993/05/08  19:41:13  syd
  * make it now depend on mallocvoid
  *
***************
*** 138,143 ****
--- 178,184 ----


 #include <sys/types.h>        /* for fundamental types */
+ #include <stdio.h>    /* Must get the _IOEOF flag for feof() on Convex */
 #include "../config.h"
 #include "sysdefs.h"  /* system/configurable defines */

***************
*** 311,318 ****
 #define DECEMBER      11

 #define equal(s,w)    (strcmp(s,w) == 0)
! #define min(a,b)      a < b? a : b
! #define ctrl(c)               c - 'A' + 1     /* control character mapping */
 #define plural(n)     n == 1 ? "" : "s"
 #define lastch(s)     s[strlen(s)-1]
 #define ifmain(a,b)   (inalias ? b : a)
--- 352,367 ----
 #define DECEMBER      11

 #define equal(s,w)    (strcmp(s,w) == 0)
! #define min(a,b)      (a) < (b) ? (a) : (b)
! /*
!  *  Control character mapping like "c - 'A' + 1" does not work
!  *  correctly for a DEL. Neither does it allow mapping from
!  *  a control character to the letter that is normally used with
!  *  an up-arrow prefix to represent the control char.
!  *  The correct mapping should be done like this...
!  */
! #define ctrl(c)               (((c) + '@') & 0x7f)
!
 #define plural(n)     n == 1 ? "" : "s"
 #define lastch(s)     s[strlen(s)-1]
 #define ifmain(a,b)   (inalias ? b : a)
***************
*** 482,487 ****
--- 531,553 ----
       char mailx_status[WLEN];/** mailx status flags (RO...)  **/
        };

+ #ifdef __alpha
+ #define int32 int
+ #else
+ #define int32 long
+ #endif
+
+ struct alias_disk_rec {
+       int32 status;                   /* DELETED, TAGGED, VISIBLE, ...     */
+       int32 alias;                    /* alias name                        */
+       int32 last_name;                /* actual personal (last) name       */
+       int32 name;                     /* actual personal name (first last) */
+       int32 comment;                  /* comment, doesn't show in headers  */
+       int32 address;                  /* non expanded address              */
+       int32 type;                     /* mask-- sys/user, person/group     */
+       int32 length;                   /* length of alias data on file      */
+        };
+
 struct alias_rec {
       int   status;                   /* DELETED, TAGGED, VISIBLE, ...     */
       char  *alias;                   /* alias name                        */
***************
*** 530,535 ****
--- 596,615 ----
 #    include <string.h>
 #  endif
 #endif
+
+ #ifdef        __convex__
+ /*
+  *  Nice work Convex people! Thanks a million!
+  *  When STDC is used feof() is defined as a true library routine
+  *  in the header files and moreover the library routine also leaks
+  *  royally. (It returns always 1!!) Consequently this macro is
+  *  unavoidable.)
+  */
+ #  ifndef   feof
+ #    define   feof(p) ((p)->_flag&_IOEOF)
+ #  endif
+ #endif
+
 #ifndef ANSI_C   /* ANSI puts these in string.h */
 char *index(), *rindex(); /* names will be traslated by define in config.h */
 char *strtok(), *strcpy(), *strcat(), *strncpy(); /* more in string.h in ANSI */
***************
*** 573,583 ****

 #ifdef POSIX_SIGNALS
 #define signal posix_signal
! #ifdef __STDC__
 extern SIGHAND_TYPE (*posix_signal(int, SIGHAND_TYPE (*)(int)))(int);
! #else /* __STDC__ */
 extern SIGHAND_TYPE (*posix_signal())();
! #endif        /* __STDC__ */
 #else /* POSIX_SIGNALS */
 #ifdef SIGSET
 #define signal sigset
--- 653,663 ----

 #ifdef POSIX_SIGNALS
 #define signal posix_signal
! #if ANSI_C
 extern SIGHAND_TYPE (*posix_signal(int, SIGHAND_TYPE (*)(int)))(int);
! #else /* ANSI_C */
 extern SIGHAND_TYPE (*posix_signal())();
! #endif        /* ANSI_C */
 #else /* POSIX_SIGNALS */
 #ifdef SIGSET
 #define signal sigset
***************
*** 587,592 ****
--- 667,695 ----
 #endif /* SIGSET */
 #endif /* POSIX_SIGNALS */

+ /*
+  * Some of the old BSD ctype conversion macros corrupted characters.
+  * We will substitute our own versions if required.
+  */
+ #include <ctype.h>
+ #ifdef BROKE_CTYPE
+ # undef  toupper
+ # define toupper(c)   (islower(c) ? ((c) - 'a' + 'A') : (c))
+ # undef  tolower
+ # define tolower(c)   (isupper(c) ? ((c) - 'A' + 'a') : (c))
+ #endif
+
+ /*
+  *    if the seek constants arent set in an include file
+  *    lets define them ourselves
+  */
+ #ifndef SEEK_SET
+ #define       SEEK_SET        0       /* Set file pointer to "offset" */
+ #define       SEEK_CUR        1       /* Set file pointer to current plus "offset" */
+ #define       SEEK_END        2       /* Set file pointer to EOF plus "offset" */
+ #endif
+
+
 /*
  * The "safe_malloc_fail_handler" vector points to a routine that is invoked
  * if one of the safe_malloc() routines fails.  At startup, this will point

Index: hdrs/elm.h
Prereq: 5.9
*** ../elm2.4/hdrs/elm.h        Sat May  8 16:03:17 1993
--- hdrs/elm.h  Tue Aug 10 14:49:33 1993
***************
*** 1,8 ****

! /* $Id: elm.h,v 5.9 1993/05/08 20:03:12 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.9 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! /* $Id: elm.h,v 5.10 1993/08/10 18:49:32 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.10 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,27 ----
  *
  *******************************************************************************
  * $Log: elm.h,v $
+  * Revision 5.10  1993/08/10  18:49:32  syd
+  * When an environment variable was given as the tmpdir definition the src
+  * and dest overlapped in expand_env.  This made elm produce a garbage
+  * expansion because expand_env cannot cope with overlapping src and
+  * dest.  I added a new variable raw_temp_dir to keep src and dest not to
+  * overlap.
+  * From: Jukka Ukkonen <[email protected]>
+  *
  * Revision 5.9  1993/05/08  20:03:12  syd
  * add sleepmsg to list
  *
***************
*** 115,120 ****
--- 123,129 ----
 char cur_tempfolder[SLEN] = {0};/* name of temp folder open for a mailbox */
 char defaultfile[SLEN] = {0}; /* name of default folder */
 char temp_dir[SLEN] = {0};      /* name of temp directory */
+ char raw_temp_dir[SLEN] = {0};  /* unexpanded name of temp directory */
 char hostname[SLEN] = {0};    /* name of machine we're on*/
 char hostdomain[SLEN] = {0};  /* name of domain we're in */
 char hostfullname[SLEN] = {0};        /* name of FQDN we're in */

Index: hdrs/filter.h
Prereq: 5.10
*** ../elm2.4/hdrs/filter.h     Sun Jun  6 14:24:47 1993
--- hdrs/filter.h       Tue Aug  3 15:28:44 1993
***************
*** 1,8 ****

! /* $Id: filter.h,v 5.10 1993/06/06 17:34:40 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.10 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! /* $Id: filter.h,v 5.11 1993/08/03 19:28:39 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.11 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,31 ----
  *
  *******************************************************************************
  * $Log: filter.h,v $
+  * Revision 5.11  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.10  1993/06/06  17:34:40  syd
  * remove useless _vbuf definition
  *
***************
*** 68,77 ****

 #include "regexp.h"

- #ifdef   BSD
- # undef  tolower
- #endif
-
 /** define a few handy macros for later use... **/

 #define  the_same(a,b)        (strncmp(a,b,strlen(b)) == 0)
--- 80,85 ----

Index: hdrs/headers.h
Prereq: 5.10
*** ../elm2.4/hdrs/headers.h    Sat May  8 16:03:18 1993
--- hdrs/headers.h      Tue Aug 10 16:49:55 1993
***************
*** 1,8 ****

! /* $Id: headers.h,v 5.10 1993/05/08 20:03:12 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.10 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! /* $Id: headers.h,v 5.11 1993/08/10 20:49:40 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.11 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,22 ----
  *
  *******************************************************************************
  * $Log: headers.h,v $
+  * Revision 5.11  1993/08/10  20:49:40  syd
+  * Add raw_temp_dir
+  *
  * Revision 5.10  1993/05/08  20:03:12  syd
  * add sleepmsg to list
  *
***************
*** 115,120 ****
--- 118,124 ----
 extern char cur_tempfolder[SLEN]; /* name of temp folder open for a mailbox */
 extern char defaultfile[SLEN];        /* name of default folder */
 extern char temp_dir[SLEN];     /* name of temp directory */
+ extern char raw_temp_dir[SLEN]; /* unexpanded name of temp directory */
 extern char hostname[SLEN];   /* name of machine we're on*/
 extern char hostdomain[SLEN]; /* name of domain we're in */
 extern char hostfullname[SLEN]; /* name of FQDN we're in */

Index: hdrs/mcprt.h
*** ../elm2.4/hdrs/mcprt.h      Sat Oct  3 18:35:08 1992
--- hdrs/mcprt.h        Sun Aug 22 22:46:28 1993
***************
*** 48,56 ****
--- 48,62 ----
 #include <stdio.h>

 #ifdef USENLS
+ #  ifdef I_STDARG
+ extern int            MCprintf(char *fmt, ...);
+ extern int            MCfprintf(FILE *fptr, char *fmt, ...);
+ extern int            MCsprintf(char *cptr, char *fmt, ...);
+ #  else
 extern int            MCprintf();
 extern int            MCfprintf();
 extern int            MCsprintf();
+ #  endif
 #endif

 #endif

Index: hdrs/mcprtlib.h
*** ../elm2.4/hdrs/mcprtlib.h   Sat Oct  3 18:35:09 1992
--- hdrs/mcprtlib.h     Sun Aug 22 22:48:18 1993
***************
*** 41,47 ****
 03/20/91   2 schulert Ultrix cc has trouble with void*, so change them to int*
 01/18/91   3 hamilton #if not rescanned
 01/12/91   1 schulert conditionally use prototypes
!                       rework to use either varargs or stdargs
 11/03/90   2 hamilton Alphalpha->Alfalfa & OmegaMail->Poste
 08/10/90   1 nazgul   Initial version
 */
--- 41,47 ----
 03/20/91   2 schulert Ultrix cc has trouble with void*, so change them to int*
 01/18/91   3 hamilton #if not rescanned
 01/12/91   1 schulert conditionally use prototypes
!                       rework to use either varargs or stdarg
 11/03/90   2 hamilton Alphalpha->Alfalfa & OmegaMail->Poste
 08/10/90   1 nazgul   Initial version
 */
***************
*** 49,56 ****
--- 49,61 ----
 /* taken from Xm/lib/VaSimple.h
    currently no one defines MISSING_STDARG_H */

+ #ifdef        I_STDARG
+ # include <stdarg.h>
+ # define Va_start(a,b) va_start(a,b)
+ #else
 # include <varargs.h>
 # define Va_start(a,b) va_start(a)
+ #endif

 #define MCFree                0x0010                  /* Reminder to MCPrintFree */
 #define MCCatalog     0x0100                  /* Probably came from catalog */

Index: hdrs/ndbz.h
Prereq: 5.2
*** ../elm2.4/hdrs/ndbz.h       Sat Oct 10 21:47:09 1992
--- hdrs/ndbz.h Mon Jul 19 22:59:54 1993
***************
*** 1,8 ****

! /* $Id: ndbz.h,v 5.2 1992/10/11 01:46:35 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! /* $Id: ndbz.h,v 5.3 1993/07/20 02:59:53 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,23 ----
  *
  *******************************************************************************
  * $Log: ndbz.h,v $
+  * Revision 5.3  1993/07/20  02:59:53  syd
+  * Support aliases both on 64 bit and 32 bit machines at the same time.
+  * From: Dan Mosedale <[email protected]>
+  *
  * Revision 5.2  1992/10/11  01:46:35  syd
  * change dbm name to dbz to avoid conflicts with partial call
  * ins from shared librarys, and from mixing code with yp code.
***************
*** 57,63 ****
  * to have a distinctive name for it.  Beware, this is just for readability,
  * don't try to change this.
  */
! #define       of_t    long
 #define       SOF     (sizeof(of_t))

 /*
--- 61,73 ----
  * to have a distinctive name for it.  Beware, this is just for readability,
  * don't try to change this.
  */
!
! /*
!  * Big kludge: this is set up as 32-bit rather than a long so that ndbz db's
!  * will work across NFS on 64 bit machines as well as 32 bit machines.
!  */
!
! #define       of_t    int32
 #define       SOF     (sizeof(of_t))

 /*

Index: hdrs/s_elm.h
*** ../elm2.4/hdrs/s_elm.h      Mon May 31 15:35:18 1993
--- hdrs/s_elm.h        Tue Aug  3 14:58:35 1993
***************
*** 1,4 ****
! /* s_elm.h created from s_elm.us by gencat on Mon May 31 15:35:18 EDT 1993 */

 #define ElmSet        0x3
 #define ElmYes        0x1
--- 1,4 ----
! /* s_elm.h created from s_elm.us by gencat on Tue Aug  3 14:58:35 EDT 1993 */

 #define ElmSet        0x3
 #define ElmYes        0x1
***************
*** 499,505 ****
 #define ElmTooManyWeedHeaders 0x233
 #define ElmTooManyWeedPmalloc 0x234
 #define ElmNoMemDefaultWeed   0x235
! #define ElmCantExpandEnvVar   0x236
 #define ElmCouldntMakeTempFileName    0x237
 #define ElmCouldntOpenForWriting      0x238
 #define ElmSureYouWantToRemail        0x239
--- 499,505 ----
 #define ElmTooManyWeedHeaders 0x233
 #define ElmTooManyWeedPmalloc 0x234
 #define ElmNoMemDefaultWeed   0x235
! #define ElmCannotInitErrorExpanding   0x236
 #define ElmCouldntMakeTempFileName    0x237
 #define ElmCouldntOpenForWriting      0x238
 #define ElmSureYouWantToRemail        0x239

Index: hdrs/save_opts.h
Prereq: 5.8
*** ../elm2.4/hdrs/save_opts.h  Sat May  8 16:02:01 1993
--- hdrs/save_opts.h    Tue Aug 10 14:49:32 1993
***************
*** 1,8 ****

! /* @(#)$Id: save_opts.h,v 5.8 1993/05/08 18:56:16 syd Exp syd $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.8 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! /* @(#)$Id: save_opts.h,v 5.10 1993/08/10 18:49:32 syd Exp $ */

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.10 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,30 ----
  *
  *******************************************************************************
  * $Log: save_opts.h,v $
+  * Revision 5.10  1993/08/10  18:49:32  syd
+  * When an environment variable was given as the tmpdir definition the src
+  * and dest overlapped in expand_env.  This made elm produce a garbage
+  * expansion because expand_env cannot cope with overlapping src and
+  * dest.  I added a new variable raw_temp_dir to keep src and dest not to
+  * overlap.
+  * From: Jukka Ukkonen <[email protected]>
+  *
+  * Revision 5.9  1993/06/12  05:28:06  syd
+  * Missing checkin
+  *
  * Revision 5.8  1993/05/08  18:56:16  syd
  * created a new elmrc variable named "readmsginc".  This specifies an
  * increment by which the message count is updated.  If this variable is
***************
*** 230,236 ****
 #endif
 {"timeout",           -1L,DT_NUM,(char *)&timeout},
 {"titles",            -1L,DT_BOL,(char *)&title_messages},
! {"tmpdir",            -1L,DT_STR,temp_dir},
 {"userlevel",         -1L,DT_NUM,(char *)&user_level},
 {"username",          -1L,DT_SYN,"fullname"},
 {"usetite",           -1L,DT_BOL|FL_AND,(char *)&use_tite},
--- 241,247 ----
 #endif
 {"timeout",           -1L,DT_NUM,(char *)&timeout},
 {"titles",            -1L,DT_BOL,(char *)&title_messages},
! {"tmpdir",            -1L,DT_STR,raw_temp_dir},
 {"userlevel",         -1L,DT_NUM,(char *)&user_level},
 {"username",          -1L,DT_SYN,"fullname"},
 {"usetite",           -1L,DT_BOL|FL_AND,(char *)&use_tite},

Index: lib/Makefile.SH
Prereq: 5.11
*** ../elm2.4/lib/Makefile.SH   Sun Apr 11 21:51:43 1993
--- lib/Makefile.SH     Tue Aug  3 15:28:46 1993
***************
*** 36,42 ****

 echo "Extracting lib/Makefile (with variable substitutions)"
 cat >Makefile <<!GROK!THIS!
! # $Id: Makefile.SH,v 5.11 1993/04/12 01:51:42 syd Exp $
 #
 #  Makefile for the ELM mail program.
 #
--- 36,42 ----

 echo "Extracting lib/Makefile (with variable substitutions)"
 cat >Makefile <<!GROK!THIS!
! # $Id: Makefile.SH,v 5.15 1993/08/03 19:28:39 syd Exp $
 #
 #  Makefile for the ELM mail program.
 #
***************
*** 49,54 ****
--- 49,88 ----
 #                     dsinc!elm
 #
 # $Log: Makefile.SH,v $
+ # Revision 5.15  1993/08/03  19:28:39  syd
+ # Elm tries to replace the system toupper() and tolower() on current
+ # BSD systems, which is unnecessary.  Even worse, the replacements
+ # collide during linking with routines in isctype.o.  This patch adds
+ # a Configure test to determine whether replacements are really needed
+ # (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+ # globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+ # there.  Inclusion of <ctype.h> was removed from *all* the individual
+ # files, and the toupper() and tolower() routines in lib/opt_utils.c
+ # were dropped.
+ # From: [email protected] (Chip Rosenthal)
+ #
+ # Revision 5.14  1993/08/03  19:17:33  syd
+ # Implement new timezone handling.  New file lib/get_tz.c with new timezone
+ # routines.  Added new TZMINS_USE_xxxxxx and TZNAME_USE_xxxxxx configuration
+ # definitions.  Obsoleted TZNAME, ALTCHECK, and TZ_MINUTESWEST configuration
+ # definitions.  Updated Configure.  Modified lib/getarpdate.c and
+ # lib/strftime.c to use new timezone routines.
+ #
+ # From: [email protected] (Chip Rosenthal)
+ #
+ # Revision 5.13  1993/08/02  18:14:35  syd
+ # add missing references for mcprt.c/mcprtlib.c to defs.h
+ # From: Syd
+ #
+ # Revision 5.12  1993/06/10  03:02:46  syd
+ # break_down_tolist() tried to blindly split address lists at "," which
+ # caused bogus results with addreses that had a comma inside a comment
+ # or quoted text, such as "user@domain (Last, First)".  This patch steps
+ # through the address in quanta of RFC-822 tokens when searching for a
+ # delimiting comma.  It also adds "rfc822_toklen()" to the library to
+ # get that length.
+ # From: [email protected] (Chip Rosenthal)
+ #
 # Revision 5.11  1993/04/12  01:51:42  syd
 # Added safe_malloc(), safe_realloc(), and safe_strdup().  They
 # will be used in the new elmalias utility.
***************
*** 162,167 ****
--- 196,202 ----
                       getarpdate.c    \
                       getfullnam.c    \
                       getword.c       \
+                       get_tz.c        \
                       header_cmp.c    \
                       in_list.c       \
                       in_string.c     \
***************
*** 182,187 ****
--- 217,223 ----
                       qstrings.c      \
                       remfirstwd.c    \
                       reverse.c       \
+                       rfc822tlen.c    \
                       safemalloc.c    \
                       shiftlower.c    \
                       strfcpy.c       \
***************
*** 207,212 ****
--- 243,249 ----
                       expand.o        \
                       figadrssee.o    \
                       gcos_name.o     \
+                       get_tz.o        \
                       getaddrfrm.o    \
                       getarpdate.o    \
                       getfullnam.o    \
***************
*** 231,236 ****
--- 268,274 ----
                       realfrom.o      \
                       remfirstwd.o    \
                       reverse.o       \
+                       rfc822tlen.o    \
                       safemalloc.o    \
                       shiftlower.o    \
                       strfcpy.o       \
***************
*** 280,285 ****
--- 318,324 ----
 #     Dependencies of C object files
 add_site.o:   $(INCLDIR)/headers.h
 addrmchusr.o: $(INCLDIR)/headers.h
+ atonum.o:     $(INCLDIR)/defs.h
 mk_aliases.o: $(INCLDIR)/headers.h $(INCLDIR)/ndbz.h $(INCLDIR)/s_newalias.h
 aliasdb.o:    $(INCLDIR)/headers.h $(INCLDIR)/ndbz.h
 mk_lockname.o:        $(INCLDIR)/headers.h
***************
*** 291,296 ****
--- 330,336 ----
 expand.o:     $(INCLDIR)/defs.h $(INCLDIR)/s_elmrc.h
 figadrssee.o: $(INCLDIR)/headers.h
 gcos_name.o:  $(INCLDIR)/headers.h
+ get_tz.o:     $(INCLDIR)/defs.h
 getaddrfrm.o: $(INCLDIR)/headers.h
 getarpdate.o: $(INCLDIR)/headers.h
 getfullnam.o: $(INCLDIR)/headers.h
***************
*** 302,309 ****
 ldstate.o:    $(INCLDIR)/defs.h
 len_next.o:   ../config.h
 mail_gets.o:  ../config.h
! mcprt.o:      $(INCLDIR)/mcprt.h $(INCLDIR)/mcprtlib.h
! mcprtlib.o:   $(INCLDIR)/mcprtlib.h $(INCLDIR)/nl_types.h
 move_left.o:  $(INCLDIR)/headers.h
 msgcat.o:     $(INCLDIR)/msgcat.h $(INCLDIR)/nl_types.h
 ndbz.o:               $(INCLDIR)/headers.h $(INCLDIR)/ndbz.h
--- 342,349 ----
 ldstate.o:    $(INCLDIR)/defs.h
 len_next.o:   ../config.h
 mail_gets.o:  ../config.h
! mcprt.o:      $(INCLDIR)/mcprt.h $(INCLDIR)/mcprtlib.h $(INCLDIR)/defs.h
! mcprtlib.o:   $(INCLDIR)/mcprtlib.h $(INCLDIR)/nl_types.h $(INCLDIR)/defs.h
 move_left.o:  $(INCLDIR)/headers.h
 msgcat.o:     $(INCLDIR)/msgcat.h $(INCLDIR)/nl_types.h
 ndbz.o:               $(INCLDIR)/headers.h $(INCLDIR)/ndbz.h

Index: lib/aliasdb.c
Prereq: 5.3
*** ../elm2.4/lib/aliasdb.c     Tue Apr 20 21:40:16 1993
--- lib/aliasdb.c       Sun Sep 19 19:41:00 1993
***************
*** 1,5 ****
 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----
+
+ static char rcsid[] = "@(#)$Id: aliasdb.c,v 5.8 1993/09/19 23:40:48 syd Exp $";
+
 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.8 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 11,16 ****
--- 14,50 ----
  *
  *******************************************************************************
  * $Log: aliasdb.c,v $
+  * Revision 5.8  1993/09/19  23:40:48  syd
+  * Defince SEEK_SET in one of our headers as a last resort
+  * From: Syd
+  *
+  * Revision 5.7  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
+  * Revision 5.6  1993/07/20  02:59:53  syd
+  * Support aliases both on 64 bit and 32 bit machines at the same time.
+  * From: Dan Mosedale <[email protected]>
+  *
+  * Revision 5.5  1993/06/10  03:12:10  syd
+  * Add missing rcs id lines
+  * From: Syd
+  *
+  * Revision 5.4  1993/06/10  02:58:26  syd
+  * Correct problem in fetch_alias() with alias record fixup that caused
+  * core dump on machines with pointers larger than int.  This problem
+  * was reported on comp.mail.elm by Richard Eckman and Jim Brown.  Simplify
+  * get_one_alias() by having it use fetch_alias().
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.3  1993/04/21  01:40:12  syd
  * add seekset define
  *
***************
*** 35,53 ****
 **/

 #include "headers.h"
- #include <ctype.h>
 #include "ndbz.h"

- #ifndef SEEK_SET
- #define       SEEK_SET        0       /* Set file pointer to "offset" */
- #define       SEEK_CUR        1       /* Set file pointer to current plus "offset" */
- #define       SEEK_END        2       /* Set file pointer to EOF plus "offset" */
- #endif
-
 #ifdef BSD
 #  include <sys/file.h>
- #  undef tolower
- #  undef toupper
 #endif

 /* byte-ordering stuff */
--- 69,78 ----
***************
*** 74,82 ****
       return(out.o);
 }

! read_one_alias(db, ar)
 DBZ *db;
! struct alias_rec *ar;
 {
 /*
  *    Read an alias (name, address, etc.) from the data file
--- 99,107 ----
       return(out.o);
 }

! read_one_alias(db, adr)
 DBZ *db;
! struct alias_disk_rec *adr;
 {
 /*
  *    Read an alias (name, address, etc.) from the data file
***************
*** 87,104 ****
       if (data_file == NULL)
           return(0);  /* no alias file, but hash exists, error condition */

!       if (fread((char *) ar, sizeof(struct alias_rec), 1, data_file) <= 0)
!           return(0);

-       ar->status = (int) MAPIN(ar->status);
-       ar->alias = (char *) MAPIN(ar->alias);
-       ar->last_name = (char *) MAPIN(ar->last_name);
-       ar->name = (char *) MAPIN(ar->name);
-       ar->comment = (char *) MAPIN(ar->comment);
-       ar->address = (char *) MAPIN(ar->address);
-       ar->type = (int) MAPIN(ar->type);
-       ar->length = (long) MAPIN(ar->length);
-
       return(1);
 }

--- 112,130 ----
       if (data_file == NULL)
           return(0);  /* no alias file, but hash exists, error condition */

!       if (fread((char *) adr, sizeof(struct alias_disk_rec), 1, data_file)
!           <= 0)
!               return(0);
!
!       adr->status = (int32) MAPIN(adr->status);
!       adr->alias = (int32) MAPIN(adr->alias);
!       adr->last_name = (int32) MAPIN(adr->last_name);
!       adr->name = (int32) MAPIN(adr->name);
!       adr->comment = (int32) MAPIN(adr->comment);
!       adr->address = (int32) MAPIN(adr->address);
!       adr->type = (int32) MAPIN(adr->type);
!       adr->length = (int32) MAPIN(adr->length);

       return(1);
 }

***************
*** 122,128 ****
 char *alias;
 {
       datum key, val;
!       struct alias_rec arec;
       long pos;
       register struct alias_rec *ar;
       register char *buf, *s;
--- 148,154 ----
 char *alias;
 {
       datum key, val;
!       struct alias_disk_rec adrec;
       long pos;
       register struct alias_rec *ar;
       register char *buf, *s;
***************
*** 159,194 ****
           /*
            * Move to the position of the selected alias record.
            */
!           pos = *((long *)(val.dptr)) - sizeof(struct alias_rec);
           if (fseek(db->dbz_basef, pos, SEEK_SET) != 0)
                   return (struct alias_rec *)NULL;

       }

       /*
        * We are now positioned at the alias record we want.  Pull it in.
        */
!       if (!read_one_alias(db, &arec))
               return (struct alias_rec *)NULL;

       /*
        * Allocate space to hold the alias record and data content.
        */
       ar = (struct alias_rec *)
!               safe_malloc(sizeof(struct alias_rec) + arec.length);
!       *ar = arec;
       buf = (char *)ar + sizeof(struct alias_rec);

       /*
!        * Read in the data content and fixup pointers in the alias record.
        */
       if (fread(buf, ar->length, 1, db->dbz_basef) != 1)
               return (struct alias_rec *)NULL;
-       ar->alias += (int) buf;
-       ar->last_name += (int) buf;
-       ar->name += (int) buf;
-       ar->comment += (int) buf;
-       ar->address += (int) buf;

       return ar;
 }
--- 185,239 ----
           /*
            * Move to the position of the selected alias record.
            */
!           pos = *((long *)(val.dptr)) - sizeof(struct alias_disk_rec);
           if (fseek(db->dbz_basef, pos, SEEK_SET) != 0)
                   return (struct alias_rec *)NULL;

       }

       /*
+        * Each alias in the data file is stored as a (struct alias_rec)
+        * followed by text information for that alias record.  The
+        * size of the following text information is specified by `length',
+        * and the value of the other members of the structure are actually
+        * offsets into that buffer space.  So, to load in an alias we
+        * need to:  (1) read the alias record, (2) see how long the data
+        * buffer is and pull it in, and (3) fixup the pointers in the
+        * alias record so they point into the data buffer.
+        */
+
+       /*
        * We are now positioned at the alias record we want.  Pull it in.
        */
!       if (!read_one_alias(db, &adrec))
               return (struct alias_rec *)NULL;

       /*
        * Allocate space to hold the alias record and data content.
        */
+
       ar = (struct alias_rec *)
!               safe_malloc(sizeof(struct alias_rec) + (size_t)adrec.length);
!
       buf = (char *)ar + sizeof(struct alias_rec);

+         /*
+        * Fixup pointers in the alias record.
+        */
+       ar->status = (int)adrec.status;
+       ar->alias = (char *) ((size_t) adrec.alias + (size_t) buf);
+       ar->last_name = (char *) ((size_t) adrec.last_name + (size_t) buf);
+       ar->name = (char *) ((size_t) adrec.name + (size_t) buf);
+       ar->comment = (char *) ((size_t) adrec.comment + (size_t) buf);
+       ar->address = (char *) ((size_t) adrec.address + (size_t) buf);
+       ar->type = (int)adrec.type;
+       ar->length = (size_t)adrec.length;
+
       /*
!        * Read in the data content
        */
       if (fread(buf, ar->length, 1, db->dbz_basef) != 1)
               return (struct alias_rec *)NULL;

       return ar;
 }

Index: lib/atonum.c
Prereq: 5.1
*** ../elm2.4/lib/atonum.c      Mon Jan 18 23:46:39 1993
--- lib/atonum.c        Tue Aug  3 15:28:47 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: atonum.c,v 5.1 1993/01/19 04:46:21 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.1 $   $State: Exp $
  *
  *                    Copyright (c) 1993 USENET Community Trust
  *******************************************************************************
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: atonum.c,v 5.2 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1993 USENET Community Trust
  *******************************************************************************
***************
*** 13,25 ****
  *
  *******************************************************************************
  * $Log: atonum.c,v $
  * Revision 5.1  1993/01/19  04:46:21  syd
  * Initial Checkin
  *
  *
  ******************************************************************************/

! #include <ctype.h>

 /*
  * This is similar to atoi(), but it complains if the string
--- 13,37 ----
  *
  *******************************************************************************
  * $Log: atonum.c,v $
+  * Revision 5.2  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.1  1993/01/19  04:46:21  syd
  * Initial Checkin
  *
  *
  ******************************************************************************/

! #include "defs.h"

 /*
  * This is similar to atoi(), but it complains if the string

Index: lib/can_access.c
Prereq: 5.6
*** ../elm2.4/lib/can_access.c  Thu May 13 23:52:11 1993
--- lib/can_access.c    Sun Aug 22 22:46:07 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: can_access.c,v 5.6 1993/05/14 03:52:10 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.6 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: can_access.c,v 5.8 1993/08/23 02:46:07 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.8 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,35 ----
  *
  *******************************************************************************
  * $Log: can_access.c,v $
+  * Revision 5.8  1993/08/23  02:46:07  syd
+  * Don't declare _exit() if <unistd.h> already did it.
+  * From: decwrl!uunet.UU.NET!fin!chip (Chip Salzenberg)
+  *
+  * Revision 5.7  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.6  1993/05/14  03:52:10  syd
  * When compiled on a POSIX host PL22 failed checking whether the file is
  * readable and a regular file or not. There was one `!' missing in the
***************
*** 48,60 ****

 #include "headers.h"
 #include <sys/stat.h>
- #include <ctype.h>
 #include <errno.h>

 #ifdef BSD
 # include <sys/wait.h>
 #endif

 extern int errno;             /* system error number */

 int
--- 64,79 ----

 #include "headers.h"
 #include <sys/stat.h>
 #include <errno.h>

 #ifdef BSD
 # include <sys/wait.h>
 #endif

+ #ifndef I_UNISTD
+ void _exit();
+ #endif
+
 extern int errno;             /* system error number */

 int
***************
*** 66,72 ****

       int the_stat = 0, pid, w;
       struct stat stat_buf;
-       void _exit();
 #if defined(BSD) && !defined(WEXITSTATUS)
       union wait status;
 #else
--- 85,90 ----

Index: lib/can_open.c
Prereq: 5.2
*** ../elm2.4/lib/can_open.c    Fri Dec 11 20:29:27 1992
--- lib/can_open.c      Sun Aug 22 22:46:08 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: can_open.c,v 5.2 1992/12/12 01:29:26 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: can_open.c,v 5.4 1993/08/23 02:46:07 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.4 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,35 ----
  *
  *******************************************************************************
  * $Log: can_open.c,v $
+  * Revision 5.4  1993/08/23  02:46:07  syd
+  * Don't declare _exit() if <unistd.h> already did it.
+  * From: decwrl!uunet.UU.NET!fin!chip (Chip Salzenberg)
+  *
+  * Revision 5.3  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.2  1992/12/12  01:29:26  syd
  * Fix double inclusion of sys/types.h
  * From: Tom Moore <[email protected]>
***************
*** 30,42 ****

 #include "headers.h"
 #include <sys/stat.h>
- #include <ctype.h>
 #include <errno.h>

 #ifdef BSD
 # include <sys/wait.h>
 #endif

 extern int errno;             /* system error number */

 int
--- 46,61 ----

 #include "headers.h"
 #include <sys/stat.h>
 #include <errno.h>

 #ifdef BSD
 # include <sys/wait.h>
 #endif

+ #ifndef I_UNISTD
+ void _exit();
+ #endif
+
 extern int errno;             /* system error number */

 int
***************
*** 49,55 ****

       FILE *fd;
       int the_stat = 0, pid, w, preexisted = 0;
-       void _exit();
 #if defined(BSD) && !defined(WEXITSTATUS)
       union wait status;
 #else
--- 68,73 ----

Index: lib/date_util.c
Prereq: 5.2
*** ../elm2.4/lib/date_util.c   Wed Jan 27 15:54:25 1993
--- lib/date_util.c     Tue Aug  3 15:28:48 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: date_util.c,v 5.2 1993/01/27 20:54:24 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1993 USENET Community Trust
  *******************************************************************************
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: date_util.c,v 5.3 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1993 USENET Community Trust
  *******************************************************************************
***************
*** 13,18 ****
--- 13,30 ----
  *
  *******************************************************************************
  * $Log: date_util.c,v $
+  * Revision 5.3  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.2  1993/01/27  20:54:24  syd
  * There is a small bug in this routine in Chip's PL21 patch.  The code
  * calls atonum to convert the 4 digit timezone field.  However this field
***************
*** 27,33 ****
  ******************************************************************************/

 #include "headers.h"
- #include <ctype.h>

 /*
  * Date processing functions:
--- 39,44 ----

Index: lib/expand.c
Prereq: 5.3
*** ../elm2.4/lib/expand.c      Thu Dec 10 20:45:27 1992
--- lib/expand.c        Sun Sep 19 19:38:55 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: expand.c,v 5.3 1992/12/11 01:45:04 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: expand.c,v 5.4 1993/09/19 23:38:55 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.4 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,24 ----
  *
  *******************************************************************************
  * $Log: expand.c,v $
+  * Revision 5.4  1993/09/19  23:38:55  syd
+  * expand() didn't read the global rc file if the user elmrc didn't exist or
+  * didn't have an entry for maildir.
+  * From: [email protected] (Jan Djarv)
+  *
  * Revision 5.3  1992/12/11  01:45:04  syd
  * remove sys/types.h include, it is now included by defs.h
  * and this routine includes defs.h or indirectly includes defs.h
***************
*** 44,56 ****

 char *expand_define();

 int
 expand(filename)
 char *filename;
 {
       /** Expand the filename since the first character is a meta-
           character that should expand to the "maildir" variable
!           in the users ".elmrc" file...

           Note: this is a brute force way of getting the entry out
           of the .elmrc file, and isn't recommended for the faint
--- 49,93 ----

 char *expand_define();

+ static char*
+ expand_maildir(rcfile, filename, buffer)
+ FILE *rcfile;
+ char *filename;
+ char *buffer;
+ {
+       char *home = NULL, *bufptr;
+       int  foundit = 0;
+
+       bufptr = (char *) buffer;               /* same address */
+
+       while (! foundit && mail_gets(buffer, SLEN, rcfile) != 0) {
+         if (strncmp(buffer, "maildir", 7) == 0 ||
+             strncmp(buffer, "folders", 7) == 0) {
+           while (*bufptr != '=' && *bufptr)
+             bufptr++;
+           bufptr++;                   /* skip the equals sign */
+           while (whitespace(*bufptr) && *bufptr)
+             bufptr++;
+           home = bufptr;              /* remember this address */
+
+           while (! whitespace(*bufptr) && *bufptr != '\n')
+             bufptr++;
+
+           *bufptr = '\0';             /* remove trailing space */
+           foundit++;
+         }
+       }
+
+       return home;
+ }
+
 int
 expand(filename)
 char *filename;
 {
       /** Expand the filename since the first character is a meta-
           character that should expand to the "maildir" variable
!           in the users ".elmrc" file or in the global rc file...

           Note: this is a brute force way of getting the entry out
           of the .elmrc file, and isn't recommended for the faint
***************
*** 58,68 ****
       **/

       FILE *rcfile;
!       char  buffer[SLEN], *expanded_dir, *home, *bufptr;
!       int   foundit = 0;

-       bufptr = (char *) buffer;               /* same address */
-
       if ((home = getenv("HOME")) == NULL) {
         printf(catgets(elm_msg_cat, ElmrcSet, ElmrcExpandHome,
            "Can't expand environment variable $HOME to find .elmrc file!\n"));
--- 95,102 ----
       **/

       FILE *rcfile;
!       char  buffer[SLEN], *home, *expanded_dir;

       if ((home = getenv("HOME")) == NULL) {
         printf(catgets(elm_msg_cat, ElmrcSet, ElmrcExpandHome,
            "Can't expand environment variable $HOME to find .elmrc file!\n"));
***************
*** 71,105 ****

       sprintf(buffer, "%s/%s", home, elmrcfile);

!       if ((rcfile = fopen(buffer, "r")) == NULL) {
!         printf(catgets(elm_msg_cat, ElmrcSet, ElmrcOpenElmrc,
!               "Can't open your \".elmrc\" file (%s) for reading!\n"),
!                buffer);
!         return(NO);
       }

!       while (! foundit && mail_gets(buffer, SLEN, rcfile) != 0) {
!         if (strncmp(buffer, "maildir", 7) == 0 ||
!             strncmp(buffer, "folders", 7) == 0) {
!           while (*bufptr != '=' && *bufptr)
!             bufptr++;
!           bufptr++;                   /* skip the equals sign */
!           while (whitespace(*bufptr) && *bufptr)
!             bufptr++;
!           home = bufptr;              /* remember this address */
!
!           while (! whitespace(*bufptr) && *bufptr != '\n')
!             bufptr++;
!
!           *bufptr = '\0';             /* remove trailing space */
!           foundit++;
         }
       }

!       fclose(rcfile);                 /* be nice... */
!
!       if (! foundit) {
!         /* Use default */
         sprintf(buffer, "~/%s", default_folders);
         home = buffer;
       }
--- 105,125 ----

       sprintf(buffer, "%s/%s", home, elmrcfile);

!       home = NULL;
!       if ((rcfile = fopen(buffer, "r")) != NULL) {
!         home = expand_maildir(rcfile, filename, buffer);
!         fclose(rcfile);
       }

!       if (home == NULL) { /* elmrc didn't exist or maildir wasn't in it */
!         if ((rcfile = fopen(system_rc_file, "r")) != NULL) {
!           home = expand_maildir(rcfile, filename, buffer);
!           fclose(rcfile);
         }
       }

!       if (home == NULL) {
!         /* Didn't find it, use default */
         sprintf(buffer, "~/%s", default_folders);
         home = buffer;
       }

Index: lib/figadrssee.c
Prereq: 5.2
*** ../elm2.4/lib/figadrssee.c  Wed Feb  3 11:25:46 1993
--- lib/figadrssee.c    Sat Jun 12 01:33:39 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: figadrssee.c,v 5.2 1993/02/03 16:25:45 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: figadrssee.c,v 5.3 1993/06/12 05:33:32 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,23 ----
  *
  *******************************************************************************
  * $Log: figadrssee.c,v $
+  * Revision 5.3  1993/06/12  05:33:32  syd
+  * Remove useless auto
+  * From: Syd
+  *
  * Revision 5.2  1993/02/03  16:25:45  syd
  * Adresses with double quoted strings that contains comma was parsed
  * wrongly by break_down_tolist() and figure_out_addressee().
***************
*** 42,48 ****
       **/

       char *address, *bufptr, mybuf[SLEN];
-       register int index2 = 0;

       if (equal(mail_to, username)) return;   /* can't be better! */

--- 46,51 ----

Index: lib/gcos_name.c
Prereq: 5.2
*** ../elm2.4/lib/gcos_name.c   Tue Jan 19 22:02:33 1993
--- lib/gcos_name.c     Tue Aug  3 15:28:49 1993
***************
*** 1,7 ****
! static char rcsid[] = "@(#)$Id: gcos_name.c,v 5.2 1993/01/20 03:02:19 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,7 ----
! static char rcsid[] = "@(#)$Id: gcos_name.c,v 5.3 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 13,18 ****
--- 13,30 ----
  *
  *******************************************************************************
  * $Log: gcos_name.c,v $
+  * Revision 5.3  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.2  1993/01/20  03:02:19  syd
  * Move string declarations to defs.h
  * From: Syd
***************
*** 28,39 ****
 **/

 #include "headers.h"
- #include <ctype.h>
-
- #ifdef BSD
- #undef tolower
- #undef toupper
- #endif

 char *
 gcos_name(gcos_field, logname)
--- 40,45 ----

Index: lib/get_tz.c
*** /dev/null   Sun Sep 19 14:13:21 1993
--- lib/get_tz.c        Tue Aug 10 14:57:50 1993
***************
*** 0 ****
--- 1,298 ----
+
+ static char rcsid[] = "@(#)$Id: get_tz.c,v 5.1 1993/08/10 18:56:53 syd Exp $";
+
+ /*******************************************************************************
+  *  The Elm Mail System  -  $Revision: 5.1 $   $State: Exp $
+  *
+  *                    Copyright (c) 1992, 1993 USENET Community Trust
+  *******************************************************************************
+  * Bug reports, patches, comments, suggestions should be sent to:
+  *
+  *    Syd Weinstein, Elm Coordinator
+  *    [email protected]                     dsinc!elm
+  *
+  *******************************************************************************
+  * $Log: get_tz.c,v $
+  * Revision 5.1  1993/08/10  18:56:53  syd
+  * Initial Checkin
+  *
+  *
+  ******************************************************************************/
+
+ /*
+  * get_tz - Site-specific timezone handling.
+  *
+  * get_tz_mins(tm) - Return timezone adjustment in minutes west of GMT.
+  * get_tz_name(tm) - Return timezone name.
+  *
+  * These procedures return timezone infomation for the time specified by "tm".
+  * If "tm" is NULL, then the local, current timezone info are returned.
+  *
+  * On some systems, regardless of the "tm" value, the local timezone
+  * values are returned.
+  *
+  * On some systems, when passing a non-NULL "tm" value, a call to "tzset()"
+  * must be performed prior to invoking these routines to obtain proper
+  * timezone information.  Note that some systems will implicitly call
+  * "tzset()" through other routines, such as "localtime()".  On such
+  * systems an explicit "tzset()" is not required if the "tm" value was
+  * obtained through a routine that does the implicit setup.
+  *
+  * The task of discovering timezone info is a horrid mess because so many
+  * systems have different notions about how to do it.  The goal of these
+  * routines is to encapsulate the system dependancies here.  Two definitions,
+  * TZMINS_USE_xxxxxx and TZNAME_USE_xxxxxx must be enabled as appropriate
+  * for this system.  Exactly _one_ definition from each group must be
+  * specified.  The available choices are:
+  *
+  * TZMINS_USE_xxxxxx specifies how to get timezone offset.
+  *
+  *    TZMINS_USE_TM_TZADJ    use (struct tm*)->tm_tzadj
+  *    TZMINS_USE_TM_GMTOFF   use (struct tm*)->tm_gmtoff
+  *    TZMINS_USE_TZAZ_GLOBAL use "timezone, altzone" externals
+  *    TZMINS_USE_TZ_GLOBAL   use "timezone" external
+  *    TZMINS_USE_FTIME       use ftime() function
+  *    TZMINS_USE_TIMEOFDAY   use gettimeofday() function
+  *
+  * TZNAME_USE_xxxxxx specifies how to get timezone name.
+  *
+  *    TZNAME_USE_TM_NAME     use (struct tm *)->tm_name
+  *    TZNAME_USE_TM_ZONE     use (struct tm *)->tm_zone
+  *    TZNAME_USE_TZNAME      use "tzname[]" external
+  *    TZNAME_USE_TIMEZONE    use timezone() function
+  *
+  * The TZMINS_HANDLING and TZNAME_HANDLING definitions are just used
+  * to verify the configurations were setup correctly.  They force
+  * compiler warnings and/or errors in the event of a configuration problem.
+  */
+
+ #include "defs.h"
+
+ #ifdef I_TIME
+ #  include <time.h>
+ #endif
+ #ifdef I_SYSTIME
+ #  include <sys/time.h>
+ #endif
+ #ifdef TZMINS_USE_FTIME
+ #  include <sys/timeb.h>
+ #endif
+
+ #ifndef       _POSIX_SOURCE
+ extern struct tm *localtime();
+ extern time_t   time();
+ #endif
+
+ /****************************************************************************/
+
+ int get_tz_mins(tm)
+ struct tm *tm;
+ {
+
+       if (tm == 0) {
+               time_t t;
+               (void) time(&t);
+               tm = localtime(&t);
+       }
+
+ #ifdef TZMINS_USE_TM_TZADJ
+ #define TZMINS_HANDLING 1
+       /*
+        * This system maintains the timezone offset in the (struct tm)
+        * as a number of _seconds_ west of GMT.
+        */
+       return (int)(tm->tm_tzadj / 60);
+ #endif
+
+ #ifdef TZMINS_USE_TM_GMTOFF
+ #define TZMINS_HANDLING 2
+       /*
+        * This system maintains the timezone offset in the (struct tm)
+        * as a number of _seconds_ _east_ of GMT.  Since this is an
+        * easterly pointing offset, we need to flip the sign to go the
+        * other direction.
+        */
+       return (int)(-tm->tm_gmtoff / 60);
+ #endif
+
+ #ifdef TZMINS_USE_TZAZ_GLOBAL
+ #define TZMINS_HANDLING 3
+       /*
+        * This system maintains timezone offsets in global variables
+        * as a number of _seconds_ west of GMT.  There are two globals,
+        * one for when DST is in effect and one for when it is not,
+        * and we need to select the correct one.
+        */
+       {
+               extern long altzone, timezone;
+               return (int)((tm->tm_isdst ? altzone : timezone) / 60);
+       }
+ #endif
+
+ #ifdef TZMINS_USE_TZ_GLOBAL
+ #define TZMINS_HANDLING 4
+       /*
+        * This system maintains the timezone offset in a global variable as
+        * a number of _seconds_ west of GMT.  We need to correct this value
+        * if DST is in effect.  Note that the global "daylight" indicates
+        * that DST applies to this site and NOT necessarily that the DST
+        * correction needs to be applied right now.  Be careful -- some
+        * systems have a "timezone()" procedure and this method will return
+        * the address of that procedure rather than a timezone offset!
+        */
+       {
+               extern long timezone;
+               extern int daylight;
+               return (int)(timezone/60) -
+                   ((daylight && tm->tm_isdst) ? 60 : 0);
+       }
+ #endif
+
+ #ifdef TZMINS_USE_TIMEOFDAY
+ #define TZMINS_HANDLING 5
+       /*
+        * This system uses gettimeofday() to obtain the timezone
+        * information as minutes west of GMT.  The returned value will
+        * not be corrected for DST (unless you are unlucky enough to
+        * own a Unix written by some unmentionable vendor), so we will
+        * need to account for that.  Be careful -- some systems that
+        * have this procedure depreciate its use for timezone information
+        * and recommend it only for the high-resolution time information.
+        * On these systems the timezone info may be some kernel default
+        * or even garbage.
+        */
+       {
+               struct timeval tv;
+               struct timezone tz;
+               (void) gettimeofday(&tv, &tz);
+ #ifdef AIX
+               return tz.tz_minuteswest;
+ #else
+               return tz.tz_minuteswest -
+                   (tm->tm_isdst && tz.tz_dsttime != DST_NONE ? 60 : 0);
+ #endif
+       }
+ #endif
+
+ #ifdef TZMINS_USE_FTIME
+ #define TZMINS_HANDLING 6
+       /*
+        * This system uses ftime() to obtain the timezone information
+        * as minutes west of GMT.  The returned value will not be
+        * corrected for DST, so we will need to account for that.  Be
+        * careful -- some systems that have this procedure depreciate
+        * its use for timezone information and recommend it only for
+        * the high-resolution time information.  On these systems the
+        * timezone info may be some kernel default or even garbage.
+        */
+       {
+               struct timeb tb;
+               (void) ftime(&tb);
+               return tb.timezone - (tm->tm_isdst ? 60 : 0);
+       }
+ #endif
+
+ #ifndef TZMINS_HANDLING
+       /* Force a compile error if the timezone config is wrong. */
+       no_tzmins_handling_defined(TZMINS_HANDLING);
+ #endif
+ }
+
+ /****************************************************************************/
+
+ char *get_tz_name(tm)
+ struct tm *tm;
+ {
+
+       if (tm == 0) {
+               time_t t;
+               (void) time(&t);
+               tm = localtime(&t);
+       }
+
+ #ifdef TZNAME_USE_TM_NAME
+ #define TZNAME_HANDLING 1
+       /*
+        * This system maintains the timezone name in the (struct tm).
+        */
+       return tm->tm_name;
+ #endif
+
+ #ifdef TZNAME_USE_TM_ZONE
+ #define TZNAME_HANDLING 2
+       /*
+        * This system maintains the timezone name in the (struct tm).
+        */
+       return tm->tm_zone;
+ #endif
+
+ #ifdef TZNAME_USE_TZNAME
+ #define TZNAME_HANDLING 3
+       /*
+        * This system maintains a global array that contains two timezone
+        * names, one for when DST is in effect and one for when it is not.
+        * We simply need to pick the right one.
+        */
+       {
+               extern char *tzname[];
+               return tzname[tm->tm_isdst];
+       }
+ #endif
+
+ #ifdef TZNAME_USE_TIMEZONE
+ #define TZNAME_HANDLING 4
+       /*
+        * This system provides a timezone() procedure to get a timezone
+        * name.  Be careful -- some systems have this procedure but
+        * depreciate its use, and in some cases it is outright broke.
+        */
+       {
+               extern char *timezone();
+               return timezone(get_tz_mins(tm), tm->tm_isdst);
+       }
+ #endif
+
+ #ifndef TZNAME_HANDLING
+       /* Force a compile error if the timezone config is wrong. */
+       no_tzname_handling_defined(TZNAME_HANDLING);
+ #endif
+ }
+
+ /****************************************************************************/
+
+ #ifdef _TEST
+
+ /*
+  * It would be best to futz around with the TZ setting when running this
+  * test.  In all cases, the "null" and the "localtime()" results should
+  * be identical, and the "gmtime()" results should indicate "GMT 0"
+  * regardless of TZ setting.  Here are a few possible TZ settings you
+  * can try, and the result you should expect.
+  *
+  *    TZ=GMT                  always GMT 0
+  *    TZ=CST6CDT              CST 360 or CDT 300, depending upon time of year
+  *    TZ=EST5EDT              EST 300 or EDT 240, depending upon time of year
+  *    TZ=EST5EDT;0,364        always EDT 240
+  *    TZ=EST5EDT;0,0          always EST 300
+  *
+  * Oh...this all assumes your system supports TZ. :-)
+  */
+
+ main()
+ {
+       time_t t;
+       struct tm *tm;
+       static char f[] = "using %s tm struct - name=\"%s\" mins_west=\"%d\"\n";
+
+       (void) time(&t);
+       tm = (struct tm *)0;
+       printf(f, "null", get_tz_name(tm), get_tz_mins(tm));
+       tm = localtime(&t);
+       printf(f, "localtime()", get_tz_name(tm), get_tz_mins(tm));
+       tm = gmtime(&t);
+       printf(f, "gmtime()", get_tz_name(tm), get_tz_mins(tm));
+       exit(0);
+ }
+
+ #endif /*_TEST*/
+

Index: lib/getaddrfrm.c
Prereq: 5.3
*** ../elm2.4/lib/getaddrfrm.c  Sun May 16 16:55:52 1993
--- lib/getaddrfrm.c    Tue Aug  3 15:28:49 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: getaddrfrm.c,v 5.3 1993/05/16 20:55:52 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: getaddrfrm.c,v 5.4 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.4 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 14,19 ****
--- 14,31 ----
  *
  *******************************************************************************
  * $Log: getaddrfrm.c,v $
+  * Revision 5.4  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.3  1993/05/16  20:55:52  syd
  * Fix bug where text following "<" within double-quote delimited comment
  * is taken as an address.
***************
*** 34,40 ****
 **/

 #include "headers.h"
- #include <ctype.h>

 #ifdef USE_EMBEDDED_ADDRESSES

--- 46,51 ----

Index: lib/getarpdate.c
Prereq: 5.8
*** ../elm2.4/lib/getarpdate.c  Sat May  8 15:22:46 1993
--- lib/getarpdate.c    Tue Aug  3 15:20:59 1993
***************
*** 1,7 ****
! static char rcsid[] = "@(#)$Id: getarpdate.c,v 5.8 1993/05/08 19:22:46 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.8 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,7 ----
! static char rcsid[] = "@(#)$Id: getarpdate.c,v 5.9 1993/08/03 19:17:33 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.9 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 13,18 ****
--- 13,27 ----
  *
  *******************************************************************************
  * $Log: getarpdate.c,v $
+  * Revision 5.9  1993/08/03  19:17:33  syd
+  * Implement new timezone handling.  New file lib/get_tz.c with new timezone
+  * routines.  Added new TZMINS_USE_xxxxxx and TZNAME_USE_xxxxxx configuration
+  * definitions.  Obsoleted TZNAME, ALTCHECK, and TZ_MINUTESWEST configuration
+  * definitions.  Updated Configure.  Modified lib/getarpdate.c and
+  * lib/strftime.c to use new timezone routines.
+  *
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.8  1993/05/08  19:22:46  syd
  * On the DEC Alpha, OSF/1 the following change made things happy.
  * From: [email protected] (Dave Rasmussen)
***************
*** 49,58 ****
  *
  ******************************************************************************/

- /**
-
- **/
-
 #include "headers.h"

 #ifdef I_TIME
--- 58,63 ----
***************
*** 61,75 ****
 #ifdef I_SYSTIME
 #  include <sys/time.h>
 #endif
- #ifdef BSD
- #  include <sys/timeb.h>
- #endif
-
- #include <ctype.h>

 #ifndef       _POSIX_SOURCE
 extern struct tm *localtime();
- extern struct tm *gmtime();
 extern time_t   time();
 #endif

--- 66,74 ----
***************
*** 79,93 ****
 static char *arpa_monname[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""};

! #ifdef TZNAME
!   extern char *tzname[];
! #else
!   char *timezone();
! #endif
!
! #ifdef _AIX370
! #undef ALTCHECK
! #endif /* _AIX370 */

 char *
 get_arpa_date()
--- 78,85 ----
 static char *arpa_monname[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""};

! extern int get_tz_mins();
! extern char *get_tz_name();

 char *
 get_arpa_date()
***************
*** 100,190 ****
       **/

       static char buffer[SLEN];       /* static character buffer       */
!       struct tm *the_time;            /* Time structure, see CTIME(3C) */
!       time_t     junk;                /* time in seconds....           */
       long       tzmin;               /* number of minutes off gmt     */
       char      *tzsign;              /* + or - gmt                    */
!
! #if !defined(TZNAME) || defined(_AIX)
! # ifndef TZ_MINUTESWEST
!       struct timeb    loc_time;
!
!       junk = time((time_t *) 0);
!       ftime(&loc_time);
! # else /* TZ_MINUTESWEST */
!       struct  timeval  time_val;
!       struct  timezone time_zone;
!
!       gettimeofday(&time_val, &time_zone);
!       junk = time_val.tv_sec;
! # endif /* TZ_MINUTESWEST */
!
! #else /* TZNAME */
! # ifndef __osf__
!       extern  time_t  timezone;
! # endif /* __osf__ */
! # ifdef ALTCHECK
!       extern  time_t  altzone;
! # endif
!
!       junk = time((time_t *) 0);      /* this must be here for it to work! */
! #endif /* TZNAME */
!
!       the_time = localtime(&junk);
!       if (the_time->tm_year < 100)
!               the_time->tm_year += 1900;
! #if !defined(TZNAME) || defined(_AIX)
! # ifdef TZ_MINUTESWEST
! #  ifndef AIX
!       if (the_time->tm_isdst && time_zone.tz_dsttime != DST_NONE)
!               tzmin = - (time_zone.tz_minuteswest - 60);
!       else
! #  endif /* AIX */
!               tzmin = - time_zone.tz_minuteswest;
! # else /* TZ_MINUTESWEST */
!       tzmin = the_time->tm_gmtoff / 60;
! # endif /* TZ_MINUTESWEST */
! #else /* TZNAME */
! # ifdef ALTCHECK
!       if (the_time->tm_isdst)
!               tzmin = - (altzone / 60);
!       else
!               tzmin = - (timezone / 60);
! # else /* ALTCHECK */
!       tzmin = - (timezone / 60);
! # endif /* ALTCHECK */
! #endif /* TZNAME */

!       if (tzmin >= 0)
               tzsign = "+";
!       else {
               tzsign = "-";
               tzmin = -tzmin;
       }
-
       sprintf(buffer, "%s, %d %s %d %02d:%02d:%02d %s%02d%02d (%s)",
!         arpa_dayname[the_time->tm_wday],
!         the_time->tm_mday,
!         arpa_monname[the_time->tm_mon], the_time->tm_year,
!         the_time->tm_hour, the_time->tm_min, the_time->tm_sec,
!         tzsign, tzmin / 60, tzmin % 60,
! #if !defined(TZNAME) || defined(_AIX)
! #ifdef TZ_MINUTESWEST
! # ifdef GOULD_NP1
!         the_time->tm_zone);
! # else
! #  ifndef _AIX
!         timezone(time_zone.tz_minuteswest, the_time->tm_isdst));
! #  else /* AIX has tzname */
!         tzname[the_time->tm_isdst]);
! #  endif
! # endif
! #else
!         timezone(loc_time.timezone, the_time->tm_isdst));
! #endif
! #else
!         tzname[the_time->tm_isdst]);
! #endif

!       return( (char *) buffer);
 }
--- 92,118 ----
       **/

       static char buffer[SLEN];       /* static character buffer       */
!       time_t     curr_time;           /* time in seconds....           */
!       struct tm *curr_tm;             /* Time structure, see CTIME(3C) */
       long       tzmin;               /* number of minutes off gmt     */
       char      *tzsign;              /* + or - gmt                    */
!       int       year;                 /* current year - with century   */

!       (void) time(&curr_time);
!       curr_tm = localtime(&curr_time);
!       if ((year = curr_tm->tm_year) < 100)
!               year += 1900;
!       if ((tzmin = -get_tz_mins(curr_tm)) >= 0) {
               tzsign = "+";
!       } else {
               tzsign = "-";
               tzmin = -tzmin;
       }
       sprintf(buffer, "%s, %d %s %d %02d:%02d:%02d %s%02d%02d (%s)",
!         arpa_dayname[curr_tm->tm_wday],
!         curr_tm->tm_mday, arpa_monname[curr_tm->tm_mon], year,
!         curr_tm->tm_hour, curr_tm->tm_min, curr_tm->tm_sec,
!         tzsign, tzmin / 60, tzmin % 60, get_tz_name(curr_tm));

!       return buffer;
 }

Index: lib/getword.c
Prereq: 5.1
*** ../elm2.4/lib/getword.c     Mon Jan 18 23:46:52 1993
--- lib/getword.c       Tue Aug  3 15:28:50 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: getword.c,v 5.1 1993/01/19 04:46:21 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.1 $   $State: Exp $
  *
  *                    Copyright (c) 1993 USENET Community Trust
  *******************************************************************************
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: getword.c,v 5.2 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1993 USENET Community Trust
  *******************************************************************************
***************
*** 13,18 ****
--- 13,30 ----
  *
  *******************************************************************************
  * $Log: getword.c,v $
+  * Revision 5.2  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.1  1993/01/19  04:46:21  syd
  * Initial Checkin
  *
***************
*** 20,26 ****
  ******************************************************************************/

 #include <stdio.h>
- #include <ctype.h>
 #include "defs.h"

 int get_word(buffer, start, word, wordlen)
--- 32,37 ----

Index: lib/header_cmp.c
Prereq: 5.2
*** ../elm2.4/lib/header_cmp.c  Sat Nov  7 15:59:52 1992
--- lib/header_cmp.c    Tue Aug  3 15:28:50 1993
***************
*** 1,7 ****
! static char rcsid[] = "@(#)$Id: header_cmp.c,v 5.2 1992/11/07 20:59:49 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,7 ----
! static char rcsid[] = "@(#)$Id: header_cmp.c,v 5.3 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.3 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 13,18 ****
--- 13,30 ----
  *
  *******************************************************************************
  * $Log: header_cmp.c,v $
+  * Revision 5.3  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.2  1992/11/07  20:59:49  syd
  * fix typo
  *
***************
*** 32,42 ****
 **/

 #include "headers.h"
- #include <ctype.h>
-
- #ifdef BSD
- #undef tolower
- #endif


 char *
--- 44,49 ----

Index: lib/istrcmp.c
Prereq: 5.1
*** ../elm2.4/lib/istrcmp.c     Sat Oct  3 18:42:24 1992
--- lib/istrcmp.c       Tue Aug  3 15:28:51 1993
***************
*** 1,7 ****
! static char rcsid[] = "@(#)$Id: istrcmp.c,v 5.1 1992/10/03 22:41:36 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.1 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
--- 1,7 ----
! static char rcsid[] = "@(#)$Id: istrcmp.c,v 5.2 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1988-1992 USENET Community Trust
  *                    Copyright (c) 1986,1987 Dave Taylor
***************
*** 13,18 ****
--- 13,30 ----
  *
  *******************************************************************************
  * $Log: istrcmp.c,v $
+  * Revision 5.2  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.1  1992/10/03  22:41:36  syd
  * Initial checkin as of 2.4 Release at PL0
  *
***************
*** 24,35 ****
 **/

 #include "headers.h"
- #include <ctype.h>
-
- #ifdef BSD
- #undef tolower
- #endif
-

 int
 istrcmp(s1,s2)
--- 36,41 ----
***************
*** 38,45 ****
       /* case insensitive comparison */
       register int d;
       for (;;) {
!         d = ( isupper(*s1) ? tolower(*s1) : *s1 )
!                 - ( isupper(*s2) ? tolower(*s2) : *s2 ) ;
         if ( d != 0 || *s1 == '\0' || *s2 == '\0' )
           return d;
         ++s1;
--- 44,50 ----
       /* case insensitive comparison */
       register int d;
       for (;;) {
!         d = (tolower(*s1) - tolower(*s2));
         if ( d != 0 || *s1 == '\0' || *s2 == '\0' )
           return d;
         ++s1;

Index: lib/ldstate.c
Prereq: 5.5
*** ../elm2.4/lib/ldstate.c     Wed Feb  3 10:26:31 1993
--- lib/ldstate.c       Sun Aug 22 22:46:53 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: ldstate.c,v 5.5 1993/02/03 15:26:13 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.5 $   $State: Exp $
  *
  *                    Copyright (c) 1992 USENET Community Trust
  *******************************************************************************
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: ldstate.c,v 5.6 1993/08/23 02:46:51 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.6 $   $State: Exp $
  *
  *                    Copyright (c) 1992 USENET Community Trust
  *******************************************************************************
***************
*** 13,18 ****
--- 13,22 ----
  *
  *******************************************************************************
  * $Log: ldstate.c,v $
+  * Revision 5.6  1993/08/23  02:46:51  syd
+  * Test ANSI_C, not __STDC__ (which is not set on e.g. AIX).
+  * From: decwrl!uunet.UU.NET!fin!chip (Chip Salzenberg)
+  *
  * Revision 5.5  1993/02/03  15:26:13  syd
  * protect atol in ifndef __STDC__ as some make it a macro, and its in stdlib.h
  *
***************
*** 57,64 ****
  * the (struct folder_state) record.
  */

! #ifndef __STDC__ /* avoid problemswith systems that declare atol as a macro */
!     extern long atol();
 #endif

 static char *elm_fgetline(buf, buflen, fp)
--- 61,68 ----
  * the (struct folder_state) record.
  */

! #if !ANSI_C  /* avoid problems with systems that declare atol as a macro */
! extern long atol();
 #endif

 static char *elm_fgetline(buf, buflen, fp)

Index: lib/len_next.c
Prereq: 5.4
*** ../elm2.4/lib/len_next.c    Sun Apr 11 21:27:30 1993
--- lib/len_next.c      Tue Aug  3 15:28:51 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: len_next.c,v 5.4 1993/04/12 01:27:30 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.4 $   $State: Exp $
  *
  *                    Copyright (c) 1992 USENET Community Trust
  *******************************************************************************
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: len_next.c,v 5.5 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.5 $   $State: Exp $
  *
  *                    Copyright (c) 1992 USENET Community Trust
  *******************************************************************************
***************
*** 13,18 ****
--- 13,30 ----
  *
  *******************************************************************************
  * $Log: len_next.c,v $
+  * Revision 5.5  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
  * Revision 5.4  1993/04/12  01:27:30  syd
  * len_next_part() was botching quote-delimited strings.
  * From: [email protected] (Chip Rosenthal)
***************
*** 54,61 ****

 **/

- #include <ctype.h>
-

 int
 len_next_part(str)
--- 66,71 ----

Index: lib/mail_gets.c
Prereq: 5.2
*** ../elm2.4/lib/mail_gets.c   Sun Apr 11 21:13:30 1993
--- lib/mail_gets.c     Tue Aug  3 15:28:52 1993
***************
*** 1,8 ****

! static char rcsid[] = "@(#)$Id: mail_gets.c,v 5.2 1993/04/12 01:13:30 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.2 $   $State: Exp $
  *
  *                    Copyright (c) 1992 USENET Community Trust
  *******************************************************************************
--- 1,8 ----

! static char rcsid[] = "@(#)$Id: mail_gets.c,v 5.4 1993/08/03 19:28:39 syd Exp $";

 /*******************************************************************************
!  *  The Elm Mail System  -  $Revision: 5.4 $   $State: Exp $
  *
  *                    Copyright (c) 1992 USENET Community Trust
  *******************************************************************************
***************
*** 13,18 ****
--- 13,39 ----
  *
  *******************************************************************************
  * $Log: mail_gets.c,v $
+  * Revision 5.4  1993/08/03  19:28:39  syd
+  * Elm tries to replace the system toupper() and tolower() on current
+  * BSD systems, which is unnecessary.  Even worse, the replacements
+  * collide during linking with routines in isctype.o.  This patch adds
+  * a Configure test to determine whether replacements are really needed
+  * (BROKE_CTYPE definition).  The <ctype.h> header file is now included
+  * globally through hdrs/defs.h and the BROKE_CTYPE patchup is handled
+  * there.  Inclusion of <ctype.h> was removed from *all* the individual
+  * files, and the toupper() and tolower() routines in lib/opt_utils.c
+  * were dropped.
+  * From: [email protected] (Chip Rosenthal)
+  *
+  * Revision 5.3  1993/08/03  19:05:33  syd
+  * When STDC is used on Convex the feof() function is defined as
+  * a true library routine in the header files and moreover the
+  * library routine also leaks royally. It returns always 1!!
+  * So we have to use a macro. Convex naturally does not provide
+  * you with one though if you are using a STDC compiler. So we
+  * have to include one.
+  * From: Jukka Ukkonen <[email protected]>
+  *
  * Revision 5.2  1993/04/12  01:13:30  syd
  * In some cases, with certain editors, the user can create an
  * aliases.text file in which the last line is terminated with an EOF but
***************
*** 33,40 ****
 **/

 #include <stdio.h>
! #include <ctype.h>
!

 int
 mail_gets(buffer, size, mailfile)
--- 54,60 ----
 **/

 #include <stdio.h>
! #include "defs.h"

 int
 mail_gets(buffer, size, mailfile)
***************
*** 46,51 ****
--- 66,72 ----
       register char *c = buffer;

       size--; /* allow room for zero terminator on end, just in case */
+
       while (!feof(mailfile) && !ferror(mailfile) && line_bytes < size) {
         ch = getc(mailfile); /* Macro, faster than  fgetc() ! */


Index: lib/mcprt.c
*** ../elm2.4/lib/mcprt.c       Sat Oct  3 18:42:25 1992
--- lib/mcprt.c Sun Aug 22 22:49:36 1993
***************
*** 1,4 ****
--- 1,6 ----

+ static char rcsid[] = "@(#)$Id: mcprt.c,v 5.5 1993/08/23 02:49:35 syd Exp $";
+
 /***********************************************************
 Copyright 1990, by Alfalfa Software Incorporated, Cambridge, Massachusetts.

***************
*** 35,41 ****

 01/18/91   3 hamilton #if not rescanned
 01/12/91   1 schulert conditionally use prototypes
!                       rework to use either varargs or stdargs
 11/03/90   2 hamilton Alphalpha->Alfalfa & OmegaMail->Poste
 08/10/90   1 nazgul   printf, sprintf and fprintf
 */
--- 37,43 ----

 01/18/91   3 hamilton #if not rescanned
 01/12/91   1 schulert conditionally use prototypes
!                       rework to use either varargs or stdarg
 11/03/90   2 hamilton Alphalpha->Alfalfa & OmegaMail->Poste
 08/10/90   1 nazgul   printf, sprintf and fprintf
 */
***************
*** 47,55 ****
--- 49,61 ----
 #include "mcprt.h"
 #include "mcprtlib.h"

+ #ifdef        I_STDARG
+ int   MCprintf(char *fmt, ...)
+ #else
 int   MCprintf(fmt, va_alist)
 char *fmt;
 va_dcl
+ #endif
 {
     MCRockT   *rock;
     int               len, i;
***************
*** 65,74 ****
--- 71,84 ----
     return len;
 }

+ #ifdef        I_STDARG
+ int   MCfprintf(FILE *fptr, char *fmt, ...)
+ #else
 int   MCfprintf(fptr, fmt, va_alist)
 FILE *fptr;
 char *fmt;
 va_dcl
+ #endif
 {
     MCRockT   *rock;
     int               len, i;
***************
*** 84,93 ****
--- 94,107 ----
     return len;
 }

+ #ifdef        I_STDARG
+ int   MCsprintf(char *cptr, char *fmt, ...)
+ #else
 int   MCsprintf(cptr, fmt, va_alist)
 char *cptr;
 char *fmt;
 va_dcl
+ #endif
 {
     MCRockT   *rock;
     int               len, i;

Index: lib/mcprtlib.c
*** ../elm2.4/lib/mcprtlib.c    Sat Oct  3 18:42:26 1992
--- lib/mcprtlib.c      Sun Aug 22 22:54:32 1993
***************
*** 1,4 ****
--- 1,6 ----

+ static char rcsid[] = "@(#)$Id: mcprtlib.c,v 5.5 1993/08/23 02:54:31 syd Exp $";
+
 /***********************************************************
 Copyright 1990, by Alfalfa Software Incorporated, Cambridge, Massachusetts.

***************
*** 47,53 ****
 #define       CATGETS

 #include <stdio.h>
- #include <ctype.h>
 #include "defs.h"

 #include "mcprtlib.h"
--- 49,54 ----
***************
*** 292,297 ****
--- 293,302 ----
      * Set the correct types and figure out how many data segments we are going
      * to have.
      */
+     /* Initialize typeList */
+     for (i = 0; i < typeCnt; i++)
+       typeList[i].type = 0;
+
     for (replyCnt = i = 0; i < argCnt; ++i) {
       if (argList[i].type) {
           pos = argList[i].pos-1;
***************
*** 580,586 ****
     if (rock->typeList) free((char *) rock->typeList);

     if (rock->replyList) {
!       for (i = 0; i < rock->argCnt; ++i) {
           if ((rock->replyList[i].argType & MCFree) && rock->replyList[i].data)
             free(rock->replyList[i].data);
       }
--- 585,591 ----
     if (rock->typeList) free((char *) rock->typeList);

     if (rock->replyList) {
!       for (i = 0; i < rock->replyCnt; ++i) {
           if ((rock->replyList[i].argType & MCFree) && rock->replyList[i].data)
             free(rock->replyList[i].data);
       }