diff options
| -rw-r--r-- | gpgme/ChangeLog | 11 | ||||
| -rw-r--r-- | gpgme/engine.c | 41 | ||||
| -rw-r--r-- | gpgme/engine.h | 2 | ||||
| -rw-r--r-- | gpgme/version.c | 162 | 
4 files changed, 105 insertions, 111 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index defb9edc..8bccdb9a 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,5 +1,16 @@  2001-12-18  Marcus Brinkmann  <[email protected]> +	* version.c (gpgme_get_engine_info): Reimplemented. +	(gpgme_check_engine): Reimplemented. +	(_gpgme_compare_versions): Return NULL if MY_VERSION is NULL. + +	* engine.c: Include `io.h'. +	(gpgme_engine_get_info): New function. +	* engine.h (gpgme_engine_check_version, _gpgme_engine_get_info): +	Add prototype. + +2001-12-18  Marcus Brinkmann  <[email protected]> +  	* rungpg.c (struct reap_s, reap_list, reap_list_lock): Moved to ...  	* engine.c (struct reap_s, reap_list, reap_list_lock): ... here.  	Include `time.h', `sys/types.h', `assert.h', and `sema.h'. diff --git a/gpgme/engine.c b/gpgme/engine.c index 3c250c9e..5e0117b5 100644 --- a/gpgme/engine.c +++ b/gpgme/engine.c @@ -29,6 +29,7 @@  #include "gpgme.h"  #include "util.h"  #include "sema.h" +#include "io.h"  #include "engine.h"  #include "rungpg.h" @@ -103,6 +104,46 @@ gpgme_engine_check_version (GpgmeProtocol proto)      }  } +const char * +_gpgme_engine_get_info (GpgmeProtocol proto) +{ +  static const char fmt[] = " <engine>\n" +    "  <protocol>%s</protocol>\n" +    "  <version>%s</version>\n" +    "  <path>%s</path>\n" +    " </engine>\n"; +  static const char *const strproto[3] = { "OpenPGP", "CMS", NULL }; +  static const char *engine_info[3];  /* FIXME: MAX_PROTO + 1*/ +  const char *path; +  const char *version; +  char *info; + +  if (proto > 2 /* FIXME MAX_PROTO */ || !strproto[proto]) +    return NULL; + +  /* FIXME: Make sure that only one instance does run.  */ +  if (engine_info[proto]) +    return engine_info[proto]; + +  path = _gpgme_engine_get_path (proto); +  version = _gpgme_engine_get_version (proto); + +  if (!path || !version) +    return NULL; + +  info = xtrymalloc (strlen(fmt) + strlen(strproto[proto]) + strlen(path) +                     + strlen (version) + 1); +  if (!info) +    info = " <engine>\n" +      "  <error>Out of core</error>\n" +      " </engine>"; +  else +    sprintf (info, fmt, strproto[proto], version, path); +  engine_info[proto] = info; + +  return engine_info[proto]; +} +  GpgmeError  _gpgme_engine_new (GpgmeProtocol proto, EngineObject *r_engine)  { diff --git a/gpgme/engine.h b/gpgme/engine.h index 23be9dc9..e7b7cbc5 100644 --- a/gpgme/engine.h +++ b/gpgme/engine.h @@ -27,6 +27,8 @@  const char *_gpgme_engine_get_path (GpgmeProtocol proto);  const char *_gpgme_engine_get_version (GpgmeProtocol proto); +GpgmeError gpgme_engine_check_version (GpgmeProtocol proto); +const char * _gpgme_engine_get_info (GpgmeProtocol proto);  GpgmeError _gpgme_engine_new (GpgmeProtocol proto, EngineObject *r_engine);  void _gpgme_engine_release (EngineObject engine);  void _gpgme_engine_set_status_handler (EngineObject engine, diff --git a/gpgme/version.c b/gpgme/version.c index b2146db8..27d720b3 100644 --- a/gpgme/version.c +++ b/gpgme/version.c @@ -35,7 +35,6 @@  static const char *get_engine_info (void); -  static void  do_subsystem_inits (void)  { @@ -47,8 +46,6 @@ do_subsystem_inits (void)      _gpgme_key_cache_init ();  } - -  static const char*  parse_version_number ( const char *s, int *number )  { @@ -64,7 +61,6 @@ parse_version_number ( const char *s, int *number )      return val < 0? NULL : s;  } -  static const char *  parse_version_string( const char *s, int *major, int *minor, int *micro )  { @@ -92,6 +88,8 @@ _gpgme_compare_versions (const char *my_version,    if (!req_version)      return my_version; +  if (!my_version) +    return NULL;    my_plvl = parse_version_string (my_version, &my_major, &my_minor, &my_micro);    if (!my_plvl) @@ -114,7 +112,6 @@ _gpgme_compare_versions (const char *my_version,    return NULL;  } -  /**   * gpgme_check_version:   * @req_version: A string with a version @@ -139,56 +136,73 @@ gpgme_check_version (const char *req_version)  /**   * gpgme_get_engine_info:   *   - * Return information about the underlying crypto engine.  This is an - * XML string with various information.  To get the version of the - * crypto engine it should be sufficient to grep for the first - * <literal>version</literal> tag and use it's content.  A string is - * always returned even if the crypto engine is not installed; in this - * case a XML string with some error information is returned. + * Return information about the underlying crypto engines.  This is an + * XML string with various information.  A string is always returned + * even if the crypto engines is not installed; in this case a XML + * string with some error information is returned.   *  - * Return value: A XML string with information about the crypto engine. + * Return value: A XML string with information about the crypto + * engines.   **/  const char *  gpgme_get_engine_info ()  { -    do_subsystem_inits (); -    return get_engine_info (); +  static const char *engine_info; +  const char *openpgp_info = _gpgme_engine_get_info (GPGME_PROTOCOL_OpenPGP); +  const char *cms_info = _gpgme_engine_get_info (GPGME_PROTOCOL_CMS); +  char *info; + +  /* FIXME: Make sure that only one instance does run.  */ +  if (engine_info) +    return engine_info; + +  if (!openpgp_info && !cms_info) +    info = "<EngineInfo>\n</EngineInfo>\n"; +  else if (!openpgp_info || !cms_info) +    { +      const char *fmt = "<EngineInfo>\n" +        "%s" +        "</EngineInfo>\n"; + +      info = xtrymalloc (strlen(fmt) + strlen(openpgp_info +                                              ? openpgp_info : cms_info) + 1); +      if (info) +        sprintf (info, fmt, openpgp_info ? openpgp_info : cms_info); +    } +  else +    { +      const char *fmt = "<EngineInfo>\n" +        "%s%s" +        "</EngineInfo>\n"; +      info = xtrymalloc (strlen(fmt) + strlen(openpgp_info) +                         + strlen (cms_info) + 1); +      if (info) +        sprintf (info, fmt, openpgp_info, cms_info); +    } +  if (!info) +    info = "<EngineInfo>\n" +      "  <error>Out of core</error>\n" +      "</EngineInfo>\n"; +  engine_info = info; +  return engine_info;  }  /**   * gpgme_check_engine:   *  - * Check whether the installed crypto engine matches the requirement of - * GPGME. + * Check whether the installed crypto engine for the OpenPGP protocol + * matches the requirement of GPGME.  This function is deprecated, + * instead use gpgme_engine_get_info() with the specific protocol you + * need.   *   * Return value: 0 or an error code.   **/  GpgmeError  gpgme_check_engine ()  { -    const char *info = gpgme_get_engine_info (); -    const char *s, *s2; - -    s = strstr (info, "<version>"); -    if (s) { -        s += 9; -        s2 = strchr (s, '<'); -        if (s2) { -            char *ver = xtrymalloc (s2 - s + 1); -            if (!ver) -                return mk_error (Out_Of_Core); -            memcpy (ver, s, s2-s); -            ver[s2-s] = 0; -            s = _gpgme_compare_versions ( ver, NEED_GPG_VERSION ); -            xfree (ver); -            if (s) -                return 0; -        } -    } -    return mk_error (Invalid_Engine); +  return gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);  } -  #define LINELENGTH 80 @@ -253,77 +267,3 @@ _gpgme_get_program_version (const char *const path)    return NULL;  } - -static const char * -get_engine_info (void) -{ -    static const char *engine_info =NULL; -    GpgmeError err = 0; -    const char *path = NULL; -    char *version; - -    /* FIXME: make sure that only one instance does run */ -    if (engine_info) -        return engine_info; - -    path = _gpgme_get_gpg_path (); -    if (!path) -      { -	engine_info = "<GnupgInfo>\n" -	  "  <error>Not supported</error>\n" -	  "</GnupgInfo>\n"; -	goto leave; -      } -    version = _gpgme_get_program_version (path); - -    if (version) { -        const char *fmt; -        char *p; - -        fmt = "<GnupgInfo>\n" -              " <engine>\n" -              "  <version>%s</version>\n" -              "  <path>%s</path>\n" -              " </engine>\n" -              "</GnupgInfo>\n"; -        /*(yes, I know that we allocating 2 extra bytes)*/ -        p = xtrymalloc ( strlen(fmt) + strlen(path) -                         + strlen (version) + 1); -        if (!p) { -            err = mk_error (Out_Of_Core); -            goto leave; -        } -        sprintf (p, fmt, version, path); -        engine_info = p; -        xfree (version); -    } -    else { -        err = mk_error (General_Error); -    } - - leave: -    if (err) { -        const char *fmt; -        const char *errstr = gpgme_strerror (err); -        char *p; - -        fmt = "<GnupgInfo>\n" -            " <engine>\n" -            "  <error>%s</error>\n"                 -            "  <path>%s</path>\n" -            " </engine>\n" -            "</GnupgInfo>\n"; - -        p = xtrymalloc ( strlen(fmt) + strlen(errstr) + strlen(path) + 1); -        if (p) {  -            sprintf (p, fmt, errstr, path); -            engine_info = p; -        } -        else { -            engine_info = "<GnupgInfo>\n" -                          "  <error>Out of core</error>\n" -                          "</GnupgInfo>\n"; -        } -    } -    return engine_info; -}  | 
