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 09/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 } 181