2001-01-30 16:00:50 +00:00
|
|
|
|
/* w32-util.c - Utility functions for the W32 API
|
2003-01-29 20:03:24 +00:00
|
|
|
|
Copyright (C) 1999 Free Software Foundation, Inc
|
|
|
|
|
Copyright (C) 2001 Werner Koch (dd9jn)
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
Copyright (C) 2001, 2002, 2003, 2004, 2007 g10 Code GmbH
|
2003-01-29 20:03:24 +00:00
|
|
|
|
|
|
|
|
|
This file is part of GPGME.
|
|
|
|
|
|
|
|
|
|
GPGME is free software; you can redistribute it and/or modify it
|
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* README: Refer to COPYING.LESSER and "each file" instead of
COPYING.
* COPYING.LESSER: New file.
* gpgme.spec.in (%doc): Add COPYING.LESSER.
* acinclude.m4, configure.ac, Makefile.am: Change license to LGPL
2.1 or later.
* TODO: Add copyright notice.
* README.CVS: Likewise.
assuan/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* README.1st: Add copyright notice.
doc/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am: Change license to LGPL.
(gpgme_TEXINFOS): Replace gpl.texi with lesser.texi.
* gpgme.texi: Change license to LGPL (also for documentation of
GPGME's license).
* lesser.texi: New file.
* gpl.texi: File removed.
gpgme/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* putc_unlocked.c, funopen.c: I just claim copyright on these
files and change their license to LGPL, because they are totally
trivial wrapper functions.
* isascii.c: Change copyright notice to the one from ctype/ctype.h
in the GNU C Library (CVS Head 2004-10-10), where isascii is
defined as a macro doing exactly the same as the function in this
file.
* memrchr.c: Update from the GNU C Library (CVS Head 2001-07-06).
* stpcpy.c: Update from the GNU C Library (CVS Head 2004-10-10).
* ath.c, ath-compat.c, ath.h, ath-pth.c, ath-pth-compat.c,
ath-pthread.c, ath-pthread-compat.c, context.h, conversion.c,
data.c, data-compat.c, data-fd.c, data.h, data-mem.c,
data-stream.c, data-user.c, debug.c, debug.h, decrypt.c,
decrypt-verify.c, delete.c, edit.c, encrypt.c, encrypt-sign.c,
engine-backend.h, engine.c, engine-gpgsm.c, engine.h, error.c,
export.c, genkey.c, get-env.c, gpgme.c, gpgme.h, import.c, io.h,
key.c, keylist.c, mkstatus, Makefile.am, ops.h, op-support.c,
passphrase.c, posix-io.c, posix-sema.c, posix-util.c, progress.c,
rungpg.c, sema.h, sign.c, signers.c, trust-item.c, trustlist.c,
util.h, verify.c, version.c, w32-io.c, w32-sema.c, w32-util.c,
wait.c, wait-global.c, wait.h, wait-private.c, wait-user.c: Change
license to LGPL.
tests/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* gpg/mkdemodirs: Add copyright notice.
* gpgsm/Makefile.am, gpgsm/t-support.h, gpgsm/t-decrypt.c,
gpgsm/t-encrypt.c, gpgsm/t-export.c, gpgsm/t-genkey.c,
gpgsm/t-import.c, gpgsm/t-keylist.c, gpgsm/t-sign.c,
gpgsm/t-verify.c, gpg/Makefile.am, gpg/t-decrypt.c,
gpg/t-decrypt-verify.c, gpg/t-edit.c, gpg/t-encrypt.c,
gpg/t-encrypt-sign.c, gpg/t-encrypt-sym.c, gpg/t-eventloop.c,
gpg/t-export.c, gpg/t-genkey.c, gpg/t-import.c, gpg/t-keylist.c,
gpg/t-keylist-sig.c, gpg/t-sign.c, gpg/t-signers.c,
gpg/t-support.h, gpg/t-thread1.c, gpg/t-trustlist.c,
gpg/t-verify.c, Makefile.am, t-data.c, t-engine-info.c,
t-version.c: Change license to LGPL.
2004-12-07 21:13:39 +00:00
|
|
|
|
under the terms of the GNU Lesser General Public License as
|
|
|
|
|
published by the Free Software Foundation; either version 2.1 of
|
|
|
|
|
the License, or (at your option) any later version.
|
|
|
|
|
|
2003-01-29 20:03:24 +00:00
|
|
|
|
GPGME 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
|
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* README: Refer to COPYING.LESSER and "each file" instead of
COPYING.
* COPYING.LESSER: New file.
* gpgme.spec.in (%doc): Add COPYING.LESSER.
* acinclude.m4, configure.ac, Makefile.am: Change license to LGPL
2.1 or later.
* TODO: Add copyright notice.
* README.CVS: Likewise.
assuan/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* README.1st: Add copyright notice.
doc/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am: Change license to LGPL.
(gpgme_TEXINFOS): Replace gpl.texi with lesser.texi.
* gpgme.texi: Change license to LGPL (also for documentation of
GPGME's license).
* lesser.texi: New file.
* gpl.texi: File removed.
gpgme/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* putc_unlocked.c, funopen.c: I just claim copyright on these
files and change their license to LGPL, because they are totally
trivial wrapper functions.
* isascii.c: Change copyright notice to the one from ctype/ctype.h
in the GNU C Library (CVS Head 2004-10-10), where isascii is
defined as a macro doing exactly the same as the function in this
file.
* memrchr.c: Update from the GNU C Library (CVS Head 2001-07-06).
* stpcpy.c: Update from the GNU C Library (CVS Head 2004-10-10).
* ath.c, ath-compat.c, ath.h, ath-pth.c, ath-pth-compat.c,
ath-pthread.c, ath-pthread-compat.c, context.h, conversion.c,
data.c, data-compat.c, data-fd.c, data.h, data-mem.c,
data-stream.c, data-user.c, debug.c, debug.h, decrypt.c,
decrypt-verify.c, delete.c, edit.c, encrypt.c, encrypt-sign.c,
engine-backend.h, engine.c, engine-gpgsm.c, engine.h, error.c,
export.c, genkey.c, get-env.c, gpgme.c, gpgme.h, import.c, io.h,
key.c, keylist.c, mkstatus, Makefile.am, ops.h, op-support.c,
passphrase.c, posix-io.c, posix-sema.c, posix-util.c, progress.c,
rungpg.c, sema.h, sign.c, signers.c, trust-item.c, trustlist.c,
util.h, verify.c, version.c, w32-io.c, w32-sema.c, w32-util.c,
wait.c, wait-global.c, wait.h, wait-private.c, wait-user.c: Change
license to LGPL.
tests/
2004-12-07 Marcus Brinkmann <marcus@g10code.de>
* gpg/mkdemodirs: Add copyright notice.
* gpgsm/Makefile.am, gpgsm/t-support.h, gpgsm/t-decrypt.c,
gpgsm/t-encrypt.c, gpgsm/t-export.c, gpgsm/t-genkey.c,
gpgsm/t-import.c, gpgsm/t-keylist.c, gpgsm/t-sign.c,
gpgsm/t-verify.c, gpg/Makefile.am, gpg/t-decrypt.c,
gpg/t-decrypt-verify.c, gpg/t-edit.c, gpg/t-encrypt.c,
gpg/t-encrypt-sign.c, gpg/t-encrypt-sym.c, gpg/t-eventloop.c,
gpg/t-export.c, gpg/t-genkey.c, gpg/t-import.c, gpg/t-keylist.c,
gpg/t-keylist-sig.c, gpg/t-sign.c, gpg/t-signers.c,
gpg/t-support.h, gpg/t-thread1.c, gpg/t-trustlist.c,
gpg/t-verify.c, Makefile.am, t-data.c, t-engine-info.c,
t-version.c: Change license to LGPL.
2004-12-07 21:13:39 +00:00
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
License along with this program; if not, write to the Free Software
|
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
|
02111-1307, USA. */
|
2001-01-30 16:00:50 +00:00
|
|
|
|
|
2002-03-18 00:04:06 +00:00
|
|
|
|
#ifdef HAVE_CONFIG_H
|
2001-01-30 16:00:50 +00:00
|
|
|
|
#include <config.h>
|
2002-03-18 00:04:06 +00:00
|
|
|
|
#endif
|
2001-01-30 16:00:50 +00:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
#include <errno.h>
|
assuan/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* assuan-pipe-connect.c (struct spawn_fd_item_s): Add new members.
(HANDLE_TRANSLATION): New macro.
(pipe_connect_gpgme): Adjust caller of _gpgme_io_spawn.
[HANDLE_TRANSLATION]: Return translated handles.
gpgme/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgme-w32spawn.c: New file.
* Makefile.am (libexec_PROGRAMS) [HAVE_W32_SYSTEM]: New variable
with gpgme-w32spawn.
* engine-gpgsm.c (gpgsm_new): Use server translated handles.
(gpgsm_set_locale): Return early if locale value is NULL.
* util.h (_gpgme_mkstemp)
(_gpgme_get_w32spawn_path) [HAVE_W32_SYSTEM]: New function
prototypes.
* w32-util.c: Include <stdint.h>, <sys/stat.h> and <unistd.h>.
(letters, mkstemp, _gpgme_mkstemp, _gpgme_get_w32spawn_path): New
functions.
* rungpg.c (gpg_decrypt, gpg_encrypt, gpg_encrypt_sign)
(gpg_genkey, gpg_import, gpg_verify, gpg_sign): Pass data over
special filename FD rather than stdin.
(struct arg_and_data_s): Add member ARG_LOCP.
(struct fd_data_map_s): Add member ARG_LOC.
(struct engine_gpg): Add member ARG_LOC to status and colon.
(_add_arg, add_arg_with_locp): New function.
(add_arg_ext): Reimplement in terms of _add_arg.
(gpg_new): Remember argument location for status FD.
(build_argv): Set argument location if requested. Also set
argument location of fd_data_map for data items.
(start): Adjust caller of _gpgme_io_spawn.
* priv-io.h (struct spawn_fd_item_s): Add members peer_name and
arg_loc.
(_gpgme_io_spawn): Remove parent fd list argument.
* posix-io.c (get_max_fds): New function.
(_gpgme_io_dup): Add tracing.
(_gpgme_io_spawn): Remove parent fd list. Change meaning of child
fd list to contain all child fds that should be inherited. Close
all other file descriptors after fork.
* w32-io.c, w32-glib-io.c, w32-qt-io.c(_gpgme_io_spawn): Remove
parent fd list. Change meaning of child fd list to contain all
child fds that should be inherited. Do not inherit any file
descriptors, but DuplicateHandle them. Spawn process through
wrapper process. Provide wrapper process with a temporary file
containing handle translation data. Return translated handle
names.
* w32-io.c (reader): Add more tracing output.
(_gpgme_io_read): Likewise.
* engine-gpgconf.c (gpgconf_read): Adjust caller of
_gpgme_io_spawn.
* version.c (_gpgme_get_program_version): Likewise.
2008-06-25 16:52:31 +00:00
|
|
|
|
#include <stdint.h>
|
2001-01-30 16:00:50 +00:00
|
|
|
|
#include <sys/time.h>
|
|
|
|
|
#include <sys/types.h>
|
assuan/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* assuan-pipe-connect.c (struct spawn_fd_item_s): Add new members.
(HANDLE_TRANSLATION): New macro.
(pipe_connect_gpgme): Adjust caller of _gpgme_io_spawn.
[HANDLE_TRANSLATION]: Return translated handles.
gpgme/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgme-w32spawn.c: New file.
* Makefile.am (libexec_PROGRAMS) [HAVE_W32_SYSTEM]: New variable
with gpgme-w32spawn.
* engine-gpgsm.c (gpgsm_new): Use server translated handles.
(gpgsm_set_locale): Return early if locale value is NULL.
* util.h (_gpgme_mkstemp)
(_gpgme_get_w32spawn_path) [HAVE_W32_SYSTEM]: New function
prototypes.
* w32-util.c: Include <stdint.h>, <sys/stat.h> and <unistd.h>.
(letters, mkstemp, _gpgme_mkstemp, _gpgme_get_w32spawn_path): New
functions.
* rungpg.c (gpg_decrypt, gpg_encrypt, gpg_encrypt_sign)
(gpg_genkey, gpg_import, gpg_verify, gpg_sign): Pass data over
special filename FD rather than stdin.
(struct arg_and_data_s): Add member ARG_LOCP.
(struct fd_data_map_s): Add member ARG_LOC.
(struct engine_gpg): Add member ARG_LOC to status and colon.
(_add_arg, add_arg_with_locp): New function.
(add_arg_ext): Reimplement in terms of _add_arg.
(gpg_new): Remember argument location for status FD.
(build_argv): Set argument location if requested. Also set
argument location of fd_data_map for data items.
(start): Adjust caller of _gpgme_io_spawn.
* priv-io.h (struct spawn_fd_item_s): Add members peer_name and
arg_loc.
(_gpgme_io_spawn): Remove parent fd list argument.
* posix-io.c (get_max_fds): New function.
(_gpgme_io_dup): Add tracing.
(_gpgme_io_spawn): Remove parent fd list. Change meaning of child
fd list to contain all child fds that should be inherited. Close
all other file descriptors after fork.
* w32-io.c, w32-glib-io.c, w32-qt-io.c(_gpgme_io_spawn): Remove
parent fd list. Change meaning of child fd list to contain all
child fds that should be inherited. Do not inherit any file
descriptors, but DuplicateHandle them. Spawn process through
wrapper process. Provide wrapper process with a temporary file
containing handle translation data. Return translated handle
names.
* w32-io.c (reader): Add more tracing output.
(_gpgme_io_read): Likewise.
* engine-gpgconf.c (gpgconf_read): Adjust caller of
_gpgme_io_spawn.
* version.c (_gpgme_get_program_version): Likewise.
2008-06-25 16:52:31 +00:00
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <unistd.h>
|
2001-01-30 16:00:50 +00:00
|
|
|
|
#include <signal.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <windows.h>
|
2005-08-26 12:38:57 +00:00
|
|
|
|
#include <shlobj.h>
|
2002-03-18 00:04:06 +00:00
|
|
|
|
#include <io.h>
|
2001-01-30 16:00:50 +00:00
|
|
|
|
|
|
|
|
|
#include "util.h"
|
2003-01-19 22:05:40 +00:00
|
|
|
|
#include "sema.h"
|
2005-03-09 11:47:21 +00:00
|
|
|
|
#include "debug.h"
|
2001-01-30 16:00:50 +00:00
|
|
|
|
|
2002-05-09 03:38:12 +00:00
|
|
|
|
DEFINE_STATIC_LOCK (get_path_lock);
|
|
|
|
|
|
2005-08-26 12:38:57 +00:00
|
|
|
|
|
|
|
|
|
#define RTLD_LAZY 0
|
|
|
|
|
|
|
|
|
|
static __inline__ void *
|
|
|
|
|
dlopen (const char * name, int flag)
|
|
|
|
|
{
|
|
|
|
|
void * hd = LoadLibrary (name);
|
|
|
|
|
return hd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static __inline__ void *
|
|
|
|
|
dlsym (void * hd, const char * sym)
|
|
|
|
|
{
|
|
|
|
|
if (hd && sym)
|
|
|
|
|
{
|
|
|
|
|
void * fnc = GetProcAddress (hd, sym);
|
|
|
|
|
if (!fnc)
|
|
|
|
|
return NULL;
|
|
|
|
|
return fnc;
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static __inline__ int
|
|
|
|
|
dlclose (void * hd)
|
|
|
|
|
{
|
|
|
|
|
if (hd)
|
|
|
|
|
{
|
|
|
|
|
FreeLibrary (hd);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Return a string from the W32 Registry or NULL in case of error.
|
|
|
|
|
Caller must release the return value. A NULL for root is an alias
|
|
|
|
|
for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn. */
|
2001-01-30 16:00:50 +00:00
|
|
|
|
static char *
|
2002-03-18 00:04:06 +00:00
|
|
|
|
read_w32_registry_string (const char *root, const char *dir, const char *name)
|
2001-01-30 16:00:50 +00:00
|
|
|
|
{
|
2002-03-18 00:04:06 +00:00
|
|
|
|
HKEY root_key, key_handle;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
DWORD n1, nbytes, type;
|
2002-03-18 00:04:06 +00:00
|
|
|
|
char *result = NULL;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
|
|
|
|
|
if ( !root )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
root_key = HKEY_CURRENT_USER;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
else if ( !strcmp( root, "HKEY_CLASSES_ROOT" ) )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
root_key = HKEY_CLASSES_ROOT;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
else if ( !strcmp( root, "HKEY_CURRENT_USER" ) )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
root_key = HKEY_CURRENT_USER;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
else if ( !strcmp( root, "HKEY_LOCAL_MACHINE" ) )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
root_key = HKEY_LOCAL_MACHINE;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
else if ( !strcmp( root, "HKEY_USERS" ) )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
root_key = HKEY_USERS;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
else if ( !strcmp( root, "HKEY_PERFORMANCE_DATA" ) )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
root_key = HKEY_PERFORMANCE_DATA;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
else if ( !strcmp( root, "HKEY_CURRENT_CONFIG" ) )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
root_key = HKEY_CURRENT_CONFIG;
|
|
|
|
|
else
|
|
|
|
|
return NULL;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
|
|
|
|
|
if ( RegOpenKeyEx ( 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) )
|
|
|
|
|
return NULL; /* still no need for a RegClose, so return direct */
|
|
|
|
|
}
|
2001-01-30 16:00:50 +00:00
|
|
|
|
|
2002-03-18 00:04:06 +00:00
|
|
|
|
nbytes = 1;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
if ( RegQueryValueEx( 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) )
|
|
|
|
|
return NULL; /* Nope. */
|
|
|
|
|
if (RegQueryValueEx ( key_handle, name, 0, NULL, NULL, &nbytes))
|
|
|
|
|
goto leave;
|
|
|
|
|
}
|
|
|
|
|
result = malloc ( (n1=nbytes+1) );
|
|
|
|
|
if ( !result )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
goto leave;
|
2005-08-26 12:38:57 +00:00
|
|
|
|
if ( RegQueryValueEx ( key_handle, name, 0, &type, result, &n1 ) )
|
2002-03-18 00:04:06 +00:00
|
|
|
|
{
|
2005-08-26 12:38:57 +00:00
|
|
|
|
free(result); result = NULL;
|
2002-03-18 00:04:06 +00:00
|
|
|
|
goto leave;
|
2001-01-30 16:00:50 +00:00
|
|
|
|
}
|
2005-08-26 12:38:57 +00:00
|
|
|
|
result[nbytes] = 0; /* Make sure it is really a string. */
|
|
|
|
|
if (type == REG_EXPAND_SZ && strchr (result, '%'))
|
|
|
|
|
{
|
|
|
|
|
char *tmp;
|
|
|
|
|
|
|
|
|
|
n1 += 1000;
|
|
|
|
|
tmp = malloc (n1+1);
|
|
|
|
|
if (!tmp)
|
|
|
|
|
goto leave;
|
|
|
|
|
nbytes = ExpandEnvironmentStrings (result, tmp, n1);
|
|
|
|
|
if (nbytes && nbytes > n1)
|
|
|
|
|
{
|
|
|
|
|
free (tmp);
|
|
|
|
|
n1 = nbytes;
|
|
|
|
|
tmp = malloc (n1 + 1);
|
|
|
|
|
if (!tmp)
|
|
|
|
|
goto leave;
|
|
|
|
|
nbytes = ExpandEnvironmentStrings (result, tmp, n1);
|
|
|
|
|
if (nbytes && nbytes > n1) {
|
|
|
|
|
free (tmp); /* Oops - truncated, better don't expand at all. */
|
|
|
|
|
goto leave;
|
|
|
|
|
}
|
|
|
|
|
tmp[nbytes] = 0;
|
|
|
|
|
free (result);
|
|
|
|
|
result = tmp;
|
|
|
|
|
}
|
|
|
|
|
else if (nbytes) /* Okay, reduce the length. */
|
|
|
|
|
{
|
|
|
|
|
tmp[nbytes] = 0;
|
|
|
|
|
free (result);
|
|
|
|
|
result = malloc (strlen (tmp)+1);
|
|
|
|
|
if (!result)
|
|
|
|
|
result = tmp;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
strcpy (result, tmp);
|
|
|
|
|
free (tmp);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else /* Error - don't expand. */
|
|
|
|
|
{
|
|
|
|
|
free (tmp);
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-01-30 16:00:50 +00:00
|
|
|
|
|
2002-03-18 00:04:06 +00:00
|
|
|
|
leave:
|
2005-08-26 12:38:57 +00:00
|
|
|
|
RegCloseKey( key_handle );
|
2002-03-18 00:04:06 +00:00
|
|
|
|
return result;
|
2001-01-30 16:00:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-03-18 00:04:06 +00:00
|
|
|
|
|
2005-08-26 12:38:57 +00:00
|
|
|
|
/* 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#if 0
|
2005-08-26 12:38:57 +00:00
|
|
|
|
static char *
|
2001-11-18 03:31:31 +00:00
|
|
|
|
find_program_in_registry (const char *name)
|
|
|
|
|
{
|
|
|
|
|
char *program = NULL;
|
|
|
|
|
|
|
|
|
|
program = read_w32_registry_string (NULL, "Software\\GNU\\GnuPG", name);
|
|
|
|
|
if (program)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
2007-07-17 Marcus Brinkmann <marcus@g10code.de>
* debug.c:;5B Include <errno.h> and "debug.h".
(_gpgme_debug): Save and restore ERRNO.
(TOHEX): New macro.
(_gpgme_debug_buffer): New function.
* conversion.c, data-compat.c, data-mem.c, data.c, engine-gpgsm.c,
gpgme.c, keylist.c, posix-io.c, rungpg.c, sign.c, version.c,
w32-io.c, wait.c: Replace DEBUG macros by TRACE_* variants. In
most of these files, add many more tracepoints.
2007-07-17 12:36:04 +00:00
|
|
|
|
TRACE2 (DEBUG_CTX, "gpgme:find_program_in_registry", 0,
|
|
|
|
|
"found %s in registry: `%s'", name, program);
|
2001-11-18 03:31:31 +00:00
|
|
|
|
for (i = 0; program[i]; i++)
|
|
|
|
|
{
|
|
|
|
|
if (program[i] == '/')
|
|
|
|
|
program[i] = '\\';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return program;
|
|
|
|
|
}
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#endif
|
2001-01-30 16:00:50 +00:00
|
|
|
|
|
2002-03-18 00:04:06 +00:00
|
|
|
|
|
2007-11-28 16:31:05 +00:00
|
|
|
|
static char *
|
|
|
|
|
find_program_in_inst_dir (const char *name)
|
|
|
|
|
{
|
|
|
|
|
char *result = NULL;
|
|
|
|
|
char *tmp;
|
|
|
|
|
|
|
|
|
|
tmp = read_w32_registry_string ("HKEY_LOCAL_MACHINE",
|
assuan/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* assuan-pipe-connect.c (struct spawn_fd_item_s): Add new members.
(HANDLE_TRANSLATION): New macro.
(pipe_connect_gpgme): Adjust caller of _gpgme_io_spawn.
[HANDLE_TRANSLATION]: Return translated handles.
gpgme/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgme-w32spawn.c: New file.
* Makefile.am (libexec_PROGRAMS) [HAVE_W32_SYSTEM]: New variable
with gpgme-w32spawn.
* engine-gpgsm.c (gpgsm_new): Use server translated handles.
(gpgsm_set_locale): Return early if locale value is NULL.
* util.h (_gpgme_mkstemp)
(_gpgme_get_w32spawn_path) [HAVE_W32_SYSTEM]: New function
prototypes.
* w32-util.c: Include <stdint.h>, <sys/stat.h> and <unistd.h>.
(letters, mkstemp, _gpgme_mkstemp, _gpgme_get_w32spawn_path): New
functions.
* rungpg.c (gpg_decrypt, gpg_encrypt, gpg_encrypt_sign)
(gpg_genkey, gpg_import, gpg_verify, gpg_sign): Pass data over
special filename FD rather than stdin.
(struct arg_and_data_s): Add member ARG_LOCP.
(struct fd_data_map_s): Add member ARG_LOC.
(struct engine_gpg): Add member ARG_LOC to status and colon.
(_add_arg, add_arg_with_locp): New function.
(add_arg_ext): Reimplement in terms of _add_arg.
(gpg_new): Remember argument location for status FD.
(build_argv): Set argument location if requested. Also set
argument location of fd_data_map for data items.
(start): Adjust caller of _gpgme_io_spawn.
* priv-io.h (struct spawn_fd_item_s): Add members peer_name and
arg_loc.
(_gpgme_io_spawn): Remove parent fd list argument.
* posix-io.c (get_max_fds): New function.
(_gpgme_io_dup): Add tracing.
(_gpgme_io_spawn): Remove parent fd list. Change meaning of child
fd list to contain all child fds that should be inherited. Close
all other file descriptors after fork.
* w32-io.c, w32-glib-io.c, w32-qt-io.c(_gpgme_io_spawn): Remove
parent fd list. Change meaning of child fd list to contain all
child fds that should be inherited. Do not inherit any file
descriptors, but DuplicateHandle them. Spawn process through
wrapper process. Provide wrapper process with a temporary file
containing handle translation data. Return translated handle
names.
* w32-io.c (reader): Add more tracing output.
(_gpgme_io_read): Likewise.
* engine-gpgconf.c (gpgconf_read): Adjust caller of
_gpgme_io_spawn.
* version.c (_gpgme_get_program_version): Likewise.
2008-06-25 16:52:31 +00:00
|
|
|
|
"Software\\GNU\\GnuPG",
|
|
|
|
|
"Install Directory");
|
2007-11-28 16:31:05 +00:00
|
|
|
|
if (!tmp)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
result = malloc (strlen (tmp) + 1 + strlen (name) + 1);
|
|
|
|
|
if (!result)
|
|
|
|
|
{
|
|
|
|
|
free (tmp);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strcpy (stpcpy (stpcpy (result, tmp), "\\"), name);
|
|
|
|
|
free (tmp);
|
|
|
|
|
if (access (result, F_OK))
|
|
|
|
|
{
|
|
|
|
|
free (result);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Support gpgconf.
gpgme/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (gpgconf_components): New variable.
(main_sources): Add gpgconf.c.
* gpgme.h (gpgme_protocol_t): New protocol GPGME_PROTOCOL_GPGCONF.
(gpgme_conf_level_t, gpgme_conf_type_t, gpgme_conf_arg_t)
(gpgme_conf_opt_t, gpgme_conf_comp_t, gpgme_conf_arg_new)
(gpgme_conf_arg_release, gpgme_conf_opt_change)
(gpgme_conf_release, gpgme_op_conf_load, gpgme_op_conf_save): New
types.
* gpgconf.c, engine-gpgconf.c: New files.
* engine.h: (_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New prototypes.
* op-support.c (_gpgme_op_reset): Ignore not implemented locale
function.
* posix-util.c (_gpgme_get_gpgconf_path): New function.
* w32-util.c (_gpgme_get_gpgconf_path): New function.
* engine-gpgsm.c:
(_gpgme_engine_ops_gpgsm): Add stubs for conf_load and conf_save.
* rungpg.c:
(_gpgme_engine_ops_gpg): Add stubs for conf_load and conf_save.
* gpgme.def: Add new gpgconf related interfaces.
* libgpgme.vers: Likewise.
* util.h (_gpgme_get_gpgconf_path): New prototype.
* gpgme.h (gpgme_protocol_t): Add GPGME_PROTOCOL_GPGCONF.
* engine-backend.h (_gpgme_engine_ops_gpgconf): New prototype.
(struct engine_ops): Add members for conf_load and conf_save.
* engine.c (engine_ops): Add _gpgme_engine_ops_gpgconf.
(_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New functions.
(gpgme_get_engine_info): Allow protocol GPGME_PROTOCOL_GPGCONF.
tests/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpgsm/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS): Add t-gpgconf.
t-gpgconf.c: New file.
2008-01-04 14:31:15 +00:00
|
|
|
|
|
2005-08-26 12:38:57 +00:00
|
|
|
|
static char *
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
result = malloc (strlen (path) + 1 + strlen (name) + 1);
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
strcpy (stpcpy (stpcpy (result, path), "\\"), name);
|
|
|
|
|
if (access (result, F_OK))
|
|
|
|
|
{
|
|
|
|
|
free (result);
|
|
|
|
|
result = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2007-11-28 16:31:05 +00:00
|
|
|
|
|
2001-01-30 16:00:50 +00:00
|
|
|
|
const char *
|
|
|
|
|
_gpgme_get_gpg_path (void)
|
|
|
|
|
{
|
2002-05-09 03:38:12 +00:00
|
|
|
|
static char *gpg_program;
|
|
|
|
|
|
|
|
|
|
LOCK (get_path_lock);
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#if 0
|
2001-11-18 03:31:31 +00:00
|
|
|
|
if (!gpg_program)
|
2005-03-09 16:03:05 +00:00
|
|
|
|
gpg_program = find_program_in_registry ("gpgProgram");
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#endif
|
2005-08-26 12:38:57 +00:00
|
|
|
|
if (!gpg_program)
|
2007-11-28 16:31:05 +00:00
|
|
|
|
gpg_program = find_program_in_inst_dir ("gpg.exe");
|
2001-11-18 03:31:31 +00:00
|
|
|
|
if (!gpg_program)
|
2007-11-28 16:31:05 +00:00
|
|
|
|
gpg_program = find_program_at_standard_place ("GNU\\GnuPG\\gpg.exe");
|
2002-05-09 03:38:12 +00:00
|
|
|
|
UNLOCK (get_path_lock);
|
2001-11-18 03:31:31 +00:00
|
|
|
|
return gpg_program;
|
2001-01-30 16:00:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Support gpgconf.
gpgme/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (gpgconf_components): New variable.
(main_sources): Add gpgconf.c.
* gpgme.h (gpgme_protocol_t): New protocol GPGME_PROTOCOL_GPGCONF.
(gpgme_conf_level_t, gpgme_conf_type_t, gpgme_conf_arg_t)
(gpgme_conf_opt_t, gpgme_conf_comp_t, gpgme_conf_arg_new)
(gpgme_conf_arg_release, gpgme_conf_opt_change)
(gpgme_conf_release, gpgme_op_conf_load, gpgme_op_conf_save): New
types.
* gpgconf.c, engine-gpgconf.c: New files.
* engine.h: (_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New prototypes.
* op-support.c (_gpgme_op_reset): Ignore not implemented locale
function.
* posix-util.c (_gpgme_get_gpgconf_path): New function.
* w32-util.c (_gpgme_get_gpgconf_path): New function.
* engine-gpgsm.c:
(_gpgme_engine_ops_gpgsm): Add stubs for conf_load and conf_save.
* rungpg.c:
(_gpgme_engine_ops_gpg): Add stubs for conf_load and conf_save.
* gpgme.def: Add new gpgconf related interfaces.
* libgpgme.vers: Likewise.
* util.h (_gpgme_get_gpgconf_path): New prototype.
* gpgme.h (gpgme_protocol_t): Add GPGME_PROTOCOL_GPGCONF.
* engine-backend.h (_gpgme_engine_ops_gpgconf): New prototype.
(struct engine_ops): Add members for conf_load and conf_save.
* engine.c (engine_ops): Add _gpgme_engine_ops_gpgconf.
(_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New functions.
(gpgme_get_engine_info): Allow protocol GPGME_PROTOCOL_GPGCONF.
tests/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpgsm/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS): Add t-gpgconf.
t-gpgconf.c: New file.
2008-01-04 14:31:15 +00:00
|
|
|
|
|
2001-11-18 03:31:31 +00:00
|
|
|
|
const char *
|
|
|
|
|
_gpgme_get_gpgsm_path (void)
|
|
|
|
|
{
|
2002-05-09 03:38:12 +00:00
|
|
|
|
static char *gpgsm_program;
|
|
|
|
|
|
|
|
|
|
LOCK (get_path_lock);
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#if 0
|
2001-11-18 03:31:31 +00:00
|
|
|
|
if (!gpgsm_program)
|
2005-03-09 16:03:05 +00:00
|
|
|
|
gpgsm_program = find_program_in_registry ("gpgsmProgram");
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#endif
|
2005-08-26 12:38:57 +00:00
|
|
|
|
if (!gpgsm_program)
|
2007-11-28 16:31:05 +00:00
|
|
|
|
gpgsm_program = find_program_in_inst_dir ("gpgsm.exe");
|
2001-11-18 03:31:31 +00:00
|
|
|
|
if (!gpgsm_program)
|
2007-11-28 16:31:05 +00:00
|
|
|
|
gpgsm_program = find_program_at_standard_place ("GNU\\GnuPG\\gpgsm.exe");
|
2002-05-09 03:38:12 +00:00
|
|
|
|
UNLOCK (get_path_lock);
|
2001-11-18 03:31:31 +00:00
|
|
|
|
return gpgsm_program;
|
|
|
|
|
}
|
2006-01-26 10:23:15 +00:00
|
|
|
|
|
|
|
|
|
|
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Support gpgconf.
gpgme/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (gpgconf_components): New variable.
(main_sources): Add gpgconf.c.
* gpgme.h (gpgme_protocol_t): New protocol GPGME_PROTOCOL_GPGCONF.
(gpgme_conf_level_t, gpgme_conf_type_t, gpgme_conf_arg_t)
(gpgme_conf_opt_t, gpgme_conf_comp_t, gpgme_conf_arg_new)
(gpgme_conf_arg_release, gpgme_conf_opt_change)
(gpgme_conf_release, gpgme_op_conf_load, gpgme_op_conf_save): New
types.
* gpgconf.c, engine-gpgconf.c: New files.
* engine.h: (_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New prototypes.
* op-support.c (_gpgme_op_reset): Ignore not implemented locale
function.
* posix-util.c (_gpgme_get_gpgconf_path): New function.
* w32-util.c (_gpgme_get_gpgconf_path): New function.
* engine-gpgsm.c:
(_gpgme_engine_ops_gpgsm): Add stubs for conf_load and conf_save.
* rungpg.c:
(_gpgme_engine_ops_gpg): Add stubs for conf_load and conf_save.
* gpgme.def: Add new gpgconf related interfaces.
* libgpgme.vers: Likewise.
* util.h (_gpgme_get_gpgconf_path): New prototype.
* gpgme.h (gpgme_protocol_t): Add GPGME_PROTOCOL_GPGCONF.
* engine-backend.h (_gpgme_engine_ops_gpgconf): New prototype.
(struct engine_ops): Add members for conf_load and conf_save.
* engine.c (engine_ops): Add _gpgme_engine_ops_gpgconf.
(_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New functions.
(gpgme_get_engine_info): Allow protocol GPGME_PROTOCOL_GPGCONF.
tests/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpgsm/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS): Add t-gpgconf.
t-gpgconf.c: New file.
2008-01-04 14:31:15 +00:00
|
|
|
|
const char *
|
|
|
|
|
_gpgme_get_gpgconf_path (void)
|
|
|
|
|
{
|
|
|
|
|
static char *gpgconf_program;
|
|
|
|
|
|
|
|
|
|
LOCK (get_path_lock);
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#if 0
|
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Support gpgconf.
gpgme/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (gpgconf_components): New variable.
(main_sources): Add gpgconf.c.
* gpgme.h (gpgme_protocol_t): New protocol GPGME_PROTOCOL_GPGCONF.
(gpgme_conf_level_t, gpgme_conf_type_t, gpgme_conf_arg_t)
(gpgme_conf_opt_t, gpgme_conf_comp_t, gpgme_conf_arg_new)
(gpgme_conf_arg_release, gpgme_conf_opt_change)
(gpgme_conf_release, gpgme_op_conf_load, gpgme_op_conf_save): New
types.
* gpgconf.c, engine-gpgconf.c: New files.
* engine.h: (_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New prototypes.
* op-support.c (_gpgme_op_reset): Ignore not implemented locale
function.
* posix-util.c (_gpgme_get_gpgconf_path): New function.
* w32-util.c (_gpgme_get_gpgconf_path): New function.
* engine-gpgsm.c:
(_gpgme_engine_ops_gpgsm): Add stubs for conf_load and conf_save.
* rungpg.c:
(_gpgme_engine_ops_gpg): Add stubs for conf_load and conf_save.
* gpgme.def: Add new gpgconf related interfaces.
* libgpgme.vers: Likewise.
* util.h (_gpgme_get_gpgconf_path): New prototype.
* gpgme.h (gpgme_protocol_t): Add GPGME_PROTOCOL_GPGCONF.
* engine-backend.h (_gpgme_engine_ops_gpgconf): New prototype.
(struct engine_ops): Add members for conf_load and conf_save.
* engine.c (engine_ops): Add _gpgme_engine_ops_gpgconf.
(_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New functions.
(gpgme_get_engine_info): Allow protocol GPGME_PROTOCOL_GPGCONF.
tests/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpgsm/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS): Add t-gpgconf.
t-gpgconf.c: New file.
2008-01-04 14:31:15 +00:00
|
|
|
|
if (!gpgconf_program)
|
|
|
|
|
gpgconf_program = find_program_in_registry ("gpgconfProgram");
|
2008-10-17 23:10:26 +00:00
|
|
|
|
#endif
|
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* configure.ac: Support gpgconf.
gpgme/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (gpgconf_components): New variable.
(main_sources): Add gpgconf.c.
* gpgme.h (gpgme_protocol_t): New protocol GPGME_PROTOCOL_GPGCONF.
(gpgme_conf_level_t, gpgme_conf_type_t, gpgme_conf_arg_t)
(gpgme_conf_opt_t, gpgme_conf_comp_t, gpgme_conf_arg_new)
(gpgme_conf_arg_release, gpgme_conf_opt_change)
(gpgme_conf_release, gpgme_op_conf_load, gpgme_op_conf_save): New
types.
* gpgconf.c, engine-gpgconf.c: New files.
* engine.h: (_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New prototypes.
* op-support.c (_gpgme_op_reset): Ignore not implemented locale
function.
* posix-util.c (_gpgme_get_gpgconf_path): New function.
* w32-util.c (_gpgme_get_gpgconf_path): New function.
* engine-gpgsm.c:
(_gpgme_engine_ops_gpgsm): Add stubs for conf_load and conf_save.
* rungpg.c:
(_gpgme_engine_ops_gpg): Add stubs for conf_load and conf_save.
* gpgme.def: Add new gpgconf related interfaces.
* libgpgme.vers: Likewise.
* util.h (_gpgme_get_gpgconf_path): New prototype.
* gpgme.h (gpgme_protocol_t): Add GPGME_PROTOCOL_GPGCONF.
* engine-backend.h (_gpgme_engine_ops_gpgconf): New prototype.
(struct engine_ops): Add members for conf_load and conf_save.
* engine.c (engine_ops): Add _gpgme_engine_ops_gpgconf.
(_gpgme_engine_op_conf_load,
(_gpgme_engine_op_conf_save): New functions.
(gpgme_get_engine_info): Allow protocol GPGME_PROTOCOL_GPGCONF.
tests/
2008-01-04 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpgsm/Makefile.am (TESTS_ENVIRONMENT): Use absolute path for
GNUPGHOME.
* gpg/Makefile.am (TESTS): Add t-gpgconf.
t-gpgconf.c: New file.
2008-01-04 14:31:15 +00:00
|
|
|
|
if (!gpgconf_program)
|
|
|
|
|
gpgconf_program = find_program_in_inst_dir ("gpgconf.exe");
|
|
|
|
|
if (!gpgconf_program)
|
|
|
|
|
gpgconf_program
|
|
|
|
|
= find_program_at_standard_place ("GNU\\GnuPG\\gpgconf.exe");
|
|
|
|
|
UNLOCK (get_path_lock);
|
|
|
|
|
return gpgconf_program;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
assuan/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* assuan-pipe-connect.c (struct spawn_fd_item_s): Add new members.
(HANDLE_TRANSLATION): New macro.
(pipe_connect_gpgme): Adjust caller of _gpgme_io_spawn.
[HANDLE_TRANSLATION]: Return translated handles.
gpgme/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgme-w32spawn.c: New file.
* Makefile.am (libexec_PROGRAMS) [HAVE_W32_SYSTEM]: New variable
with gpgme-w32spawn.
* engine-gpgsm.c (gpgsm_new): Use server translated handles.
(gpgsm_set_locale): Return early if locale value is NULL.
* util.h (_gpgme_mkstemp)
(_gpgme_get_w32spawn_path) [HAVE_W32_SYSTEM]: New function
prototypes.
* w32-util.c: Include <stdint.h>, <sys/stat.h> and <unistd.h>.
(letters, mkstemp, _gpgme_mkstemp, _gpgme_get_w32spawn_path): New
functions.
* rungpg.c (gpg_decrypt, gpg_encrypt, gpg_encrypt_sign)
(gpg_genkey, gpg_import, gpg_verify, gpg_sign): Pass data over
special filename FD rather than stdin.
(struct arg_and_data_s): Add member ARG_LOCP.
(struct fd_data_map_s): Add member ARG_LOC.
(struct engine_gpg): Add member ARG_LOC to status and colon.
(_add_arg, add_arg_with_locp): New function.
(add_arg_ext): Reimplement in terms of _add_arg.
(gpg_new): Remember argument location for status FD.
(build_argv): Set argument location if requested. Also set
argument location of fd_data_map for data items.
(start): Adjust caller of _gpgme_io_spawn.
* priv-io.h (struct spawn_fd_item_s): Add members peer_name and
arg_loc.
(_gpgme_io_spawn): Remove parent fd list argument.
* posix-io.c (get_max_fds): New function.
(_gpgme_io_dup): Add tracing.
(_gpgme_io_spawn): Remove parent fd list. Change meaning of child
fd list to contain all child fds that should be inherited. Close
all other file descriptors after fork.
* w32-io.c, w32-glib-io.c, w32-qt-io.c(_gpgme_io_spawn): Remove
parent fd list. Change meaning of child fd list to contain all
child fds that should be inherited. Do not inherit any file
descriptors, but DuplicateHandle them. Spawn process through
wrapper process. Provide wrapper process with a temporary file
containing handle translation data. Return translated handle
names.
* w32-io.c (reader): Add more tracing output.
(_gpgme_io_read): Likewise.
* engine-gpgconf.c (gpgconf_read): Adjust caller of
_gpgme_io_spawn.
* version.c (_gpgme_get_program_version): Likewise.
2008-06-25 16:52:31 +00:00
|
|
|
|
const char *
|
|
|
|
|
_gpgme_get_w32spawn_path (void)
|
|
|
|
|
{
|
|
|
|
|
static char *w32spawn_program;
|
|
|
|
|
|
|
|
|
|
LOCK (get_path_lock);
|
|
|
|
|
if (!w32spawn_program)
|
|
|
|
|
w32spawn_program = find_program_in_inst_dir ("gpgme-w32spawn.exe");
|
|
|
|
|
if (!w32spawn_program)
|
|
|
|
|
w32spawn_program
|
|
|
|
|
= find_program_at_standard_place ("GNU\\GnuPG\\gpgme-w32spawn.exe");
|
|
|
|
|
UNLOCK (get_path_lock);
|
|
|
|
|
return w32spawn_program;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2006-01-26 10:23:15 +00:00
|
|
|
|
/* Return an integer value from gpgme specific configuration
|
|
|
|
|
entries. VALUE receives that value; function returns true if a value
|
|
|
|
|
has been configured and false if not. */
|
|
|
|
|
int
|
|
|
|
|
_gpgme_get_conf_int (const char *key, int *value)
|
|
|
|
|
{
|
|
|
|
|
char *tmp = read_w32_registry_string (NULL, "Software\\GNU\\gpgme", key);
|
|
|
|
|
if (!tmp)
|
|
|
|
|
return 0;
|
|
|
|
|
*value = atoi (tmp);
|
|
|
|
|
free (tmp);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
2008-02-14 19:51:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-12 16:58:45 +00:00
|
|
|
|
_gpgme_allow_set_foreground_window (pid_t pid)
|
2008-02-14 19:51:21 +00:00
|
|
|
|
{
|
|
|
|
|
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))
|
2009-06-12 16:58:45 +00:00
|
|
|
|
{
|
|
|
|
|
TRACE1 (DEBUG_ENGINE, "gpgme:AllowSetForegroundWindow", 0,
|
|
|
|
|
"no action for pid %d", (int)pid);
|
|
|
|
|
}
|
2008-02-14 19:51:21 +00:00
|
|
|
|
else if (func)
|
2009-06-12 16:58:45 +00:00
|
|
|
|
{
|
|
|
|
|
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");
|
|
|
|
|
}
|
2008-02-14 19:51:21 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
assuan/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* assuan-pipe-connect.c (struct spawn_fd_item_s): Add new members.
(HANDLE_TRANSLATION): New macro.
(pipe_connect_gpgme): Adjust caller of _gpgme_io_spawn.
[HANDLE_TRANSLATION]: Return translated handles.
gpgme/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgme-w32spawn.c: New file.
* Makefile.am (libexec_PROGRAMS) [HAVE_W32_SYSTEM]: New variable
with gpgme-w32spawn.
* engine-gpgsm.c (gpgsm_new): Use server translated handles.
(gpgsm_set_locale): Return early if locale value is NULL.
* util.h (_gpgme_mkstemp)
(_gpgme_get_w32spawn_path) [HAVE_W32_SYSTEM]: New function
prototypes.
* w32-util.c: Include <stdint.h>, <sys/stat.h> and <unistd.h>.
(letters, mkstemp, _gpgme_mkstemp, _gpgme_get_w32spawn_path): New
functions.
* rungpg.c (gpg_decrypt, gpg_encrypt, gpg_encrypt_sign)
(gpg_genkey, gpg_import, gpg_verify, gpg_sign): Pass data over
special filename FD rather than stdin.
(struct arg_and_data_s): Add member ARG_LOCP.
(struct fd_data_map_s): Add member ARG_LOC.
(struct engine_gpg): Add member ARG_LOC to status and colon.
(_add_arg, add_arg_with_locp): New function.
(add_arg_ext): Reimplement in terms of _add_arg.
(gpg_new): Remember argument location for status FD.
(build_argv): Set argument location if requested. Also set
argument location of fd_data_map for data items.
(start): Adjust caller of _gpgme_io_spawn.
* priv-io.h (struct spawn_fd_item_s): Add members peer_name and
arg_loc.
(_gpgme_io_spawn): Remove parent fd list argument.
* posix-io.c (get_max_fds): New function.
(_gpgme_io_dup): Add tracing.
(_gpgme_io_spawn): Remove parent fd list. Change meaning of child
fd list to contain all child fds that should be inherited. Close
all other file descriptors after fork.
* w32-io.c, w32-glib-io.c, w32-qt-io.c(_gpgme_io_spawn): Remove
parent fd list. Change meaning of child fd list to contain all
child fds that should be inherited. Do not inherit any file
descriptors, but DuplicateHandle them. Spawn process through
wrapper process. Provide wrapper process with a temporary file
containing handle translation data. Return translated handle
names.
* w32-io.c (reader): Add more tracing output.
(_gpgme_io_read): Likewise.
* engine-gpgconf.c (gpgconf_read): Adjust caller of
_gpgme_io_spawn.
* version.c (_gpgme_get_program_version): Likewise.
2008-06-25 16:52:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* mkstemp extracted from libc/sysdeps/posix/tempname.c. Copyright
|
|
|
|
|
(C) 1991-1999, 2000, 2001, 2006 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
|
version 2.1 of the License, or (at your option) any later version. */
|
|
|
|
|
|
|
|
|
|
static const char letters[] =
|
|
|
|
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
|
|
|
|
|
|
|
|
/* Generate a temporary file name based on TMPL. TMPL must match the
|
|
|
|
|
rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed
|
|
|
|
|
does not exist at the time of the call to mkstemp. TMPL is
|
|
|
|
|
overwritten with the result. */
|
|
|
|
|
static int
|
|
|
|
|
mkstemp (char *tmpl)
|
|
|
|
|
{
|
|
|
|
|
int len;
|
|
|
|
|
char *XXXXXX;
|
|
|
|
|
static uint64_t value;
|
|
|
|
|
uint64_t random_time_bits;
|
|
|
|
|
unsigned int count;
|
|
|
|
|
int fd = -1;
|
|
|
|
|
int save_errno = errno;
|
|
|
|
|
|
|
|
|
|
/* A lower bound on the number of temporary files to attempt to
|
|
|
|
|
generate. The maximum total number of temporary file names that
|
|
|
|
|
can exist for a given template is 62**6. It should never be
|
|
|
|
|
necessary to try all these combinations. Instead if a reasonable
|
|
|
|
|
number of names is tried (we define reasonable as 62**3) fail to
|
|
|
|
|
give the system administrator the chance to remove the problems. */
|
|
|
|
|
#define ATTEMPTS_MIN (62 * 62 * 62)
|
|
|
|
|
|
|
|
|
|
/* The number of times to attempt to generate a temporary file. To
|
|
|
|
|
conform to POSIX, this must be no smaller than TMP_MAX. */
|
|
|
|
|
#if ATTEMPTS_MIN < TMP_MAX
|
|
|
|
|
unsigned int attempts = TMP_MAX;
|
|
|
|
|
#else
|
|
|
|
|
unsigned int attempts = ATTEMPTS_MIN;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
len = strlen (tmpl);
|
|
|
|
|
if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX"))
|
|
|
|
|
{
|
|
|
|
|
errno = EINVAL;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This is where the Xs start. */
|
|
|
|
|
XXXXXX = &tmpl[len - 6];
|
|
|
|
|
|
|
|
|
|
/* Get some more or less random data. */
|
|
|
|
|
{
|
2008-06-26 14:38:39 +00:00
|
|
|
|
FILETIME ft;
|
|
|
|
|
|
|
|
|
|
GetSystemTimeAsFileTime (&ft);
|
|
|
|
|
random_time_bits = (((uint64_t)ft.dwHighDateTime << 32)
|
|
|
|
|
| (uint64_t)ft.dwLowDateTime);
|
assuan/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* assuan-pipe-connect.c (struct spawn_fd_item_s): Add new members.
(HANDLE_TRANSLATION): New macro.
(pipe_connect_gpgme): Adjust caller of _gpgme_io_spawn.
[HANDLE_TRANSLATION]: Return translated handles.
gpgme/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgme-w32spawn.c: New file.
* Makefile.am (libexec_PROGRAMS) [HAVE_W32_SYSTEM]: New variable
with gpgme-w32spawn.
* engine-gpgsm.c (gpgsm_new): Use server translated handles.
(gpgsm_set_locale): Return early if locale value is NULL.
* util.h (_gpgme_mkstemp)
(_gpgme_get_w32spawn_path) [HAVE_W32_SYSTEM]: New function
prototypes.
* w32-util.c: Include <stdint.h>, <sys/stat.h> and <unistd.h>.
(letters, mkstemp, _gpgme_mkstemp, _gpgme_get_w32spawn_path): New
functions.
* rungpg.c (gpg_decrypt, gpg_encrypt, gpg_encrypt_sign)
(gpg_genkey, gpg_import, gpg_verify, gpg_sign): Pass data over
special filename FD rather than stdin.
(struct arg_and_data_s): Add member ARG_LOCP.
(struct fd_data_map_s): Add member ARG_LOC.
(struct engine_gpg): Add member ARG_LOC to status and colon.
(_add_arg, add_arg_with_locp): New function.
(add_arg_ext): Reimplement in terms of _add_arg.
(gpg_new): Remember argument location for status FD.
(build_argv): Set argument location if requested. Also set
argument location of fd_data_map for data items.
(start): Adjust caller of _gpgme_io_spawn.
* priv-io.h (struct spawn_fd_item_s): Add members peer_name and
arg_loc.
(_gpgme_io_spawn): Remove parent fd list argument.
* posix-io.c (get_max_fds): New function.
(_gpgme_io_dup): Add tracing.
(_gpgme_io_spawn): Remove parent fd list. Change meaning of child
fd list to contain all child fds that should be inherited. Close
all other file descriptors after fork.
* w32-io.c, w32-glib-io.c, w32-qt-io.c(_gpgme_io_spawn): Remove
parent fd list. Change meaning of child fd list to contain all
child fds that should be inherited. Do not inherit any file
descriptors, but DuplicateHandle them. Spawn process through
wrapper process. Provide wrapper process with a temporary file
containing handle translation data. Return translated handle
names.
* w32-io.c (reader): Add more tracing output.
(_gpgme_io_read): Likewise.
* engine-gpgconf.c (gpgconf_read): Adjust caller of
_gpgme_io_spawn.
* version.c (_gpgme_get_program_version): Likewise.
2008-06-25 16:52:31 +00:00
|
|
|
|
}
|
|
|
|
|
value += random_time_bits ^ getpid ();
|
|
|
|
|
|
|
|
|
|
for (count = 0; count < attempts; value += 7777, ++count)
|
|
|
|
|
{
|
|
|
|
|
uint64_t v = value;
|
|
|
|
|
|
|
|
|
|
/* Fill in the random bits. */
|
|
|
|
|
XXXXXX[0] = letters[v % 62];
|
|
|
|
|
v /= 62;
|
|
|
|
|
XXXXXX[1] = letters[v % 62];
|
|
|
|
|
v /= 62;
|
|
|
|
|
XXXXXX[2] = letters[v % 62];
|
|
|
|
|
v /= 62;
|
|
|
|
|
XXXXXX[3] = letters[v % 62];
|
|
|
|
|
v /= 62;
|
|
|
|
|
XXXXXX[4] = letters[v % 62];
|
|
|
|
|
v /= 62;
|
|
|
|
|
XXXXXX[5] = letters[v % 62];
|
|
|
|
|
|
|
|
|
|
fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
|
|
|
|
|
if (fd >= 0)
|
|
|
|
|
{
|
|
|
|
|
errno = save_errno;
|
|
|
|
|
return fd;
|
|
|
|
|
}
|
|
|
|
|
else if (errno != EEXIST)
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We got out of the loop because we ran out of combinations to try. */
|
|
|
|
|
errno = EEXIST;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
_gpgme_mkstemp (int *fd, char **name)
|
|
|
|
|
{
|
|
|
|
|
char tmp[MAX_PATH + 2];
|
|
|
|
|
char *tmpname;
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
*fd = -1;
|
|
|
|
|
*name = NULL;
|
|
|
|
|
|
|
|
|
|
err = GetTempPath (MAX_PATH + 1, tmp);
|
|
|
|
|
if (err == 0 || err > MAX_PATH + 1)
|
|
|
|
|
strcpy (tmp,"c:\\windows\\temp");
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
int len = strlen(tmp);
|
|
|
|
|
|
|
|
|
|
/* GetTempPath may return with \ on the end */
|
|
|
|
|
while(len > 0 && tmp[len - 1] == '\\')
|
|
|
|
|
{
|
|
|
|
|
tmp[len-1] = '\0';
|
|
|
|
|
len--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tmpname = malloc (strlen (tmp) + 13 + 1);
|
|
|
|
|
if (!tmpname)
|
|
|
|
|
return -1;
|
2008-06-26 14:38:39 +00:00
|
|
|
|
strcpy (stpcpy (tmpname, tmp), "\\gpgme-XXXXXX");
|
assuan/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* assuan-pipe-connect.c (struct spawn_fd_item_s): Add new members.
(HANDLE_TRANSLATION): New macro.
(pipe_connect_gpgme): Adjust caller of _gpgme_io_spawn.
[HANDLE_TRANSLATION]: Return translated handles.
gpgme/
2008-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgme-w32spawn.c: New file.
* Makefile.am (libexec_PROGRAMS) [HAVE_W32_SYSTEM]: New variable
with gpgme-w32spawn.
* engine-gpgsm.c (gpgsm_new): Use server translated handles.
(gpgsm_set_locale): Return early if locale value is NULL.
* util.h (_gpgme_mkstemp)
(_gpgme_get_w32spawn_path) [HAVE_W32_SYSTEM]: New function
prototypes.
* w32-util.c: Include <stdint.h>, <sys/stat.h> and <unistd.h>.
(letters, mkstemp, _gpgme_mkstemp, _gpgme_get_w32spawn_path): New
functions.
* rungpg.c (gpg_decrypt, gpg_encrypt, gpg_encrypt_sign)
(gpg_genkey, gpg_import, gpg_verify, gpg_sign): Pass data over
special filename FD rather than stdin.
(struct arg_and_data_s): Add member ARG_LOCP.
(struct fd_data_map_s): Add member ARG_LOC.
(struct engine_gpg): Add member ARG_LOC to status and colon.
(_add_arg, add_arg_with_locp): New function.
(add_arg_ext): Reimplement in terms of _add_arg.
(gpg_new): Remember argument location for status FD.
(build_argv): Set argument location if requested. Also set
argument location of fd_data_map for data items.
(start): Adjust caller of _gpgme_io_spawn.
* priv-io.h (struct spawn_fd_item_s): Add members peer_name and
arg_loc.
(_gpgme_io_spawn): Remove parent fd list argument.
* posix-io.c (get_max_fds): New function.
(_gpgme_io_dup): Add tracing.
(_gpgme_io_spawn): Remove parent fd list. Change meaning of child
fd list to contain all child fds that should be inherited. Close
all other file descriptors after fork.
* w32-io.c, w32-glib-io.c, w32-qt-io.c(_gpgme_io_spawn): Remove
parent fd list. Change meaning of child fd list to contain all
child fds that should be inherited. Do not inherit any file
descriptors, but DuplicateHandle them. Spawn process through
wrapper process. Provide wrapper process with a temporary file
containing handle translation data. Return translated handle
names.
* w32-io.c (reader): Add more tracing output.
(_gpgme_io_read): Likewise.
* engine-gpgconf.c (gpgconf_read): Adjust caller of
_gpgme_io_spawn.
* version.c (_gpgme_get_program_version): Likewise.
2008-06-25 16:52:31 +00:00
|
|
|
|
*fd = mkstemp (tmpname);
|
|
|
|
|
if (fd < 0)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
*name = tmpname;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|