1: # include "conf.h" 2: # include <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.1 7/25/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 (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: } 132: else 133: { 134: *q++ = ' '; 135: *q++ = *p++; 136: *q++ = *p++; 137: *q++ = *p++; 138: } 139: 140: *q = '\0'; 141: return (b); 142: }