diff --git a/sys/man/2/ctime b/sys/man/2/ctime index a4e0743..814dc76 100644 --- a/sys/man/2/ctime +++ b/sys/man/2/ctime @@ -121,9 +121,15 @@ GMT 0 .SH BUGS The return values point to static data whose content is overwritten by each call. -.br +.PP Daylight Savings Time is ``normal'' in the Southern hemisphere. -.br +.PP These routines are not equipped to handle non-\c .SM ASCII text, and are provincial anyway. +.PP +These interfaces are fixed, but all occurrences of +.B long +in the above should be manipulated as +.BR ulong ; +this extends the range of valid times into the year 2106. diff --git a/sys/src/cmd/ar.c b/sys/src/cmd/ar.c index 006a54a..0d066ad 100644 --- a/sys/src/cmd/ar.c +++ b/sys/src/cmd/ar.c @@ -731,11 +731,11 @@ armove(Biobuf *b, Arfile *ap, Armember *bp) for (cp = strchr(bp->hdr.name, 0); /* blank pad on right */ cp < bp->hdr.name+sizeof(bp->hdr.name); cp++) *cp = ' '; - sprint(bp->hdr.date, "%-12ld", d->mtime); + sprint(bp->hdr.date, "%-12lud", d->mtime); sprint(bp->hdr.uid, "%-6d", 0); sprint(bp->hdr.gid, "%-6d", 0); sprint(bp->hdr.mode, "%-8lo", d->mode); - sprint(bp->hdr.size, "%-10lld", d->length); + sprint(bp->hdr.size, "%-10llud", d->length); strncpy(bp->hdr.fmag, ARFMAG, 2); bp->size = d->length; arread(b, bp, bp->size); @@ -829,11 +829,11 @@ rl(int fd) len = symdefsize; if(len&01) len++; - sprint(a.date, "%-12ld", time(0)); + sprint(a.date, "%-12lud", time(0)); sprint(a.uid, "%-6d", 0); sprint(a.gid, "%-6d", 0); sprint(a.mode, "%-8lo", 0644L); - sprint(a.size, "%-10ld", len); + sprint(a.size, "%-10lud", len); strncpy(a.fmag, ARFMAG, 2); strcpy(a.name, symdef); for (cp = strchr(a.name, 0); /* blank pad on right */ @@ -988,7 +988,7 @@ longt(Armember *bp) pmode(strtoul(bp->hdr.mode, 0, 8)); Bprint(&bout, "%3ld/%1ld", strtol(bp->hdr.uid, 0, 0), strtol(bp->hdr.gid, 0, 0)); - Bprint(&bout, "%7ld", bp->size); + Bprint(&bout, "%7lud", bp->size); cp = ctime(bp->date); Bprint(&bout, " %-12.12s %-4.4s ", cp+4, cp+24); } diff --git a/sys/src/cmd/mk/archive.c b/sys/src/cmd/mk/archive.c index 8c4c0c8..8d73ca7 100644 --- a/sys/src/cmd/mk/archive.c +++ b/sys/src/cmd/mk/archive.c @@ -67,7 +67,7 @@ atouch(char *name) if(strcmp(member, h.name) == 0){ t = SARNAME-sizeof(h); /* ughgghh */ LSEEK(fd, t, 1); - fprint(fd, "%-12ld", time(0)); + fprint(fd, "%-12lud", time(0)); break; } t = atol(h.size); diff --git a/sys/src/cmd/upas/smtp/greylist.c b/sys/src/cmd/upas/smtp/greylist.c index b5cee5a..493e98f 100644 --- a/sys/src/cmd/upas/smtp/greylist.c +++ b/sys/src/cmd/upas/smtp/greylist.c @@ -30,7 +30,7 @@ typedef struct { int existed; /* these two are distinct to cope with errors */ int created; int noperm; - long mtime; /* mod time, iff it already existed */ + ulong mtime; /* mod time, iff it already existed */ } Greysts; static char whitelist[] = "/mail/grey/whitelist"; @@ -218,7 +219,7 @@ addgreylist(char *file, Greysts *gsp) static int recentcall(Greysts *gsp) { - long delay = time(0) - gsp->mtime; + ulong delay = (ulong)time(0) - gsp->mtime; if (!gsp->existed) return 0; diff --git a/sys/src/libc/9sys/ctime.c b/sys/src/libc/9sys/ctime.c index 0137d6f..f072ad8 100644 --- a/sys/src/libc/9sys/ctime.c +++ b/sys/src/libc/9sys/ctime.c @@ -47,7 +47,8 @@ static char dmsize[12] = static int dysize(int); static void ct_numb(char*, int); -#define TZSIZE 150 +#define TZSIZE ((136*2)+10) /* 1970-2106; match tm2sec.c */ + static void readtimezone(void); static int rd_name(char**, char*); static int rd_long(char**, long*); @@ -58,7 +59,7 @@ struct char dlname[4]; long stdiff; long dldiff; - long dlpairs[TZSIZE]; + ulong dlpairs[TZSIZE]; } timezone; char* @@ -68,12 +69,13 @@ ctime(long t) } Tm* -localtime(long tim) +localtime(long atim) /* should be ulong, but it's too late */ { Tm *ct; - long t, *p; + ulong tim, t, *p; int dlflag; + tim = atim; if(timezone.stname[0] == 0) readtimezone(); t = tim + timezone.stdiff; @@ -97,17 +99,19 @@ localtime(long tim) } Tm* -gmtime(long tim) +gmtime(long atim) /* should be ulong, but it's too late */ { int d0, d1; long hms, day; + ulong tim; static Tm xtime; /* * break initial number into days */ - hms = (ulong)tim % 86400L; - day = (ulong)tim / 86400L; + tim = atim; + hms = tim % 86400L; + day = tim / 86400L; if(hms < 0) { hms += 86400L; day -= 1; @@ -182,7 +186,7 @@ asctime(Tm *t) cbuf[22] = *ncp; if(t->year >= 100) { cbuf[24] = '2'; - cbuf[25] = t->year >= 200? '1': '0'; + cbuf[25] = '0'; } ct_numb(cbuf+26, t->year+100); return cbuf; @@ -234,12 +238,12 @@ readtimezone(void) if(rd_long(&p, &timezone.dldiff)) goto error; for(i=0; i #include -#define TZSIZE 150 +#define TZSIZE ((136*2)+10) /* 1970-2106; match tm2sec.c */ + static void readtimezone(void); static int rd_name(char**, char*); static int rd_long(char**, long*); + static struct { @@ -12,12 +14,12 @@ struct char dlname[4]; long stdiff; long dldiff; - long dlpairs[TZSIZE]; + ulong dlpairs[TZSIZE]; } timezone; -#define SEC2MIN 60L -#define SEC2HOUR (60L*SEC2MIN) -#define SEC2DAY (24L*SEC2HOUR) +#define SEC2MIN 60UL +#define SEC2HOUR (60UL*SEC2MIN) +#define SEC2DAY (24UL*SEC2HOUR) /* * days per month plus days/year @@ -50,7 +52,7 @@ yrsize(int y) long tm2sec(Tm *tm) { - long secs; + ulong secs; int i, yday, year, *d2m; if(strcmp(tm->zone, "GMT") != 0 && timezone.stname[0] == 0) @@ -95,8 +97,6 @@ tm2sec(Tm *tm) secs -= timezone.stdiff; else if(strcmp(tm->zone, timezone.dlname) == 0) secs -= timezone.dldiff; - if(secs < 0) - secs = 0; return secs; } @@ -124,12 +124,12 @@ readtimezone(void) if(rd_long(&p, &timezone.dldiff)) goto error; for(i=0; i