More W32 related changes
authorWerner Koch <wk@gnupg.org>
Tue, 26 Jun 2007 13:48:44 +0000 (13:48 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 26 Jun 2007 13:48:44 +0000 (13:48 +0000)
25 files changed:
ChangeLog
TODO
agent/ChangeLog
agent/gpg-agent.c
common/ChangeLog
common/Makefile.am
common/gpgrlhelp.c
common/homedir.c
common/init.h [new file with mode: 0644]
common/iobuf.c
common/sysutils.h
common/ttyio.c
common/util.h
g10/ChangeLog
g10/gpg.c
g10/gpgv.c
g10/openfile.c
gl/mkdtemp.c
kbx/ChangeLog
kbx/kbxutil.c
sm/ChangeLog
sm/Makefile.am
sm/gpgsm.c
tools/ChangeLog
tools/gpgconf-comp.c

index fa9811c..b375edf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-06-25  Werner Koch  <wk@g10code.com>
+
+       * gl/mkdtemp.c (gen_tempname) [MKDIR_TAKES_ONE_ARG]: Avoid
+       compiler warning by using the proper config macro.
+
 2007-06-15  Werner Koch  <wk@g10code.com>
 
        * configure.ac: Call AM_PO_SUBDIRS.
diff --git a/TODO b/TODO
index 649dbf2..1d34988 100644 (file)
--- a/TODO
+++ b/TODO
 ** GCRY_MD_USER
    Remove these definitions.
 ** MY_GCRY_PK_ECDSA
-   Removed this.
+   Remove this.
 
 * Extend selinux support to other modules
 
index 653bcd0..607a022 100644 (file)
@@ -1,3 +1,7 @@
+2007-06-26  Werner Koch  <wk@g10code.com>
+
+       * gpg-agent.c (create_directories) [W32]: Made it work.
+
 2007-06-21  Werner Koch  <wk@g10code.com>
 
        * agent.h (ctrl_t): Remove.  It is now declared in ../common/util.h. 
index 360870f..b691428 100644 (file)
@@ -1351,10 +1351,7 @@ static void
 create_directories (void)
 {
   struct stat statbuf;
-#ifdef HAVE_W32_SYSTEM
-#warning change it so that it works like in gpg.
-#endif
-  const char *defhome = GNUPG_DEFAULT_HOMEDIR;
+  const char *defhome = standard_homedir ();
   char *home;
 
   home = make_filename (opt.homedir, NULL);
@@ -1362,11 +1359,16 @@ create_directories (void)
     {
       if (errno == ENOENT)
         {
-          if ( (*defhome == '~'
+          if (
+#ifdef HAVE_W32_SYSTEM
+              ( !compare_filenames (home, defhome) )
+#else
+              (*defhome == '~'
                 && (strlen (home) >= strlen (defhome+1)
                     && !strcmp (home + strlen(home)
                                 - strlen (defhome+1), defhome+1)))
                || (*defhome != '~' && !strcmp (home, defhome) )
+#endif
                )
             {
 #ifdef HAVE_W32_SYSTEM
index c5fc79d..f6ef06e 100644 (file)
@@ -1,5 +1,22 @@
+2007-06-26  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am ($(PROGRAMS)): New.
+
+       * util.h (init_common_subsystems): Moved to ..
+       * init.h: .. New.
+       * util.h: Include init.h.
+
+       * homedir.c (standard_homedir): New.
+       (default_homedir) [W32]: Reimplemented in terms of
+       standard_homedir.  Fixed memory leak.
+
 2007-06-25  Werner Koch  <wk@g10code.com>
 
+       * iobuf.c: Add more documentation and slighly restructured macro
+       defintion for better readability.
+       (FILEP_OR_FD): Rename to fp_or_fd_t.
+       (CLOSE_CACHE): Rename to close_cache_t.
+
        * sysutils.c (translate_sys2libc_fd): New using the code from iobuf.c.
        * iobuf.c: Include sysutils.h.
        (iobuf_translate_file_handle): Remove.
index 5168230..73951c4 100644 (file)
@@ -37,7 +37,7 @@ common_sources = \
        openpgpdefs.h \
        keyserver.h \
        sexp-parse.h \
-       init.c \
+       init.c init.h \
        sexputil.c \
        sysutils.c sysutils.h \
        homedir.c \
@@ -91,3 +91,6 @@ t_common_ldadd = ../jnlib/libjnlib.a $(libcommon) ../gl/libgnu.a \
 t_convert_DEPENDENCIES = convert.c libcommon.a
 t_convert_LDADD = $(t_common_ldadd)
 
+
+$(PROGRAMS): ../jnlib/libjnlib.a $(libcommon) ../gl/libgnu.a
+
index ec72c98..4f8e652 100644 (file)
@@ -21,8 +21,8 @@
 
 /* This module may by used by applications to initializes readline
    support.  It is required so that we can have hooks in other parts
-   of libcommon without actually requing to link against
-   libreadline. It works along ttyio.c which a proper part of
+   of libcommon without actually requiring to link against
+   libreadline.  It works along with ttyio.c which is a proper part of
    libcommon. */
 
 #include <config.h>
index e0c511c..772bd30 100644 (file)
@@ -1,5 +1,5 @@
 /* homedir.c - Setup the home directory.
- *     Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+ *     Copyright (C) 2004, 2006, 2007 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -83,18 +83,17 @@ w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
 #endif /*HAVE_W32_SYSTEM*/
 
 
-/* Set up the default home directory.  The usual --homedir option
-   should be parsed later. */
+/* Get the standard home directory.  In general this function should
+   not be used as it does not consider a registry value (under W32) or
+   the GNUPGHOME encironment variable.  It is better to use
+   default_homedir(). */
 const char *
-default_homedir (void)
+standard_homedir (void)
 {
-  const char *dir;
-
-  dir = getenv("GNUPGHOME");
 #ifdef HAVE_W32_SYSTEM
-  if (!dir || !*dir)
-    dir = read_w32_registry_string (NULL, "Software\\GNU\\GnuPG", "HomeDir");
-  if (!dir || !*dir)
+  static const char *dir;
+
+  if (!dir)
     {
       char path[MAX_PATH];
       
@@ -112,11 +111,53 @@ default_homedir (void)
           strcpy (stpcpy (tmp, path), "\\gnupg");
           dir = tmp;
           
-          /* Try to create the directory if it does not yet
-             exists.  */
+          /* Try to create the directory if it does not yet exists.  */
           if (access (dir, F_OK))
             CreateDirectory (dir, NULL);
         }
+      else
+        dir = GNUPG_DEFAULT_HOMEDIR;
+    }
+  return dir;
+#else/*!HAVE_W32_SYSTEM*/
+  return GNUPG_DEFAULT_HOMEDIR;
+#endif /*!HAVE_W32_SYSTEM*/
+}
+
+/* Set up the default home directory.  The usual --homedir option
+   should be parsed later. */
+const char *
+default_homedir (void)
+{
+  const char *dir;
+
+  dir = getenv ("GNUPGHOME");
+#ifdef HAVE_W32_SYSTEM
+  if (!dir || !*dir)
+    {
+      static const char *saved_dir;
+      
+      if (!saved_dir)
+        {
+          if (!dir || !*dir)
+            {
+              char *tmp;
+
+              tmp = read_w32_registry_string (NULL, "Software\\GNU\\GnuPG",
+                                              "HomeDir");
+              if (tmp && *tmp)
+                {
+                  xfree (tmp);
+                  tmp = NULL;
+                }
+              if (tmp)
+                saved_dir = tmp;
+            }
+          
+          if (!saved_dir)
+            saved_dir = standard_homedir ();
+        }
+      dir = saved_dir;
     }
 #endif /*HAVE_W32_SYSTEM*/
   if (!dir || !*dir)
diff --git a/common/init.h b/common/init.h
new file mode 100644 (file)
index 0000000..83e6c6b
--- /dev/null
@@ -0,0 +1,28 @@
+/* init.h - Definitions for init fucntions.
+ *     Copyright (C) 2007 Free Software Foundation, Inc.
+ *
+ * This file is part of GnuPG.
+ *
+ * GnuPG is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuPG 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef GNUPG_COMMON_INIT_H
+#define GNUPG_COMMON_INIT_H
+
+void init_common_subsystems (void);
+
+
+#endif /*GNUPG_COMMON_INIT_H*/
index f395405..bf5bf8b 100644 (file)
@@ -1,6 +1,6 @@
-/* iobuf.c  -  file handling
- * Copyright (C) 1998, 1999, 2000, 2001, 2003,
- *               2004, 2006  Free Software Foundation, Inc.
+/* iobuf.c  -  File Handling for OpenPGP.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2006,
+ *               2007  Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
-#ifdef HAVE_DOSISH_SYSTEM
-#include <windows.h>
+#ifdef HAVE_W32_SYSTEM
+# include <windows.h>
 #endif
 #ifdef __riscos__
-#include <kernel.h>
-#include <swis.h>
+# include <kernel.h>
+# include <swis.h>
 #endif /* __riscos__ */
 
 #include "util.h"
 #include "sysutils.h"
 #include "iobuf.h"
 
+/*-- Begin configurable part.  --*/
+
 /* The size of the internal buffers. 
    NOTE: If you change this value you MUST also adjust the regression
    test "armored_key_8192" in armor.test! */
 #define IOBUF_BUFFER_SIZE  8192
 
+/* We don't want to use the STDIO based backend.  */
 #undef FILE_FILTER_USES_STDIO
 
-#ifdef HAVE_DOSISH_SYSTEM
-#define USE_SETMODE 1
-#endif
+/*-- End configurable part.  --*/
+
+
+/* Under W32 the default is to use the setmode call.  Define a macro
+   which allows us to enable this call.  */
+#ifdef HAVE_W32_SYSTEM
+# define USE_SETMODE 1
+#endif /*HAVE_W32_SYSTEM*/
+
+
+/* Definition of constants and macros used by our file filter
+   implementation.  What we define here are 3 macros to make the
+   appropriate calls:
+
+   my_fileno 
+     Is expanded to fileno(a) if using a stdion backend and to a if we
+     are using the low-level backend.
+
+   my_fopen 
+     Is defined to fopen for the stdio backend and to direct_open if
+     we are using the low-evel backend.
+
+   my_fopen_ro 
+     Is defined to fopen for the stdio backend and to fd_cache_open if
+     we are using the low-evel backend.
+
+   fp_or_fd_t
+     Is the type we use for the backend stream or fiel descriptor.
 
+   INVALID_FP, FILEP_OR_FD_FOR_STDIN, FILEP_OR_FD_FOR_STDOUT
+     Are macros defined depending on the used backend.
+
+*/
 #ifdef FILE_FILTER_USES_STDIO
-#define my_fileno(a)  fileno ((a))
-#define my_fopen_ro(a,b) fopen ((a),(b))
-#define my_fopen(a,b)    fopen ((a),(b))
-typedef FILE *FILEP_OR_FD;
-#define INVALID_FP    NULL
-#define FILEP_OR_FD_FOR_STDIN  (stdin)
-#define FILEP_OR_FD_FOR_STDOUT  (stdout)
+# define my_fileno(a)     fileno ((a))
+# define my_fopen_ro(a,b) fopen ((a),(b))
+# define my_fopen(a,b)    fopen ((a),(b))
+  typedef FILE *fp_or_fd_t;
+# define INVALID_FP              NULL
+# define FILEP_OR_FD_FOR_STDIN   (stdin)
+# define FILEP_OR_FD_FOR_STDOUT  (stdout)
+#else /*!FILE_FILTER_USES_STDIO*/
+# define my_fopen_ro(a,b) fd_cache_open ((a),(b))
+# define my_fopen(a,b)    direct_open ((a),(b))
+# ifdef HAVE_W32_SYSTEM
+   /* (We assume that a HANDLE first into an int.)  */
+#  define my_fileno(a)  ((int)(a))
+   typedef HANDLE fp_or_fd_t;
+#  define INVALID_FP             ((HANDLE)-1)
+#  define FILEP_OR_FD_FOR_STDIN  (GetStdHandle (STD_INPUT_HANDLE))
+#  define FILEP_OR_FD_FOR_STDOUT (GetStdHandle (STD_OUTPUT_HANDLE))
+#  undef USE_SETMODE
+# else /*!HAVE_W32_SYSTEM*/
+#  define my_fileno(a)  (a)
+   typedef int fp_or_fd_t;
+#  define INVALID_FP             (-1)
+#  define FILEP_OR_FD_FOR_STDIN  (0)
+#  define FILEP_OR_FD_FOR_STDOUT (1)
+# endif /*!HAVE_W32_SYSTEM*/
+#endif /*!FILE_FILTER_USES_STDIO*/
+
+/* The context used by the file filter.  */
 typedef struct
 {
-  FILE *fp;                    /* open file handle */
-  int keep_open;
-  int no_cache;
-  int print_only_name;         /* flags indicating that fname is not a real file */
-  char fname[1];               /* name of the file */
-}
-file_filter_ctx_t;
-#else
-#define my_fileno(a)  (a)
-#define my_fopen_ro(a,b) fd_cache_open ((a),(b))
-#define my_fopen(a,b) direct_open ((a),(b))
-#ifdef HAVE_DOSISH_SYSTEM
-typedef HANDLE FILEP_OR_FD;
-#define INVALID_FP  ((HANDLE)-1)
-#define FILEP_OR_FD_FOR_STDIN  (GetStdHandle (STD_INPUT_HANDLE))
-#define FILEP_OR_FD_FOR_STDOUT (GetStdHandle (STD_OUTPUT_HANDLE))
-#undef USE_SETMODE
-#else
-typedef int FILEP_OR_FD;
-#define INVALID_FP  (-1)
-#define FILEP_OR_FD_FOR_STDIN  (0)
-#define FILEP_OR_FD_FOR_STDOUT (1)
-#endif
-typedef struct
-{
-  FILEP_OR_FD fp;              /* open file handle */
-  int keep_open;
+  fp_or_fd_t fp;       /* Open file pointer or handle.  */
+  int keep_open; 
   int no_cache;
   int eof_seen;
-  int print_only_name;         /* flags indicating that fname is not a real file */
-  char fname[1];               /* name of the file */
+  int print_only_name; /* Flags indicating that fname is not a real file.  */
+  char fname[1];       /* Name of the file.  */
 }
 file_filter_ctx_t;
 
+
+/* If we are not using stdio as the backend we make use of a "close
+   cache".  */
+#ifndef FILE_FILTER_USES_STDIO
 struct close_cache_s
 {
   struct close_cache_s *next;
-  FILEP_OR_FD fp;
+  fp_or_fd_t fp;
   char fname[1];
 };
-typedef struct close_cache_s *CLOSE_CACHE;
-static CLOSE_CACHE close_cache;
-#endif
+typedef struct close_cache_s *close_cache_t;
+static close_cache_t close_cache;
+#endif /*!FILE_FILTER_USES_STDIO*/
 
-#ifdef _WIN32
+
+
+#ifdef HAVE_W32_SYSTEM
 typedef struct
 {
   int sock;
   int keep_open;
   int no_cache;
   int eof_seen;
-  int print_only_name;         /* flags indicating that fname is not a real file */
-  char fname[1];               /* name of the file */
+  int print_only_name; /* Flag indicating that fname is not a real file.  */
+  char fname[1];       /* Name of the file */
 }
 sock_filter_ctx_t;
-#endif /*_WIN32*/
+#endif /*HAVE_W32_SYSTEM*/
 
 /* The first partial length header block must be of size 512
  * to make it easier (and efficienter) we use a min. block size of 512
@@ -127,33 +161,41 @@ sock_filter_ctx_t;
 #define OP_MIN_PARTIAL_CHUNK     512
 #define OP_MIN_PARTIAL_CHUNK_2POW 9
 
+/* The context we use for the block filter (used to handle OpenPGP
+   length information header).  */
 typedef struct
 {
   int use;
   size_t size;
   size_t count;
-  int partial;                 /* 1 = partial header, 2 in last partial packet */
-  char *buffer;                        /* used for partial header */
-  size_t buflen;               /* used size of buffer */
-  int first_c;                 /* of partial header (which is > 0) */
+  int partial;    /* 1 = partial header, 2 in last partial packet.  */
+  char *buffer;           /* Used for partial header.  */
+  size_t buflen;   /* Used size of buffer.  */
+  int first_c;    /* First character of a partial header (which is > 0).  */
   int eof;
 }
 block_filter_ctx_t;
 
+
+/* Global flag to tell whether special file names are enabled.  See
+   gpg.c for an explanation of these file names.  FIXME: it does not
+   belong into the iobuf subsystem. */
 static int special_names_enabled;
 
+/* Local prototypes.  */
 static int underflow (iobuf_t a);
 static int translate_file_handle (int fd, int for_write);
 
-#ifndef FILE_FILTER_USES_STDIO
 
+\f
+#ifndef FILE_FILTER_USES_STDIO
 /*
  * Invalidate (i.e. close) a cached iobuf
  */
 static void
 fd_cache_invalidate (const char *fname)
 {
-  CLOSE_CACHE cc;
+  close_cache_t cc;
 
   assert (fname);
   if (DBG_IOBUF)
@@ -165,7 +207,7 @@ fd_cache_invalidate (const char *fname)
        {
          if (DBG_IOBUF)
            log_debug ("                did (%s)\n", cc->fname);
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
          CloseHandle (cc->fp);
 #else
          close (cc->fp);
@@ -176,11 +218,10 @@ fd_cache_invalidate (const char *fname)
 }
 
 
-
-static FILEP_OR_FD
+static fp_or_fd_t
 direct_open (const char *fname, const char *mode)
 {
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
   unsigned long da, cd, sm;
   HANDLE hfile;
 
@@ -213,7 +254,7 @@ direct_open (const char *fname, const char *mode)
 
   hfile = CreateFile (fname, da, sm, NULL, cd, FILE_ATTRIBUTE_NORMAL, NULL);
   return hfile;
-#else
+#else /*!HAVE_W32_SYSTEM*/
   int oflag;
   int cflag = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
 
@@ -236,6 +277,7 @@ direct_open (const char *fname, const char *mode)
   if (strchr (mode, 'b'))
     oflag |= O_BINARY;
 #endif
+  /* No we need to distinguish between POSIX and RISC OS.  */
 #ifndef __riscos__
   return open (fname, oflag, cflag);
 #else
@@ -250,7 +292,7 @@ direct_open (const char *fname, const char *mode)
       return open (fname, oflag, cflag);
   }
 #endif
-#endif
+#endif /*!HAVE_W32_SYSTEM*/
 }
 
 
@@ -259,14 +301,14 @@ direct_open (const char *fname, const char *mode)
  * Note that this caching strategy only works if the process does not chdir.
  */
 static void
-fd_cache_close (const char *fname, FILEP_OR_FD fp)
+fd_cache_close (const char *fname, fp_or_fd_t fp)
 {
-  CLOSE_CACHE cc;
+  close_cache_t cc;
 
   assert (fp);
   if (!fname || !*fname)
     {
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
       CloseHandle (fp);
 #else
       close (fp);
@@ -299,21 +341,21 @@ fd_cache_close (const char *fname, FILEP_OR_FD fp)
 /*
  * Do an direct_open on FNAME but first try to reuse one from the fd_cache
  */
-static FILEP_OR_FD
+static fp_or_fd_t
 fd_cache_open (const char *fname, const char *mode)
 {
-  CLOSE_CACHE cc;
+  close_cache_t cc;
 
   assert (fname);
   for (cc = close_cache; cc; cc = cc->next)
     {
       if (cc->fp != INVALID_FP && !strcmp (cc->fname, fname))
        {
-         FILEP_OR_FD fp = cc->fp;
+         fp_or_fd_t fp = cc->fp;
          cc->fp = INVALID_FP;
          if (DBG_IOBUF)
            log_debug ("fd_cache_open (%s) using cached fp\n", fname);
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
          if (SetFilePointer (fp, 0, NULL, FILE_BEGIN) == 0xffffffff)
            {
              log_error ("rewind file failed on handle %p: ec=%d\n",
@@ -335,7 +377,6 @@ fd_cache_open (const char *fname, const char *mode)
   return direct_open (fname, mode);
 }
 
-
 #endif /*FILE_FILTER_USES_STDIO */
 
 
@@ -368,7 +409,7 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf,
             size_t * ret_len)
 {
   file_filter_ctx_t *a = opaque;
-  FILEP_OR_FD f = a->fp;
+  fp_or_fd_t f = a->fp;
   size_t size = *ret_len;
   size_t nbytes = 0;
   int rc = 0;
@@ -444,7 +485,7 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf,
        }
       else
        {
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
          unsigned long nread;
 
          nbytes = 0;
@@ -503,7 +544,7 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf,
     {
       if (size)
        {
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
          byte *p = buf;
          unsigned long n;
 
@@ -563,7 +604,7 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf,
     }
   else if (control == IOBUFCTRL_FREE)
     {
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
       if (f != FILEP_OR_FD_FOR_STDIN && f != FILEP_OR_FD_FOR_STDOUT)
        {
          if (DBG_IOBUF)
@@ -587,9 +628,10 @@ file_filter (void *opaque, int control, iobuf_t chain, byte * buf,
   return rc;
 }
 
-#ifdef _WIN32
-/* Becuase sockets are an special object under Lose32 we have to
- * use a special filter */
+
+#ifdef HAVE_W32_SYSTEM
+/* Because network sockets are special objects under Lose32 we have to
+   use a dedicated filter for them. */
 static int
 sock_filter (void *opaque, int control, iobuf_t chain, byte * buf,
             size_t * ret_len)
@@ -674,7 +716,7 @@ sock_filter (void *opaque, int control, iobuf_t chain, byte * buf,
     }
   return rc;
 }
-#endif /*_WIN32*/
+#endif /*HAVE_W32_SYSTEM*/
 
 /****************
  * This is used to implement the block write mode.
@@ -1050,7 +1092,7 @@ iobuf_cancel (iobuf_t a)
   const char *s;
   iobuf_t a2;
   int rc;
-#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+#if defined(HAVE_W32_SYSTEM) || defined(__riscos__)
   char *remove_name = NULL;
 #endif
 
@@ -1059,7 +1101,7 @@ iobuf_cancel (iobuf_t a)
       s = iobuf_get_real_fname (a);
       if (s && *s)
        {
-#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+#if defined(HAVE_W32_SYSTEM) || defined(__riscos__)
          remove_name = xstrdup (s);
 #else
          remove (s);
@@ -1076,7 +1118,7 @@ iobuf_cancel (iobuf_t a)
     }
 
   rc = iobuf_close (a);
-#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+#if defined(HAVE_W32_SYSTEM) || defined(__riscos__)
   if (remove_name)
     {
       /* Argg, MSDOS does not allow to remove open files.  So
@@ -1161,7 +1203,7 @@ iobuf_t
 iobuf_open (const char *fname)
 {
   iobuf_t a;
-  FILEP_OR_FD fp;
+  fp_or_fd_t fp;
   file_filter_ctx_t *fcx;
   size_t len;
   int print_only = 0;
@@ -1206,7 +1248,7 @@ iobuf_t
 iobuf_fdopen (int fd, const char *mode)
 {
   iobuf_t a;
-  FILEP_OR_FD fp;
+  fp_or_fd_t fp;
   file_filter_ctx_t *fcx;
   size_t len;
 
@@ -1214,7 +1256,7 @@ iobuf_fdopen (int fd, const char *mode)
   if (!(fp = fdopen (fd, mode)))
     return NULL;
 #else
-  fp = (FILEP_OR_FD) fd;
+  fp = (fp_or_fd_t) fd;
 #endif
   a = iobuf_alloc (strchr (mode, 'w') ? 2 : 1, 8192);
   fcx = xmalloc (sizeof *fcx + 20);
@@ -1236,7 +1278,7 @@ iobuf_t
 iobuf_sockopen (int fd, const char *mode)
 {
   iobuf_t a;
-#ifdef _WIN32
+#ifdef HAVE_W32_SYSTEM
   sock_filter_ctx_t *scx;
   size_t len;
 
@@ -1265,7 +1307,7 @@ iobuf_t
 iobuf_create (const char *fname)
 {
   iobuf_t a;
-  FILEP_OR_FD fp;
+  fp_or_fd_t fp;
   file_filter_ctx_t *fcx;
   size_t len;
   int print_only = 0;
@@ -1339,7 +1381,7 @@ iobuf_t
 iobuf_openrw (const char *fname)
 {
   iobuf_t a;
-  FILEP_OR_FD fp;
+  fp_or_fd_t fp;
   file_filter_ctx_t *fcx;
   size_t len;
 
@@ -1379,7 +1421,7 @@ iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval)
            b->keep_open = intval;
            return 0;
          }
-#ifdef _WIN32
+#ifdef HAVE_W32_SYSTEM
        else if (!a->chain && a->filter == sock_filter)
          {
            sock_filter_ctx_t *b = a->filter_ov;
@@ -1414,7 +1456,7 @@ iobuf_ioctl (iobuf_t a, int cmd, int intval, void *ptrval)
            b->no_cache = intval;
            return 0;
          }
-#ifdef _WIN32
+#ifdef HAVE_W32_SYSTEM
        else if (!a->chain && a->filter == sock_filter)
          {
            sock_filter_ctx_t *b = a->filter_ov;
@@ -2027,9 +2069,9 @@ iobuf_get_filelength (iobuf_t a, int *overflow)
     if ( !a->chain && a->filter == file_filter )
       {
         file_filter_ctx_t *b = a->filter_ov;
-        FILEP_OR_FD fp = b->fp;
+        fp_or_fd_t fp = b->fp;
         
-#if defined(HAVE_DOSISH_SYSTEM) && !defined(FILE_FILTER_USES_STDIO)
+#if defined(HAVE_W32_SYSTEM) && !defined(FILE_FILTER_USES_STDIO)
         ulong size;
         static int (* __stdcall get_file_size_ex) (void *handle,
                                                    LARGE_INTEGER *r_size);
@@ -2096,7 +2138,7 @@ iobuf_get_fd (iobuf_t a)
     if (!a->chain && a->filter == file_filter)
       {
         file_filter_ctx_t *b = a->filter_ov;
-        FILEP_OR_FD fp = b->fp;
+        fp_or_fd_t fp = b->fp;
 
         return my_fileno (fp);
       }
@@ -2184,7 +2226,7 @@ iobuf_seek (iobuf_t a, off_t newpos)
          return -1;
        }
 #else
-#ifdef HAVE_DOSISH_SYSTEM
+#ifdef HAVE_W32_SYSTEM
       if (SetFilePointer (b->fp, newpos, NULL, FILE_BEGIN) == 0xffffffff)
        {
          log_error ("SetFilePointer failed on handle %p: ec=%d\n",
@@ -2354,10 +2396,10 @@ iobuf_read_line (iobuf_t a, byte ** addr_of_buffer,
 static int
 translate_file_handle (int fd, int for_write)
 {
-#ifdef _WIN32
-#ifdef FILE_FILTER_USES_STDIO
+#ifdef HAVE_W32_SYSTEM
+# ifdef FILE_FILTER_USES_STDIO
   fd = translate_sys2libc_fd (fd, for_write);
-#else
+# else
   {
     int x;
 
@@ -2376,7 +2418,7 @@ translate_file_handle (int fd, int for_write)
 
     fd = x;
   }
-#endif
+# endif
 #endif
   return fd;
 }
index 3ed702a..b59f345 100644 (file)
@@ -26,7 +26,7 @@ void trap_unaligned (void);
 int  disable_core_dumps (void);
 int  enable_core_dumps (void);
 const unsigned char *get_session_marker (size_t *rlen);
-int check_permissions (const char *path,int extension,int checkonly);
+/*int check_permissions (const char *path,int extension,int checkonly);*/
 void gnupg_sleep (unsigned int seconds);
 int translate_sys2libc_fd (int fd, int for_write);
 
index 98a4614..5b10915 100644 (file)
@@ -632,7 +632,7 @@ tty_get_answer_is_yes( const char *prompt )
 }
 
 
-/* Called by gnupg_rl_initialize to setup the reradline support. */
+/* Called by gnupg_rl_initialize to setup the readline support. */
 void
 tty_private_set_rl_hooks (void (*init_stream) (FILE *),
                           void (*set_completer) (rl_completion_func_t*),
index 3985821..1159512 100644 (file)
 #include "../jnlib/utf8conv.h"
 #include "../jnlib/dynload.h"
 
+#include "init.h"
+
 /* Redefine asprintf by our estream version which uses our own memory
    allocator..  */
 #include "estream-printf.h"
 #define asprintf estream_asprintf
 #define vasprintf estream_vasprintf
 
+
 /* GCC attributes.  */
 #if __GNUC__ >= 4 
 # define GNUPG_GCC_A_SENTINEL(a) __attribute__ ((sentinel(a)))
@@ -119,8 +122,6 @@ gnupg_copy_time (gnupg_isotime_t d, const gnupg_isotime_t s)
   strcpy (d, s);
 }
 
-/*-- init.c --*/
-void init_common_subsystems (void);
 
 /*-- signal.c --*/
 void gnupg_init_signals (int mode, void (*fast_cleanup)(void));
@@ -170,6 +171,7 @@ char *bin2hexcolon (const void *buffer, size_t length, char *stringbuf);
 
 
 /*-- homedir.c --*/
+const char *standard_homedir (void);
 const char *default_homedir (void);
 const char *gnupg_sysconfdir (void);
 const char *gnupg_bindir (void);
index 2958c9f..4778158 100644 (file)
@@ -1,8 +1,13 @@
+2007-06-26  Werner Koch  <wk@g10code.com>
+
+       * openfile.c (try_make_homedir): Support W32; use standard_homedir.
+
 2007-06-25  Werner Koch  <wk@g10code.com>
 
-       * gpg.c (main): Replace iobuf_translate_file_handle by
+       * gpg.c, gpgv.c: Include sysutils.h.
+       (main): Replace iobuf_translate_file_handle by
        translate_sys2libc_fd.
-       * gpgv.c (main): Ditto.
+       
 
 2007-06-21  Werner Koch  <wk@g10code.com>
 
index d1d79ea..0eb21f0 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -53,6 +53,7 @@
 #include "filter.h"
 #include "ttyio.h"
 #include "i18n.h"
+#include "sysutils.h"
 #include "status.h"
 #include "keyserver-internal.h"
 #include "exec.h"
index f7cac34..72ee53c 100644 (file)
@@ -48,6 +48,7 @@
 #include "filter.h"
 #include "ttyio.h"
 #include "i18n.h"
+#include "sysutils.h"
 #include "status.h"
 #include "call-agent.h"
 
index 095aad9..949299a 100644 (file)
@@ -404,37 +404,35 @@ copy_options_file( const char *destdir )
 
 
 void
-try_make_homedir( const char *fname )
+try_make_homedir (const char *fname)
 {
-    const char *defhome = GNUPG_DEFAULT_HOMEDIR;
-#ifdef HAVE_W32_SYSTEM
-#warning use a function and not a constant
-#endif
+  const char *defhome = standard_homedir ();
 
-    /* Create the directory only if the supplied directory name
-     * is the same as the default one.  This way we avoid to create
-     * arbitrary directories when a non-default homedirectory is used.
-     * To cope with HOME, we do compare only the suffix if we see that
-     * the default homedir does start with a tilde.
-     */
-    if( opt.dry_run || opt.no_homedir_creation )
-       return;
+  /* Create the directory only if the supplied directory name is the
+     same as the default one.  This way we avoid to create arbitrary
+     directories when a non-default home directory is used.  To cope
+     with HOME, we do compare only the suffix if we see that the
+     default homedir does start with a tilde.  */
+  if ( opt.dry_run || opt.no_homedir_creation )
+    return;
 
-    if ( ( *defhome == '~'
-           && ( strlen(fname) >= strlen (defhome+1)
-                && !strcmp(fname+strlen(fname)-strlen(defhome+1),
-                           defhome+1 ) ))
-         || ( *defhome != '~'
-              && !compare_filenames( fname, defhome ) )
-        ) {
-       if( mkdir( fname, S_IRUSR|S_IWUSR|S_IXUSR ) )
-           log_fatal( _("can't create directory `%s': %s\n"),
-                                       fname,  strerror(errno) );
-       else if( !opt.quiet )
-           log_info( _("directory `%s' created\n"), fname );
-       copy_options_file( fname );
-/*     log_info(_("you have to start GnuPG again, " */
-/*                "so it can read the new configuration file\n") ); */
-/*     g10_exit(1); */
+  if (
+#ifdef HAVE_W32_SYSTEM
+      ( !compare_filenames (fname, defhome) )
+#else
+      ( *defhome == '~'
+        && (strlen(fname) >= strlen (defhome+1)
+            && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) ))
+      || (*defhome != '~'  && !compare_filenames( fname, defhome ) )
+#endif
+      )
+    {
+      if ( mkdir (fname, S_IRUSR|S_IWUSR|S_IXUSR) )
+        log_fatal ( _("can't create directory `%s': %s\n"),
+                    fname, strerror(errno) );
+      else if (!opt.quiet )
+        log_info ( _("directory `%s' created\n"), fname );
+      copy_options_file( fname );
+      
     }
 }
index 60bbd0a..c346078 100644 (file)
@@ -74,9 +74,6 @@
 
 #ifdef __MINGW32__
 # include <io.h>
-/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
-   Therefore we have to disable the argument count checking.  */
-# define mkdir ((int (*)()) _mkdir)
 #endif
 
 #if !_LIBC
@@ -177,7 +174,11 @@ gen_tempname (char *tmpl)
       v /= 62;
       XXXXXX[5] = letters[v % 62];
 
+#ifdef MKDIR_TAKES_ONE_ARG
+      fd = mkdir (tmpl);
+#else
       fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
+#endif
 
       if (fd >= 0)
        {
index e7c7b9a..b36746d 100644 (file)
@@ -1,3 +1,7 @@
+2007-06-26  Werner Koch  <wk@g10code.com>
+
+       * kbxutil.c: Include init.h
+
 2007-06-15  Werner Koch  <wk@g10code.com>
 
        * Makefile.am (kbxutil_LDADD): Add W32SOCKLIBS.
index 3919684..e231a82 100644 (file)
 #include "../jnlib/argparse.h"
 #include "../jnlib/stringhelp.h"
 #include "../jnlib/utf8conv.h"
-#include "../common/i18n.h"
+#include "i18n.h"
+#include "init.h"
 #include "keybox-defs.h"
 
 #include <gcrypt.h>
 
-
 enum cmd_and_opt_values {
   aNull = 0,
   oArmor         = 'a',
index a57af3c..ab9b899 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-26  Werner Koch  <wk@g10code.com>
+
+       * gpgsm.c (main): Call gnupg_rl_initialize.
+       * Makefile.am (gpgsm_LDADD): Add LIBREADLINE and libgpgrl.a.
+
 2007-06-25  Werner Koch  <wk@g10code.com>
 
        * gpgsm.c (check_special_filename): Use translate_sys2libc_fd and
index e560648..8171af5 100644 (file)
@@ -57,9 +57,9 @@ gpgsm_SOURCES = \
 common_libs = ../jnlib/libjnlib.a ../kbx/libkeybox.a \
               $(libcommon) ../gl/libgnu.a
 
-gpgsm_LDADD = $(common_libs) \
+gpgsm_LDADD = $(common_libs) ../common/libgpgrl.a \
               $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) \
-              $(GPG_ERROR_LIBS) $(LIBINTL) $(ZLIBS) $(LIBICONV)
+              $(GPG_ERROR_LIBS) $(LIBREADLINE) $(LIBINTL) $(ZLIBS) $(LIBICONV)
 
 # Make sure that all libs are build before we use them.  This is
 # important for things like make -j2.
index d3be015..08f0804 100644 (file)
@@ -736,6 +736,7 @@ main ( int argc, char **argv)
   /*mtrace();*/
 
   /* trap_unaligned ();*/
+  gnupg_rl_initialize ();
   set_strusage (my_strusage);
   gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
   /* We don't need any locking in libgcrypt unless we use any kind of
index f36c33a..72298da 100644 (file)
@@ -1,3 +1,14 @@
+2007-06-26  Werner Koch  <wk@g10code.com>
+
+       * gpgconf-comp.c (key_matches_user_or_group) [W32]: Implement user
+       name matching.
+       (GPGNAME): New.  Use it instead of "gpg".
+       (gc_component) [W32]:  Disable dirmngr for now.
+       (gc_component_retrieve_options): Ignore components without options.
+       (gc_component_change_options): Ditto.
+       (gc_component_list_options): Ditto.
+       (gc_component_find, gc_component_list_components): Ditto.
+
 2007-06-19  Werner Koch  <wk@g10code.com>
 
        * gpgconf-comp.c (percent_escape): Rename to my_percent_escape.
index caf09d3..4a83adb 100644 (file)
 #include <time.h>
 #include <stdarg.h>
 #include <signal.h>
-#ifndef HAVE_W32_SYSTEM
-#include <pwd.h>
-#include <grp.h>
+#ifdef HAVE_W32_SYSTEM
+# define WIN32_LEAN_AND_MEAN 1
+# include <windows.h>
+#else
+# include <pwd.h>
+# include <grp.h>
 #endif
 
 /* For log_logv(), asctimestamp(), gnupg_get_time ().  */
 #include "gpgconf.h"
 
 
+/* There is a problem with gpg 1.4 under Windows: --gpgconf-list
+   returns a plain filename without escaping.  As long as we have not
+   fixed that we need to use gpg2 - it might actually be better to use
+   gpg2 in any case.  */
+#ifdef HAVE_W32_SYSTEM
+#define GPGNAME "gpg2"
+#else
+#define GPGNAME "gpg"
+#endif
+
 \f
 /* TODO:
    Components: Add more components and their options.
@@ -156,7 +169,7 @@ static struct
 } gc_backend[GC_BACKEND_NR] =
   {
     { NULL },          /* GC_BACKEND_ANY dummy entry.  */
-    { "GnuPG", "gpg", NULL, "gpgconf-gpg.conf" },
+    { "GnuPG", GPGNAME, NULL, "gpgconf-gpg.conf" },
     { "GPGSM", "gpgsm", NULL, "gpgconf-gpgsm.conf" },
     { "GPG Agent", "gpg-agent", gpg_agent_runtime_change,
       "gpgconf-gpg-agent.conf" },
@@ -901,7 +914,9 @@ static struct
     { "gpg-agent", NULL, "GPG Agent", gc_options_gpg_agent },
     { "scdaemon", NULL, "Smartcard Daemon", gc_options_scdaemon },
     { "gpgsm", NULL, "GPG for S/MIME", gc_options_gpgsm },
+#ifndef HAVE_W32_SYSTEM
     { "dirmngr", NULL, "Directory Manager", gc_options_dirmngr }
+#endif
   };
 
 \f
@@ -1081,10 +1096,13 @@ gc_component_list_components (FILE *out)
 
   for (idx = 0; idx < GC_COMPONENT_NR; idx++)
     {
-      const char *desc = gc_component[idx].desc;
-      desc = my_dgettext (gc_component[idx].desc_domain, desc);
-      fprintf (out, "%s:%s\n",
-               gc_component[idx].name,  my_percent_escape (desc));
+      if (gc_component[idx].options)
+        {
+          const char *desc = gc_component[idx].desc;
+          desc = my_dgettext (gc_component[idx].desc_domain, desc);
+          fprintf (out, "%s:%s\n",
+                   gc_component[idx].name,  my_percent_escape (desc));
+        }
     }
 }
 
@@ -1098,7 +1116,8 @@ gc_component_find (const char *name)
 
   for (idx = 0; idx < GC_COMPONENT_NR; idx++)
     {
-      if (!strcmp (name, gc_component[idx].name))
+      if (gc_component[idx].options
+          && !strcmp (name, gc_component[idx].name))
        return idx;
     }
   return -1;
@@ -1222,7 +1241,7 @@ gc_component_list_options (int component, FILE *out)
   const gc_option_t *option = gc_component[component].options;
   const gc_option_t *group_option = NULL;
 
-  while (option->name)
+  while (option && option->name)
     {
       /* Do not output unknown or internal options.  */
       if (!(option->flags & GC_OPT_FLAG_GROUP)
@@ -1595,7 +1614,7 @@ gc_component_retrieve_options (int component)
     {
       option = gc_component[component].options;
 
-      while (option->name)
+      while (option && option->name)
         {
           if (!(option->flags & GC_OPT_FLAG_GROUP))
             {
@@ -2507,7 +2526,7 @@ gc_component_change_options (int component, FILE *in)
      write them out to new configuration files, verify them
      externally, and then commit them.  */
   option = gc_component[component].options;
-  while (option->name)
+  while (option && option->name)
     {
       /* Go on if we have already seen this backend, or if there is
         nothing to do.  */
@@ -2649,11 +2668,7 @@ gc_component_change_options (int component, FILE *in)
 static int
 key_matches_user_or_group (char *user)
 {
-#ifdef HAVE_W32_SYSTEM
-# warning We need a real user and group lookup.
-#else
   char *group;
-  int n;
 
   if (*user == '*' && user[1] == 0)
     return 1; /* A single asterisk matches all users.  */
@@ -2662,6 +2677,30 @@ key_matches_user_or_group (char *user)
   if (group)
     *group++ = 0;
 
+#ifdef HAVE_W32_SYSTEM
+  /* Under Windows we don't support groups. */   
+  if (group && *group)
+    gc_error (0, 0, _("Note that group specifications are ignored\n"));
+  if (*user)
+    {
+      static char *my_name;
+
+      if (!my_name)
+        {
+          char tmp[1];
+          DWORD size = 1;
+
+          GetUserNameA (tmp, &size);
+          my_name = xmalloc (size);
+          if (!GetUserNameA (my_name, &size))
+            gc_error (1,0, "error getting current user name: %s",
+                      w32_strerror (-1));
+        }
+
+      if (!strcmp (user, my_name))
+        return 1; /* Found.  */
+    }
+#else /*!HAVE_W32_SYSTEM*/
   /* First check whether the user matches.  */
   if (*user)
     {
@@ -2683,6 +2722,7 @@ key_matches_user_or_group (char *user)
     {
       static char *my_group;
       static char **my_supgroups;
+      int n;
 
       if (!my_group)
         {
@@ -2719,7 +2759,7 @@ key_matches_user_or_group (char *user)
         if (!strcmp (group, my_supgroups[n]))
           return 1; /* Found.  */
     }
-#endif
+#endif /*!HAVE_W32_SYSTEM*/
   return 0; /* No match.  */
 }