[svn] GnuPG - r5299 - in trunk: . am common g10 kbx sm

svn author wk cvs at cvs.gnupg.org
Wed Mar 24 13:15:31 CET 2010


Author: wk
Date: 2010-03-24 13:15:30 +0100 (Wed, 24 Mar 2010)
New Revision: 5299

Modified:
   trunk/ChangeLog
   trunk/am/cmacros.am
   trunk/common/ChangeLog
   trunk/common/dotlock.c
   trunk/common/exechelp-posix.c
   trunk/common/exechelp-w32.c
   trunk/common/exechelp-w32ce.c
   trunk/common/exechelp.h
   trunk/common/init.c
   trunk/common/iobuf.c
   trunk/common/session-env.c
   trunk/common/stringhelp.c
   trunk/common/sysutils.c
   trunk/common/sysutils.h
   trunk/common/ttyio.c
   trunk/configure.ac
   trunk/g10/ChangeLog
   trunk/kbx/ChangeLog
   trunk/kbx/Makefile.am
   trunk/kbx/keybox-update.c
   trunk/sm/ChangeLog
   trunk/sm/Makefile.am
   trunk/sm/certdump.c
   trunk/sm/export.c
   trunk/sm/gpgsm.c
   trunk/sm/import.c
   trunk/sm/qualified.c
   trunk/sm/server.c
Log:
More changes for CE.  gpgsm does now build and run a keylisting.


[The diff below has been truncated]

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/ChangeLog	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,3 +1,14 @@
+2010-03-24  Werner Koch  <wk at g10code.com>
+
+	* configure.ac (AH_BOTTOM): Use /gnupg as the default homedir on
+	dosish systems which don't support drive letters (e.g. W32CE).
+
+	* am/cmacros.am (extra_sys_libs): New.
+
+2010-03-23  Werner Koch  <wk at g10code.com>
+
+	* configure.ac (W32SOCKLIBS): Change value for W32CE.
+
 2010-03-12  Werner Koch  <wk at g10code.com>
 
 	* configure.ac (AC_INIT): Prepare for using git.

Modified: trunk/common/ChangeLog
===================================================================
--- trunk/common/ChangeLog	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/ChangeLog	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,5 +1,36 @@
+2010-03-24  Werner Koch  <wk at g10code.com>
+
+	* stringhelp.c (change_slashes, compare_filenames): Replace
+	HAVE_DRIVE_LETTERS by HAVE_DOSISH_SYSTEM.
+	(make_basename, make_dirname): Detect backslashes and drive
+	letters separately.
+
+	* dotlock.c (make_dotlock, create_dotlock, release_dotlock): Use
+	LockFileEx and UnlockFileEx to support W32CE.
+
+	* ttyio.c (USE_W32_CONSOLE): Replace all _WIN32 by this.
+	(init_ttyfp) [W32CE]: Use stderr.
+
+	* iobuf.c (FD_FOR_STDIN, FD_FOR_STDOUT) [W32CE]: Use estream.
+	(translate_file_handle) [W32CE]: Remove handle translation.
+
+2010-03-23  Werner Koch  <wk at g10code.com>
+
+	* sysutils.c (gnupg_remove): New.
+
 2010-03-22  Werner Koch  <wk at g10code.com>
 
+	* exechelp-w32ce.c (build_w32_commandline): Replace by code from
+	libassuan.
+	(create_inheritable_pipe): Use _assuan_w32ce_prepare_pipe.
+	(build_w32_commandline_copy, do_create_pipe): Remove.
+
+	* exechelp-posix.c (gnupg_spawn_process): Change to use estream
+	also for INFILE and STATUSFILE.
+	* exechelp-w32.c (gnupg_spawn_process): Ditto.
+
+2010-03-22  Werner Koch  <wk at g10code.com>
+
 	* exechelp.c: Remove after factoring all code out to ...
 	* exechelp-posix.c, exechelp-w32.c, exechelp-w32ce.c:  .. new.
 

Modified: trunk/g10/ChangeLog
===================================================================
--- trunk/g10/ChangeLog	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/g10/ChangeLog	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,3 +1,8 @@
+2010-03-24  Werner Koch  <wk at g10code.com>
+
+	* openfile.c (CMP_FILENAME): Depend on HAVE_DOSISH_SYSTEM instead
+	of HAVE_DRIVE_LETTERS.
+
 2010-03-15  Werner Koch  <wk at g10code.com>
 
 	* card-util.c: Replace stdio by estream.

Modified: trunk/kbx/ChangeLog
===================================================================
--- trunk/kbx/ChangeLog	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/kbx/ChangeLog	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,3 +1,12 @@
+2010-03-23  Werner Koch  <wk at g10code.com>
+
+	* Makefile.am (extra_libs): New.
+	(kbxutil_LDADD): Use it.
+
+	* keybox-update.c: [HAVE_DOSISH_SYSTEM]: Include sysutils.h.
+	(keybox_compress): Replace rewind by fseek+clearerr.
+	(rename_tmp_file, keybox_compress): s/remove/gnupg_remove/.
+
 2010-03-10  Werner Koch  <wk at g10code.com>
 
 	* Makefile.am (kbxutil_LDADD, $(PROGRAMS)): Remove libjnlib.a.

Modified: trunk/sm/ChangeLog
===================================================================
--- trunk/sm/ChangeLog	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/sm/ChangeLog	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,3 +1,17 @@
+2010-03-24  Werner Koch  <wk at g10code.com>
+
+	* Makefile.am (gpgsm_LDADD): Add extra_sys_libs.
+
+2010-03-23  Werner Koch  <wk at g10code.com>
+
+	* qualified.c (gpgsm_is_in_qualified_list): Replace rewind by
+	fseek+clearerr.
+
+2010-03-22  Werner Koch  <wk at g10code.com>
+
+	* import.c (parse_p12): Use estream functions for the tmp streams.
+	* export.c (export_p12): Ditto.
+
 2010-03-11  Werner Koch  <wk at g10code.com>
 
 	* verify.c (gpgsm_verify): Use gpgsm_es_print_name.

Modified: trunk/am/cmacros.am
===================================================================
--- trunk/am/cmacros.am	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/am/cmacros.am	2010-03-24 12:15:30 UTC (rev 5299)
@@ -48,7 +48,16 @@
 AM_CPPFLAGS += -DGNUPG_DEFAULT_PROTECT_TOOL="\"@GNUPG_PROTECT_TOOL_PGM@\""
 endif
 
+# Under Windows we use LockFileEx.  WindowsCE provides this only on
+# the WindowsMobile 6 platform and thus we need to use the coredll6
+# import library.
+if HAVE_W32CE_SYSTEM
+extra_sys_libs = -lcoredll6
+else
+extra_sys_libs = 
+endif
 
+
 # Convenience macros
 libcommon = ../common/libcommon.a
 libcommonpth = ../common/libcommonpth.a

Modified: trunk/common/dotlock.c
===================================================================
--- trunk/common/dotlock.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/dotlock.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,6 +1,6 @@
 /* dotlock.c - dotfile locking
  * Copyright (C) 1998, 2000, 2001, 2003, 2004, 
- *               2005, 2006, 2008 Free Software Foundation, Inc.
+ *               2005, 2006, 2008, 2010 Free Software Foundation, Inc.
  *
  * This file is part of JNLIB.
  *
@@ -362,7 +362,10 @@
 #ifdef HAVE_DOSISH_SYSTEM
       if (h->locked)
         {
-          UnlockFile (h->lockhd, 0, 0, 1, 0);
+          OVERLAPPED ovl;
+
+          memset (&ovl, 0, sizeof ovl); 
+          UnlockFileEx (h->lockhd, 0, 1, 0, &ovl);
         }
       CloseHandle (h->lockhd);
 #else /* !HAVE_DOSISH_SYSTEM */
@@ -497,8 +500,12 @@
         return -1;
 #else /*HAVE_DOSISH_SYSTEM*/
       int w32err;
+      OVERLAPPED ovl;
 
-      if (LockFile (h->lockhd, 0, 0, 1, 0))
+      /* Lock one byte at offset 0.  The offset is given by OVL.  */
+      memset (&ovl, 0, sizeof ovl); 
+      if (LockFileEx (h->lockhd, (LOCKFILE_EXCLUSIVE_LOCK
+                                  | LOCKFILE_FAIL_IMMEDIATELY), 0, 1, 0, &ovl))
         {
           h->locked = 1;
           return 0; /* okay */
@@ -552,12 +559,17 @@
     }
 
 #ifdef HAVE_DOSISH_SYSTEM
-  if (!UnlockFile (h->lockhd, 0, 0, 1, 0))
-    {
-      log_error ("release_dotlock: error removing lockfile `%s': %s\n",
-                 h->lockname, w32_strerror (-1));
-      return -1;
-    }
+  {
+    OVERLAPPED ovl;
+    
+    memset (&ovl, 0, sizeof ovl); 
+    if (!UnlockFileEx (h->lockhd, 0, 1, 0, &ovl))
+      {
+        log_error ("release_dotlock: error removing lockfile `%s': %s\n",
+                   h->lockname, w32_strerror (-1));
+        return -1;
+      }
+  }
 #else
 
   pid = read_lockfile (h, &same_node);

Modified: trunk/common/exechelp-posix.c
===================================================================
--- trunk/common/exechelp-posix.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/exechelp-posix.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -299,31 +299,12 @@
 }
 
 
-/* Fork and exec the PGMNAME, connect the file descriptor of INFILE to
-   stdin, write the output to OUTFILE, return a new stream in
-   STATUSFILE for stderr and the pid of the process in PID. The
-   arguments for the process are expected in the NULL terminated array
-   ARGV.  The program name itself should not be included there.  If
-   PREEXEC is not NULL, that function will be called right before the
-   exec.  Calling gnupg_wait_process is required.
-
-   FLAGS is a bit vector with just one bit defined for now:
-
-   Bit 7: If set the process will be started as a background process.
-          This flag is only useful under W32 systems, so that no new
-          console is created and pops up a console window when
-          starting the server
- 
-   Bit 6: On W32 run AllowSetForegroundWindow for the child.  Due to
-          error problems this actually allows SetForegroundWindow for
-          childs of this process.
-
-   Returns 0 on success or an error code. */
+/* Fork and exec the PGMNAME, see exechelp.h for details.  */
 gpg_error_t
 gnupg_spawn_process (const char *pgmname, const char *argv[],
-                     FILE *infile, estream_t outfile,
+                     estream_t infile, estream_t outfile,
                      void (*preexec)(void), unsigned int flags,
-                     FILE **statusfile, pid_t *pid)
+                     estream_t *statusfile, pid_t *pid)
 {
   gpg_error_t err;
   int fd, fdout, rp[2];
@@ -332,9 +313,9 @@
 
   *statusfile = NULL;
   *pid = (pid_t)(-1);
-  fflush (infile);
-  rewind (infile);
-  fd = fileno (infile);
+  es_fflush (infile);
+  es_rewind (infile);
+  fd = es_fileno (infile);
   fdout = es_fileno (outfile);
   if (fd == -1 || fdout == -1)
     log_fatal ("no file descriptor for file passed to gnupg_spawn_process\n");
@@ -371,7 +352,7 @@
   /* Parent. */
   close (rp[1]);
 
-  *statusfile = fdopen (rp[0], "r");
+  *statusfile = es_fdopen (rp[0], "r");
   if (!*statusfile)
     {
       err = gpg_error_from_syserror ();

Modified: trunk/common/exechelp-w32.c
===================================================================
--- trunk/common/exechelp-w32.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/exechelp-w32.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -362,31 +362,12 @@
 }
 
 
-/* Fork and exec the PGMNAME, connect the file descriptor of INFILE to
-   stdin, write the output to OUTFILE, return a new stream in
-   STATUSFILE for stderr and the pid of the process in PID. The
-   arguments for the process are expected in the NULL terminated array
-   ARGV.  The program name itself should not be included there.  If
-   PREEXEC is not NULL, that function will be called right before the
-   exec.  Calling gnupg_wait_process is required.
-
-   FLAGS is a bit vector with just one bit defined for now:
-
-   Bit 7: If set the process will be started as a background process.
-          This flag is only useful under W32 systems, so that no new
-          console is created and pops up a console window when
-          starting the server
- 
-   Bit 6: On W32 run AllowSetForegroundWindow for the child.  Due to
-          error problems this actually allows SetForegroundWindow for
-          childs of this process.
-
-   Returns 0 on success or an error code. */
+/* Fork and exec the PGMNAME, see exechelp.h for details.  */
 gpg_error_t
 gnupg_spawn_process (const char *pgmname, const char *argv[],
-                     FILE *infile, estream_t outfile,
+                     estream_t infile, estream_t outfile,
                      void (*preexec)(void), unsigned int flags,
-                     FILE **statusfile, pid_t *pid)
+                     estream_t *statusfile, pid_t *pid)
 {
   gpg_error_t err;
   SECURITY_ATTRIBUTES sec_attr;
@@ -407,9 +388,9 @@
   /* Setup return values.  */
   *statusfile = NULL;
   *pid = (pid_t)(-1);
-  fflush (infile);
-  rewind (infile);
-  fd = _get_osfhandle (fileno (infile));
+  es_fflush (infile);
+  es_rewind (infile);
+  fd = _get_osfhandle (es_fileno (infile));
   fdout = _get_osfhandle (es_fileno (outfile));
   if (fd == -1 || fdout == -1)
     log_fatal ("no file descriptor for file passed to gnupg_spawn_process\n");
@@ -494,7 +475,7 @@
     if (x == -1)
       log_error ("failed to translate osfhandle %p\n", (void*)rp[0] );
     else 
-      *statusfile = fdopen (x, "r");
+      *statusfile = es_fdopen (x, "r");
   }
   if (!*statusfile)
     {

Modified: trunk/common/exechelp-w32ce.c
===================================================================
--- trunk/common/exechelp-w32ce.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/exechelp-w32ce.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -48,6 +48,7 @@
 # include <sys/stat.h>
 #endif
 
+#include <assuan.h>
 
 #include "util.h"
 #include "i18n.h"
@@ -71,7 +72,128 @@
 #define pid_to_handle(a) ((HANDLE)(a))
 #define handle_to_pid(a) ((int)(a))
 
+
+#ifdef USE_GNU_PTH      
+/* The data passed to the feeder_thread.  */ 
+struct feeder_thread_parms
+{
+  estream_t stream;
+  int fd;
+  int direction;
+};
 
+
+/* The thread started by start_feeded.  */
+static void *
+feeder_thread (void *arg)
+{
+  struct feeder_thread_parms *parm = arg;
+  char buffer[4096];
+
+  if (parm->direction)
+    {
+      size_t nread;
+      DWORD nwritten;
+
+      while (!es_read (parm->stream, buffer, sizeof buffer, &nread))
+        {
+          do
+            {
+              if (!WriteFile (fd_to_handle (parm->fd), 
+                              buffer, nread, &nwritten, NULL))
+                {
+                  log_debug ("feeder(%d): WriteFile error: rc=%d\n",
+                             parm->fd, (int)GetLastError ());
+                  goto leave;
+                }
+              nread -= nwritten;
+            }
+          while (nread);
+        }
+      if (nread)
+        log_debug ("feeder(%d): es_read error: %s\n",
+                   parm->fd, strerror (errno));
+    }
+  else
+    {
+      DWORD nread;
+      size_t nwritten;
+
+      while (ReadFile (fd_to_handle (parm->fd),
+                       buffer, sizeof buffer, &nread, NULL) && nread)
+        {
+          do 
+            {
+              if (es_write (parm->stream, buffer, nread, &nwritten))
+                {
+                  log_debug ("feeder(%d): es_write error: %s\n",
+                             parm->fd, strerror (errno));
+                  goto leave;
+                }
+              nread -= nwritten;
+            }
+          while (nread);
+        }
+      if (nread)
+        log_debug ("feeder(%d): ReadFile error: rc=%d\n",
+                   parm->fd, (int)GetLastError ());
+      else
+        log_debug ("feeder(%d): eof\n", parm->fd);
+    }
+
+leave:
+  CloseHandle (fd_to_handle (parm->fd));
+  xfree (parm);
+  return NULL;
+}
+#endif /*USE_GNU_PTH*/
+
+/* Fire up a thread to copy data between STREAM and a pipe's
+   descriptor FD.  With DIRECTION set to true the copy takes place
+   from the stream to the pipe, otherwise from the pipe to the
+   stream.  */
+static gpg_error_t
+start_feeder (estream_t stream, int fd, int direction)
+{
+#ifdef USE_GNU_PTH      
+  gpg_error_t err;
+  struct feeder_thread_parms *parm;
+  pth_attr_t tattr;
+  
+  parm = xtrymalloc (sizeof *parm);
+  if (!parm)
+    return gpg_error_from_syserror ();
+  parm->stream = stream;
+  parm->fd = fd;
+  parm->direction = direction;
+  
+  tattr = pth_attr_new ();
+  pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0);
+  pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 64*1024);
+  pth_attr_set (tattr, PTH_ATTR_NAME, "exec-feeder");
+  
+  log_error ("spawning new feeder(%p, %d, %d)\n", stream, fd, direction);
+  if(!pth_spawn (tattr, feeder_thread, parm))
+    {
+      err = gpg_error_from_syserror ();
+      log_error ("error spawning feeder: %s\n", gpg_strerror (err));
+      xfree (parm);
+    }
+  else
+    err = 0;
+  pth_attr_destroy (tattr);
+
+  return err;
+#else
+  (void)stream;
+  (void)fd;
+  (void)direction;
+  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);  /* No Pth.  */
+#endif
+}
+
+
+
 /* Return the maximum number of currently allowed open file
    descriptors.  Only useful on POSIX systems but returns a value on
    other systems too.  */
@@ -182,20 +304,18 @@
 }
 
 
-/* Helper function to build_w32_commandline. */
+
 static char *
-build_w32_commandline_copy (char *buffer, const char *string)
+copy_quoted (char *p, const char *string)
 {
-  char *p = buffer;
   const char *s;
 
   if (!*string) /* Empty string. */
     p = stpcpy (p, "\"\"");
-  else if (strpbrk (string, " \t\n\v\f\""))
+  else if (strpbrk (string, " \t\n\v\f\"")) /* Need quotes.  */
     {
-      /* Need to do some kind of quoting.  */
       p = stpcpy (p, "\"");
-      for (s=string; *s; s++)
+      for (s = string; *s; s++)
         {
           *p++ = *s;
           if (*s == '\"')
@@ -204,32 +324,52 @@
       *p++ = '\"';
       *p = 0;
     }
-  else
+  else /* Copy verbatim.  */
     p = stpcpy (p, string);
 
   return p;
 }
 
+
 /* Build a command line for use with W32's CreateProcess.  On success
    CMDLINE gets the address of a newly allocated string.  */
-static gpg_error_t
-build_w32_commandline (const char *pgmname, const char * const *argv, 
+static int
+build_w32_commandline (const char *pgmname, const char * const *argv,
+		       int fd0, int fd1, int fd2, int fd2_isnull,
                        char **cmdline)
 {
   int i, n;
   const char *s;
   char *buf, *p;
+  char fdbuf[3*30];
 
+  p = fdbuf;
+  *p = 0;
+  if (fd0)
+    {
+      snprintf (p, 25, "-&S0=%d ", fd0);
+      p += strlen (p);
+    }
+  if (fd1)
+    {
+      snprintf (p, 25, "-&S1=%d ", fd1);
+      p += strlen (p);
+    }
+  if (fd2)
+    {
+      if (fd2_isnull)
+        strcpy (p, "-&S2=null ");
+      else
+        snprintf (p, 25, "-&S2=%d ", fd2);
+      p += strlen (p);
+    }
+  
   *cmdline = NULL;
-  n = 0;
-  s = pgmname;
-  n += strlen (s) + 1 + 2;  /* (1 space, 2 quoting */
-  for (; *s; s++)
-    if (*s == '\"')
-      n++;  /* Need to double inner quotes.  */
-  for (i=0; (s=argv[i]); i++)
+  n = strlen (fdbuf);
+  n += strlen (pgmname) + 1 + 2; /* (1 space, 2 quoting) */
+  for (i=0; (s = argv[i]); i++)
     {
-      n += strlen (s) + 1 + 2;  /* (1 space, 2 quoting */
+      n += strlen (s) + 1 + 2;  /* (1 space, 2 quoting) */
       for (; *s; s++)
         if (*s == '\"')
           n++;  /* Need to double inner quotes.  */
@@ -237,229 +377,203 @@
   n++;
 
   buf = p = xtrymalloc (n);
-  if (!buf)
-    return gpg_error_from_syserror ();
+  if (! buf)
+    return -1;
 
-  p = build_w32_commandline_copy (p, pgmname);
-  for (i=0; argv[i]; i++) 
+  p = stpcpy (p, fdbuf);
+  p = copy_quoted (p, pgmname);
+  for (i = 0; argv[i]; i++) 
     {
       *p++ = ' ';
-      p = build_w32_commandline_copy (p, argv[i]);
+      p = copy_quoted (p, argv[i]);
     }
 
-  *cmdline= buf;
+  *cmdline = buf;
   return 0;
 }
 
 
 /* Create pipe where one end is inheritable: With an INHERIT_IDX of 0
-   the read end is inheritable, with 1 the write end is inheritable.  */
-static int
+   the read end is inheritable, with 1 the write end is inheritable.
+   Note that the inheritable ends are rendezvous ids and no file
+   descriptors or handles. */
+static gpg_error_t
 create_inheritable_pipe (int filedes[2], int inherit_idx)
 {
-  HANDLE r, w, h;
+  HANDLE hd;
+  int rvid;
 
-  if (!CreatePipe (&r, &w, NULL, 0))
-    return -1;
-
-  if (!DuplicateHandle (GetCurrentProcess(), inherit_idx? w : r,
-                        GetCurrentProcess(), &h, 0,
-                        TRUE, DUPLICATE_SAME_ACCESS ))
+  filedes[0] = filedes[1] = -1;
+  hd = _assuan_w32ce_prepare_pipe (&rvid, !inherit_idx);
+  if (hd == INVALID_HANDLE_VALUE)
     {
-      log_error ("DuplicateHandle failed: %s\n", w32_strerror (-1));
-      CloseHandle (r);
-      CloseHandle (w);
-      return -1;
+      log_error ("_assuan_w32ce_prepare_pipe failed: %s\n", w32_strerror (-1));
+      gpg_err_set_errno (EIO);
+      return gpg_error_from_syserror ();
     }
 
   if (inherit_idx)
     {
-      CloseHandle (w);
-      w = h;
+      filedes[0] = handle_to_fd (hd);
+      filedes[1] = rvid;
     }
   else
     {
-      CloseHandle (r);
-      r = h;
+      filedes[0] = rvid;
+      filedes[1] = handle_to_fd (hd);
     }
-
-  filedes[0] = handle_to_fd (r);
-  filedes[1] = handle_to_fd (w);
   return 0;
 }
 
 
-static gpg_error_t
-do_create_pipe (int filedes[2], int inherit_idx)
-{
-  gpg_error_t err = 0;
-  int fds[2];
-
-  filedes[0] = filedes[1] = -1;
-  err = gpg_error (GPG_ERR_GENERAL);
-  if (!create_inheritable_pipe (fds, inherit_idx))
-    {
-      filedes[0] = _open_osfhandle (fds[0], 0);
-      if (filedes[0] == -1)
-        {
-          log_error ("failed to translate osfhandle %p\n", (void*)fds[0]);
-          CloseHandle (fd_to_handle (fds[1]));
-        }
-      else 
-        {
-          filedes[1] = _open_osfhandle (fds[1], 1);
-          if (filedes[1] == -1)
-            {
-              log_error ("failed to translate osfhandle %p\n", (void*)fds[1]);
-              close (filedes[0]);
-              filedes[0] = -1;
-              CloseHandle (fd_to_handle (fds[1]));
-            }
-          else
-            err = 0;
-        }
-    }
-  return err;
-}
-
 /* Portable function to create a pipe.  Under Windows the write end is
-   inheritable.  */
+   inheritable (i.e. an rendezvous id).  */
 gpg_error_t
 gnupg_create_inbound_pipe (int filedes[2])
 {
-  return do_create_pipe (filedes, 1);
+  return create_inheritable_pipe (filedes, 1);
 }
 
 
 /* Portable function to create a pipe.  Under Windows the read end is
-   inheritable.  */
+   inheritable (i.e. an rendezvous id).  */
 gpg_error_t
 gnupg_create_outbound_pipe (int filedes[2])
 {
-  return do_create_pipe (filedes, 0);
+  return create_inheritable_pipe (filedes, 0);
 }
 
 
-/* Fork and exec the PGMNAME, connect the file descriptor of INFILE to
-   stdin, write the output to OUTFILE, return a new stream in
-   STATUSFILE for stderr and the pid of the process in PID. The
-   arguments for the process are expected in the NULL terminated array
-   ARGV.  The program name itself should not be included there.  If
-   PREEXEC is not NULL, that function will be called right before the
-   exec.  Calling gnupg_wait_process is required.
+static int
+create_process (const char *pgmname, const char *cmdline,
+                PROCESS_INFORMATION *pi)
+{
+  int res;
+  wchar_t *wpgmname, *wcmdline;
 
-   FLAGS is a bit vector with just one bit defined for now:
+  wpgmname = utf8_to_wchar (pgmname);
+  if (!wpgmname)
+    return 0;
+  wcmdline = utf8_to_wchar (cmdline);
+  if (!wcmdline)
+    {
+      xfree (wpgmname);
+      return 0;
+    }
+  res = CreateProcess (wpgmname,      /* Program to start.  */
+                       wcmdline,      /* Command line arguments.  */
+                       NULL,          /* Process security attributes.  */
+                       NULL,          /* Thread security attributes.  */
+                       FALSE,          /* Inherit handles.  */
+                       CREATE_SUSPENDED, /* Creation flags.  */
+                       NULL,          /* Environment.  */
+                       NULL,          /* Use current drive/directory.  */
+                       NULL,          /* Startup information. */
+                       pi);           /* Returns process information.  */
+  xfree (wcmdline);
+  xfree (wpgmname);
+  return res;
+}
 
-   Bit 7: If set the process will be started as a background process.
-          This flag is only useful under W32 systems, so that no new
-          console is created and pops up a console window when
-          starting the server.  Does not work on W32CE.
- 
-   Bit 6: On W32 run AllowSetForegroundWindow for the child.  Due to
-          error problems this actually allows SetForegroundWindow for
-          childs of this process.
 
-   Returns 0 on success or an error code. */
+/* Fork and exec the PGMNAME, see exechelp.h for details.  */
 gpg_error_t
 gnupg_spawn_process (const char *pgmname, const char *argv[],
-                     FILE *infile, estream_t outfile,
+                     estream_t infile, estream_t outfile,
                      void (*preexec)(void), unsigned int flags,
-                     FILE **statusfile, pid_t *pid)
+                     estream_t *statusfile, pid_t *pid)
 {
   gpg_error_t err;
-  PROCESS_INFORMATION pi = 
-    {
-      NULL,      /* Returns process handle.  */
-      0,         /* Returns primary thread handle.  */
-      0,         /* Returns pid.  */
-      0          /* Returns tid.  */
-    };
-  STARTUPINFO si;
+  PROCESS_INFORMATION pi = {NULL };
   char *cmdline;
-  int fd, fdout, rp[2];
+  int inpipe[2], outpipe[2], errpipe[2];
 
   (void)preexec;
-
+  (void)flags;
+  
   /* Setup return values.  */
   *statusfile = NULL;
   *pid = (pid_t)(-1);
-  fflush (infile);
-  rewind (infile);
-  fd = _get_osfhandle (fileno (infile));
-  fdout = _get_osfhandle (es_fileno (outfile));
-  if (fd == -1 || fdout == -1)
-    log_fatal ("no file descriptor for file passed to gnupg_spawn_process\n");
 
-  /* Build the command line.  */
-  err = build_w32_commandline (pgmname, argv, &cmdline);
+  es_fflush (infile);
+  es_rewind (infile);
+
+  /* Create a pipe to copy our infile to the stdin of the child
+     process.  On success inpipe[1] is owned by the feeder.  */
+  err = create_inheritable_pipe (inpipe, 0);
   if (err)
-    return err; 
+    {
+      log_error (_("error creating a pipe: %s\n"), gpg_strerror (err));
+      return err;
+    }
+  err = start_feeder (infile, inpipe[1], 1);
+  if (err)
+    {
+      log_error (_("error spawning feeder: %s\n"), gpg_strerror (err));
+      CloseHandle (fd_to_handle (inpipe[1]));
+      return err;
+    }
 
-  /* Create a pipe.  */
-  if (create_inheritable_pipe (rp, 1))
+  /* Create a pipe to copy stdout of the child process to our
+     outfile. On success outpipe[0] is owned by the feeded.  */
+  err = create_inheritable_pipe (outpipe, 1);
+  if (err)
     {
-      err = gpg_error (GPG_ERR_GENERAL);
       log_error (_("error creating a pipe: %s\n"), gpg_strerror (err));
-      xfree (cmdline);
       return err;
     }
-  
-  /* Start the process.  Note that we can't run the PREEXEC function
-     because this would change our own environment. */
-  /* si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; */
-  /* si.hStdInput  = fd_to_handle (fd); */
-  /* si.hStdOutput = fd_to_handle (fdout); */
-  /* si.hStdError  = fd_to_handle (rp[1]); */
+  err = start_feeder (outfile, outpipe[0], 0);
+  if (err)
+    {
+      log_error (_("error spawning feeder: %s\n"), gpg_strerror (err));
+      CloseHandle (fd_to_handle (outpipe[0]));
+      return err;
+    }
 
-/*   log_debug ("CreateProcess, path=`%s' cmdline=`%s'\n", pgmname, cmdline); */
-  if (!CreateProcess (pgmname,       /* Program to start.  */
-                      cmdline,       /* Command line arguments.  */
-                      NULL,          /* Process security attributes.  */
-                      NULL,          /* Thread security attributes.  */
-                      FALSE,          /* Inherit handles.  */
-                      CREATE_SUSPENDED, /* Creation flags.  */
-                      NULL,          /* Environment.  */
-                      NULL,          /* Use current drive/directory.  */
-                      NULL,           /* Startup information. */
-                      &pi            /* Returns process information.  */
-                      ))
+
+  /* Create a pipe for use with stderr of the child process.  */
+  err = create_inheritable_pipe (errpipe, 1);
+  if (err)
     {
+      log_error (_("error creating a pipe: %s\n"), gpg_strerror (err));
+      return err;
+    }
+
+  /* Build the command line.  */
+  err = build_w32_commandline (pgmname, argv, inpipe[0], outpipe[1], errpipe[1],
+                               0, &cmdline);
+  if (err)
+    {
+      CloseHandle (fd_to_handle (errpipe[0]));
+      return err; 
+    }
+
+  
+  log_debug ("CreateProcess, path=`%s' cmdline=`%s'\n", pgmname, cmdline);
+  if (!create_process (pgmname, cmdline, &pi))
+    {
       log_error ("CreateProcess failed: %s\n", w32_strerror (-1));
       xfree (cmdline);
-      CloseHandle (fd_to_handle (rp[0]));
-      CloseHandle (fd_to_handle (rp[1]));
+      CloseHandle (fd_to_handle (errpipe[0]));
       return gpg_error (GPG_ERR_GENERAL);
     }
   xfree (cmdline);
   cmdline = NULL;
 
-  /* Close the other end of the pipe.  */
-  CloseHandle (fd_to_handle (rp[1]));
+  /* Note: The other end of the pipe is a rendezvous id and thus there
+     is no need to close.  */
+
+  log_debug ("CreateProcess ready: hProcess=%p hThread=%p"
+             " dwProcessID=%d dwThreadId=%d\n",
+             pi.hProcess, pi.hThread,
+             (int) pi.dwProcessId, (int) pi.dwThreadId);
   
-/*   log_debug ("CreateProcess ready: hProcess=%p hThread=%p" */
-/*              " dwProcessID=%d dwThreadId=%d\n", */
-/*              pi.hProcess, pi.hThread, */
-/*              (int) pi.dwProcessId, (int) pi.dwThreadId); */
-  
-  /* Fixme: For unknown reasons AllowSetForegroundWindow returns an
-     invalid argument error if we pass the correct processID to
-     it.  As a workaround we use -1 (ASFW_ANY).  */
-  if ( (flags & 64) )
-    gnupg_allow_set_foregound_window ((pid_t)(-1)/*pi.dwProcessId*/);
 
   /* Process has been created suspended; resume it now. */
   ResumeThread (pi.hThread);
   CloseHandle (pi.hThread); 
 
-  {
-    int x;
-
-    x = _open_osfhandle (rp[0], 0);
-    if (x == -1)
-      log_error ("failed to translate osfhandle %p\n", (void*)rp[0] );
-    else 
-      *statusfile = fdopen (x, "r");
-  }
+  *statusfile = es_fdopen (handle_to_fd (errpipe[0]), "r");
   if (!*statusfile)
     {
       err = gpg_error_from_syserror ();
@@ -487,6 +601,8 @@
 gnupg_spawn_process_fd (const char *pgmname, const char *argv[],
                         int infd, int outfd, int errfd, pid_t *pid)
 {
+  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+#if 0
   gpg_error_t err;
   PROCESS_INFORMATION pi = { NULL, 0, 0, 0 };
   STARTUPINFO si;
@@ -546,10 +662,9 @@
 
   *pid = handle_to_pid (pi.hProcess);
   return 0;
-
+#endif
 }
 
-
 /* Wait for the process identified by PID to terminate. PGMNAME should
    be the same as supplied to the spawn function and is only used for
    diagnostics. Returns 0 if the process succeeded, GPG_ERR_GENERAL
@@ -628,6 +743,8 @@
 gnupg_spawn_process_detached (const char *pgmname, const char *argv[],
                               const char *envp[] )
 {
+  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+#if 0
   gpg_error_t err;
   PROCESS_INFORMATION pi = 
     {
@@ -678,9 +795,9 @@
   CloseHandle (pi.hThread); 
 
   return 0;
+#endif
 }
 
-
 /* Kill a process; that is send an appropriate signal to the process.
    gnupg_wait_process must be called to actually remove the process
    from the system.  An invalid PID is ignored.  */

Modified: trunk/common/exechelp.h
===================================================================
--- trunk/common/exechelp.h	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/exechelp.h	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,5 +1,5 @@
 /* exechelp.h - Definitions for the fork and exec helpers
- *	Copyright (C) 2004, 2009 Free Software Foundation, Inc.
+ * Copyright (C) 2004, 2009, 2010 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -58,13 +58,25 @@
    arguments for the process are expected in the NULL terminated array
    ARGV.  The program name itself should not be included there.  If
    PREEXEC is not NULL, that function will be called right before the
-   exec.  FLAGS is currently only useful for W32, see the source for
-   details.  Calling gnupg_wait_process is required.  Returns 0 on
-   success or an error code. */
+   exec.  Calling gnupg_wait_process is required.  Returns 0 on
+   success or an error code.
+
+   FLAGS is a bit vector:
+
+   Bit 7: If set the process will be started as a background process.
+          This flag is only useful under W32 (but not W32CE) systems,
+          so that no new console is created and pops up a console
+          window when starting the server.  Does not work on W32CE.
+ 
+   Bit 6: On W32 (but not on W32CE) run AllowSetForegroundWindow for
+          the child.  Note that due to unknown problems this actually
+          allows SetForegroundWindow for all childs of this process.
+
+ */
 gpg_error_t gnupg_spawn_process (const char *pgmname, const char *argv[],
-                                 FILE *infile, estream_t outfile,
+                                 estream_t infile, estream_t outfile,
                                  void (*preexec)(void), unsigned int flags,
-                                 FILE **statusfile, pid_t *pid);
+                                 estream_t *statusfile, pid_t *pid);
 
 
 /* Simplified version of gnupg_spawn_process.  This function forks and

Modified: trunk/common/init.c
===================================================================
--- trunk/common/init.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/init.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -101,7 +101,7 @@
    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.

Modified: trunk/common/iobuf.c
===================================================================
--- trunk/common/iobuf.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/iobuf.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -52,8 +52,13 @@
 
 
 #ifdef HAVE_W32_SYSTEM
-# define FD_FOR_STDIN  (GetStdHandle (STD_INPUT_HANDLE))
-# define FD_FOR_STDOUT (GetStdHandle (STD_OUTPUT_HANDLE))
+# ifdef HAVE_W32CE_SYSTEM
+#  define FD_FOR_STDIN  (es_fileno (es_stdin))
+#  define FD_FOR_STDOUT (es_fileno (es_stdout))
+# else
+#  define FD_FOR_STDIN  (GetStdHandle (STD_INPUT_HANDLE))
+#  define FD_FOR_STDOUT (GetStdHandle (STD_OUTPUT_HANDLE))
+# endif
 #else /*!HAVE_W32_SYSTEM*/
 # define FD_FOR_STDIN  (0)
 # define FD_FOR_STDOUT (1)
@@ -2361,7 +2366,7 @@
 static int
 translate_file_handle (int fd, int for_write)
 {
-#ifdef HAVE_W32_SYSTEM
+#if defined(HAVE_W32_SYSTEM) && !defined (HAVE_W32CE_SYSTEM)
   {
     int x;
     

Modified: trunk/common/session-env.c
===================================================================
--- trunk/common/session-env.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/session-env.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,4 +1,4 @@
-/* se4ssiobn-env.c - session environment helper functions.
+/* session-env.c - Session environment helper functions.
  * Copyright (C) 2009 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
@@ -300,7 +300,7 @@
 /* Return the value of the environment variable NAME from the SE
    object.  The returned value is valid as long as SE is valid and as
    long it has not been removed or updated by a call to
-   session_env_putenv.  If the variable does not exist, the fucntion
+   session_env_putenv.  If the variable does not exist, the function
    tries to return the value trough a call to getenv; if that returns
    a value, this value is recorded and and used.  If no value could be
    found, returns NULL.  The caller must not change the returned
@@ -325,7 +325,7 @@
         return se->array[idx]->value;
       }
   
-  /* Get the default value with and additional fallback for GPG_TTY.  */
+  /* Get the default value with an additional fallback for GPG_TTY.  */
   defvalue = getenv (name);
   if ((!defvalue || !*defvalue) && !strcmp (name, "GPG_TTY") && ttyname (0))
     defvalue = ttyname (0);

Modified: trunk/common/stringhelp.c
===================================================================
--- trunk/common/stringhelp.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/stringhelp.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -1,6 +1,6 @@
 /* stringhelp.c -  standard string helper functions
- * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005,
- *               2006, 2007, 2008, 2009  Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007,
+ *               2008, 2009, 2010  Free Software Foundation, Inc.
  *
  * This file is part of JNLIB.
  *
@@ -48,7 +48,7 @@
 static inline char *
 change_slashes (char *name)
 {
-#ifdef HAVE_DRIVE_LETTERS
+#ifdef HAVE_DOSISH_SYSTEM
   char *p;
 
   if (strchr (name, '\\'))
@@ -57,7 +57,7 @@
         if (*p == '/')
           *p = '\\';
     }
-#endif /*HAVE_DRIVE_LETTERS*/
+#endif /*HAVE_DOSISH_SYSTEM*/
   return name;
 }
 
@@ -273,8 +273,10 @@
     (void)inputpath; /* Only required for riscos.  */
 
     if ( !(p=strrchr(filepath, '/')) )
+#ifdef HAVE_DOSISH_SYSTEM
+	if ( !(p=strrchr(filepath, '\\')) )
+#endif
 #ifdef HAVE_DRIVE_LETTERS
-	if ( !(p=strrchr(filepath, '\\')) )
 	    if ( !(p=strrchr(filepath, ':')) )
 #endif
 	      {
@@ -300,8 +302,10 @@
     char *p;
 
     if ( !(p=strrchr(filepath, '/')) )
+#ifdef HAVE_DOSISH_SYSTEM
+	if ( !(p=strrchr(filepath, '\\')) )
+#endif
 #ifdef HAVE_DRIVE_LETTERS
-	if ( !(p=strrchr(filepath, '\\')) )
 	    if ( !(p=strrchr(filepath, ':')) )
 #endif
 	      {
@@ -479,12 +483,12 @@
 /* Compare whether the filenames are identical.  This is a
    special version of strcmp() taking the semantics of filenames in
    account.  Note that this function works only on the supplied names
-   without considereing any context like the current directory.  See
+   without considering any context like the current directory.  See
    also same_file_p(). */
 int
 compare_filenames (const char *a, const char *b)
 {
-#ifdef HAVE_DRIVE_LETTERS
+#ifdef HAVE_DOSISH_SYSTEM
   for ( ; *a && *b; a++, b++ ) 
     {
       if (*a != *b 

Modified: trunk/common/sysutils.c
===================================================================
--- trunk/common/sysutils.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/sysutils.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -505,8 +505,32 @@
 #endif
 }
 
+int
+gnupg_remove (const char *fname)
+{
+#ifdef HAVE_W32CE_SYSTEM
+  int rc;
+  wchar_t *wfname;
 
+  wfname = utf8_to_wchar (fname);
+  if (!wfname)
+    rc = 0;
+  else
+    {
+      rc = DeleteFile (wfname);
+      xfree (wfname);
+    }
+  if (!rc)
+    gpg_err_set_errno (EIO);
+  return !rc;
+#else
+  return remove;
+#endif
+}
 
+
+
+
 #ifdef HAVE_W32CE_SYSTEM
 /* Replacement for getenv which takes care of the our use of getenv.
    The code is not thread safe but we expect it to work in all cases

Modified: trunk/common/sysutils.h
===================================================================
--- trunk/common/sysutils.h	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/sysutils.h	2010-03-24 12:15:30 UTC (rev 5299)
@@ -48,8 +48,8 @@
 FILE *gnupg_tmpfile (void);
 void gnupg_reopen_std (const char *pgmname);
 void gnupg_allow_set_foregound_window (pid_t pid);
+int  gnupg_remove (const char *fname);
 
-
 #ifdef HAVE_W32_SYSTEM
 
 #include "../common/w32help.h"

Modified: trunk/common/ttyio.c
===================================================================
--- trunk/common/ttyio.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/common/ttyio.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -24,6 +24,11 @@
 #include <string.h>
 #include <stdarg.h>
 #include <unistd.h>
+
+#if defined(HAVE_W32_SYSTEM) && !defined(HAVE_W32CE_SYSTEM)
+# define USE_W32_CONSOLE 1
+#endif
+
 #ifdef HAVE_TCGETATTR
 #include <termios.h>
 #else
@@ -37,12 +42,12 @@
 #define HAVE_TCGETATTR
 #endif
 #endif
-#ifdef _WIN32 /* use the odd Win32 functions */
-#include <windows.h>
-#ifdef HAVE_TCGETATTR
-#error mingw32 and termios
+#ifdef USE_W32_CONSOLE
+# include <windows.h>
+# ifdef HAVE_TCGETATTR
+#  error mingw32 and termios
+# endif
 #endif
-#endif
 #include <errno.h>
 #include <ctype.h>
 
@@ -52,7 +57,8 @@
 
 #define CONTROL_D ('D' - 'A' + 1)
 
-#ifdef _WIN32 /* use the odd Win32 functions */
+
+#ifdef USE_W32_CONSOLE
 static struct {
     HANDLE in, out;
 } con;
@@ -116,7 +122,7 @@
     }
 #endif /*HAVE_CTERMID*/
   /* Assume the standard tty on memory error or when tehre is no
-     certmid. */
+     ctermid. */
   return name? name : "/dev/tty";
 }
 
@@ -140,7 +146,7 @@
     if( initialized )
 	return;
 
-#if defined(_WIN32)
+#if defined(USE_W32_CONSOLE)
     {
 	SECURITY_ATTRIBUTES sa;
 
@@ -168,6 +174,8 @@
     ttyfp = stdout; /* Fixme: replace by the real functions: see wklib */
     if (my_rl_init_stream)
       my_rl_init_stream (ttyfp);
+#elif defined (HAVE_W32CE_SYSTEM)
+    ttyfp = stderr;
 #else
     ttyfp = batchmode? stderr : fopen (tty_get_ttyname (), "r+");
     if( !ttyfp ) {
@@ -216,7 +224,7 @@
 	init_ttyfp();
 
     va_start( arg_ptr, fmt ) ;
-#ifdef _WIN32
+#ifdef USE_W32_CONSOLE
     {   
         char *buf = NULL;
         int n;
@@ -263,7 +271,7 @@
     init_ttyfp ();
 
   va_start (arg_ptr, fmt);
-#ifdef _WIN32
+#ifdef USE_W32_CONSOLE
   {   
     char *buf = NULL;
     int n;
@@ -300,7 +308,7 @@
     if( !initialized )
 	init_ttyfp();
 
-#ifdef _WIN32
+#ifdef USE_W32_CONSOLE
     /* not so effective, change it if you want */
     for( ; n; n--, p++ )
 	if( iscntrl( *p ) ) {
@@ -394,7 +402,7 @@
     buf = xmalloc((n=50));
     i = 0;
 
-#ifdef _WIN32 /* windoze version */
+#ifdef USE_W32_CONSOLE
     if( hidden )
 	SetConsoleMode(con.in, HID_INPMODE );
 
@@ -428,9 +436,17 @@
     if( hidden )
 	SetConsoleMode(con.in, DEF_INPMODE );
 
-#elif defined(__riscos__)
+#elif defined(__riscos__) || defined(HAVE_W32CE_SYSTEM)
     do {
+#ifdef HAVE_W32CE_SYSTEM
+      /* Using getchar is not a correct solution but for now it
+         doesn't matter becuase we have no real console at all.  We
+         should rework this as soon as we have switched this entire
+         module to estream.  */
+        c = getchar();
+#else
         c = riscos_getchar();
+#endif
         if (c == 0xa || c == 0xd) { /* Return || Enter */
             c = (int) '\n';
         } else if (c == 0x8 || c == 0x7f) { /* Backspace || Delete */
@@ -468,7 +484,7 @@
         }
     } while (c != '\n');
     i = (i>0) ? i-1 : 0;
-#else /* unix version */
+#else /* Other systems. */
     if( hidden ) {
 #ifdef HAVE_TCGETATTR
 	struct termios term;
@@ -509,7 +525,6 @@
 	i = 1;
     }
 
-
     if( hidden ) {
 #ifdef HAVE_TCGETATTR
 	if( tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave) )
@@ -601,7 +616,7 @@
 	last_prompt_len = 0;
     if( !last_prompt_len )
 	return;
-#ifdef _WIN32
+#ifdef USE_W32_CONSOLE
     tty_printf("\r%*s\r", last_prompt_len, "");
 #else
     {

Modified: trunk/configure.ac
===================================================================
--- trunk/configure.ac	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/configure.ac	2010-03-24 12:15:30 UTC (rev 5299)
@@ -364,8 +364,12 @@
 #define SAFE_VERSION_DASH '-'
 
 /* Some global constants. */
-#ifdef HAVE_DRIVE_LETTERS
-#define GNUPG_DEFAULT_HOMEDIR "c:/gnupg"
+#ifdef HAVE_DOSISH_SYSTEM
+# ifdef HAVE_DRIVE_LETTERS
+#  define GNUPG_DEFAULT_HOMEDIR "c:/gnupg"
+# else
+#  define GNUPG_DEFAULT_HOMEDIR "/gnupg"
+# endif
 #elif defined(__VMS)
 #define GNUPG_DEFAULT_HOMEDIR "/SYS\$LOGIN/gnupg" 
 #else
@@ -376,15 +380,22 @@
 /* For some systems (DOS currently), we hardcode the path here.  For
    POSIX systems the values are constructed by the Makefiles, so that
    the values may be overridden by the make invocations; this is to
-   comply with the GNU coding standards. */
-#ifdef HAVE_DRIVE_LETTERS
- /* FIXME: We need to use a function to determine these values depending 
-    on the actual installation directory. */
-#define GNUPG_BINDIR      "c:\\gnupg"
-#define GNUPG_LIBEXECDIR  "c:\\gnupg"
-#define GNUPG_LIBDIR      "c:\\gnupg"
-#define GNUPG_DATADIR     "c:\\gnupg"
-#define GNUPG_SYSCONFDIR  "c:\\gnupg"
+   comply with the GNU coding standards.  Note that these values are
+   only defaults.  */
+#ifdef HAVE_DOSISH_SYSTEM
+# ifdef HAVE_DRIVE_LETTERS
+#  define GNUPG_BINDIR      "c:\\gnupg"
+#  define GNUPG_LIBEXECDIR  "c:\\gnupg"
+#  define GNUPG_LIBDIR      "c:\\gnupg"
+#  define GNUPG_DATADIR     "c:\\gnupg"
+#  define GNUPG_SYSCONFDIR  "c:\\gnupg"
+# else
+#  define GNUPG_BINDIR      "\\gnupg"
+#  define GNUPG_LIBEXECDIR  "\\gnupg"
+#  define GNUPG_LIBDIR      "\\gnupg"
+#  define GNUPG_DATADIR     "\\gnupg"
+#  define GNUPG_SYSCONFDIR  "\\gnupg"
+# endif
 #endif
 
 /* Derive some other constants. */
@@ -509,17 +520,23 @@
         # special stuff for Windoze NT
         ac_cv_have_dev_random=no
         AC_DEFINE(USE_ONLY_8DOT3,1,
-                  [set this to limit filenames to the 8.3 format])
-        AC_DEFINE(HAVE_DRIVE_LETTERS,1,
-                  [defined if we must run on a stupid file system])
+                  [Set this to limit filenames to the 8.3 format])
         AC_DEFINE(USE_SIMPLE_GETTEXT,1,
-                  [because the Unix gettext has too much overhead on
+                  [Because the Unix gettext has too much overhead on
                    MingW32 systems and these systems lack Posix functions,
                    we use a simplified version of gettext])
         disable_keyserver_path=yes
         have_dosish_system=yes
         have_w32_system=yes
-        case "${host}" in *-mingw32ce*) have_w32ce_system=yes ;; esac
+        case "${host}" in 
+          *-mingw32ce*)
+            have_w32ce_system=yes
+            ;;
+          *)
+            AC_DEFINE(HAVE_DRIVE_LETTERS,1,
+                      [Defined if the OS supports drive letters.])
+            ;;
+        esac
         try_gettext="no"
 	use_simple_gettext=yes
         ;;
@@ -576,7 +593,8 @@
    AC_DEFINE(HAVE_DOSISH_SYSTEM,1,
              [Defined if we run on some of the PCDOS like systems 
               (DOS, Windoze. OS/2) with special properties like
-              no file modes])
+              no file modes, case insensitive file names and preferred
+              use of backslashes as directory name separators.])
 fi
 AM_CONDITIONAL(HAVE_DOSISH_SYSTEM, test "$have_dosish_system" = yes)
 
@@ -1272,9 +1290,13 @@
 # mysterious reasons - the final link step should bail out.
 # W32SOCKLIBS is also defined so that if can be used for tools not
 # requiring any network stuff but linking to code in libcommon which
-# tracks in winsock stuff (e.g. init_common_subsystems.
+# tracks in winsock stuff (e.g. init_common_subsystems).
 if test "$have_w32_system" = yes; then
-   W32SOCKLIBS="-lws2_32"
+   if test "$have_w32ce_system" = yes; then
+     W32SOCKLIBS="-lws2"
+   else
+     W32SOCKLIBS="-lws2_32"
+   fi
    NETLIBS="${NETLIBS} ${W32SOCKLIBS}"
 fi
 

Modified: trunk/kbx/Makefile.am
===================================================================
--- trunk/kbx/Makefile.am	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/kbx/Makefile.am	2010-03-24 12:15:30 UTC (rev 5299)
@@ -28,6 +28,12 @@
 noinst_LIBRARIES = libkeybox.a
 bin_PROGRAMS = kbxutil
 
+if HAVE_W32CE_SYSTEM
+extra_libs =  $(LIBASSUAN_LIBS)
+else
+extra_libs = 
+endif
+
 common_sources = \
 	keybox.h keybox-defs.h keybox-search-desc.h \
 	keybox-util.c \
@@ -47,7 +53,7 @@
 # to do it this way.
 kbxutil_SOURCES = kbxutil.c $(common_sources)
 kbxutil_LDADD   = ../common/libcommon.a ../gl/libgnu.a \
-                  $(KSBA_LIBS) $(LIBGCRYPT_LIBS) \
+                  $(KSBA_LIBS) $(LIBGCRYPT_LIBS) $(extra_libs) \
                   $(GPG_ERROR_LIBS) $(LIBINTL) $(LIBICONV) $(W32SOCKLIBS)
 
 $(PROGRAMS) : ../common/libcommon.a ../gl/libgnu.a 

Modified: trunk/kbx/keybox-update.c
===================================================================
--- trunk/kbx/keybox-update.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/kbx/keybox-update.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -26,6 +26,9 @@
 #include <unistd.h>
 
 #include "keybox-defs.h"
+#ifdef HAVE_DOSISH_SYSTEM
+#include "../common/sysutils.h"
+#endif
 
 #define EXTSEP_S "."
 
@@ -174,7 +177,7 @@
   if (!secret)
     { 
 #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
-      remove (bakfname);
+      gnupg_remove (bakfname);
 #endif
       if (rename (fname, bakfname) )
         {
@@ -184,7 +187,7 @@
   
   /* Then rename the file. */
 #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
-  remove (fname);
+  gnupg_remove (fname);
 #endif
   if (rename (tmpfname, fname) )
     {
@@ -607,7 +610,8 @@
             }
         }
       _keybox_release_blob (blob);
-      rewind (fp);
+      fseek (fp, 0, SEEK_SET);
+      clearerr (fp);
     }
 
   /* Create the new file. */
@@ -709,7 +713,7 @@
 
   /* Rename or remove the temporary file. */
   if (rc || !any_changes)
-    remove (tmpfname);
+    gnupg_remove (tmpfname);
   else
     rc = rename_tmp_file (bakfname, tmpfname, fname, hd->secret);
 

Modified: trunk/sm/Makefile.am
===================================================================
--- trunk/sm/Makefile.am	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/sm/Makefile.am	2010-03-24 12:15:30 UTC (rev 5299)
@@ -56,7 +56,8 @@
 
 gpgsm_LDADD = $(common_libs) ../common/libgpgrl.a \
               $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) \
-              $(GPG_ERROR_LIBS) $(LIBREADLINE) $(LIBINTL) $(ZLIBS) $(LIBICONV)
+              $(GPG_ERROR_LIBS) $(LIBREADLINE) $(LIBINTL) $(ZLIBS) \
+	      $(LIBICONV) $(extra_sys_libs)
 
 # Make sure that all libs are build before we use them.  This is
 # important for things like make -j2.

Modified: trunk/sm/certdump.c
===================================================================
--- trunk/sm/certdump.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/sm/certdump.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -786,7 +786,7 @@
   else if (c->len + size < c->len)
     {
       p = NULL;
-      errno = ENOMEM;
+      gpg_err_set_errno (ENOMEM);
     }
   else if (c->size < c->len + size)
     {
@@ -804,7 +804,7 @@
       c->error = errno;
       xfree (c->buffer);
       c->buffer = NULL;
-      errno = c->error;
+      gpg_err_set_errno (c->error);
       return -1;
     }
   memcpy (p + c->len, buffer, size);
@@ -834,8 +834,8 @@
   if (!fp)
     {
       int save_errno = errno;
-      log_error ("error creating memory stream: %s\n", strerror (errno));
-      errno = save_errno;
+      log_error ("error creating memory stream: %s\n", strerror (save_errno));
+      gpg_err_set_errno (save_errno);
       return NULL;
     }
   gpgsm_es_print_name2 (fp, name, translate);
@@ -843,7 +843,7 @@
   if (cookie.error || !cookie.buffer)
     {
       xfree (cookie.buffer);
-      errno = cookie.error;
+      gpg_err_set_errno (cookie.error);
       return NULL;
     }
   return cookie.buffer;

Modified: trunk/sm/export.c
===================================================================
--- trunk/sm/export.c	2010-03-22 15:00:54 UTC (rev 5298)
+++ trunk/sm/export.c	2010-03-24 12:15:30 UTC (rev 5299)
@@ -561,7 +561,8 @@
 
 static gpg_error_t
 popen_protect_tool (ctrl_t ctrl, const char *pgmname,
-                    FILE *infile, estream_t outfile, FILE **statusfile, 
+                    estream_t infile, estream_t outfile, 
+                    estream_t *statusfile, 
                     const char *prompt, const char *keygrip,
                     pid_t *pid)
 {
@@ -611,7 +612,8 @@
   gpg_error_t err = 0, child_err = 0;
   int c, cont_line;
   unsigned int pos;
-  FILE *infp = NULL, *fp = NULL;
+  estream_t infp = NULL;
+  estream_t fp = NULL;
   estream_t outfp = NULL;
   char buffer[1024];
   pid_t pid = -1;
@@ -622,7 +624,7 @@
   else
     pgmname = opt.protect_tool_program;
 
-  infp = gnupg_tmpfile ();
+  infp = es_tmpfile ();
   if (!infp)




More information about the Gnupg-commits mailing list