|
|
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.