doc/
authorMarcus Brinkmann <mb@g10code.com>
Thu, 30 Jan 2003 11:54:23 +0000 (11:54 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Thu, 30 Jan 2003 11:54:23 +0000 (11:54 +0000)
2003-01-30  Marcus Brinkmann  <marcus@g10code.de>

* gpgme.texi (Engine Information): Rewritten.

gpgme/
2003-01-30  Marcus Brinkmann  <marcus@g10code.de>

* gpgme.h (enum GpgmeProtocol): Remove GPGME_PROTOCOL_AUTO.
* gpgme.c (gpgme_set_protocol): Don't handle GPGME_PROTOCOL_AUTO.
(gpgme_get_protocol_name): New function.

* engine-backend.h (struct engine_ops): New member
get_req_version, remove member check_version.
* engine.h (_gpgme_Engine_get_version): New prototype.
* rungpg.c (gpg_get_req_version): New function.
(gpg_check_version): Function removed.
(_gpgme_engine_ops_gpg): Add gpg_get_req_version, remove
gpg_check_version.
* engine-gpgsm.c (gpgsm_get_req_version): New function.
(gpgsm_check_version): Function removed.
(_gpgme_engine_ops_gpgsm): Add gpgsm_get_req_version, remove
gpgsm_check_version.
* engine.c: Include ops.h.
 (_gpgme_engine_get_req_version): New function.
(gpgme_engine_check_version): Rewritten.
* version.c (gpgme_get_engine_info): Rewritten.
* gpgme.h (gpgme_engine_info): New structure.
(GpgmeEngineInfo): New type.

tests/
2003-01-30  Marcus Brinkmann  <marcus@g10code.de>

* Makefile.am (TESTS): Add t-engine-info.
* t-engine-info.c: New file.
* gpg/t-encrypt.c (main): Don't print engine info.
* gpg/t-eventloop.c (main): Likewise.
* gpg/t-encrypt-sign.c (main): Likewise.
* gpgsm/t-encrypt.c (main): Likewise.

18 files changed:
trunk/doc/ChangeLog
trunk/doc/gpgme.texi
trunk/gpgme/ChangeLog
trunk/gpgme/engine-backend.h
trunk/gpgme/engine-gpgsm.c
trunk/gpgme/engine.c
trunk/gpgme/engine.h
trunk/gpgme/gpgme.c
trunk/gpgme/gpgme.h
trunk/gpgme/rungpg.c
trunk/gpgme/version.c
trunk/tests/ChangeLog
trunk/tests/Makefile.am
trunk/tests/gpg/t-encrypt-sign.c
trunk/tests/gpg/t-encrypt.c
trunk/tests/gpg/t-eventloop.c
trunk/tests/gpgsm/t-encrypt.c
trunk/tests/t-engine-info.c [new file with mode: 0644]

index 9edc0bc78f88d010e64334ab337067755c52541a..ab3a6ae70a17a438dade5f707e4d4fcb7884e19a 100644 (file)
@@ -1,3 +1,7 @@
+2003-01-30  Marcus Brinkmann  <marcus@g10code.de>
+
+       * gpgme.texi (Engine Information): Rewritten.
+
 2003-01-29  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpgme.texi (I/O Callback Interface): Document new even
index 6b8229836c4bde19c82c54867d546030b4684de5..8b4cf1190494d24b3bd1840b900be2b2b571e7fe 100644 (file)
@@ -609,41 +609,87 @@ and @code{GPGME_Invalid_Engine} if it is not.
 @section Engine Information
 @cindex engine, information about
 
-@deftypefun {const char *} gpgme_get_engine_info (void)
-The function @code{gpgme_get_engine_info} returns an @acronym{XML}
-string containing information about the available protocols and the
-engine which implement them.  The following information is returned
-for each engine:
-
-@table @samp
-@item <protocol>
-The name of the protocol.
-@item <version>
-The version of the engine.
-@item <path>
-The path to the engine binary.
+@deftp {Data type} {GpgmeEngineInfo}
+@tindex GpgmeProtocol
+The @code{GpgmeEngineInfo} type specifies a pointer to a structure
+describing a crypto backend engine.  The structure contains the
+following elements:
+
+@table @code
+@item GpgmeEngineInfo next
+This is a pointer to the next engine info structure in the linked
+list, or @code{NULL} if this is the last element.
+
+@item GpgmeProtocol protocol
+This is the protocol for which the crypo engine is used.  You can
+convert this to a string with @code{gpgme_get_protocol_name} for
+printing.
+
+@item const char *path
+This is a string holding the path to the executable of the crypto
+engine.  Currently, it is never @code{NULL}, but using @code{NULL} is
+reserved for future use, so always check before you use it.
+
+@item const char *version
+This is a string containing the version number of the crypto engine.
+It might be @code{NULL} if the version number can not be determined,
+for example because the executable doesn't exist or is invalid.
+
+@item const char *req_version
+This is a string containing the minimum required version number of the
+crypto engine for @acronym{GPGME} to work correctly.  This is the
+version number that @code{gpgme_engine_check_version} verifies
+against.  Currently, it is never @code{NULL}, but using @code{NULL} is
+reserved for future use, so always check before you use it.
 @end table
+@end deftp
 
-A string is always returned.  If an error occurs, the string will
-contain an @samp{<error>} tag with a description of the failure.
+@deftypefun GpgmeError gpgme_get_engine_info (GpgmeEngineInfo *info)
+The function @code{gpgme_get_engine_info} returns a linked list of
+engine info structures in @var{info}.  Each info structure describes
+one configured crypto backend engine.
+
+The memory for the info structures is allocated the first time this
+function is invoked, and must not be freed by the caller.
+
+This function returns @code{GPGME_No_Error} if successful, and
+@code{GPGME_Out_Of_Core} if not enough memory is available for the
+operation.
 @end deftypefun
 
-Here is the example output of what @code{gpgme_get_engine_info} might
-return on your system:
+Here is the example how you can provide more diagnostics if you
+receive an error message which indicates that the crypto engine is
+invalid.
 
 @example
-<EngineInfo>
- <engine>
-  <protocol>OpenPGP</protocol>
-  <version>1.0.6</version>
-  <path>/usr/bin/gpg</path>
- </engine>
- <engine>
-  <protocol>CMS</protocol>
-  <version>0.0.0</version>
-  <path>/usr/bin/gpgsm</path>
- </engine>
-</EngineInfo>
+GpgmeCtx ctx;
+GpgmeError err;
+
+[...]
+
+if (err == GPGME_Invalid_Engine)
+  @{
+    GpgmeEngineInfo info;
+    err = gpgme_get_engine_info (&info);
+    if (!err)
+      @{
+        while (info && info->protocol != gpgme_get_protocol (ctx))
+          info = info->next;
+        if (!info)
+          fprintf (stderr, "GPGME compiled without support for protocol %s",
+                   gpgme_get_protocol_name (info->protocol));
+        else if (info->path && !info->version)
+          fprintf (stderr, "Engine %s not installed properly",
+                   info->path);
+        else if (info->path && info->version && info->req_version)
+          fprintf (stderr, "Engine %s version %s installed, "
+                   "but at least version %s required", info->path,
+                   info->version, info->req_version);
+        else
+          fprintf (stderr, "Unknown problem with engine for protocol %s",
+                   gpgme_get_protocol_name (info->protocol));
+      @}
+  @}
 @end example
 
 
index fef987242a49c472f1897a59ea486219c0b1e5ed..b143582e8de85cd91e7d4a5083b7f465491da0df 100644 (file)
@@ -1,3 +1,27 @@
+2003-01-30  Marcus Brinkmann  <marcus@g10code.de>
+
+       * gpgme.h (enum GpgmeProtocol): Remove GPGME_PROTOCOL_AUTO.
+       * gpgme.c (gpgme_set_protocol): Don't handle GPGME_PROTOCOL_AUTO.
+       (gpgme_get_protocol_name): New function.
+
+       * engine-backend.h (struct engine_ops): New member
+       get_req_version, remove member check_version.
+       * engine.h (_gpgme_Engine_get_version): New prototype.
+       * rungpg.c (gpg_get_req_version): New function.
+       (gpg_check_version): Function removed.
+       (_gpgme_engine_ops_gpg): Add gpg_get_req_version, remove
+       gpg_check_version.
+       * engine-gpgsm.c (gpgsm_get_req_version): New function.
+       (gpgsm_check_version): Function removed.
+       (_gpgme_engine_ops_gpgsm): Add gpgsm_get_req_version, remove
+       gpgsm_check_version.
+       * engine.c: Include ops.h.
+        (_gpgme_engine_get_req_version): New function.
+       (gpgme_engine_check_version): Rewritten.
+       * version.c (gpgme_get_engine_info): Rewritten.
+       * gpgme.h (gpgme_engine_info): New structure.
+       (GpgmeEngineInfo): New type.
+       
 2003-01-29  Marcus Brinkmann  <marcus@g10code.de>
 
        * types.h: Remove byte and ulong types.
index 84da0c5a024b0464ef25a5db6bcc30303e4896f6..b291f05a6ec5b22d0961539a022da582d1a1d384 100644 (file)
@@ -34,7 +34,7 @@ struct engine_ops
   /* Static functions.  */
   const char *(*get_path) (void);
   const char *(*get_version) (void);
-  GpgmeError (*check_version) (void);
+  const char *(*get_req_version) (void);
   GpgmeError (*new) (void **r_engine);
 
   /* Member functions.  */
index 190eeb527652b5f1d1da233fdf13a008d6627f8d..38c2c0f11ed587139fd6e4cde1a01727fe151077 100644 (file)
@@ -113,11 +113,10 @@ gpgsm_get_version (void)
 }
 
 
-static GpgmeError
-gpgsm_check_version (void)
+static const char *
+gpgsm_get_req_version (void)
 {
-  return _gpgme_compare_versions (gpgsm_get_version (), NEED_GPGSM_VERSION)
-    ? 0 : GPGME_Invalid_Engine;
+  return NEED_GPGSM_VERSION;
 }
 
 
@@ -1437,7 +1436,7 @@ struct engine_ops _gpgme_engine_ops_gpgsm =
     /* Static functions.  */
     _gpgme_get_gpgsm_path,
     gpgsm_get_version,
-    gpgsm_check_version,
+    gpgsm_get_req_version,
     gpgsm_new,
 
     /* Member functions.  */
index fcb6790710c24e406820e0e3298f773986fb70fe..131a0de86c5eb59a5d544fe04d9af5d9db9b4c1c 100644 (file)
@@ -27,6 +27,7 @@
 #include "gpgme.h"
 #include "util.h"
 #include "sema.h"
+#include "ops.h"
 
 #include "engine.h"
 #include "engine-backend.h"
@@ -54,7 +55,7 @@ static struct engine_ops *engine_ops[] =
 const char *
 _gpgme_engine_get_path (GpgmeProtocol proto)
 {
-  if (proto > sizeof (engine_ops) / sizeof (engine_ops[0]))
+  if (proto > DIM (engine_ops))
     return NULL;
 
   if (engine_ops[proto] && engine_ops[proto]->get_path)
@@ -68,7 +69,7 @@ _gpgme_engine_get_path (GpgmeProtocol proto)
 const char *
 _gpgme_engine_get_version (GpgmeProtocol proto)
 {
-  if (proto > sizeof (engine_ops) / sizeof (engine_ops[0]))
+  if (proto > DIM (engine_ops))
     return NULL;
 
   if (engine_ops[proto] && engine_ops[proto]->get_version)
@@ -78,20 +79,27 @@ _gpgme_engine_get_version (GpgmeProtocol proto)
 }
 
 
+/* Get the required version number of the engine for PROTOCOL.  */
+const char *
+_gpgme_engine_get_req_version (GpgmeProtocol proto)
+{
+  if (proto > DIM (engine_ops))
+    return NULL;
+
+  if (engine_ops[proto] && engine_ops[proto]->get_req_version)
+    return (*engine_ops[proto]->get_req_version) ();
+  else
+    return NULL;
+}
+
+
 /* Verify the version requirement for the engine for PROTOCOL.  */
 GpgmeError
 gpgme_engine_check_version (GpgmeProtocol proto)
 {
-  if (proto > sizeof (engine_ops) / sizeof (engine_ops[0]))
-    return GPGME_Invalid_Value;
-
-  if (!engine_ops[proto])
-    return GPGME_Invalid_Engine;
-
-  if (engine_ops[proto]->check_version)
-    return (*engine_ops[proto]->check_version) ();
-  else
-    return 0;
+  return _gpgme_compare_versions (_gpgme_engine_get_version (proto),
+                                 _gpgme_engine_get_req_version (proto))
+    ? 0 : GPGME_Invalid_Engine;
 }
 
 
@@ -142,7 +150,7 @@ _gpgme_engine_new (GpgmeProtocol proto, EngineObject *r_engine)
   const char *path;
   const char *version;
 
-  if (proto > sizeof (engine_ops) / sizeof (engine_ops[0]))
+  if (proto > DIM (engine_ops))
     return GPGME_Invalid_Value;
 
   if (!engine_ops[proto])
index d24169c21e2962ada4364fd0910686772502024a..746de6f1ee36c7c80ae02815d2bdadcd9d396cbf 100644 (file)
@@ -29,6 +29,9 @@ const char *_gpgme_engine_get_path (GpgmeProtocol proto);
 /* Get the version number of the engine for PROTOCOL.  */
 const char *_gpgme_engine_get_version (GpgmeProtocol proto);
 
+/* Get the version number of the engine for PROTOCOL.  */
+const char *_gpgme_engine_req_version (GpgmeProtocol proto);
+
 /* Verify the version requirement for the engine for PROTOCOL.  */
 const char *_gpgme_engine_get_info (GpgmeProtocol proto);
 
index 472f9f1e1dde8bed7a6864f396fe4e4312549518..d7e0056a584bf214103356d6aee12f5b4d4ab62d 100644 (file)
@@ -209,8 +209,6 @@ gpgme_set_protocol (GpgmeCtx ctx, GpgmeProtocol protocol)
     case GPGME_PROTOCOL_CMS:
       ctx->use_cms = 1;
       break;
-    case GPGME_PROTOCOL_AUTO:
-      return GPGME_Not_Implemented;
     default:
       return GPGME_Invalid_Value;
     }
@@ -229,6 +227,22 @@ gpgme_get_protocol (GpgmeCtx ctx)
 }
 
 
+const char *
+gpgme_get_protocol_name (GpgmeProtocol protocol)
+{
+  switch (protocol)
+    {
+    case GPGME_PROTOCOL_OpenPGP:
+      return "OpenPGP";
+
+    case GPGME_PROTOCOL_CMS:
+      return "CMS";
+
+    default:
+      return NULL;
+    }
+}
+
 /**
  * gpgme_set_armor:
  * @ctx: the context
index 1cea05e509a1509ce32ec43ddf2d1a0f3fc6e272..341a32ddd5c295cc6cb361eba334fe8b5cf5f8ec 100644 (file)
@@ -218,7 +218,6 @@ typedef enum
   {
     GPGME_PROTOCOL_OpenPGP = 0,  /* The default mode.  */
     GPGME_PROTOCOL_CMS     = 1,
-    GPGME_PROTOCOL_AUTO    = 2
   }
 GpgmeProtocol;
 
@@ -312,6 +311,26 @@ typedef enum  {
 #define GPGME_KEYLIST_MODE_EXTERN 2
 #define GPGME_KEYLIST_MODE_SIGS   4
 
+/* The engine information structure.  */
+struct _gpgme_engine_info
+{
+  struct _gpgme_engine_info *next;
+
+  /* The protocol ID.  */
+  GpgmeProtocol protocol;
+
+  /* The path to the engine binary.  */
+  const char *path;
+
+  /* The version string of the installed engine.  */
+  const char *version;
+
+  /* The minimum version required for GPGME.  */
+  const char *req_version;
+};
+typedef struct _gpgme_engine_info *GpgmeEngineInfo;
+
+
 /* Types for callback functions.  */
 
 /* Request a passphrase from the user.  */
@@ -343,6 +362,9 @@ GpgmeError gpgme_set_protocol (GpgmeCtx ctx, GpgmeProtocol proto);
 /* Get the protocol used with CTX */
 GpgmeProtocol gpgme_get_protocol (GpgmeCtx ctx);
 
+/* Get the string describing protocol PROTO, or NULL if invalid.  */
+const char *gpgme_get_protocol_name (GpgmeProtocol proto);
+
 /* If YES is non-zero, enable armor mode in CTX, disable it otherwise.  */
 void gpgme_set_armor (GpgmeCtx ctx, int yes);
 
@@ -798,7 +820,7 @@ GpgmeError gpgme_op_trustlist_end (GpgmeCtx ctx);
 const char *gpgme_check_version (const char *req_version);
 
 /* Retrieve information about the backend engines.  */
-const char *gpgme_get_engine_info (void);
+GpgmeError gpgme_get_engine_info (GpgmeEngineInfo *engine_info);
 
 /* Return a string describing ERR.  */
 const char *gpgme_strerror (GpgmeError err);
index 80981ae7200463b4d2c0f6bc3d066c8fbe51bdfb..ca1cb0bf86cd75e4c09273f0620d8e227952bacd 100644 (file)
@@ -248,11 +248,10 @@ gpg_get_version (void)
 }
 
 
-static GpgmeError
-gpg_check_version (void)
+static const char *
+gpg_get_req_version (void)
 {
-  return _gpgme_compare_versions (gpg_get_version (), NEED_GPG_VERSION)
-    ? 0 : GPGME_Invalid_Engine;
+  return NEED_GPG_VERSION;
 }
 
 
@@ -1646,7 +1645,7 @@ struct engine_ops _gpgme_engine_ops_gpg =
     /* Static functions.  */
     _gpgme_get_gpg_path,
     gpg_get_version,
-    gpg_check_version,
+    gpg_get_req_version,
     gpg_new,
 
     /* Member functions.  */
index 03cdb3291cec46236296caa97156c08ae96ea6b3..1af91cf67d1aa5282733d1f3d404f4f561c77064 100644 (file)
@@ -1,6 +1,6 @@
 /* version.c -  version check
    Copyright (C) 2000 Werner Koch (dd9jn)
-   Copyright (C) 2001, 2002 g10 Code GmbH
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
  
    This file is part of GPGME.
  
@@ -134,65 +134,57 @@ gpgme_check_version (const char *req_version)
   return _gpgme_compare_versions (VERSION, req_version);
 }
 
-/**
- * gpgme_get_engine_info:
- *  
- * 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
- * engines.
- **/
-const char *
-gpgme_get_engine_info ()
+
+/* Get the information about the configured and installed engines.  A
+   pointer to the first engine in the statically allocated linked list
+   is returned in *INFO.  If an error occurs, it is returned.  */
+GpgmeError
+gpgme_get_engine_info (GpgmeEngineInfo *info)
 {
-  static const char *engine_info;
+  static GpgmeEngineInfo engine_info;
   DEFINE_STATIC_LOCK (engine_info_lock);
 
   LOCK (engine_info_lock);
   if (!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;
+      GpgmeEngineInfo *lastp = &engine_info;
+      GpgmeProtocol proto_list[] = { GPGME_PROTOCOL_OpenPGP,
+                                    GPGME_PROTOCOL_CMS };
+      int proto;
 
-      if (!openpgp_info && !cms_info)
-       info = "<EngineInfo>\n</EngineInfo>\n";
-      else if (!openpgp_info || !cms_info)
+      for (proto = 0; proto < DIM (proto_list); proto++)
        {
-         const char *fmt = "<EngineInfo>\n"
-           "%s"
-           "</EngineInfo>\n";
+         const char *path = _gpgme_engine_get_path (proto_list[proto]);
 
-         info = malloc (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 = malloc (strlen (fmt) + strlen (openpgp_info)
-                            + strlen (cms_info) + 1);
-         if (info)
-           sprintf (info, fmt, openpgp_info, cms_info);
+         if (!path)
+           continue;
+
+         *lastp = malloc (sizeof (*engine_info));
+         if (!*lastp)
+           {
+             while (engine_info)
+               {
+                 GpgmeEngineInfo next_info = engine_info->next;
+                 free (engine_info);
+                 engine_info = next_info;
+               }
+             UNLOCK (engine_info_lock);
+             return GPGME_Out_Of_Core;
+           }
+
+         (*lastp)->protocol = proto_list[proto];
+         (*lastp)->path = path;
+         (*lastp)->version = _gpgme_engine_get_version (proto_list[proto]);
+         (*lastp)->req_version
+           = _gpgme_engine_get_req_version (proto_list[proto]);
+         lastp = &(*lastp)->next;
        }
-      if (!info)
-       info = "<EngineInfo>\n"
-         "  <error>Out of core</error>\n"
-         "</EngineInfo>\n";
-      engine_info = info;
     }
   UNLOCK (engine_info_lock);
-  return engine_info;
+  *info = engine_info;
+  return 0;
 }
 
-
 \f
 #define LINELENGTH 80
 
index 1ca88b5226e92d03b6dc919b6136b6be0d77edff..425884b9123b880ca0407cbd16ec9ea5e842fa34 100644 (file)
@@ -1,3 +1,12 @@
+2003-01-30  Marcus Brinkmann  <marcus@g10code.de>
+
+       * Makefile.am (TESTS): Add t-engine-info.
+       * t-engine-info.c: New file.
+       * gpg/t-encrypt.c (main): Don't print engine info.
+       * gpg/t-eventloop.c (main): Likewise.
+       * gpg/t-encrypt-sign.c (main): Likewise.
+       * gpgsm/t-encrypt.c (main): Likewise.
+       
 2002-12-24  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpgsm/t-verify.c (main): Adjust caller of gpgme_op_verify.
index b3679179b7b0ced75ef079df198829b5db293339..aa1da7980b3faa0276a06c38ac11440ce134b93b 100644 (file)
@@ -21,7 +21,7 @@
 
 TESTS_ENVIRONMENT = GNUPGHOME=.
 
-TESTS = t-version t-data
+TESTS = t-version t-data t-engine-info
 
 EXTRA_DIST = t-data-1.txt t-data-2.txt
 
index 1517db0f9cfd689967f58cde7777aba3b36dab54..dfd54bed5a26faf4fffab5f70d7251a91b50e309 100644 (file)
@@ -1,23 +1,22 @@
 /* t-encrypt-sign.c  - regression test
- *     Copyright (C) 2000 Werner Koch (dd9jn)
- *      Copyright (C) 2001, 2002 g10 Code GmbH
- *
- * This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * GPGME is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -94,7 +93,6 @@ main (int argc, char **argv )
 
     err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);
     fail_if_err (err);
-    puts ( gpgme_get_engine_info() );
 
   do {
     err = gpgme_new (&ctx);
index 14a407d900692656a5521e466bab1e77925405e2..fa55fd6f2a9ba5ab16435ab11c2826e15317aa2a 100644 (file)
@@ -1,23 +1,22 @@
 /* t-encrypt.c  - regression test
- *     Copyright (C) 2000 Werner Koch (dd9jn)
- *      Copyright (C) 2001 g10 Code GmbH
- *
- * This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * GPGME is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -74,7 +73,6 @@ main (int argc, char **argv)
 
     err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);
     fail_if_err (err);
-    puts ( gpgme_get_engine_info() );
 
   do {
     err = gpgme_new (&ctx);
index 887de64c4c515672f6f5d54f13653c23ebdaca1c..71998bdbfcad3c85abaec361bb18a9f95e4cdb19 100644 (file)
@@ -1,23 +1,22 @@
 /* t-eventloop.c  - regression test
- *     Copyright (C) 2000 Werner Koch (dd9jn)
- *      Copyright (C) 2001, 2002 g10 Code GmbH
- *
- * This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * GPGME is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -205,7 +204,6 @@ main (int argc, char *argv[])
 
   err = gpgme_engine_check_version (GPGME_PROTOCOL_OpenPGP);
   fail_if_err (err);
-  puts (gpgme_get_engine_info ());
 
   do
     {
index 49996858799e1dc67639226451f309611cdc2df9..a6f80a4f8985c0a0d3a5855581fddc4e34d925c7 100644 (file)
@@ -1,23 +1,22 @@
 /* t-encrypt.c  - regression test
- *     Copyright (C) 2000 Werner Koch (dd9jn)
- *      Copyright (C) 2001 g10 Code GmbH
- *
- * This file is part of GPGME.
- *
- * GPGME is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * GPGME is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -92,7 +91,6 @@ main (int argc, char **argv )
 
     err = gpgme_engine_check_version (GPGME_PROTOCOL_CMS);
     fail_if_err (err);
-    puts ( gpgme_get_engine_info() );
 
   do {
     err = gpgme_new (&ctx);
diff --git a/trunk/tests/t-engine-info.c b/trunk/tests/t-engine-info.c
new file mode 100644 (file)
index 0000000..e4d0eda
--- /dev/null
@@ -0,0 +1,92 @@
+/* t-engine-info.c - Regression test for gpgme_get_engine_info.
+   Copyright (C) 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+\f
+#define fail_if_err(err)                                       \
+  do                                                           \
+    {                                                          \
+      if (err)                                                 \
+        {                                                      \
+          fprintf (stderr, "%s:%d: GpgmeError %s\n",           \
+                   __FILE__, __LINE__, gpgme_strerror (err));   \
+          exit (1);                                            \
+        }                                                      \
+    }                                                          \
+  while (0)
+
+\f
+void
+check_engine_info (GpgmeEngineInfo info, GpgmeProtocol protocol,
+                  const char *path, const char *req_version)
+{
+  if (info->protocol != protocol)
+    {
+      fprintf (stderr, "Unexpected protocol %i (expected %i instead)\n",
+              info->protocol, protocol);
+      exit (1);
+    }
+  if (strcmp (info->path, path))
+    {
+      fprintf (stderr, "Unexpected path to executable %s (expected %s instead)",
+              info->path, path);
+      exit (1);
+    }
+  if (strcmp (info->req_version, req_version))
+    {
+      fprintf (stderr, "Unexpected required version %s (expected %s instead)",
+              info->req_version, req_version);
+      exit (1);
+    }
+}
+
+
+int 
+main (int argc, char **argv )
+{
+  GpgmeEngineInfo info;
+  GpgmeError err;
+
+  err = gpgme_get_engine_info (&info);
+  fail_if_err (err);
+
+  check_engine_info (info, GPGME_PROTOCOL_OpenPGP, GPG_PATH, NEED_GPG_VERSION);
+
+  info = info->next;
+#ifdef GPGSM_PATH
+  check_engine_info (info, GPGME_PROTOCOL_CMS, GPGSM_PATH, NEED_GPGSM_VERSION);
+#else
+  if (info)
+    {
+      fprintf (stderr, "Unexpected engine info.\n");
+      exit (1);
+    }
+#endif
+
+  return 0;
+}