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