More work on the dirmngr. It now builds for W32 and W32CE and quick
[gnupg.git] / common / init.c
index d818856..f0ab9c9 100644 (file)
 #ifdef HAVE_PTH      
 #include <pth.h>
 #endif
+#ifdef HAVE_W32CE_SYSTEM
+# include <assuan.h> /* For _assuan_w32ce_finish_pipe. */
+#endif
 
 #include "util.h"
 
+
 #ifdef HAVE_W32CE_SYSTEM
-#include <assuan.h>
 static void parse_std_file_handles (int *argcp, char ***argvp);
+static void
+sleep_on_exit (void)
+{
+  /* The sshd on CE swallows some of the command output.  Sleeping a
+     while usually helps.  */
+  Sleep (400);
+}
 #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
@@ -63,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 ();
@@ -82,6 +117,10 @@ init_common_subsystems (int *argcp, char ***argvp)
   (void)argcp;
   (void)argvp;
 #endif
+
+  /* --version et al shall use estream as well.  */
+  argparse_register_outfnc (writestring_via_estream);
+
 }
 
 
@@ -101,7 +140,7 @@ init_common_subsystems (int *argcp, char ***argvp)
    SetStdioPath set and restore game.  The caller needs to pass the
    rendezvous ids using up to three options:
 
-     -&S0=<handle> -&S1=<handle> -&S2=<handle>
+     -&S0=<rvid> -&S1=<rvid> -&S2=<rvid>
 
    They are all optional but they must be the first arguments on the
    command line.  Parsing stops as soon as an invalid option is found.