Browse Source

Optionally support the struct tm extension fields.
Add a few misc functions mentioned in time.h.
Revert davidm's change regarding using a define for the "/etc/TZ" path,
as this is eventually meant to be a configurable extension and not
unconditionally supported.

Manuel Novoa III 21 years ago
parent
commit
20d8808116
4 changed files with 44 additions and 17 deletions
  1. 0 1
      include/paths.h
  2. 4 4
      include/time.h
  3. 1 1
      libc/misc/time/Makefile
  4. 39 11
      libc/misc/time/time.c

+ 0 - 1
include/paths.h

@@ -67,7 +67,6 @@
 #define	_PATH_SHADOW	"/etc/shadow"
 #define	_PATH_PASSWD	"/etc/passwd"
 #define	_PATH_GROUP	"/etc/group"
-#define	_PATH_TZ	"/etc/TZ"
 
 /* Provide trailing slash, since mostly used for building pathnames. */
 #define	_PATH_DEV	"/dev/"

+ 4 - 4
include/time.h

@@ -127,15 +127,15 @@ struct tm
   int tm_yday;			/* Days in year.[0-365]	*/
   int tm_isdst;			/* DST.		[-1/0/1]*/
 
-#if 0
+#ifdef __UCLIBC_HAS_TM_EXTENSIONS__
 # ifdef	__USE_BSD
   long int tm_gmtoff;		/* Seconds east of UTC.  */
-  __const char *tm_zone;	/* Timezone abbreviation.  */
+  __const char tm_zone[8];	/* Timezone abbreviation.  */
 # else
   long int __tm_gmtoff;		/* Seconds east of UTC.  */
-  __const char *__tm_zone;	/* Timezone abbreviation.  */
+  __const char __tm_zone[8];/* Timezone abbreviation.  */
 # endif
-#endif
+#endif /* __UCLIBC_HAS_TM_EXTENSIONS__ */
 };
 
 

+ 1 - 1
libc/misc/time/Makefile

@@ -27,7 +27,7 @@ include $(TOPDIR)Rules.mak
 MSRC= time.c
 MOBJ= asctime.o asctime_r.o clock.o ctime.o ctime_r.o gmtime.o gmtime_r.o \
 	localtime.o localtime_r.o mktime.o strftime.o strptime.o tzset.o \
-	_time_t2tm.o __time_tm.o _time_mktime.o
+	_time_t2tm.o __time_tm.o _time_mktime.o dysize.o timegm.o
 
 ifeq ($(UCLIBC_HAS_FLOATS),y)
 	MOBJ += difftime.o 

+ 39 - 11
libc/misc/time/time.c

@@ -401,9 +401,9 @@ char *ctime(const time_t *clock)
 
 char *ctime_r(const time_t *clock, char *buf)
 {
-	struct tm xtms;
+	struct tm xtm;
 
-	return asctime_r(localtime_r(clock, &xtms), buf);
+	return asctime_r(localtime_r(clock, &xtm), buf);
 }
 
 #endif
@@ -589,13 +589,12 @@ struct tm *localtime_r(register const time_t *__restrict timer,
 		*x = *timer + offset;
 
 		_time_t2tm(x, days, result);
-		
-		if (dst) {
-			result->tm_isdst = dst;
-			break;
-		}
-		++dst;
-	} while ((result->tm_isdst = tm_isdst(result)) != 0);
+		result->tm_isdst = dst;
+#ifdef __UCLIBC_HAS_TM_EXTENSIONS__
+		result->tm_gmtoff = - _time_tzinfo[dst].gmt_offset;
+		strcpy( (char *)(result->tm_zone), _time_tzinfo[dst].tzname);
+#endif /* __UCLIBC_HAS_TM_EXTENSIONS__ */
+	} while ((++dst < 2) && (result->tm_isdst = tm_isdst(result)) != 0);
 
 	TZUNLOCK;
 
@@ -606,11 +605,16 @@ struct tm *localtime_r(register const time_t *__restrict timer,
 /**********************************************************************/
 #ifdef L_mktime
 
+/* Another name for `mktime'.  */
+/* time_t timelocal(struct tm *tp) */
+weak_alias(mktime,timelocal);
+
 time_t mktime(struct tm *timeptr)
 {
 	return  _time_mktime(timeptr, 1);
 }
 
+
 #endif
 /**********************************************************************/
 #ifdef L_strftime
@@ -1538,7 +1542,7 @@ static char *read_TZ_file(char *buf)
 	size_t todo;
 	char *p = NULL;
 
-	if ((fd = open(_PATH_TZ, O_RDONLY)) >= 0) {
+	if ((fd = open("/etc/TZ", O_RDONLY)) >= 0) {
 		todo = TZ_BUFLEN;
 		p = buf;
 		do {
@@ -1612,7 +1616,7 @@ void tzset(void)
 		 ) || !*e) {			/* or set to empty string. */
 	ILLEGAL:					/* TODO: Clean up the following... */
 #ifdef __TIME_TZ_OPT_SPEED
-		*oldval = 0;			/* Set oldval tonnn empty string. */
+		*oldval = 0;			/* Set oldval to an empty string. */
 #endif /* __TIME_TZ_OPT_SPEED */
 		s = _time_tzinfo[0].tzname;
 		*s = 'U';
@@ -1932,6 +1936,16 @@ struct tm *_time_t2tm(const time_t *__restrict timer,
 	}
 	/* TODO -- should this be 0? */
 	p[4] = 0;					/* result[8] .. tm_isdst */
+#ifdef __UCLIBC_HAS_TM_EXTENSIONS__
+	result->tm_gmtoff = 0;
+	{
+		register char *s = (char *) result->tm_zone;
+		*s = 'U';
+		*++s = 'T';
+		*++s = 'C';
+		*++s = 0;
+	}
+#endif /* __UCLIBC_HAS_TM_EXTENSIONS__ */
 
 	return result;
 }
@@ -2041,3 +2055,17 @@ time_t _time_mktime(struct tm *timeptr, int store_on_success)
 
 #endif
 /**********************************************************************/
+#ifdef L_dysize
+/* Return the number of days in YEAR.  */
+
+int dysize(int year)
+{
+	return __isleap(year) ? 366 : 365;
+}
+
+#endif
+/**********************************************************************/
+/* Like `mktime', but for TP represents Universal Time, not local time.  */
+/* time_t timegm(struct tm *tp) */
+
+