diff options
| author | Werner Koch <[email protected]> | 2003-11-19 15:15:21 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2003-11-19 15:15:21 +0000 | 
| commit | 7fab1937f875223d7a9ac4490fc8addd439d9b53 (patch) | |
| tree | 016973698ec1703f10b270a4c9ef10265e696688 | |
| parent | * acinclude.m4: Add AM_PATH_GPG_ERROR. (diff) | |
| download | gpgme-7fab1937f875223d7a9ac4490fc8addd439d9b53.tar.gz gpgme-7fab1937f875223d7a9ac4490fc8addd439d9b53.zip | |
* conversion.c (_gpgme_parse_timestamp): New.
(atoi_1, atoi_2, atoi_4): New.
* keylist.c (parse_timestamp): Removed. Changed all callers to use
the new function.
* verify.c (parse_valid_sig): Ditto.  Repalced the errno check.
* sign.c (parse_sig_created): Ditto.
| -rw-r--r-- | gpgme/ChangeLog | 9 | ||||
| -rw-r--r-- | gpgme/conversion.c | 68 | ||||
| -rw-r--r-- | gpgme/gpgme.h | 2 | ||||
| -rw-r--r-- | gpgme/keylist.c | 59 | ||||
| -rw-r--r-- | gpgme/sign.c | 4 | ||||
| -rw-r--r-- | gpgme/util.h | 9 | ||||
| -rw-r--r-- | gpgme/verify.c | 10 | 
7 files changed, 99 insertions, 62 deletions
| diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 2966d6be..9621e0b7 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,12 @@ +2003-11-19  Werner Koch  <[email protected]> + +	* conversion.c (_gpgme_parse_timestamp): New. +	(atoi_1, atoi_2, atoi_4): New. +	* keylist.c (parse_timestamp): Removed. Changed all callers to use +	the new function. +	* verify.c (parse_valid_sig): Ditto.  Repalced the errno check. +	* sign.c (parse_sig_created): Ditto. +  2003-10-31  Werner Koch  <[email protected]>  	* keylist.c (parse_timestamp): Detect ISO 8601 timestamps and try diff --git a/gpgme/conversion.c b/gpgme/conversion.c index 25de2693..f55e9a66 100644 --- a/gpgme/conversion.c +++ b/gpgme/conversion.c @@ -24,11 +24,18 @@  #include <stdlib.h>  #include <string.h> +#include <time.h>  #include <errno.h>  #include "gpgme.h"  #include "util.h" + +#define atoi_1(p)   (*(p) - '0' ) +#define atoi_2(p)   ((atoi_1(p) * 10) + atoi_1((p)+1)) +#define atoi_4(p)   ((atoi_2(p) * 100) + atoi_2((p)+2)) + +  /* Convert two hexadecimal digits from STR to the value they     represent.  Returns -1 if one of the characters is not a @@ -232,6 +239,67 @@ _gpgme_decode_percent_string (const char *src, char **destp, size_t len)    return 0;  } + +/* Parse the string TIMESTAMP into a time_t.  The string may either be +   seconds since Epoch or in the ISO 8601 format like +   "20390815T143012".  Returns 0 for an empty string or seconds since +   Epoch. Leading spaces are skipped. If ENDP is not NULL, it will +   point to the next non-parsed character in TIMESTRING. */ +time_t +_gpgme_parse_timestamp (const char *timestamp, char **endp) +{ +  /* Need to skip leading spaces, because that is what strtoul does +     but not our ISO 8601 checking code. */ +  while (*timestamp && *timestamp== ' ') +    timestamp++; +  if (!*timestamp) +    return 0; + +  if (strlen (timestamp) >= 15 && timestamp[8] == 'T') +    { +      struct tm buf; +      int year; + +      year = atoi_4 (timestamp); +      if (year < 1900) +        return (time_t)(-1); + +      /* Fixme: We would better use a configure test to see whether +         mktime can handle dates beyond 2038. */ +      if (sizeof (time_t) <= 4 && year >= 2038) +        return (time_t)2145914603; /* 2037-12-31 23:23:23 */ + +      memset (&buf, 0, sizeof buf); +      buf.tm_year = year - 1900; +      buf.tm_mon = atoi_2 (timestamp+4) - 1;  +      buf.tm_mday = atoi_2 (timestamp+6); +      buf.tm_hour = atoi_2 (timestamp+9); +      buf.tm_min = atoi_2 (timestamp+11); +      buf.tm_sec = atoi_2 (timestamp+13); + +      if (endp) +        *endp = (char*)(timestamp + 15); +#ifdef HAVE_TIMEGM +      return timegm (&buf); +#else +      { +        time_t tim; +         +        putenv ("TZ=UTC"); +        tim = mktime (&buf); +#ifdef __GNUC__ +#warning fixme: we must somehow reset TZ here.  It is not threadsafe anyway. +#endif +        return tim; +      } +#endif /* !HAVE_TIMEGM */ +    } +  else +    return (time_t)strtoul (timestamp, endp, 10); +} + + +  static struct  { diff --git a/gpgme/gpgme.h b/gpgme/gpgme.h index aa46fe82..1e174881 100644 --- a/gpgme/gpgme.h +++ b/gpgme/gpgme.h @@ -71,7 +71,7 @@ extern "C" {     AM_PATH_GPGME macro) check that this header matches the installed     library.  Warning: Do not edit the next line.  configure will do     that for you!  */ -#define GPGME_VERSION "0.4.3" +#define GPGME_VERSION "0.4.4"  /* Some opaque data types used by GPGME.  */ diff --git a/gpgme/keylist.c b/gpgme/keylist.c index 9bb5e47c..88ce7ca8 100644 --- a/gpgme/keylist.c +++ b/gpgme/keylist.c @@ -116,53 +116,6 @@ keylist_status_handler (void *priv, gpgme_status_code_t code, char *args)  } -static time_t -parse_timestamp (char *timestamp) -{ -  if (!*timestamp) -    return 0; - -  if (strlen (timestamp) >= 15 && timestamp[8] == 'T') -    { -      struct tm buf; -      int year; - -      year = atoi_4 (timestamp); -      if (year < 1900) -        return (time_t)(-1); - -      /* Fixme: We would better use a configure test to see whether -         mktime can handle dates beyond 2038. */ -      if (sizeof (time_t) <= 4 && year >= 2038) -        return (time_t)2145914603; /* 2037-12-31 23:23:23 */ - -      memset (&buf, 0, sizeof buf); -      buf.tm_year = year - 1900; -      buf.tm_mon = atoi_2 (timestamp+4) - 1;  -      buf.tm_mday = atoi_2 (timestamp+6); -      buf.tm_hour = atoi_2 (timestamp+9); -      buf.tm_min = atoi_2 (timestamp+11); -      buf.tm_sec = atoi_2 (timestamp+13); - -#ifdef HAVE_TIMEGM -      return timegm (&buf); -#else -      { -        time_t tim; -         -        putenv ("TZ=UTC"); -        tim = mktime (&buf); -#ifdef __GNUC__ -#warning fixme: we must somehow reset TZ here.  It is not threadsafe anyway. -#endif -        return tim; -      } -#endif /* !HAVE_TIMEGM */ -    } -  else -    return (time_t) strtoul (timestamp, NULL, 10); -} -  static void  set_mainkey_trust_info (gpgme_key_t key, const char *src) @@ -519,11 +472,11 @@ keylist_colon_handler (void *priv, char *line)        /* Field 6 has the timestamp (seconds).  */        if (fields >= 6) -	subkey->timestamp = parse_timestamp (field[5]); +	subkey->timestamp = _gpgme_parse_timestamp (field[5], NULL);        /* Field 7 has the expiration time (seconds).  */        if (fields >= 7) -	subkey->expires = parse_timestamp (field[6]); +	subkey->expires = _gpgme_parse_timestamp (field[6], NULL);        /* Field 8 has the X.509 serial number.  */        if (fields >= 8 && (rectype == RT_CRT || rectype == RT_CRS)) @@ -587,11 +540,11 @@ keylist_colon_handler (void *priv, char *line)        /* Field 6 has the timestamp (seconds).  */        if (fields >= 6) -	subkey->timestamp = parse_timestamp (field[5]); +	subkey->timestamp = _gpgme_parse_timestamp (field[5], NULL);        /* Field 7 has the expiration time (seconds).  */        if (fields >= 7) -	subkey->expires = parse_timestamp (field[6]); +	subkey->expires = _gpgme_parse_timestamp (field[6], NULL);        /* Field 8 is reserved (LID).  */        /* Field 9 has the ownertrust.  */ @@ -687,11 +640,11 @@ keylist_colon_handler (void *priv, char *line)        /* Field 6 has the timestamp (seconds).  */        if (fields >= 6) -	keysig->timestamp = parse_timestamp (field[5]); +	keysig->timestamp = _gpgme_parse_timestamp (field[5], NULL);        /* Field 7 has the expiration time (seconds).  */        if (fields >= 7) -	keysig->expires = parse_timestamp (field[6]); +	keysig->expires = _gpgme_parse_timestamp (field[6], NULL);        /* Field 11 has the signature class (eg, 0x30 means revoked).  */        if (fields >= 11) diff --git a/gpgme/sign.c b/gpgme/sign.c index 089b34c5..4c71f804 100644 --- a/gpgme/sign.c +++ b/gpgme/sign.c @@ -153,8 +153,8 @@ parse_sig_created (char *args, gpgme_new_signature_t *sigp)      }    args = tail; -  sig->timestamp = strtol (args, &tail, 0); -  if (errno || args == tail || *tail != ' ') +  sig->timestamp = _gpgme_parse_timestamp (args, &tail); +  if (sig->timestamp == -1 || args == tail || *tail != ' ')      {        /* The crypto backend does not behave.  */        free (sig); diff --git a/gpgme/util.h b/gpgme/util.h index c0873554..085b37c1 100644 --- a/gpgme/util.h +++ b/gpgme/util.h @@ -70,6 +70,15 @@ gpgme_error_t _gpgme_decode_c_string (const char *src, char **destp,  gpgme_error_t _gpgme_decode_percent_string (const char *src, char **destp,  					    size_t len); + +/* Parse the string TIMESTAMP into a time_t.  The string may either be +   seconds since Epoch or in the ISO 8601 format like +   "20390815T143012".  Returns 0 for an empty string or seconds since +   Epoch. Leading spaces are skipped. If ENDP is not NULL, it will +   point to the next non-parsed character in TIMESTRING. */ +time_t _gpgme_parse_timestamp (const char *timestamp, char **endp); + +  gpgme_error_t _gpgme_map_gnupg_error (char *err); diff --git a/gpgme/verify.c b/gpgme/verify.c index b92e753d..b3287bda 100644 --- a/gpgme/verify.c +++ b/gpgme/verify.c @@ -258,16 +258,14 @@ parse_valid_sig (gpgme_signature_t sig, char *args)    if (end)      {        char *tail; -      errno = 0; -      /* FIXME: We need to cope with ISO time strings here. */ -      sig->timestamp = strtol (end, &tail, 0); -      if (errno || end == tail || (*tail && *tail != ' ')) +      sig->timestamp = _gpgme_parse_timestamp (end, &tail); +      if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' '))  	return gpg_error (GPG_ERR_INV_ENGINE);        end = tail; -      sig->exp_timestamp = strtol (end, &tail, 0); -      if (errno || end == tail || (*tail && *tail != ' ')) +      sig->exp_timestamp = _gpgme_parse_timestamp (end, &tail); +      if (sig->exp_timestamp == -1 || end == tail || (*tail && *tail != ' '))  	return gpg_error (GPG_ERR_INV_ENGINE);      }    return 0; | 
