Blame


1 fd04aace 2003-11-23 devnull #include <u.h>
2 8ad51794 2004-03-25 devnull #include <stdlib.h> /* setenv etc. */
3 64bcfff3 2003-11-25 devnull #define NOPLAN9DEFINES
4 fd04aace 2003-11-23 devnull #include <libc.h>
5 64bcfff3 2003-11-25 devnull #include <time.h>
6 fd04aace 2003-11-23 devnull
7 64bcfff3 2003-11-25 devnull #define _HAVETIMEGM 1
8 64bcfff3 2003-11-25 devnull #define _HAVETMZONE 1
9 64bcfff3 2003-11-25 devnull #define _HAVETMTZOFF 1
10 fd04aace 2003-11-23 devnull
11 64bcfff3 2003-11-25 devnull #if defined(__linux__)
12 64bcfff3 2003-11-25 devnull # undef _HAVETMZONE
13 64bcfff3 2003-11-25 devnull # undef _HAVETMTZOFF
14 fd04aace 2003-11-23 devnull
15 64bcfff3 2003-11-25 devnull #elif defined(__sun__)
16 64bcfff3 2003-11-25 devnull # undef _HAVETIMEGM
17 64bcfff3 2003-11-25 devnull # undef _HAVETMZONE
18 64bcfff3 2003-11-25 devnull # undef _HAVETMTZOFF
19 64bcfff3 2003-11-25 devnull
20 64bcfff3 2003-11-25 devnull #endif
21 64bcfff3 2003-11-25 devnull
22 fd04aace 2003-11-23 devnull static Tm bigtm;
23 fd04aace 2003-11-23 devnull
24 fd04aace 2003-11-23 devnull static void
25 fd04aace 2003-11-23 devnull tm2Tm(struct tm *tm, Tm *bigtm)
26 fd04aace 2003-11-23 devnull {
27 8ad51794 2004-03-25 devnull char *s;
28 8ad51794 2004-03-25 devnull
29 fd04aace 2003-11-23 devnull memset(bigtm, 0, sizeof *bigtm);
30 fd04aace 2003-11-23 devnull bigtm->sec = tm->tm_sec;
31 fd04aace 2003-11-23 devnull bigtm->min = tm->tm_min;
32 fd04aace 2003-11-23 devnull bigtm->hour = tm->tm_hour;
33 fd04aace 2003-11-23 devnull bigtm->mday = tm->tm_mday;
34 fd04aace 2003-11-23 devnull bigtm->mon = tm->tm_mon;
35 fd04aace 2003-11-23 devnull bigtm->year = tm->tm_year;
36 fd04aace 2003-11-23 devnull bigtm->wday = tm->tm_wday;
37 dddc2ed1 2004-04-20 devnull strftime(bigtm->zone, sizeof bigtm->zone, "%Z", tm);
38 1c253ceb 2003-11-23 devnull #ifdef _HAVETZOFF
39 fd04aace 2003-11-23 devnull bigtm->tzoff = tm->tm_gmtoff;
40 1c253ceb 2003-11-23 devnull #endif
41 dddc2ed1 2004-04-20 devnull
42 8ad51794 2004-03-25 devnull if(bigtm->zone[0] == 0){
43 8ad51794 2004-03-25 devnull s = getenv("TIMEZONE");
44 8ad51794 2004-03-25 devnull if(s){
45 be22ae2d 2004-03-26 devnull strecpy(bigtm->zone, bigtm->zone+4, s);
46 8ad51794 2004-03-25 devnull free(s);
47 8ad51794 2004-03-25 devnull }
48 8ad51794 2004-03-25 devnull }
49 fd04aace 2003-11-23 devnull }
50 fd04aace 2003-11-23 devnull
51 fd04aace 2003-11-23 devnull static void
52 fd04aace 2003-11-23 devnull Tm2tm(Tm *bigtm, struct tm *tm)
53 fd04aace 2003-11-23 devnull {
54 fd04aace 2003-11-23 devnull memset(tm, 0, sizeof *tm);
55 fd04aace 2003-11-23 devnull tm->tm_sec = bigtm->sec;
56 fd04aace 2003-11-23 devnull tm->tm_min = bigtm->min;
57 fd04aace 2003-11-23 devnull tm->tm_hour = bigtm->hour;
58 fd04aace 2003-11-23 devnull tm->tm_mday = bigtm->mday;
59 fd04aace 2003-11-23 devnull tm->tm_mon = bigtm->mon;
60 fd04aace 2003-11-23 devnull tm->tm_year = bigtm->year;
61 fd04aace 2003-11-23 devnull tm->tm_wday = bigtm->wday;
62 1c253ceb 2003-11-23 devnull #ifdef _HAVETMZONE
63 fd04aace 2003-11-23 devnull tm->tm_zone = bigtm->zone;
64 1c253ceb 2003-11-23 devnull #endif
65 1c253ceb 2003-11-23 devnull #ifdef _HAVETZOFF
66 fd04aace 2003-11-23 devnull tm->tm_gmtoff = bigtm->tzoff;
67 1c253ceb 2003-11-23 devnull #endif
68 fd04aace 2003-11-23 devnull }
69 fd04aace 2003-11-23 devnull
70 fd04aace 2003-11-23 devnull Tm*
71 829e8223 2004-12-29 devnull p9gmtime(long x)
72 fd04aace 2003-11-23 devnull {
73 829e8223 2004-12-29 devnull time_t t;
74 fd04aace 2003-11-23 devnull struct tm tm;
75 fd04aace 2003-11-23 devnull
76 829e8223 2004-12-29 devnull t = (time_t)x;
77 fd04aace 2003-11-23 devnull tm = *gmtime(&t);
78 fd04aace 2003-11-23 devnull tm2Tm(&tm, &bigtm);
79 fd04aace 2003-11-23 devnull return &bigtm;
80 fd04aace 2003-11-23 devnull }
81 fd04aace 2003-11-23 devnull
82 fd04aace 2003-11-23 devnull Tm*
83 829e8223 2004-12-29 devnull p9localtime(long x)
84 fd04aace 2003-11-23 devnull {
85 829e8223 2004-12-29 devnull time_t t;
86 fd04aace 2003-11-23 devnull struct tm tm;
87 fd04aace 2003-11-23 devnull
88 829e8223 2004-12-29 devnull t = (time_t)x;
89 fd04aace 2003-11-23 devnull tm = *localtime(&t);
90 fd04aace 2003-11-23 devnull tm2Tm(&tm, &bigtm);
91 fd04aace 2003-11-23 devnull return &bigtm;
92 fd04aace 2003-11-23 devnull }
93 fd04aace 2003-11-23 devnull
94 d2c4ee9e 2003-11-24 devnull #if !defined(_HAVETIMEGM)
95 d2c4ee9e 2003-11-24 devnull static time_t
96 1c253ceb 2003-11-23 devnull timegm(struct tm *tm)
97 1c253ceb 2003-11-23 devnull {
98 d2c4ee9e 2003-11-24 devnull time_t ret;
99 d2c4ee9e 2003-11-24 devnull char *tz;
100 64bcfff3 2003-11-25 devnull char *s;
101 d2c4ee9e 2003-11-24 devnull
102 d2c4ee9e 2003-11-24 devnull tz = getenv("TZ");
103 64bcfff3 2003-11-25 devnull putenv("TZ=");
104 d2c4ee9e 2003-11-24 devnull tzset();
105 d2c4ee9e 2003-11-24 devnull ret = mktime(tm);
106 64bcfff3 2003-11-25 devnull if(tz){
107 64bcfff3 2003-11-25 devnull s = smprint("TZ=%s", tz);
108 64bcfff3 2003-11-25 devnull if(s)
109 64bcfff3 2003-11-25 devnull putenv(s);
110 64bcfff3 2003-11-25 devnull }
111 d2c4ee9e 2003-11-24 devnull return ret;
112 1c253ceb 2003-11-23 devnull }
113 1c253ceb 2003-11-23 devnull #endif
114 1c253ceb 2003-11-23 devnull
115 fd04aace 2003-11-23 devnull long
116 fd04aace 2003-11-23 devnull p9tm2sec(Tm *bigtm)
117 fd04aace 2003-11-23 devnull {
118 fd04aace 2003-11-23 devnull struct tm tm;
119 fd04aace 2003-11-23 devnull
120 fd04aace 2003-11-23 devnull Tm2tm(bigtm, &tm);
121 fd04aace 2003-11-23 devnull if(strcmp(bigtm->zone, "GMT") == 0 || strcmp(bigtm->zone, "UCT") == 0)
122 fd04aace 2003-11-23 devnull return timegm(&tm);
123 fd04aace 2003-11-23 devnull return mktime(&tm); /* local time zone */
124 fd04aace 2003-11-23 devnull }
125 fd04aace 2003-11-23 devnull