diff --git a/configure.ac b/configure.ac index e29c84ede..0bdd90ed7 100644 --- a/configure.ac +++ b/configure.ac @@ -677,7 +677,6 @@ have_w32_system=no have_w32ce_system=no have_android_system=no use_simple_gettext=no -use_ldapwrapper=yes mmap_needed=yes require_pipe_to_unblock_pselect=yes case "${host}" in @@ -1219,17 +1218,8 @@ fi AM_CONDITIONAL(USE_LDAP, [test "$gnupg_have_ldap" = yes]) if test "$gnupg_have_ldap" = yes ; then AC_DEFINE(USE_LDAP,1,[Defined if LDAP is support]) -else - use_ldapwrapper=no fi -if test "$use_ldapwrapper" = yes; then - AC_DEFINE(USE_LDAPWRAPPER,1, [Build dirmngr with LDAP wrapper process]) -fi -AM_CONDITIONAL(USE_LDAPWRAPPER, test "$use_ldapwrapper" = yes) - - - # # Check for sendmail diff --git a/dirmngr/Makefile.am b/dirmngr/Makefile.am index 619115322..b19728496 100644 --- a/dirmngr/Makefile.am +++ b/dirmngr/Makefile.am @@ -29,8 +29,10 @@ dist_pkgdata_DATA = sks-keyservers.netCA.pem bin_PROGRAMS = dirmngr dirmngr-client -if USE_LDAPWRAPPER +if USE_LDAP libexec_PROGRAMS = dirmngr_ldap +else +libexec_PROGRAMS = endif noinst_PROGRAMS = $(module_tests) $(module_net_tests) $(module_maint_tests) @@ -56,12 +58,6 @@ else ldap_url = endif -if USE_LDAPWRAPPER -extraldap_src = ldap-wrapper.c -else -extraldap_src = ldap-wrapper-ce.c dirmngr_ldap.c -endif - noinst_HEADERS = dirmngr.h crlcache.h crlfetch.h misc.h dirmngr_SOURCES = dirmngr.c dirmngr.h server.c crlcache.c crlfetch.c \ @@ -84,7 +80,7 @@ if USE_LDAP dirmngr_SOURCES += ldapserver.h ldapserver.c ldap.c w32-ldap-help.h \ ldap-wrapper.h ldap-parse-uri.c ldap-parse-uri.h \ ldap-misc.c ldap-misc.h \ - ks-engine-ldap.c $(ldap_url) $(extraldap_src) + ks-engine-ldap.c $(ldap_url) ldap-wrapper.c ldaplibs = $(LDAPLIBS) else ldaplibs = @@ -106,12 +102,9 @@ dirmngr_LDADD = $(libcommonpth) \ if USE_LDAP dirmngr_LDADD += $(ldaplibs) endif -if !USE_LDAPWRAPPER -dirmngr_LDADD += $(ldaplibs) -endif dirmngr_LDFLAGS = $(extra_bin_ldflags) -if USE_LDAPWRAPPER +if USE_LDAP dirmngr_ldap_SOURCES = dirmngr_ldap.c ldap-misc.c ldap-misc.h $(ldap_url) dirmngr_ldap_CFLAGS = $(GPG_ERROR_CFLAGS) $(LIBGCRYPT_CFLAGS) dirmngr_ldap_LDFLAGS = diff --git a/dirmngr/ldap-wrapper-ce.c b/dirmngr/ldap-wrapper-ce.c deleted file mode 100644 index 884bb325d..000000000 --- a/dirmngr/ldap-wrapper-ce.c +++ /dev/null @@ -1,575 +0,0 @@ -/* ldap-wrapper-ce.c - LDAP access via W32 threads - * Copyright (C) 2010 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 3 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, see . - */ - -/* - Alternative wrapper for use with WindowsCE. Under WindowsCE the - number of processes is strongly limited (32 processes including the - kernel processes) and thus we don't use the process approach but - implement a wrapper based on native threads. - - See ldap-wrapper.c for the standard wrapper interface. - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dirmngr.h" -#include "misc.h" -#include "ldap-wrapper.h" - -#ifdef USE_LDAPWRAPPER -# error This module is not expected to be build. -#endif -#error This module might not anymore work. - - - -/* Read a fixed amount of data from READER into BUFFER. */ -static gpg_error_t -read_buffer (ksba_reader_t reader, unsigned char *buffer, size_t count) -{ - gpg_error_t err; - size_t nread; - - while (count) - { - err = ksba_reader_read (reader, buffer, count, &nread); - if (err) - return err; - buffer += nread; - count -= nread; - } - return 0; -} - - - - -/* Start the reaper thread for this wrapper. */ -void -ldap_wrapper_launch_thread (void) -{ - /* Not required. */ -} - - - - - -/* Wait until all ldap wrappers have terminated. We assume that the - kill has already been sent to all of them. */ -void -ldap_wrapper_wait_connections () -{ - /* Not required. */ -} - - -/* Cleanup all resources held by the connection associated with - CTRL. This is used after a cancel to kill running wrappers. */ -void -ldap_wrapper_connection_cleanup (ctrl_t ctrl) -{ - (void)ctrl; - - /* Not required. */ -} - - - -/* The cookie we use to implement the outstream of the wrapper thread. */ -struct outstream_cookie_s -{ - int refcount; /* Reference counter - possible values are 1 and 2. */ - - /* We don't need a mutex for the conditions, as npth provides a - simpler condition interface that relies on the global lock. This - can be used if we never yield between testing the condition and - waiting on it. */ - npth_cond_t wait_data; /* Condition that data is available. */ - npth_cond_t wait_space; /* Condition that space is available. */ - - int eof_seen; /* EOF indicator. */ - char buffer[4000]; /* Data ring buffer. */ - size_t buffer_len; /* The amount of data in the BUFFER. */ - size_t buffer_pos; /* The next read position of the BUFFER. */ - size_t buffer_read_pos; /* The next read position of the BUFFER. */ -}; - -#define BUFFER_EMPTY(c) ((c)->buffer_len == 0) -#define BUFFER_FULL(c) ((c)->buffer_len == DIM((c)->buffer)) -#define BUFFER_DATA_AVAILABLE(c) ((c)->buffer_len) -#define BUFFER_SPACE_AVAILABLE(c) (DIM((c)->buffer) - (c)->buffer_len) -#define BUFFER_INC_POS(c,n) (c)->buffer_pos = ((c)->buffer_pos + (n)) % DIM((c)->buffer) -#define BUFFER_CUR_POS(c) (&(c)->buffer[(c)->buffer_pos]) -#define BUFFER_INC_READ_POS(c,n) (c)->buffer_read_pos = ((c)->buffer_read_pos + (n)) % DIM((c)->buffer) -#define BUFFER_CUR_READ_POS(c) (&(c)->buffer[(c)->buffer_read_pos]) - -static int -buffer_get_data (struct outstream_cookie_s *cookie, char *dst, int cnt) -{ - int amount; - int left; - int chunk; - - amount = cnt; - if (BUFFER_DATA_AVAILABLE (cookie) < amount) - amount = BUFFER_DATA_AVAILABLE (cookie); - left = amount; - - /* How large is the part up to the end of the buffer array? */ - chunk = DIM(cookie->buffer) - cookie->buffer_pos; - if (chunk > left) - chunk = left; - - memcpy (dst, BUFFER_CUR_READ_POS (cookie), chunk); - BUFFER_INC_READ_POS (cookie, chunk); - left -= chunk; - dst += chunk; - - if (left) - { - memcpy (dst, BUFFER_CUR_READ_POS (cookie), left); - BUFFER_INC_READ_POS (cookie, left); - } - - return amount; -} - - -static int -buffer_put_data (struct outstream_cookie_s *cookie, const char *src, int cnt) -{ - int amount; - int remain; - int left; - int chunk; - - remain = DIM(cookie->buffer) - cookie->buffer_len; - - amount = cnt; - if (remain < amount) - amount = remain; - left = amount; - - /* How large is the part up to the end of the buffer array? */ - chunk = DIM(cookie->buffer) - cookie->buffer_pos; - if (chunk > left) - chunk = left; - - memcpy (BUFFER_CUR_POS (cookie), src, chunk); - BUFFER_INC_POS (cookie, chunk); - left -= chunk; - src += chunk; - - if (left) - { - memcpy (BUFFER_CUR_POS (cookie), src, left); - BUFFER_INC_POS (cookie, left); - } - - cookie->buffer_len -= amount; - return amount; -} - - -/* The writer function for the outstream. This is used to transfer - the output of the ldap wrapper thread to the ksba reader object. */ -static gpgrt_ssize_t -outstream_cookie_writer (void *cookie_arg, const void *buffer, size_t size) -{ - struct outstream_cookie_s *cookie = cookie_arg; - const char *src; - ssize_t nwritten = 0; - int res; - ssize_t amount = 0; - - src = buffer; - do - { - int was_empty = 0; - - /* Wait for free space. */ - while (BUFFER_FULL(cookie)) - { - /* Buffer is full: Wait for space. */ - res = npth_cond_wait (&cookie->wait_space, NULL); - if (res) - { - gpg_err_set_errno (res); - return -1; - } - } - - if (BUFFER_EMPTY(cookie)) - was_empty = 1; - - /* Copy data. */ - nwritten = buffer_put_data (cookie, buffer, size); - size -= nwritten; - src += nwritten; - amount += nwritten; - - if (was_empty) - npth_cond_signal (&cookie->wait_data); - } - while (size); /* Until done. */ - - return amount; -} - - -static void -outstream_release_cookie (struct outstream_cookie_s *cookie) -{ - cookie->refcount--; - if (!cookie->refcount) - { - npth_cond_destroy (&cookie->wait_data); - npth_cond_destroy (&cookie->wait_space); - xfree (cookie); - } -} - - -/* Closer function for the outstream. This deallocates the cookie if - it won't be used anymore. */ -static int -outstream_cookie_closer (void *cookie_arg) -{ - struct outstream_cookie_s *cookie = cookie_arg; - - if (!cookie) - return 0; /* Nothing to do. */ - - cookie->eof_seen = 1; /* (only useful if refcount > 1) */ - - assert (cookie->refcount > 0); - outstream_release_cookie (cookie); - return 0; -} - - -/* The KSBA reader callback which takes the output of the ldap thread - form the outstream_cookie_writer and make it available to the ksba - reader. */ -static int -outstream_reader_cb (void *cb_value, char *buffer, size_t count, - size_t *r_nread) -{ - struct outstream_cookie_s *cookie = cb_value; - size_t nread = 0; - int was_full = 0; - - if (!buffer && !count && !r_nread) - return gpg_error (GPG_ERR_NOT_SUPPORTED); /* Rewind is not supported. */ - - *r_nread = 0; - - while (BUFFER_EMPTY(cookie)) - { - if (cookie->eof_seen) - return gpg_error (GPG_ERR_EOF); - - /* Wait for data to become available. */ - npth_cond_wait (&cookie->wait_data, NULL); - } - - if (BUFFER_FULL(cookie)) - was_full = 1; - - nread = buffer_get_data (cookie, buffer, count); - - if (was_full) - { - npth_cond_signal (&cookie->wait_space); - } - - *r_nread = nread; - return 0; /* Success. */ -} - - -/* This function is called by ksba_reader_release. */ -static void -outstream_reader_released (void *cb_value, ksba_reader_t r) -{ - struct outstream_cookie_s *cookie = cb_value; - - (void)r; - - assert (cookie->refcount > 0); - outstream_release_cookie (cookie); -} - - - -/* This function is to be used to release a context associated with the - given reader object. This does not release the reader object, though. */ -void -ldap_wrapper_release_context (ksba_reader_t reader) -{ - (void)reader; - /* Nothing to do. */ -} - - - -/* Free a NULL terminated array of malloced strings and the array - itself. */ -static void -free_arg_list (char **arg_list) -{ - int i; - - if (arg_list) - { - for (i=0; arg_list[i]; i++) - xfree (arg_list[i]); - xfree (arg_list); - } -} - - -/* Copy ARGV into a new array and prepend one element as name of the - program (which is more or less a stub). We need to allocate all - the strings to get ownership of them. */ -static gpg_error_t -create_arg_list (const char *argv[], char ***r_arg_list) -{ - gpg_error_t err; - char **arg_list; - int i, j; - - for (i = 0; argv[i]; i++) - ; - arg_list = xtrycalloc (i + 2, sizeof *arg_list); - if (!arg_list) - goto outofcore; - - i = 0; - arg_list[i] = xtrystrdup (""); - if (!arg_list[i]) - goto outofcore; - i++; - for (j=0; argv[j]; j++) - { - arg_list[i] = xtrystrdup (argv[j]); - if (!arg_list[i]) - goto outofcore; - i++; - } - arg_list[i] = NULL; - *r_arg_list = arg_list; - return 0; - - outofcore: - err = gpg_error_from_syserror (); - log_error (_("error allocating memory: %s\n"), strerror (errno)); - free_arg_list (arg_list); - *r_arg_list = NULL; - return err; - -} - - -/* Parameters passed to the wrapper thread. */ -struct ldap_wrapper_thread_parms -{ - char **arg_list; - estream_t outstream; -}; - -/* The thread which runs the LDAP wrapper. */ -static void * -ldap_wrapper_thread (void *opaque) -{ - struct ldap_wrapper_thread_parms *parms = opaque; - - /*err =*/ ldap_wrapper_main (parms->arg_list, parms->outstream); - - /* FIXME: Do we need to return ERR? */ - - free_arg_list (parms->arg_list); - es_fclose (parms->outstream); - xfree (parms); - return NULL; -} - - - -/* Start a new LDAP thread and returns a new libksba reader - object at READER. ARGV is a NULL terminated list of arguments for - the wrapper. The function returns 0 on success or an error code. */ -gpg_error_t -ldap_wrapper (ctrl_t ctrl, ksba_reader_t *r_reader, const char *argv[]) -{ - gpg_error_t err; - struct ldap_wrapper_thread_parms *parms; - npth_attr_t tattr; - es_cookie_io_functions_t outstream_func = { NULL }; - struct outstream_cookie_s *outstream_cookie; - ksba_reader_t reader; - int res; - npth_t thread; - - (void)ctrl; - - *r_reader = NULL; - - parms = xtrycalloc (1, sizeof *parms); - if (!parms) - return gpg_error_from_syserror (); - - err = create_arg_list (argv, &parms->arg_list); - if (err) - { - xfree (parms); - return err; - } - - outstream_cookie = xtrycalloc (1, sizeof *outstream_cookie); - if (!outstream_cookie) - { - err = gpg_error_from_syserror (); - free_arg_list (parms->arg_list); - xfree (parms); - return err; - } - outstream_cookie->refcount++; - - res = npth_cond_init (&outstream_cookie->wait_data, NULL); - if (res) - { - free_arg_list (parms->arg_list); - xfree (parms); - return gpg_error_from_errno (res); - } - res = npth_cond_init (&outstream_cookie->wait_space, NULL); - if (res) - { - npth_cond_destroy (&outstream_cookie->wait_data); - free_arg_list (parms->arg_list); - xfree (parms); - return gpg_error_from_errno (res); - } - - err = ksba_reader_new (&reader); - if (!err) - err = ksba_reader_set_release_notify (reader, - outstream_reader_released, - outstream_cookie); - if (!err) - err = ksba_reader_set_cb (reader, - outstream_reader_cb, outstream_cookie); - if (err) - { - log_error (_("error initializing reader object: %s\n"), - gpg_strerror (err)); - ksba_reader_release (reader); - outstream_release_cookie (outstream_cookie); - free_arg_list (parms->arg_list); - xfree (parms); - return err; - } - - - outstream_func.func_write = outstream_cookie_writer; - outstream_func.func_close = outstream_cookie_closer; - parms->outstream = es_fopencookie (outstream_cookie, "wb", outstream_func); - if (!parms->outstream) - { - err = gpg_error_from_syserror (); - ksba_reader_release (reader); - outstream_release_cookie (outstream_cookie); - free_arg_list (parms->arg_list); - xfree (parms); - return err; - } - outstream_cookie->refcount++; - - res = npth_attr_init(&tattr); - if (res) - { - err = gpg_error_from_errno (res); - ksba_reader_release (reader); - free_arg_list (parms->arg_list); - es_fclose (parms->outstream); - xfree (parms); - return err; - } - npth_attr_setdetachstate (&tattr, NPTH_CREATE_DETACHED); - - res = npth_create (&thread, &tattr, ldap_wrapper_thread, parms); - npth_attr_destroy (&tattr); - if (res) - { - err = gpg_error_from_errno (res); - log_error ("error spawning ldap wrapper thread: %s\n", - strerror (res) ); - } - else - parms = NULL; /* Now owned by the thread. */ - - if (parms) - { - free_arg_list (parms->arg_list); - es_fclose (parms->outstream); - xfree (parms); - } - if (err) - { - ksba_reader_release (reader); - return err; - } - - /* Need to wait for the first byte so we are able to detect an empty - output and not let the consumer see an EOF without further error - indications. The CRL loading logic assumes that after return - from this function, a failed search (e.g. host not found ) is - indicated right away. */ - { - unsigned char c; - - err = read_buffer (reader, &c, 1); - if (err) - { - ksba_reader_release (reader); - reader = NULL; - if (gpg_err_code (err) == GPG_ERR_EOF) - return gpg_error (GPG_ERR_NO_DATA); - else - return err; - } - ksba_reader_unread (reader, &c, 1); - } - - *r_reader = reader; - - return 0; -} diff --git a/dirmngr/ldap-wrapper.c b/dirmngr/ldap-wrapper.c index bbae3b290..42bc38a40 100644 --- a/dirmngr/ldap-wrapper.c +++ b/dirmngr/ldap-wrapper.c @@ -72,10 +72,6 @@ #define pth_close(fd) close(fd) #endif -#ifndef USE_LDAPWRAPPER -# error This module is not expected to be build. -#endif - /* In case sysconf does not return a value we need to have a limit. */ #ifdef _POSIX_OPEN_MAX #define MAX_OPEN_FDS _POSIX_OPEN_MAX diff --git a/dirmngr/ldap-wrapper.h b/dirmngr/ldap-wrapper.h index a015efafe..640300522 100644 --- a/dirmngr/ldap-wrapper.h +++ b/dirmngr/ldap-wrapper.h @@ -31,10 +31,4 @@ gpg_error_t ldap_wrapper (ctrl_t ctrl, ksba_reader_t *reader, const char *argv[]); -/* dirmngr_ldap.c */ -#ifndef USE_LDAPWRAPPER -int ldap_wrapper_main (char **argv, estream_t outstream); -#endif - - #endif /*LDAP_WRAPPER_H*/