aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/ChangeLog5
-rw-r--r--common/homedir.c53
-rw-r--r--common/iobuf.h1
-rw-r--r--common/util.h6
4 files changed, 58 insertions, 7 deletions
diff --git a/common/ChangeLog b/common/ChangeLog
index 4a184006a..54bce4538 100644
--- a/common/ChangeLog
+++ b/common/ChangeLog
@@ -1,3 +1,8 @@
+2006-04-18 Werner Koch <[email protected]>
+
+ * homedir.c (w32_shgetfolderpath): New. Taken from gpg 1.4.3.
+ (default_homedir): Use it.
+
2005-10-08 Marcus Brinkmann <[email protected]>
* signal.c (get_signal_name): Check value of HAVE_DECL_SYS_SIGLIST
diff --git a/common/homedir.c b/common/homedir.c
index ab5b1d270..a118cbac1 100644
--- a/common/homedir.c
+++ b/common/homedir.c
@@ -1,5 +1,5 @@
/* homedir.c - Setup the home directory.
- * Copyright (C) 2004 Free Software Foundation, Inc.
+ * Copyright (C) 2004, 2006 Free Software Foundation, Inc.
*
* This file is part of GnuPG.
*
@@ -41,6 +41,47 @@
#include "util.h"
#include "sysutils.h"
+
+/* This is a helper function to load a Windows function from either of
+ one DLLs. */
+#ifdef HAVE_W32_SYSTEM
+static HRESULT
+w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
+{
+ static int initialized;
+ static HRESULT (WINAPI * func)(HWND,int,HANDLE,DWORD,LPSTR);
+
+ if (!initialized)
+ {
+ static char *dllnames[] = { "shell32.dll", "shfolder.dll", NULL };
+ void *handle;
+ int i;
+
+ initialized = 1;
+
+ for (i=0, handle = NULL; !handle && dllnames[i]; i++)
+ {
+ handle = dlopen (dllnames[i], RTLD_LAZY);
+ if (handle)
+ {
+ func = dlsym (handle, "SHGetFolderPathA");
+ if (!func)
+ {
+ dlclose (handle);
+ handle = NULL;
+ }
+ }
+ }
+ }
+
+ if (func)
+ return func (a,b,c,d,e);
+ else
+ return -1;
+}
+#endif /*HAVE_W32_SYSTEM*/
+
+
/* Set up the default home directory. The usual --homedir option
should be parsed later. */
const char *
@@ -56,15 +97,15 @@ default_homedir (void)
{
char path[MAX_PATH];
- /* fixme: It might be better to use LOCAL_APPDATA because this
- is defined as "non roaming" and thus more likely to be kept
+ /* It might be better to use LOCAL_APPDATA because this is
+ defined as "non roaming" and thus more likely to be kept
locally. For private keys this is desired. However, given
that many users copy private keys anyway forth and back,
- using a system roaming serives might be better than to let
+ using a system roaming services might be better than to let
them do it manually. A security conscious user will anyway
use the registry entry to have better control. */
- if (SHGetFolderPath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
- NULL, 0, path) >= 0)
+ if (w32_shgetfolderpath (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,
+ NULL, 0, path) >= 0)
{
char *tmp = xmalloc (strlen (path) + 6 +1);
strcpy (stpcpy (tmp, path), "\\gnupg");
diff --git a/common/iobuf.h b/common/iobuf.h
index b991717c2..def0a6506 100644
--- a/common/iobuf.h
+++ b/common/iobuf.h
@@ -36,6 +36,7 @@
#define IOBUFCTRL_USER 16
typedef struct iobuf_struct *iobuf_t;
+typedef struct iobuf_struct *IOBUF; /* Compatibility with gpg 1.4. */
/* fixme: we should hide most of this stuff */
struct iobuf_struct
diff --git a/common/util.h b/common/util.h
index 1ced59b67..68f5222b5 100644
--- a/common/util.h
+++ b/common/util.h
@@ -59,6 +59,10 @@
#define xrealloc(a,b) gcry_xrealloc ((a),(b))
#define xstrdup(a) gcry_xstrdup ((a))
+/* For compatibility with gpg 1.4 we also define these: */
+#define xmalloc_clear(a) gcry_xcalloc (1, (a))
+#define xmalloc_secure_clear(a) gcry_xcalloc_secure (1, (a))
+
/* A type to hold the ISO time. Note that this this is the same as
the the KSBA type ksba_isotime_t. */
@@ -133,7 +137,7 @@ int cmp_simple_canon_sexp (const unsigned char *a, const unsigned char *b);
unsigned char *make_simple_sexp_from_hexstr (const char *line,
size_t *nscanned);
-/*-- homedir. c --*/
+/*-- homedir.c --*/
const char *default_homedir (void);