* apt-pkg/contrib/strutl.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Tue, 8 Jun 2010 20:46:42 +0000 (22:46 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Tue, 8 Jun 2010 20:46:42 +0000 (22:46 +0200)
  - split StrToTime() into HTTP1.1 and FTP date parser methods and
    use strptime() instead of some selfmade scanf mangling

apt-pkg/contrib/strutl.cc
apt-pkg/contrib/strutl.h
debian/changelog

index c7d63ce..96e8143 100644 (file)
@@ -855,6 +855,42 @@ static time_t timegm(struct tm *t)
 }
 #endif
                                                                        /*}}}*/
+// FullDateToTime - Converts a HTTP1.1 full date strings into a time_t /*{{{*/
+// ---------------------------------------------------------------------
+/* tries to parses a full date as specified in RFC2616 Section 3.3.1
+   with one exception: All timezones (%Z) are accepted but the protocol
+   says that it MUST be GMT, but this one is equal to UTC which we will
+   encounter from time to time (e.g. in Release files) so we accept all
+   here and just assume it is GMT (or UTC) later on */
+bool RFC1123StrToTime(const char* const str,time_t &time)
+{
+   struct tm Tm;
+   // Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
+   if (strptime(str, "%a, %d %b %Y %H:%M:%S %Z", &Tm) == NULL &&
+   // Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+       strptime(str, "%A, %d-%b-%y %H:%M:%S %Z", &Tm) == NULL &&
+   // Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() format
+       strptime(str, "%a %b %d %H:%M:%S %Y", &Tm) == NULL)
+      return false;
+
+   time = timegm(&Tm);
+   return true;
+}
+                                                                       /*}}}*/
+// FTPMDTMStrToTime - Converts a ftp modification date into a time_t   /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool FTPMDTMStrToTime(const char* const str,time_t &time)
+{
+   struct tm Tm;
+   // MDTM includes no whitespaces but recommend and ignored by strptime
+   if (strptime(str, "%Y %m %d %H %M %S", &Tm) == NULL)
+      return false;
+
+   time = timegm(&Tm);
+   return true;
+}
+                                                                       /*}}}*/
 // StrToTime - Converts a string into a time_t                         /*{{{*/
 // ---------------------------------------------------------------------
 /* This handles all 3 populare time formats including RFC 1123, RFC 1036
index e509145..b5de080 100644 (file)
@@ -45,7 +45,9 @@ string Base64Encode(const string &Str);
 string OutputInDepth(const unsigned long Depth, const char* Separator="  ");
 string URItoFileName(const string &URI);
 string TimeRFC1123(time_t Date);
-bool StrToTime(const string &Val,time_t &Result);
+bool RFC1123StrToTime(const char* const str,time_t &time) __attrib_const;
+bool FTPMDTMStrToTime(const char* const str,time_t &time) __attrib_const;
+__deprecated bool StrToTime(const string &Val,time_t &Result);
 string LookupTag(const string &Message,const char *Tag,const char *Default = 0);
 int StringToBool(const string &Text,int Default = -1);
 bool ReadMessages(int Fd, vector<string> &List);
index d8fb577..2a40d08 100644 (file)
@@ -44,6 +44,9 @@ apt (0.7.26~exp5) experimental; urgency=low
     - add 'disappear' to the known processing states, thanks Jonathan Nieder
   * apt-pkg/packagemanager.h:
     - export info about disappeared packages with GetDisappearedPackages()
+  * apt-pkg/contrib/strutl.cc:
+    - split StrToTime() into HTTP1.1 and FTP date parser methods and
+      use strptime() instead of some selfmade scanf mangling
 
   [ Michael Vogt ]
   * methods/http.{cc,h}: