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

1.1       root        1: # include "conf.h"
                      2: # include <sys/time.h>
                      3: # ifndef V6
                      4: # include <sys/types.h>
                      5: # include <sys/timeb.h>
                      6: # endif
                      7: # include "useful.h"
                      8: 
                      9: SCCSID(@(#)arpadate.c  4.2             9/27/83);
                     10: 
                     11: /*
                     12: **  ARPADATE -- Create date in ARPANET format
                     13: **
                     14: **     Parameters:
                     15: **             ud -- unix style date string.  if NULL, one is created.
                     16: **
                     17: **     Returns:
                     18: **             pointer to an ARPANET date field
                     19: **
                     20: **     Side Effects:
                     21: **             none
                     22: **
                     23: **     WARNING:
                     24: **             date is stored in a local buffer -- subsequent
                     25: **             calls will overwrite.
                     26: **
                     27: **     Bugs:
                     28: **             Timezone is computed from local time, rather than
                     29: **             from whereever (and whenever) the message was sent.
                     30: **             To do better is very hard.
                     31: **
                     32: **             Some sites are now inserting the timezone into the
                     33: **             local date.  This routine should figure out what
                     34: **             the format is and work appropriately.
                     35: */
                     36: 
                     37: char *
                     38: arpadate(ud)
                     39:        register char *ud;
                     40: {
                     41:        register char *p;
                     42:        register char *q;
                     43:        static char b[40];
                     44:        extern char *ctime();
                     45:        register int i;
                     46:        extern struct tm *localtime();
                     47: # ifdef V6
                     48:        long t;
                     49:        extern char *StdTimezone, *DstTimezone;
                     50:        extern long time();
                     51: # else
                     52:        struct timeb t;
                     53:        extern struct timeb *ftime();
                     54:        extern char *timezone();
                     55: # endif
                     56: 
                     57:        /*
                     58:        **  Get current time.
                     59:        **      This will be used if a null argument is passed and
                     60:        **      to resolve the timezone.
                     61:        */
                     62: 
                     63: # ifdef V6
                     64:        (void) time(&t);
                     65:        if (ud == NULL)
                     66:                ud = ctime(&t);
                     67: # else
                     68:        ftime(&t);
                     69:        if (ud == NULL)
                     70:                ud = ctime(&t.time);
                     71: # endif
                     72: 
                     73:        /*
                     74:        **  Crack the UNIX date line in a singularly unoriginal way.
                     75:        */
                     76: 
                     77:        q = b;
                     78: 
                     79:        p = &ud[0];             /* Mon */
                     80:        *q++ = *p++;
                     81:        *q++ = *p++;
                     82:        *q++ = *p++;
                     83:        *q++ = ',';
                     84:        *q++ = ' ';
                     85: 
                     86:        p = &ud[8];             /* 16 */
                     87:        if (*p == ' ')
                     88:                p++;
                     89:        else
                     90:                *q++ = *p++;
                     91:        *q++ = *p++;
                     92:        *q++ = ' ';
                     93: 
                     94:        p = &ud[4];             /* Sep */
                     95:        *q++ = *p++;
                     96:        *q++ = *p++;
                     97:        *q++ = *p++;
                     98:        *q++ = ' ';
                     99: 
                    100:        p = &ud[22];            /* 79 */
                    101:        *q++ = *p++;
                    102:        *q++ = *p++;
                    103:        *q++ = ' ';
                    104: 
                    105:        p = &ud[11];            /* 01:03:52 */
                    106:        for (i = 8; i > 0; i--)
                    107:                *q++ = *p++;
                    108: 
                    109:                                /* -PST or -PDT */
                    110: # ifdef V6
                    111:        if (localtime(&t)->tm_isdst)
                    112:                p = DstTimezone;
                    113:        else
                    114:                p = StdTimezone;
                    115: # else
                    116:        p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
                    117: # endif V6
                    118:        if ( (strncmp(p,"GMT",3)==0 || strncmp(p,"gmt",3)==0) && p[3] != '\0')
                    119:        {
                    120:                /* hours from GMT */
                    121:                p += 3;
                    122:                *q++ = *p++;
                    123:                if (p[1] == ':')
                    124:                        *q++ = '0';
                    125:                else
                    126:                        *q++ = *p++;
                    127:                *q++ = *p++;
                    128:                p++;            /* skip ``:'' */
                    129:                *q++ = *p++;
                    130:                *q++ = *p++;
                    131:                *q = '\0';
                    132:        }
                    133:        else
                    134:        if( !fconvert(p,q) )
                    135:        {
                    136:                *q++ = ' ';
                    137:                *q++ = *p++;
                    138:                *q++ = *p++;
                    139:                *q++ = *p++;
                    140:                *q = '\0';
                    141:        }
                    142: 
                    143:        return (b);
                    144: }
                    145: 
                    146: /* convert foreign identifications to some ARPA interpretable form */
                    147: /* with dst we put the time zone one hour ahead */
                    148: struct foreign { 
                    149:        char *f_from; 
                    150:        char *f_to; 
                    151: } foreign[] = {
                    152:        {"eet", " -0200"}, /* eastern europe */
                    153:        {"met", " -0100"}, /* middle europe */
                    154:        {"wet", " GMT"},   /* western europe, and what for australia? */
                    155:        {"eet dst", " -0300"}, /* daylight saving times */
                    156:        {"met dst", " -0200"},
                    157:        {"wet dst", " -0100"},
                    158:        {NULL, NULL}
                    159: };
                    160: 
                    161: fconvert( a, b ) register char *a; char *b;
                    162: {      register struct foreign *euptr;
                    163:        register char *ptr;
                    164:        extern makelower();
                    165: 
                    166: /* for news:   for ( ptr = a; *ptr; ptr++ )
                    167:                if ( isupper(*ptr) )
                    168:                        *ptr = tolower( *ptr );
                    169: */
                    170:        makelower( a );
                    171:        for ( euptr = &foreign[0]; euptr->f_from != NULL; euptr++ )
                    172:                if ( strcmp(euptr->f_from, a) == 0 )
                    173:                {       ptr = euptr->f_to;
                    174:                        while ( *ptr )
                    175:                                *b++ = *ptr++;
                    176:                        *b = '\0';
                    177:                        return 1;
                    178:                }
                    179:        return 0;
                    180: }

unix.superglobalmegacorp.com

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