Re: Trying to use AUTHOR_DATE
- From
- Juliusz Chroboczek <juliusz.chroboczek@pps.jussieu.fr>
- Date
- Apr 30, 2005, 21:59 UTC
- Message-ID
- <7ism18exin.fsf@lanthane.pps.jussieu.fr>
- In-Reply-To
- <Pine.LNX.4.58.0504301322130.2296@ppc970.osdl.org>
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