1: /*
   2: **  Sendmail
   3: **  Copyright (c) 1983  Eric P. Allman
   4: **  Berkeley, California
   5: **
   6: **  Copyright (c) 1983 Regents of the University of California.
   7: **  All rights reserved.  The Berkeley software License Agreement
   8: **  specifies the terms and conditions for redistribution.
   9: */
  10: 
  11: #ifndef lint
  12: static char SccsId[] = "@(#)arpadate.c	5.4 (Berkeley) 1/9/86";
  13: #endif not lint
  14: 
  15: # include "conf.h"
  16: # ifdef USG
  17: # include <time.h>
  18: # else
  19: # include <sys/time.h>
  20: # ifndef V6
  21: # include <sys/types.h>
  22: # include <sys/timeb.h>
  23: # endif V6
  24: # endif USG
  25: # include "useful.h"
  26: 
  27: # ifdef V6
  28: # define OLDTIME
  29: # endif V6
  30: # ifdef USG
  31: # define OLDTIME
  32: # endif USG
  33: 
  34: /*
  35: **  ARPADATE -- Create date in ARPANET format
  36: **
  37: **	Parameters:
  38: **		ud -- unix style date string.  if NULL, one is created.
  39: **
  40: **	Returns:
  41: **		pointer to an ARPANET date field
  42: **
  43: **	Side Effects:
  44: **		none
  45: **
  46: **	WARNING:
  47: **		date is stored in a local buffer -- subsequent
  48: **		calls will overwrite.
  49: **
  50: **	Bugs:
  51: **		Timezone is computed from local time, rather than
  52: **		from whereever (and whenever) the message was sent.
  53: **		To do better is very hard.
  54: **
  55: **		Some sites are now inserting the timezone into the
  56: **		local date.  This routine should figure out what
  57: **		the format is and work appropriately.
  58: */
  59: 
  60: char *
  61: arpadate(ud)
  62:     register char *ud;
  63: {
  64:     register char *p;
  65:     register char *q;
  66:     static char b[40];
  67:     extern char *ctime();
  68:     register int i;
  69:     extern struct tm *localtime();
  70:     extern bool fconvert();
  71: # ifdef OLDTIME
  72:     long t;
  73:     extern long time();
  74: # else OLDTIME
  75:     struct timeb t;
  76:     extern struct timeb *ftime();
  77:     extern char *timezone();
  78: # endif OLDTIME
  79: # ifdef V6
  80:     extern char *StdTimezone, *DstTimezone;
  81: # endif V6
  82: # ifdef USG
  83:     extern char *tzname[2];
  84: # endif USG
  85: 
  86:     /*
  87: 	**  Get current time.
  88: 	**	This will be used if a null argument is passed and
  89: 	**	to resolve the timezone.
  90: 	*/
  91: 
  92: # ifdef OLDTIME
  93:     (void) time(&t);
  94:     if (ud == NULL)
  95:         ud = ctime(&t);
  96: # else
  97:     ftime(&t);
  98:     if (ud == NULL)
  99:         ud = ctime(&t.time);
 100: # endif OLDTIME
 101: 
 102:     /*
 103: 	**  Crack the UNIX date line in a singularly unoriginal way.
 104: 	*/
 105: 
 106:     q = b;
 107: 
 108:     p = &ud[0];     /* Mon */
 109:     *q++ = *p++;
 110:     *q++ = *p++;
 111:     *q++ = *p++;
 112:     *q++ = ',';
 113:     *q++ = ' ';
 114: 
 115:     p = &ud[8];     /* 16 */
 116:     if (*p == ' ')
 117:         p++;
 118:     else
 119:         *q++ = *p++;
 120:     *q++ = *p++;
 121:     *q++ = ' ';
 122: 
 123:     p = &ud[4];     /* Sep */
 124:     *q++ = *p++;
 125:     *q++ = *p++;
 126:     *q++ = *p++;
 127:     *q++ = ' ';
 128: 
 129:     p = &ud[22];        /* 79 */
 130:     *q++ = *p++;
 131:     *q++ = *p++;
 132:     *q++ = ' ';
 133: 
 134:     p = &ud[11];        /* 01:03:52 */
 135:     for (i = 8; i > 0; i--)
 136:         *q++ = *p++;
 137: 
 138:                 /* -PST or -PDT */
 139: # ifdef V6
 140:     if (localtime(&t)->tm_isdst)
 141:         p = DstTimezone;
 142:     else
 143:         p = StdTimezone;
 144: # else
 145: # ifdef USG
 146:     if (localtime(&t)->tm_isdst)
 147:         p = tzname[1];
 148:     else
 149:         p = tzname[0];
 150: # else
 151:     p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
 152: # endif USG
 153: # endif V6
 154:     if ((strncmp(p, "GMT", 3) == 0 || strncmp(p, "gmt", 3) == 0) &&
 155:         p[3] != '\0')
 156:     {
 157:         /* hours from GMT */
 158:         p += 3;
 159:         *q++ = *p++;
 160:         if (p[1] == ':')
 161:             *q++ = '0';
 162:         else
 163:             *q++ = *p++;
 164:         *q++ = *p++;
 165:         p++;        /* skip ``:'' */
 166:         *q++ = *p++;
 167:         *q++ = *p++;
 168:         *q = '\0';
 169:     }
 170:     else if (!fconvert(p, q))
 171:     {
 172:         *q++ = ' ';
 173:         *q++ = *p++;
 174:         *q++ = *p++;
 175:         *q++ = *p++;
 176:         *q = '\0';
 177:     }
 178: 
 179:     return (b);
 180: }
 181: /*
 182: **  FCONVERT -- convert foreign timezones to ARPA timezones
 183: **
 184: **	This routine is essentially from Teus Hagen.
 185: **
 186: **	Parameters:
 187: **		a -- timezone as returned from UNIX.
 188: **		b -- place to put ARPA-style timezone.
 189: **
 190: **	Returns:
 191: **		TRUE -- if a conversion was made (and b was filled in).
 192: **		FALSE -- if this is not a recognized local time.
 193: **
 194: **	Side Effects:
 195: **		none.
 196: */
 197: 
 198: /* UNIX to arpa conversion table */
 199: struct foreign
 200: {
 201:     char *f_from;
 202:     char *f_to;
 203: };
 204: 
 205: static struct foreign   Foreign[] =
 206: {
 207:     { "EET",    "+0200" },  /* eastern europe */
 208:     { "MET",    "+0100" },  /* middle europe */
 209:     { "WET",    "GMT"   },  /* western europe */
 210:     { "EET DST",    "+0300" },  /* daylight saving times */
 211:     { "MET DST",    "+0200" },
 212:     { "WET DST",    "+0100" },
 213:     { NULL,     NULL     }
 214: };
 215: 
 216: bool
 217: fconvert(a, b)
 218:     register char *a;
 219:     char *b;
 220: {
 221:     register struct foreign *euptr;
 222:     register char *p;
 223: 
 224:     for (euptr = Foreign; euptr->f_from != NULL; euptr++)
 225:     {
 226:         extern bool sameword();
 227: 
 228:         if (sameword(euptr->f_from, a))
 229:         {
 230:             p = euptr->f_to;
 231:             *b++ = ' ';
 232:             while (*p != '\0')
 233:                 *b++ = *p++;
 234:             *b = '\0';
 235:             return (TRUE);
 236:         }
 237:     }
 238:     return (FALSE);
 239: }

Defined functions

fconvert defined in line 216; used 2 times

Defined variables

Foreign defined in line 205; used 1 times
SccsId defined in line 12; never used

Defined struct's

foreign defined in line 199; used 4 times

Defined macros

OLDTIME defined in line 31; used 3 times
Last modified: 1986-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 952
Valid CSS Valid XHTML 1.0 Strict