Annotation of 43BSD/usr.lib/sendmail/src/arpadate.c, revision 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.