gpgconf does now work for Wince.
[gnupg.git] / common / init.c
index ce661f6..de79a14 100644 (file)
@@ -49,6 +49,23 @@ sleep_on_exit (void)
 #endif /*HAVE_W32CE_SYSTEM*/
 
 
+/* If STRING is not NULL write string to es_stdout or es_stderr.  MODE
+   must be 1 or 2.  If STRING is NULL flush the respective stream.  */
+static int
+writestring_via_estream (int mode, const char *string)
+{
+  if (mode == 1 || mode == 2)
+    {
+      if (string)
+        return es_fputs (string, mode == 1? es_stdout : es_stderr);
+      else
+        return es_fflush (mode == 1? es_stdout : es_stderr);
+    }
+  else
+    return -1;
+}
+
+
 /* This function is to be used early at program startup to make sure
    that some subsystems are initialized.  This is in particular
    important for W32 to initialize the sockets so that our socket
@@ -73,13 +90,21 @@ init_common_subsystems (int *argcp, char ***argvp)
 # ifdef HAVE_PTH
   pth_init ();
 # else
- {
-   WSADATA wsadat;
-
-   WSAStartup (0x202, &wsadat);
- }
 {
+    WSADATA wsadat;
+    
+    WSAStartup (0x202, &wsadat);
 }
 # endif /*!HAVE_PTH*/
 #endif
+  
+#ifdef HAVE_W32CE_SYSTEM
+  /* Register the sleep exit function before the estream init so that
+     the sleep will be called after the estream registered atexit
+     function which flushes the left open estream streams and in
+     particular es_stdout.  */
+  atexit (sleep_on_exit);
+#endif
 
   /* Initialize the Estream library. */
   es_init ();
@@ -87,12 +112,24 @@ init_common_subsystems (int *argcp, char ***argvp)
   /* Special hack for Windows CE: We extract some options from arg
      to setup the standard handles.  */
 #ifdef HAVE_W32CE_SYSTEM
-  atexit (sleep_on_exit);
   parse_std_file_handles (argcp, argvp);
 #else
   (void)argcp;
   (void)argvp;
 #endif
+
+  /* Access the standard estreams as early as possible.  If we don't
+     do this the original stdio streams may have been closed when
+     _es_get_std_stream is first use and in turn it would connect to
+     the bit bucket.  */
+  {
+    int i;
+    for (i=0; i < 3; i++)
+      (void)_es_get_std_stream (i);
+  }
+
+  /* --version et al shall use estream as well.  */
+  argparse_register_outfnc (writestring_via_estream);
 }
 
 
@@ -163,6 +200,6 @@ parse_std_file_handles (int *argcp, char ***argvp)
         argv[i] = NULL;
     }
 
-
+  
 }
 #endif /*HAVE_W32CE_SYSTEM*/