summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libugly/tzfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libugly/tzfile.c')
-rw-r--r--mdk-stage1/dietlibc/libugly/tzfile.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/mdk-stage1/dietlibc/libugly/tzfile.c b/mdk-stage1/dietlibc/libugly/tzfile.c
index 5702d4bea..e0e8f7846 100644
--- a/mdk-stage1/dietlibc/libugly/tzfile.c
+++ b/mdk-stage1/dietlibc/libugly/tzfile.c
@@ -3,28 +3,30 @@
#include <fcntl.h>
#include <sys/mman.h>
#include <netinet/in.h>
+#include <time.h>
-#include <stdio.h>
+/* #include <stdio.h> */
+
+char* tzname[2]={"GMT","GMT"};
#ifdef WANT_TZFILE_PARSER
static char *tzfile=0;
static int tzlen=-1;
-void __maplocaltime() {
+void __maplocaltime(void);
+void __maplocaltime(void) {
int fd;
unsigned int len;
if (tzlen>=0) return;
tzlen=0;
if ((fd=open("/etc/localtime",O_RDONLY))<0) return;
len=lseek(fd,0,SEEK_END);
- if ((tzfile=mmap(0,len,PROT_READ,MAP_SHARED,fd,0))==MAP_FAILED) return;
+ if ((tzfile=mmap(0,len,PROT_READ,MAP_PRIVATE,fd,0))==MAP_FAILED) return;
close(fd);
if (ntohl(*(int*)tzfile) != 0x545a6966) return;
tzlen=len;
}
-char *tzset(void) __attribute__((weak,alias("__maplocaltime")));
-
static unsigned long __myntohl(const unsigned char* c) {
return (((unsigned long)c[0])<<24) +
(((unsigned long)c[1])<<16) +
@@ -32,6 +34,7 @@ static unsigned long __myntohl(const unsigned char* c) {
((unsigned long)c[3]);
}
+time_t __tzfile_map(time_t t, int *isdst);
time_t __tzfile_map(time_t t, int *isdst) {
/* "TZif" plus 16 reserved bytes. */
char *tmp;
@@ -64,23 +67,41 @@ time_t __tzfile_map(time_t t, int *isdst) {
printf("%s(%lu,%d,%d)",i?", ":"",ntohl(*(int*)tmp),tmp[4],tmp[5]); tmp+=6;
}
printf("\n");
+ for (i=0; i<tzh_charcnt; ++i) {
+ printf("%s\"%s\"",i?", ":"",tmp);
+ tmp+=strlen(tmp);
+ }
+ printf("\n");
#endif
tmp=tzfile+20+6*4;
- for (i=0; i<tzh_timecnt; ++i)
+ daylight=(tzh_timecnt>0);
+ for (i=0; i<tzh_timecnt; ++i) {
if ((time_t)__myntohl(tmp+i*4) >= t) {
+ char* tz=tmp;
/* printf("match at %d\n",i); */
tmp+=tzh_timecnt*4;
i=tmp[i-1];
/* printf("using index %d\n",i); */
tmp+=tzh_timecnt;
+ tz+=tzh_timecnt*5+tzh_leapcnt*4+tzh_typecnt*6;
tmp+=i*6;
/* printf("(%lu,%d,%d)\n",ntohl(*(int*)tmp),tmp[4],tmp[5]); */
*isdst=tmp[4];
- return t+__myntohl(tmp);
+ tzname[0]=tz+tmp[5];
+ timezone=-(__myntohl(tmp));
+ return t-timezone;
}
+ }
return t;
}
+
+void tzset(void) {
+ int isdst;
+ __maplocaltime();
+ __tzfile_map(time(0),&isdst);
+}
+
#else
-void tzset(void) __attribute__((weak,alias("return0")));
+void tzset(void) __attribute__((weak,alias("__nop")));
#endif