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> 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 * gpgme.h.in: Use _WIN32 instead of _MSC_VER. Include time.h for
time_t. time_t.

View File

@ -38,13 +38,22 @@
#include <shlobj.h> #include <shlobj.h>
#include <io.h> #include <io.h>
#include "ath.h"
#include "util.h" #include "util.h"
#include "sema.h" #include "sema.h"
#include "debug.h" #include "debug.h"
#ifndef HAVE_W32CE_SYSTEM
#define HAVE_ALLOW_SET_FOREGROUND_WINDOW 1
#endif
DEFINE_STATIC_LOCK (get_path_lock); DEFINE_STATIC_LOCK (get_path_lock);
#ifdef HAVE_ALLOW_SET_FOREGROUND_WINDOW
#define RTLD_LAZY 0 #define RTLD_LAZY 0
static __inline__ void * static __inline__ void *
@ -77,6 +86,52 @@ dlclose (void * hd)
} }
return -1; 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. /* Return a string from the W32 Registry or NULL in case of error.
@ -89,59 +144,64 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)
DWORD n1, nbytes, type; DWORD n1, nbytes, type;
char *result = NULL; char *result = NULL;
if ( !root ) if (!root)
root_key = HKEY_CURRENT_USER; root_key = HKEY_CURRENT_USER;
else if ( !strcmp( root, "HKEY_CLASSES_ROOT" ) ) else if (!strcmp( root, "HKEY_CLASSES_ROOT"))
root_key = HKEY_CLASSES_ROOT; root_key = HKEY_CLASSES_ROOT;
else if ( !strcmp( root, "HKEY_CURRENT_USER" ) ) else if (!strcmp( root, "HKEY_CURRENT_USER"))
root_key = HKEY_CURRENT_USER; root_key = HKEY_CURRENT_USER;
else if ( !strcmp( root, "HKEY_LOCAL_MACHINE" ) ) else if (!strcmp( root, "HKEY_LOCAL_MACHINE"))
root_key = HKEY_LOCAL_MACHINE; root_key = HKEY_LOCAL_MACHINE;
else if ( !strcmp( root, "HKEY_USERS" ) ) else if (!strcmp( root, "HKEY_USERS"))
root_key = HKEY_USERS; root_key = HKEY_USERS;
else if ( !strcmp( root, "HKEY_PERFORMANCE_DATA" ) ) else if (!strcmp( root, "HKEY_PERFORMANCE_DATA"))
root_key = HKEY_PERFORMANCE_DATA; root_key = HKEY_PERFORMANCE_DATA;
else if ( !strcmp( root, "HKEY_CURRENT_CONFIG" ) ) else if (!strcmp( root, "HKEY_CURRENT_CONFIG"))
root_key = HKEY_CURRENT_CONFIG; root_key = HKEY_CURRENT_CONFIG;
else else
return NULL; return NULL;
if ( RegOpenKeyEx ( root_key, dir, 0, KEY_READ, &key_handle ) ) if (RegOpenKeyExA (root_key, dir, 0, KEY_READ, &key_handle))
{ {
if (root) if (root)
return NULL; /* no need for a RegClose, so return direct */ return NULL; /* no need for a RegClose, so return direct */
/* It seems to be common practise to fall back to HKLM. */ /* 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 */ return NULL; /* still no need for a RegClose, so return direct */
} }
nbytes = 1; nbytes = 1;
if ( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))
{ {
if (root) if (root)
goto leave; goto leave;
/* Try to fallback to HKLM also vor a missing value. */ /* Try to fallback to HKLM also vor a missing value. */
RegCloseKey (key_handle); 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. */ return NULL; /* Nope. */
if (RegQueryValueEx ( key_handle, name, 0, NULL, NULL, &nbytes)) if (RegQueryValueExA (key_handle, name, 0, NULL, NULL, &nbytes))
goto leave; goto leave;
} }
result = malloc ( (n1=nbytes+1) ); n1 = nbytes + 1;
if ( !result ) result = malloc (n1);
if (!result)
goto leave; 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; goto leave;
} }
result[nbytes] = 0; /* Make sure it is really a string. */ 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, '%')) if (type == REG_EXPAND_SZ && strchr (result, '%'))
{ {
char *tmp; char *tmp;
n1 += 1000; n1 += 1000;
tmp = malloc (n1+1); tmp = malloc (n1 + 1);
if (!tmp) if (!tmp)
goto leave; goto leave;
nbytes = ExpandEnvironmentStrings (result, tmp, n1); nbytes = ExpandEnvironmentStrings (result, tmp, n1);
@ -179,51 +239,14 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)
free (tmp); free (tmp);
} }
} }
#endif
leave: leave:
RegCloseKey( key_handle ); RegCloseKey (key_handle);
return result; return result;
} }
/* 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 #if 0
static char * static char *
find_program_in_registry (const char *name) find_program_in_registry (const char *name)
@ -285,7 +308,8 @@ find_program_at_standard_place (const char *name)
char path[MAX_PATH]; char path[MAX_PATH];
char *result = NULL; 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); result = malloc (strlen (path) + 1 + strlen (name) + 1);
if (result) if (result)
@ -383,7 +407,7 @@ const char *
_gpgme_get_uiserver_socket_path (void) _gpgme_get_uiserver_socket_path (void)
{ {
static char *socket_path; static char *socket_path;
char *homedir; const char *homedir;
const char name[] = "S.uiserver"; const char name[] = "S.uiserver";
if (socket_path) if (socket_path)
@ -432,51 +456,6 @@ _gpgme_get_conf_int (const char *key, int *value)
return 1; 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 /* mkstemp extracted from libc/sysdeps/posix/tempname.c. Copyright
(C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc. (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) random_time_bits = (((uint64_t)ft.dwHighDateTime << 32)
| (uint64_t)ft.dwLowDateTime); | (uint64_t)ft.dwLowDateTime);
} }
value += random_time_bits ^ getpid (); value += random_time_bits ^ ath_self ();
for (count = 0; count < attempts; value += 7777, ++count) for (count = 0; count < attempts; value += 7777, ++count)
{ {
@ -583,7 +562,7 @@ _gpgme_mkstemp (int *fd, char **name)
*fd = -1; *fd = -1;
*name = NULL; *name = NULL;
err = GetTempPath (MAX_PATH + 1, tmp); err = GetTempPathA (MAX_PATH + 1, tmp);
if (err == 0 || err > MAX_PATH + 1) if (err == 0 || err > MAX_PATH + 1)
strcpy (tmp,"c:\\windows\\temp"); strcpy (tmp,"c:\\windows\\temp");
else else