auto updated version number.
[gpgme.git] / gpgme / version.c
index 27d720b..2b2874b 100644 (file)
 #include "key.h" /* for key_cache_init */
 #include "io.h"
 
-static const char *get_engine_info (void);
 
 static void
 do_subsystem_inits (void)
 {
-    static int done = 0;
+  static int done = 0;
 
-    if (done)
-        return;
-    _gpgme_sema_subsystem_init ();
-    _gpgme_key_cache_init ();
+  if (done)
+    return;
+  _gpgme_sema_subsystem_init ();
+  _gpgme_key_cache_init ();
+  done = 1;
 }
 
 static const char*
-parse_version_number ( const char *s, int *number )
+parse_version_number (const char *s, int *number)
 {
-    int val = 0;
+  int val = 0;
 
-    if ( *s == '0' && isdigit(s[1]) )
-       return NULL; /* leading zeros are not allowed */
-    for ( ; isdigit(*s); s++ ) {
-       val *= 10;
-       val += *s - '0';
+  if (*s == '0' && isdigit(s[1]))
+    return NULL;  /* Leading zeros are not allowed.  */
+  for (; isdigit(*s); s++)
+    {
+      val *= 10;
+      val += *s - '0';
     }
-    *number = val;
-    return val < 0? NULL : s;
+  *number = val;
+  return val < 0 ? NULL : s;
 }
 
 static const char *
-parse_version_string( const char *s, int *major, int *minor, int *micro )
+parse_version_string (const char *s, int *major, int *minor, int *micro)
 {
-    s = parse_version_number ( s, major );
-    if ( !s || *s != '.' )
-       return NULL;
-    s++;
-    s = parse_version_number ( s, minor );
-    if ( !s || *s != '.' )
-       return NULL;
-    s++;
-    s = parse_version_number ( s, micro );
-    if ( !s )
-       return NULL;
-    return s; /* patchlevel */
+  s = parse_version_number (s, major);
+  if (!s || *s != '.')
+    return NULL;
+  s++;
+  s = parse_version_number (s, minor);
+  if (!s || *s != '.')
+    return NULL;
+  s++;
+  s = parse_version_number (s, micro);
+  if (!s)
+    return NULL;
+  return s;  /* Patchlevel.  */
 }
 
 const char *
@@ -148,45 +149,50 @@ const char *
 gpgme_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;
+  DEFINE_STATIC_LOCK (engine_info_lock);
 
-  if (!openpgp_info && !cms_info)
-    info = "<EngineInfo>\n</EngineInfo>\n";
-  else if (!openpgp_info || !cms_info)
+  LOCK (engine_info_lock);
+  if (!engine_info)
     {
-      const char *fmt = "<EngineInfo>\n"
-        "%s"
-        "</EngineInfo>\n";
+      const char *openpgp_info = _gpgme_engine_get_info (GPGME_PROTOCOL_OpenPGP);
+      const char *cms_info = _gpgme_engine_get_info (GPGME_PROTOCOL_CMS);
+      char *info;
 
-      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 (!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;
     }
-  if (!info)
-    info = "<EngineInfo>\n"
-      "  <error>Out of core</error>\n"
-      "</EngineInfo>\n";
-  engine_info = info;
+  UNLOCK (engine_info_lock);
   return engine_info;
 }
 
+
 /**
  * gpgme_check_engine:
  *