Hi, Here's the code I'm using in darcs-git (copied from Polipo, another project of mine). You're welcome to use it in any way you see fit. sprintf_a is defined as strdup of sprintf. Juliusz #if defined __GLIBC__ #define HAVE_TM_GMTOFF #define HAVE_SETENV #ifndef __UCLIBC__ #define HAVE_TIMEGM #endif #endif #if defined(__linux__) && (__GNU_LIBRARY__ == 1) /* Linux libc 5 */ #define HAVE_TIMEGM #define HAVE_SETENV #endif #ifdef BSD #define HAVE_TM_GMTOFF #define HAVE_SETENV #endif #ifdef __CYGWIN__ #define HAVE_SETENV #endif #if _POSIX_VERSION >= 200112L #define HAVE_SETENV #endif #define HAVE_TZSET /* Like mktime(3), but UTC rather than local time */ #if defined(HAVE_TIMEGM) time_t mktime_gmt(struct tm *tm) { return timegm(tm); } #elif defined(HAVE_TM_GMTOFF) time_t mktime_gmt(struct tm *tm) { time_t t; struct tm *ltm; t = mktime(tm); if(t < 0) return -1; ltm = localtime(&t); if(ltm == NULL) return -1; return t + ltm->tm_gmtoff; } #elif defined(HAVE_TZSET) #ifdef HAVE_SETENV /* Taken from the Linux timegm(3) man page. */ time_t mktime_gmt(struct tm *tm) { time_t t; char *tz; tz = getenv("TZ"); setenv("TZ", "", 1); tzset(); t = mktime(tm); if(tz) setenv("TZ", tz, 1); else unsetenv("TZ"); tzset(); return t; } #else time_t mktime_gmt(struct tm *tm) { time_t t; char *tz; static char *old_tz = NULL; tz = getenv("TZ"); putenv("TZ="); tzset(); t = mktime(tm); if(old_tz) free(old_tz); if(tz) old_tz = sprintf_a("TZ=%s", tz); else old_tz = strdup("TZ"); /* XXX - non-portable? */ if(old_tz) putenv(old_tz); tzset(); return t; } #endif #else #error no mktime_gmt implementation on this platform #endif - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.htmlReceived on Sun May 01 08:00:14 2005
This archive was generated by hypermail 2.1.8 : 2005-05-01 08:00:15 EST