doc: Fix documentation of struct data types
[gpgme.git] / src / version.c
index b2d795a..18825f8 100644 (file)
@@ -1,19 +1,19 @@
 /* version.c - Version check routines.
    Copyright (C) 2000 Werner Koch (dd9jn)
    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 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 Lesser General Public License as
    published by the Free Software Foundation; either version 2.1 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
    Lesser General Public License for more details.
-   
+
    You should have received a copy of the GNU Lesser General Public
    License along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -35,8 +35,9 @@
 #include "debug.h"
 #include "context.h"
 
-/* For _gpgme_sema_subsystem_init ().  */
+/* For _gpgme_sema_subsystem_init and _gpgme_status_init.  */
 #include "sema.h"
+#include "util.h"
 
 #ifdef HAVE_ASSUAN_H
 #include "assuan.h"
@@ -65,32 +66,38 @@ do_subsystem_inits (void)
     return;
 
 #ifdef HAVE_W32_SYSTEM
-      {
-        WSADATA wsadat;
-        
-        WSAStartup (0x202, &wsadat);
-      }
-#endif
-
-  _gpgme_sema_subsystem_init ();
-#ifdef HAVE_ASSUAN_H
-  assuan_set_assuan_err_source (GPG_ERR_SOURCE_GPGME);
-#endif /*HAVE_ASSUAN_H*/
-  _gpgme_debug_subsystem_init ();
-  _gpgme_io_subsystem_init ();
-#if defined(HAVE_W32_SYSTEM) && defined(HAVE_ASSUAN_H)
   /* We need to make sure that the sockets are initialized.  */
   {
     WSADATA wsadat;
-    
+
     WSAStartup (0x202, &wsadat);
   }
-#endif /*HAVE_W32_SYSTEM && HAVE_ASSUAN_H*/
+#endif
+
+  _gpgme_sema_subsystem_init ();
+  _gpgme_debug_subsystem_init ();
+  _gpgme_io_subsystem_init ();
+  _gpgme_status_init ();
 
   done = 1;
 }
 
 
+/* Put vesion information into the binary.  */
+static const char *
+cright_blurb (void)
+{
+  static const char blurb[] =
+    "\n\n"
+    "This is GPGME " PACKAGE_VERSION " - The GnuPG Made Easy library\n"
+    CRIGHTBLURB
+    "\n"
+    "(" BUILD_REVISION " " BUILD_TIMESTAMP ")\n"
+    "\n\n";
+  return blurb;
+}
+
+
 /* Read the next number in the version string STR and return it in
    *NUMBER.  Return a pointer to the tail of STR after parsing, or
    *NULL if the version string was invalid.  */
@@ -167,7 +174,7 @@ _gpgme_compare_versions (const char *my_version,
 
   if (my_major > rq_major
       || (my_major == rq_major && my_minor > rq_minor)
-      || (my_major == rq_major && my_minor == rq_minor 
+      || (my_major == rq_major && my_minor == rq_minor
          && my_micro > rq_micro)
       || (my_major == rq_major && my_minor == rq_minor
          && my_micro == rq_micro && strcmp (my_plvl, rq_plvl) >= 0))
@@ -193,13 +200,13 @@ gpgme_check_version (const char *req_version)
   do_subsystem_inits ();
 
   /* Catch-22: We need to get at least the debug subsystem ready
-     before using the tarce facility.  If we won't the tarce would
+     before using the trace facility.  If we won't the trace would
      automagically initialize the debug system with out the locks
      being initialized and missing the assuan log level setting. */
-  TRACE2 (DEBUG_INIT, "gpgme_check_version", 0,
+  TRACE2 (DEBUG_INIT, "gpgme_check_version", 0,
          "req_version=%s, VERSION=%s",
           req_version? req_version:"(null)", VERSION);
+
   result = _gpgme_compare_versions (VERSION, req_version) ? VERSION : NULL;
   if (result != NULL)
     _gpgme_selftest = 0;
@@ -216,17 +223,20 @@ gpgme_check_version_internal (const char *req_version,
 {
   const char *result;
 
-  TRACE2 (DEBUG_INIT, "gpgme_check_version_internal: ", 0,
-         "req_version=%s, offset_sig_validity=%i",
-         req_version ? req_version : "(null)", offset_sig_validity);
-
+  if (req_version && req_version[0] == 1 && req_version[1] == 1)
+    return cright_blurb ();
   result = gpgme_check_version (req_version);
   if (result == NULL)
     return result;
 
+  /* Catch-22, see above.  */
+  TRACE2 (DEBUG_INIT, "gpgme_check_version_internal", 0,
+         "req_version=%s, offset_sig_validity=%i",
+         req_version ? req_version : "(null)", offset_sig_validity);
+
   if (offset_sig_validity != offsetof (struct _gpgme_signature, validity))
     {
-      TRACE1 (DEBUG_INIT, "gpgme_check_version_internal", 0,
+      TRACE1 (DEBUG_INIT, "gpgme_check_version_internal", 0,
              "offset_sig_validity mismatch: expected %i",
              offsetof (struct _gpgme_signature, validity));
       _gpgme_selftest = GPG_ERR_SELFTEST_FAILED;
@@ -240,7 +250,7 @@ gpgme_check_version_internal (const char *req_version,
 
 /* Extract the version string of a program from STRING.  The version
    number is expected to be in GNU style format:
-   
+
      foo 1.2.3
      foo (bar system) 1.2.3
      foo 1.2.3 cruft
@@ -311,7 +321,7 @@ _gpgme_get_program_version (const char *const file_name)
 
   cfd[0].fd = rp[1];
 
-  status = _gpgme_io_spawn (file_name, argv, 0, cfd, NULL);
+  status = _gpgme_io_spawn (file_name, argv, 0, cfd, NULL, NULL, NULL);
   if (status < 0)
     {
       _gpgme_io_close (rp[0]);