Annotation of 43BSD/usr.lib/sendmail/src/arpadate.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.