From 550891457ff63db01b57d9057a5fe447a165e10c Mon Sep 17 00:00:00 2001
From: David Kalnischkies <kalnischkies@gmail.com>
Date: Wed, 9 Jun 2010 00:27:22 +0200
Subject: [PATCH] use the portable timegm shown in his manpage instead of a
 strange looking code copycat from wget

---
 apt-pkg/contrib/strutl.cc | 36 ++++++++++++++++--------------------
 debian/changelog          |  2 ++
 2 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc
index 96e8143ec..160450366 100644
--- a/apt-pkg/contrib/strutl.cc
+++ b/apt-pkg/contrib/strutl.cc
@@ -827,31 +827,27 @@ static int MonthConv(char *Month)
    }   
 }
 									/*}}}*/
-// timegm - Internal timegm function if gnu is not available		/*{{{*/
+// timegm - Internal timegm if the gnu version is not available		/*{{{*/
 // ---------------------------------------------------------------------
-/* Ripped this evil little function from wget - I prefer the use of 
-   GNU timegm if possible as this technique will have interesting problems
-   with leap seconds, timezones and other.
-   
-   Converts struct tm to time_t, assuming the data in tm is UTC rather
+/* Converts struct tm to time_t, assuming the data in tm is UTC rather
    than local timezone (mktime assumes the latter).
-   
-   Contributed by Roger Beeman <beeman@cisco.com>, with the help of
-   Mark Baushke <mdb@cisco.com> and the rest of the Gurus at CISCO. */
-
-/* Turned it into an autoconf check, because GNU is not the only thing which
-   can provide timegm. -- 2002-09-22, Joel Baker */
 
-#ifndef HAVE_TIMEGM // Now with autoconf!
+   This function is a nonstandard GNU extension that is also present on
+   the BSDs and maybe other systems. For others we follow the advice of
+   the manpage of timegm and use his portable replacement. */
+#ifndef HAVE_TIMEGM
 static time_t timegm(struct tm *t)
 {
-   time_t tl, tb;
-   
-   tl = mktime (t);
-   if (tl == -1)
-      return -1;
-   tb = mktime (gmtime (&tl));
-   return (tl <= tb ? (tl + (tl - tb)) : (tl - (tb - tl)));
+   char *tz = getenv("TZ");
+   setenv("TZ", "", 1);
+   tzset();
+   time_t ret = mktime(t);
+   if (tz)
+      setenv("TZ", tz, 1);
+   else
+      unsetenv("TZ");
+   tzset();
+   return ret;
 }
 #endif
 									/*}}}*/
diff --git a/debian/changelog b/debian/changelog
index fa0e667e7..049999230 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -47,6 +47,8 @@ apt (0.7.26~exp5) experimental; urgency=low
   * apt-pkg/contrib/strutl.cc:
     - split StrToTime() into HTTP1.1 and FTP date parser methods and
       use strptime() instead of some selfmade scanf mangling
+    - use the portable timegm shown in his manpage instead of a strange
+      looking code copycat from wget
   * ftparchive/writer.cc:
     - add ValidTime option to generate a Valid-Until header in Release file
 
-- 
2.47.2