2010-05-11 Marcus Brinkmann <marcus@g10code.de>

* w32-util.c: Include ath.h
	(HAVE_ALLOW_SET_FOREGROUND_WINDOW) [!HAVE_W32CE_SYSTEM]: Define
	it.
	(RTLD_LAZY, dlopen, dlsym,
	dlclose) [!HAVE_ALLOW_SET_FORGROUND_WINDOW]: Don't define anymore.
	(_gpgme_allow_set_foreground_window) [!HAVE_ALLOW_SET_FOREGROUND_WINDOW]:
	Make it a stub.
	(read_w32_registry_string): Use FooA variants of Windows functions
	instead of Foo (which dispatches depending on UNICODE).
	[!HAVE_W32CE_SYSTEM]: Don't check environment.
	(w32_shgetfolderpath): Remove.
	(find_program_at_standard_place): Call
	SHGetSpecialFolderPath (which is available on all Windows systems
	and also Windows CE).
	(mkstemp): Use ath_self instead of getpid.
	(_gpgme_mkstemp): Use GetTempPathA instead of GetTempPath.
This commit is contained in:
Marcus Brinkmann 2010-05-11 17:20:45 +00:00
parent 3da380293d
commit 383ede75dc
2 changed files with 101 additions and 105 deletions

View File

@ -1,5 +1,22 @@
2010-05-11 Marcus Brinkmann <marcus@g10code.de>
* w32-util.c: Include ath.h
(HAVE_ALLOW_SET_FOREGROUND_WINDOW) [!HAVE_W32CE_SYSTEM]: Define
it.
(RTLD_LAZY, dlopen, dlsym,
dlclose) [!HAVE_ALLOW_SET_FORGROUND_WINDOW]: Don't define anymore.
(_gpgme_allow_set_foreground_window) [!HAVE_ALLOW_SET_FOREGROUND_WINDOW]:
Make it a stub.
(read_w32_registry_string): Use FooA variants of Windows functions
instead of Foo (which dispatches depending on UNICODE).
[!HAVE_W32CE_SYSTEM]: Don't check environment.
(w32_shgetfolderpath): Remove.
(find_program_at_standard_place): Call
SHGetSpecialFolderPath (which is available on all Windows systems
and also Windows CE).
(mkstemp): Use ath_self instead of getpid.
(_gpgme_mkstemp): Use GetTempPathA instead of GetTempPath.
* gpgme.h.in: Use _WIN32 instead of _MSC_VER. Include time.h for
time_t.

View File

@ -38,13 +38,22 @@
#include <shlobj.h>
#include <io.h>
#include "ath.h"
#include "util.h"
#include "sema.h"
#include "debug.h"
#ifndef HAVE_W32CE_SYSTEM
#define HAVE_ALLOW_SET_FOREGROUND_WINDOW 1
#endif
DEFINE_STATIC_LOCK (get_path_lock);
#ifdef HAVE_ALLOW_SET_FOREGROUND_WINDOW
#define RTLD_LAZY 0
static __inline__ void *
@ -77,6 +86,52 @@ dlclose (void * hd)
}
return -1;
}
#endif /* HAVE_ALLOW_SET_FOREGROUND_WINDOW */
void
_gpgme_allow_set_foreground_window (pid_t pid)
{
#ifdef HAVE_ALLOW_SET_FOREGROUND_WINDOW
static int initialized;
static BOOL (WINAPI * func)(DWORD);
void *handle;
if (!initialized)
{
/* Available since W2000; thus we dynload it. */
initialized = 1;
handle = dlopen ("user32.dll", RTLD_LAZY);
if (handle)
{
func = dlsym (handle, "AllowSetForegroundWindow");
if (!func)
{
dlclose (handle);
handle = NULL;
}
}
}
if (!pid || pid == (pid_t)(-1))
{
TRACE1 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0,
"no action for pid %d", (int)pid);
}
else if (func)
{
int rc = func (pid);
TRACE2 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0,
"called for pid %d; result=%d", (int)pid, rc);
}
else
{
TRACE0 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0,
"function not available");
}
#endif /* HAVE_ALLOW_SET_FOREGROUND_WINDOW */
}
/* Return a string from the W32 Registry or NULL in case of error.
@ -106,36 +161,41 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)
else
return NULL;
if ( RegOpenKeyEx ( root_key, dir, 0, KEY_READ, &key_handle ) )
if (RegOpenKeyExA (root_key, dir, 0, KEY_READ, &key_handle))
{
if (root)
return NULL; /* no need for a RegClose, so return direct */
/* It seems to be common practise to fall back to HKLM. */
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle))
return NULL; /* still no need for a RegClose, so return direct */
}
nbytes = 1;
if ( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) )
if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))
{
if (root)
goto leave;
/* Try to fallback to HKLM also vor a missing value. */
RegCloseKey (key_handle);
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle))
return NULL; /* Nope. */
if (RegQueryValueEx ( key_handle, name, 0, NULL, NULL, &nbytes))
if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))
goto leave;
}
result = malloc ( (n1=nbytes+1) );
n1 = nbytes + 1;
result = malloc (n1);
if (!result)
goto leave;
if ( RegQueryValueEx ( key_handle, name, 0, &type, result, &n1 ) )
if (RegQueryValueExA (key_handle, name, 0, &type, (LPBYTE) result, &n1))
{
free(result); result = NULL;
free (result);
result = NULL;
goto leave;
}
result[nbytes] = 0; /* Make sure it is really a string. */
#ifndef HAVE_W32CE_SYSTEM
/* Windows CE does not have an environment. */
if (type == REG_EXPAND_SZ && strchr (result, '%'))
{
char *tmp;
@ -179,6 +239,7 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)
free (tmp);
}
}
#endif
leave:
RegCloseKey (key_handle);
@ -186,44 +247,6 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)
}
/* This is a helper function to load and run a Windows function from
either of one DLLs. */
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;
}
#if 0
static char *
find_program_in_registry (const char *name)
@ -285,7 +308,8 @@ find_program_at_standard_place (const char *name)
char path[MAX_PATH];
char *result = NULL;
if (w32_shgetfolderpath (NULL, CSIDL_PROGRAM_FILES, NULL, 0, path) >= 0)
/* See http://wiki.tcl.tk/17492 for details on compatibility. */
if (SHGetSpecialFolderPathA (NULL, path, CSIDL_PROGRAM_FILES, 0))
{
result = malloc (strlen (path) + 1 + strlen (name) + 1);
if (result)
@ -383,7 +407,7 @@ const char *
_gpgme_get_uiserver_socket_path (void)
{
static char *socket_path;
char *homedir;
const char *homedir;
const char name[] = "S.uiserver";
if (socket_path)
@ -432,51 +456,6 @@ _gpgme_get_conf_int (const char *key, int *value)
return 1;
}
void
_gpgme_allow_set_foreground_window (pid_t pid)
{
static int initialized;
static BOOL (WINAPI * func)(DWORD);
void *handle;
if (!initialized)
{
/* Available since W2000; thus we dynload it. */
initialized = 1;
handle = dlopen ("user32.dll", RTLD_LAZY);
if (handle)
{
func = dlsym (handle, "AllowSetForegroundWindow");
if (!func)
{
dlclose (handle);
handle = NULL;
}
}
}
if (!pid || pid == (pid_t)(-1))
{
TRACE1 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0,
"no action for pid %d", (int)pid);
}
else if (func)
{
int rc = func (pid);
TRACE2 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0,
"called for pid %d; result=%d", (int)pid, rc);
}
else
{
TRACE0 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0,
"function not available");
}
}
/* mkstemp extracted from libc/sysdeps/posix/tempname.c. Copyright
(C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc.
@ -538,7 +517,7 @@ mkstemp (char *tmpl)
random_time_bits = (((uint64_t)ft.dwHighDateTime << 32)
| (uint64_t)ft.dwLowDateTime);
}
value += random_time_bits ^ getpid ();
value += random_time_bits ^ ath_self ();
for (count = 0; count < attempts; value += 7777, ++count)
{
@ -583,7 +562,7 @@ _gpgme_mkstemp (int *fd, char **name)
*fd = -1;
*name = NULL;
err = GetTempPath (MAX_PATH + 1, tmp);
err = GetTempPathA (MAX_PATH + 1, tmp);
if (err == 0 || err > MAX_PATH + 1)
strcpy (tmp,"c:\\windows\\temp");
else