1 /* dirmngr.c - Keyserver and X.509 LDAP access
2 * Copyright (C) 2002 Klarälvdalens Datakonsult AB
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2010, 2011 g10 Code GmbH
4 * Copyright (C) 2014 Werner Koch
6 * This file is part of GnuPG.
8 * GnuPG is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * GnuPG is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, see <https://www.gnu.org/licenses/>.
33 #ifndef HAVE_W32_SYSTEM
34 #include <sys/socket.h>
42 #ifdef HAVE_INOTIFY_INIT
43 # include <sys/inotify.h>
44 #endif /*HAVE_INOTIFY_INIT*/
47 #include "dirmngr-err.h"
52 # include <gnutls/gnutls.h>
53 #endif /*HTTP_USE_GNUTLS*/
56 #define GNUPG_COMMON_NEED_AFLOCAL
61 #include "certcache.h"
66 # include "ldapserver.h"
70 # include "ldap-wrapper.h"
72 #include "../common/init.h"
73 #include "gc-opt-flags.h"
74 #include "dns-stuff.h"
77 # define ENAMETOOLONG EINVAL
81 enum cmd_and_opt_values {
139 oIgnoreCertExtension,
144 oDisableCheckOwnSocket,
153 static ARGPARSE_OPTS opts[] = {
155 ARGPARSE_group (300, N_("@Commands:\n ")),
157 ARGPARSE_c (aServer, "server", N_("run in server mode (foreground)") ),
158 ARGPARSE_c (aDaemon, "daemon", N_("run in daemon mode (background)") ),
159 #ifndef HAVE_W32_SYSTEM
160 ARGPARSE_c (aSupervised, "supervised", N_("run in supervised mode")),
162 ARGPARSE_c (aListCRLs, "list-crls", N_("list the contents of the CRL cache")),
163 ARGPARSE_c (aLoadCRL, "load-crl", N_("|FILE|load CRL from FILE into cache")),
164 ARGPARSE_c (aFetchCRL, "fetch-crl", N_("|URL|fetch a CRL from URL")),
165 ARGPARSE_c (aShutdown, "shutdown", N_("shutdown the dirmngr")),
166 ARGPARSE_c (aFlush, "flush", N_("flush the cache")),
167 ARGPARSE_c (aGPGConfList, "gpgconf-list", "@"),
168 ARGPARSE_c (aGPGConfTest, "gpgconf-test", "@"),
170 ARGPARSE_group (301, N_("@\nOptions:\n ")),
172 ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
173 ARGPARSE_s_n (oQuiet, "quiet", N_("be somewhat more quiet")),
174 ARGPARSE_s_n (oSh, "sh", N_("sh-style command output")),
175 ARGPARSE_s_n (oCsh, "csh", N_("csh-style command output")),
176 ARGPARSE_s_s (oOptions, "options", N_("|FILE|read options from FILE")),
177 ARGPARSE_s_s (oDebugLevel, "debug-level",
178 N_("|LEVEL|set the debugging level to LEVEL")),
179 ARGPARSE_s_n (oNoDetach, "no-detach", N_("do not detach from the console")),
180 ARGPARSE_s_s (oLogFile, "log-file",
181 N_("|FILE|write server mode logs to FILE")),
182 ARGPARSE_s_n (oBatch, "batch", N_("run without asking a user")),
183 ARGPARSE_s_n (oForce, "force", N_("force loading of outdated CRLs")),
184 ARGPARSE_s_n (oAllowOCSP, "allow-ocsp", N_("allow sending OCSP requests")),
185 ARGPARSE_s_n (oAllowVersionCheck, "allow-version-check",
186 N_("allow online software version check")),
187 ARGPARSE_s_n (oDisableHTTP, "disable-http", N_("inhibit the use of HTTP")),
188 ARGPARSE_s_n (oDisableLDAP, "disable-ldap", N_("inhibit the use of LDAP")),
189 ARGPARSE_s_n (oIgnoreHTTPDP,"ignore-http-dp",
190 N_("ignore HTTP CRL distribution points")),
191 ARGPARSE_s_n (oIgnoreLDAPDP,"ignore-ldap-dp",
192 N_("ignore LDAP CRL distribution points")),
193 ARGPARSE_s_n (oIgnoreOCSPSvcUrl, "ignore-ocsp-service-url",
194 N_("ignore certificate contained OCSP service URLs")),
196 ARGPARSE_s_s (oHTTPProxy, "http-proxy",
197 N_("|URL|redirect all HTTP requests to URL")),
198 ARGPARSE_s_s (oLDAPProxy, "ldap-proxy",
199 N_("|HOST|use HOST for LDAP queries")),
200 ARGPARSE_s_n (oOnlyLDAPProxy, "only-ldap-proxy",
201 N_("do not use fallback hosts with --ldap-proxy")),
203 ARGPARSE_s_s (oLDAPFile, "ldapserverlist-file",
204 N_("|FILE|read LDAP server list from FILE")),
205 ARGPARSE_s_n (oLDAPAddServers, "add-servers",
206 N_("add new servers discovered in CRL distribution"
207 " points to serverlist")),
208 ARGPARSE_s_i (oLDAPTimeout, "ldaptimeout",
209 N_("|N|set LDAP timeout to N seconds")),
211 ARGPARSE_s_s (oOCSPResponder, "ocsp-responder",
212 N_("|URL|use OCSP responder at URL")),
213 ARGPARSE_s_s (oOCSPSigner, "ocsp-signer",
214 N_("|FPR|OCSP response signed by FPR")),
215 ARGPARSE_s_i (oOCSPMaxClockSkew, "ocsp-max-clock-skew", "@"),
216 ARGPARSE_s_i (oOCSPMaxPeriod, "ocsp-max-period", "@"),
217 ARGPARSE_s_i (oOCSPCurrentPeriod, "ocsp-current-period", "@"),
219 ARGPARSE_s_i (oMaxReplies, "max-replies",
220 N_("|N|do not return more than N items in one query")),
222 ARGPARSE_s_s (oNameServer, "nameserver", "@"),
223 ARGPARSE_s_s (oKeyServer, "keyserver", "@"),
224 ARGPARSE_s_s (oHkpCaCert, "hkp-cacert",
225 N_("|FILE|use the CA certificates in FILE for HKP over TLS")),
227 ARGPARSE_s_n (oUseTor, "use-tor", N_("route all network traffic via Tor")),
228 ARGPARSE_s_n (oNoUseTor, "no-use-tor", "@"),
230 ARGPARSE_s_n (oDisableIPv4, "disable-ipv4", "@"),
232 ARGPARSE_s_s (oSocketName, "socket-name", "@"), /* Only for debugging. */
234 ARGPARSE_s_u (oFakedSystemTime, "faked-system-time", "@"), /*(epoch time)*/
235 ARGPARSE_s_s (oDebug, "debug", "@"),
236 ARGPARSE_s_n (oDebugAll, "debug-all", "@"),
237 ARGPARSE_s_i (oGnutlsDebug, "gnutls-debug", "@"),
238 ARGPARSE_s_i (oGnutlsDebug, "tls-debug", "@"),
239 ARGPARSE_s_i (oDebugWait, "debug-wait", "@"),
240 ARGPARSE_s_n (oDisableCheckOwnSocket, "disable-check-own-socket", "@"),
241 ARGPARSE_s_n (oNoGreeting, "no-greeting", "@"),
242 ARGPARSE_s_s (oHomedir, "homedir", "@"),
243 ARGPARSE_s_s (oLDAPWrapperProgram, "ldap-wrapper-program", "@"),
244 ARGPARSE_s_s (oHTTPWrapperProgram, "http-wrapper-program", "@"),
245 ARGPARSE_s_n (oHonorHTTPProxy, "honor-http-proxy", "@"),
246 ARGPARSE_s_s (oIgnoreCertExtension,"ignore-cert-extension", "@"),
247 ARGPARSE_s_n (oStandardResolver, "standard-resolver", "@"),
248 ARGPARSE_s_n (oRecursiveResolver, "recursive-resolver", "@"),
249 ARGPARSE_s_i (oResolverTimeout, "resolver-timeout", "@"),
251 ARGPARSE_group (302,N_("@\n(See the \"info\" manual for a complete listing "
252 "of all commands and options)\n")),
257 /* The list of supported debug flags. */
258 static struct debug_flags_s debug_flags [] =
260 { DBG_X509_VALUE , "x509" },
261 { DBG_CRYPTO_VALUE , "crypto" },
262 { DBG_MEMORY_VALUE , "memory" },
263 { DBG_CACHE_VALUE , "cache" },
264 { DBG_MEMSTAT_VALUE, "memstat" },
265 { DBG_HASHING_VALUE, "hashing" },
266 { DBG_IPC_VALUE , "ipc" },
267 { DBG_DNS_VALUE , "dns" },
268 { DBG_NETWORK_VALUE, "network" },
269 { DBG_LOOKUP_VALUE , "lookup" },
270 { 77, NULL } /* 77 := Do not exit on "help" or "?". */
273 #define DEFAULT_MAX_REPLIES 10
274 #define DEFAULT_LDAP_TIMEOUT 100 /* arbitrary large timeout */
276 /* For the cleanup handler we need to keep track of the socket's name. */
277 static const char *socket_name;
278 /* If the socket has been redirected, this is the name of the
279 redirected socket.. */
280 static const char *redir_socket_name;
282 /* We need to keep track of the server's nonces (these are dummies for
284 static assuan_sock_nonce_t socket_nonce;
286 /* Only if this flag has been set will we remove the socket file. */
287 static int cleanup_socket;
289 /* Keep track of the current log file so that we can avoid updating
290 the log file after a SIGHUP if it didn't changed. Malloced. */
291 static char *current_logfile;
293 /* Helper to implement --debug-level. */
294 static const char *debug_level;
296 /* Helper to set the NTBTLS or GNUTLS log level. */
297 static int opt_gnutls_debug = -1;
299 /* Flag indicating that a shutdown has been requested. */
300 static volatile int shutdown_pending;
302 /* Flags to indicate that we shall not watch our own socket. */
303 static int disable_check_own_socket;
305 /* Flag to control the Tor mode. */
307 { TOR_MODE_AUTO = 0, /* Switch to NO or YES */
308 TOR_MODE_NEVER, /* Never use Tor. */
309 TOR_MODE_NO, /* Do not use Tor */
310 TOR_MODE_YES, /* Use Tor */
311 TOR_MODE_FORCE /* Force using Tor */
315 /* Counter for the active connections. */
316 static int active_connections;
318 /* This flag is set by any network access and used by the housekeeping
319 * thread to run background network tasks. */
320 static int network_activity_seen;
322 /* This union is used to avoid compiler warnings in case a pointer is
323 64 bit and an int 32 bit. We store an integer in a pointer and get
324 it back later (npth_getspecific et al.). */
334 /* The key used to store the current file descriptor in the thread
335 local storage. We use this in conjunction with the
336 log_set_pid_suffix_cb feature. */
337 #ifndef HAVE_W32_SYSTEM
338 static int my_tlskey_current_fd;
342 static void cleanup (void);
344 static ldap_server_t parse_ldapserver_file (const char* filename);
346 static fingerprint_list_t parse_ocsp_signer (const char *string);
347 static void netactivity_action (void);
348 static void handle_connections (assuan_fd_t listen_fd);
350 /* NPth wrapper function definitions. */
351 ASSUAN_SYSTEM_NPTH_IMPL;
354 my_strusage( int level )
359 case 11: p = "@DIRMNGR@ (@GNUPG@)";
361 case 13: p = VERSION; break;
362 case 17: p = PRINTABLE_OS_NAME; break;
363 /* TRANSLATORS: @EMAIL@ will get replaced by the actual bug
364 reporting address. This is so that we can change the
365 reporting address without breaking the translations. */
366 case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break;
367 case 49: p = PACKAGE_BUGREPORT; break;
369 case 40: p = _("Usage: @DIRMNGR@ [options] (-h for help)");
371 case 41: p = _("Syntax: @DIRMNGR@ [options] [command [args]]\n"
372 "Keyserver, CRL, and OCSP access for @GNUPG@\n");
381 /* Callback from libksba to hash a provided buffer. Our current
382 implementation does only allow SHA-1 for hashing. This may be
383 extended by mapping the name, testing for algorithm availibility
384 and adjust the length checks accordingly. */
386 my_ksba_hash_buffer (void *arg, const char *oid,
387 const void *buffer, size_t length, size_t resultsize,
388 unsigned char *result, size_t *resultlen)
392 if (oid && strcmp (oid, "1.3.14.3.2.26"))
393 return gpg_error (GPG_ERR_NOT_SUPPORTED);
395 return gpg_error (GPG_ERR_BUFFER_TOO_SHORT);
396 gcry_md_hash_buffer (2, result, buffer, length);
402 /* GNUTLS log function callback. */
403 #ifdef HTTP_USE_GNUTLS
405 my_gnutls_log (int level, const char *text)
410 while (n && text[n-1] == '\n')
413 log_debug ("gnutls:L%d: %.*s\n", level, n, text);
415 #endif /*HTTP_USE_GNUTLS*/
417 /* Setup the debugging. With a LEVEL of NULL only the active debug
418 flags are propagated to the subsystems. With LEVEL set, a specific
419 set of debug flags is set; thus overriding all flags already
424 int numok = (debug_level && digitp (debug_level));
425 int numlvl = numok? atoi (debug_level) : 0;
429 else if (!strcmp (debug_level, "none") || (numok && numlvl < 1))
431 else if (!strcmp (debug_level, "basic") || (numok && numlvl <= 2))
432 opt.debug = DBG_IPC_VALUE;
433 else if (!strcmp (debug_level, "advanced") || (numok && numlvl <= 5))
434 opt.debug = (DBG_IPC_VALUE|DBG_X509_VALUE|DBG_LOOKUP_VALUE);
435 else if (!strcmp (debug_level, "expert") || (numok && numlvl <= 8))
436 opt.debug = (DBG_IPC_VALUE|DBG_X509_VALUE|DBG_LOOKUP_VALUE
437 |DBG_CACHE_VALUE|DBG_CRYPTO_VALUE);
438 else if (!strcmp (debug_level, "guru") || numok)
441 /* Unless the "guru" string has been used we don't want to allow
442 hashing debugging. The rationale is that people tend to
443 select the highest debug value and would then clutter their
444 disk with debug files which may reveal confidential data. */
446 opt.debug &= ~(DBG_HASHING_VALUE);
450 log_error (_("invalid debug-level '%s' given\n"), debug_level);
451 log_info (_("valid debug levels are: %s\n"),
452 "none, basic, advanced, expert, guru");
453 opt.debug = 0; /* Reset debugging, so that prior debug
454 statements won't have an undesired effect. */
458 if (opt.debug && !opt.verbose)
461 gcry_control (GCRYCTL_SET_VERBOSITY, (int)opt.verbose);
463 if (opt.debug && opt.quiet)
466 if (opt.debug & DBG_CRYPTO_VALUE )
467 gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1);
470 if (opt_gnutls_debug >= 0)
472 ntbtls_set_debug (opt_gnutls_debug, NULL, NULL);
474 #elif HTTP_USE_GNUTLS
475 if (opt_gnutls_debug >= 0)
477 gnutls_global_set_log_function (my_gnutls_log);
478 gnutls_global_set_log_level (opt_gnutls_debug);
480 #endif /*HTTP_USE_GNUTLS*/
483 parse_debug_flag (NULL, &opt.debug, debug_flags);
490 if (dirmngr_use_tor ())
492 /* Enable Tor mode and when called again force a new curcuit
493 * (e.g. on SIGHUP). */
494 enable_dns_tormode (1);
495 if (assuan_sock_set_flag (ASSUAN_INVALID_FD, "tor-mode", 1))
497 log_error ("error enabling Tor mode: %s\n", strerror (errno));
498 log_info ("(is your Libassuan recent enough?)\n");
502 disable_dns_tormode ();
506 /* Return true if Tor shall be used. */
508 dirmngr_use_tor (void)
510 if (tor_mode == TOR_MODE_AUTO)
512 /* FIXME: Figure out whether Tor is running. */
515 if (tor_mode == TOR_MODE_FORCE)
516 return 2; /* Use Tor (using 2 to indicate force mode) */
517 else if (tor_mode == TOR_MODE_YES)
518 return 1; /* Use Tor */
520 return 0; /* Do not use Tor. */
525 wrong_args (const char *text)
527 es_fprintf (es_stderr, _("usage: %s [options] "), DIRMNGR_NAME);
528 es_fputs (text, es_stderr);
529 es_putc ('\n', es_stderr);
534 /* Helper to stop the reaper thread for the ldap wrapper. */
536 shutdown_reaper (void)
539 ldap_wrapper_wait_connections ();
544 /* Handle options which are allowed to be reset after program start.
545 Return true if the current option in PARGS could be handled and
546 false if not. As a special feature, passing a value of NULL for
547 PARGS, resets the options to the default. REREAD should be set
548 true if it is not the initial option parsing. */
550 parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread)
557 opt.ldap_wrapper_program = NULL;
558 opt.disable_http = 0;
559 opt.disable_ldap = 0;
560 opt.honor_http_proxy = 0;
561 opt.http_proxy = NULL;
562 opt.ldap_proxy = NULL;
563 opt.only_ldap_proxy = 0;
564 opt.ignore_http_dp = 0;
565 opt.ignore_ldap_dp = 0;
566 opt.ignore_ocsp_service_url = 0;
568 opt.allow_version_check = 0;
569 opt.ocsp_responder = NULL;
570 opt.ocsp_max_clock_skew = 10 * 60; /* 10 minutes. */
571 opt.ocsp_max_period = 90 * 86400; /* 90 days. */
572 opt.ocsp_current_period = 3 * 60 * 60; /* 3 hours. */
573 opt.max_replies = DEFAULT_MAX_REPLIES;
574 while (opt.ocsp_signer)
576 fingerprint_list_t tmp = opt.ocsp_signer->next;
577 xfree (opt.ocsp_signer);
578 opt.ocsp_signer = tmp;
580 FREE_STRLIST (opt.ignored_cert_extensions);
581 http_register_tls_ca (NULL);
582 FREE_STRLIST (opt.keyserver);
583 /* Note: We do not allow resetting of TOR_MODE_FORCE at runtime. */
584 if (tor_mode != TOR_MODE_FORCE)
585 tor_mode = TOR_MODE_AUTO;
586 disable_check_own_socket = 0;
587 enable_standard_resolver (0);
592 switch (pargs->r_opt)
594 case oQuiet: opt.quiet = 1; break;
595 case oVerbose: opt.verbose++; break;
597 parse_debug_flag (pargs->r.ret_str, &opt.debug, debug_flags);
599 case oDebugAll: opt.debug = ~0; break;
600 case oDebugLevel: debug_level = pargs->r.ret_str; break;
601 case oGnutlsDebug: opt_gnutls_debug = pargs->r.ret_int; break;
605 return 0; /* Not handled. */
606 if (!current_logfile || !pargs->r.ret_str
607 || strcmp (current_logfile, pargs->r.ret_str))
609 log_set_file (pargs->r.ret_str);
610 xfree (current_logfile);
611 current_logfile = xtrystrdup (pargs->r.ret_str);
615 case oDisableCheckOwnSocket: disable_check_own_socket = 1; break;
617 case oLDAPWrapperProgram:
618 opt.ldap_wrapper_program = pargs->r.ret_str;
620 case oHTTPWrapperProgram:
621 opt.http_wrapper_program = pargs->r.ret_str;
624 case oDisableHTTP: opt.disable_http = 1; break;
625 case oDisableLDAP: opt.disable_ldap = 1; break;
626 case oDisableIPv4: opt.disable_ipv4 = 1; break;
627 case oHonorHTTPProxy: opt.honor_http_proxy = 1; break;
628 case oHTTPProxy: opt.http_proxy = pargs->r.ret_str; break;
629 case oLDAPProxy: opt.ldap_proxy = pargs->r.ret_str; break;
630 case oOnlyLDAPProxy: opt.only_ldap_proxy = 1; break;
631 case oIgnoreHTTPDP: opt.ignore_http_dp = 1; break;
632 case oIgnoreLDAPDP: opt.ignore_ldap_dp = 1; break;
633 case oIgnoreOCSPSvcUrl: opt.ignore_ocsp_service_url = 1; break;
635 case oAllowOCSP: opt.allow_ocsp = 1; break;
636 case oAllowVersionCheck: opt.allow_version_check = 1; break;
637 case oOCSPResponder: opt.ocsp_responder = pargs->r.ret_str; break;
639 opt.ocsp_signer = parse_ocsp_signer (pargs->r.ret_str);
641 case oOCSPMaxClockSkew: opt.ocsp_max_clock_skew = pargs->r.ret_int; break;
642 case oOCSPMaxPeriod: opt.ocsp_max_period = pargs->r.ret_int; break;
643 case oOCSPCurrentPeriod: opt.ocsp_current_period = pargs->r.ret_int; break;
645 case oMaxReplies: opt.max_replies = pargs->r.ret_int; break;
651 /* Do tilde expansion and make path absolute. */
652 tmpname = make_absfilename (pargs->r.ret_str, NULL);
653 http_register_tls_ca (tmpname);
658 case oIgnoreCertExtension:
659 add_to_strlist (&opt.ignored_cert_extensions, pargs->r.ret_str);
663 tor_mode = TOR_MODE_FORCE;
666 if (tor_mode != TOR_MODE_FORCE)
667 tor_mode = TOR_MODE_NEVER;
670 case oStandardResolver: enable_standard_resolver (1); break;
671 case oRecursiveResolver: enable_recursive_resolver (1); break;
674 if (*pargs->r.ret_str)
675 add_to_strlist (&opt.keyserver, pargs->r.ret_str);
679 set_dns_nameserver (pargs->r.ret_str);
682 case oResolverTimeout:
683 set_dns_timeout (pargs->r.ret_int);
687 return 0; /* Not handled. */
690 set_dns_verbose (opt.verbose, !!DBG_DNS);
691 http_set_verbose (opt.verbose, !!DBG_NETWORK);
692 set_dns_disable_ipv4 (opt.disable_ipv4);
694 return 1; /* Handled. */
698 #ifndef HAVE_W32_SYSTEM
700 pid_suffix_callback (unsigned long *r_suffix)
702 union int_and_ptr_u value;
704 memset (&value, 0, sizeof value);
705 value.aptr = npth_getspecific (my_tlskey_current_fd);
706 *r_suffix = value.aint;
707 return (*r_suffix != -1); /* Use decimal representation. */
709 #endif /*!HAVE_W32_SYSTEM*/
716 gpgrt_set_syscall_clamp (npth_unprotect, npth_protect);
718 /* Now with NPth running we can set the logging callback. Our
719 windows implementation does not yet feature the NPth TLS
721 #ifndef HAVE_W32_SYSTEM
722 if (npth_key_create (&my_tlskey_current_fd, NULL) == 0)
723 if (npth_setspecific (my_tlskey_current_fd, NULL) == 0)
724 log_set_pid_suffix_cb (pid_suffix_callback);
725 #endif /*!HAVE_W32_SYSTEM*/
730 main (int argc, char **argv)
732 enum cmd_and_opt_values cmd = 0;
736 FILE *configfp = NULL;
737 char *configname = NULL;
739 unsigned configlineno;
741 int default_config =1;
746 char *logfile = NULL;
748 char *ldapfile = NULL;
752 struct assuan_malloc_hooks malloc_hooks;
754 early_system_init ();
755 set_strusage (my_strusage);
756 log_set_prefix (DIRMNGR_NAME, GPGRT_LOG_WITH_PREFIX | GPGRT_LOG_WITH_PID);
758 /* Make sure that our subsystems are ready. */
760 init_common_subsystems (&argc, &argv);
762 gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
764 /* Check that the libraries are suitable. Do it here because
765 the option parsing may need services of the libraries. */
766 if (!ksba_check_version (NEED_KSBA_VERSION) )
767 log_fatal( _("%s is too old (need %s, have %s)\n"), "libksba",
768 NEED_KSBA_VERSION, ksba_check_version (NULL) );
770 ksba_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free );
771 ksba_set_hash_buffer_function (my_ksba_hash_buffer, NULL);
773 /* Init TLS library. */
775 if (!ntbtls_check_version (NEED_NTBTLS_VERSION) )
776 log_fatal( _("%s is too old (need %s, have %s)\n"), "ntbtls",
777 NEED_NTBTLS_VERSION, ntbtls_check_version (NULL) );
778 #elif HTTP_USE_GNUTLS
779 rc = gnutls_global_init ();
781 log_fatal ("gnutls_global_init failed: %s\n", gnutls_strerror (rc));
782 #endif /*HTTP_USE_GNUTLS*/
785 malloc_hooks.malloc = gcry_malloc;
786 malloc_hooks.realloc = gcry_realloc;
787 malloc_hooks.free = gcry_free;
788 assuan_set_malloc_hooks (&malloc_hooks);
789 assuan_set_assuan_log_prefix (log_get_prefix (NULL));
790 assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
791 assuan_set_system_hooks (ASSUAN_SYSTEM_NPTH);
793 setup_libassuan_logging (&opt.debug, dirmngr_assuan_log_monitor);
795 setup_libgcrypt_logging ();
797 /* Setup defaults. */
798 shell = getenv ("SHELL");
799 if (shell && strlen (shell) >= 3 && !strcmp (shell+strlen (shell)-3, "csh") )
802 /* Reset rereadable options to default values. */
803 parse_rereadable_options (NULL, 0);
806 opt.add_new_ldapservers = 0;
807 opt.ldaptimeout = DEFAULT_LDAP_TIMEOUT;
809 /* Other defaults. */
811 /* Check whether we have a config file given on the commandline */
816 pargs.flags= 1|(1<<6); /* do not remove the args, ignore version */
817 while (arg_parse( &pargs, opts))
819 if (pargs.r_opt == oDebug || pargs.r_opt == oDebugAll)
821 else if (pargs.r_opt == oOptions)
822 { /* Yes there is one, so we do not try the default one, but
823 read the option file when it is encountered at the
827 else if (pargs.r_opt == oNoOptions)
828 default_config = 0; /* --no-options */
829 else if (pargs.r_opt == oHomedir)
831 gnupg_set_homedir (pargs.r.ret_str);
835 socket_name = dirmngr_socket_name ();
837 configname = make_filename (gnupg_homedir (), DIRMNGR_NAME".conf", NULL );
843 pargs.flags= 1; /* do not remove the args */
848 configfp = fopen (configname, "r");
854 log_info (_("Note: no default option file '%s'\n"),
859 log_error (_("option file '%s': %s\n"),
860 configname, strerror(errno) );
866 if (parse_debug && configname )
867 log_info (_("reading options from '%s'\n"), configname );
871 while (optfile_parse( configfp, configname, &configlineno, &pargs, opts) )
873 if (parse_rereadable_options (&pargs, 0))
874 continue; /* Already handled */
890 case oQuiet: opt.quiet = 1; break;
891 case oVerbose: opt.verbose++; break;
892 case oBatch: opt.batch=1; break;
894 case oDebugWait: debug_wait = pargs.r.ret_int; break;
897 /* Config files may not be nested (silently ignore them) */
901 configname = xstrdup(pargs.r.ret_str);
905 case oNoGreeting: nogreeting = 1; break;
906 case oNoVerbose: opt.verbose = 0; break;
907 case oNoOptions: break; /* no-options */
908 case oHomedir: /* Ignore this option here. */; break;
909 case oNoDetach: nodetach = 1; break;
910 case oLogFile: logfile = pargs.r.ret_str; break;
911 case oCsh: csh_style = 1; break;
912 case oSh: csh_style = 0; break;
915 ldapfile = pargs.r.ret_str;
918 case oLDAPAddServers: opt.add_new_ldapservers = 1; break;
920 opt.ldaptimeout = pargs.r.ret_int;
923 case oFakedSystemTime:
924 gnupg_set_time ((time_t)pargs.r.ret_ulong, 0);
927 case oForce: opt.force = 1; break;
929 case oSocketName: socket_name = pargs.r.ret_str; break;
931 default : pargs.err = configfp? 1:2; break;
938 /* Keep a copy of the name so that it can be read on SIGHUP. */
939 opt.config_filename = configname;
945 if (log_get_errorcount(0))
950 if (!opt.homedir_cache)
951 opt.homedir_cache = xstrdup (gnupg_homedir ());
955 es_fprintf (es_stderr, "%s %s; %s\n",
956 strusage(11), strusage(13), strusage(14) );
957 es_fprintf (es_stderr, "%s\n", strusage(15) );
960 #ifdef IS_DEVELOPMENT_VERSION
961 log_info ("NOTE: this is a development version!\n");
964 /* Print a warning if an argument looks like an option. */
965 if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN))
969 for (i=0; i < argc; i++)
970 if (argv[i][0] == '-' && argv[i][1] == '-')
971 log_info (_("Note: '%s' is not considered an option\n"), argv[i]);
974 if (!access ("/etc/"DIRMNGR_NAME, F_OK)
975 && !strncmp (gnupg_homedir (), "/etc/", 5))
977 ("NOTE: DirMngr is now a proper part of %s. The configuration and"
978 " other directory names changed. Please check that no other version"
979 " of dirmngr is still installed. To disable this warning, remove the"
980 " directory '/etc/dirmngr'.\n", GNUPG_NAME);
982 if (gnupg_faked_time_p ())
984 gnupg_isotime_t tbuf;
986 log_info (_("WARNING: running with faked system time: "));
987 gnupg_get_isotime (tbuf);
995 /* Get LDAP server list from file. */
999 ldapfile = make_filename (gnupg_homedir (),
1000 "dirmngr_ldapservers.conf",
1002 opt.ldapservers = parse_ldapserver_file (ldapfile);
1006 opt.ldapservers = parse_ldapserver_file (ldapfile);
1009 #ifndef HAVE_W32_SYSTEM
1010 /* We need to ignore the PIPE signal because the we might log to a
1011 socket and that code handles EPIPE properly. The ldap wrapper
1012 also requires us to ignore this silly signal. Assuan would set
1013 this signal to ignore anyway.*/
1014 signal (SIGPIPE, SIG_IGN);
1017 /* Ready. Now to our duties. */
1024 /* Note that this server mode is mainly useful for debugging. */
1026 wrong_args ("--server");
1030 log_set_file (logfile);
1031 log_set_prefix (NULL, GPGRT_LOG_WITH_TIME | GPGRT_LOG_WITH_PID);
1036 log_debug ("waiting for debugger - my pid is %u .....\n",
1037 (unsigned int)getpid());
1038 gnupg_sleep (debug_wait);
1039 log_debug ("... okay\n");
1046 http_register_netactivity_cb (netactivity_action);
1047 start_command_handler (ASSUAN_INVALID_FD);
1050 #ifndef HAVE_W32_SYSTEM
1051 else if (cmd == aSupervised)
1053 /* In supervised mode, we expect file descriptor 3 to be an
1054 already opened, listening socket.
1056 We will also not detach from the controlling process or close
1057 stderr; the supervisor should handle all of that. */
1058 struct stat statbuf;
1059 if (fstat (3, &statbuf) == -1 && errno == EBADF)
1061 log_error ("file descriptor 3 must be validin --supervised mode\n");
1064 socket_name = gnupg_get_socket_name (3);
1066 /* Now start with logging to a file if this is desired. */
1069 log_set_file (logfile);
1070 log_set_prefix (NULL, (GPGRT_LOG_WITH_PREFIX
1071 |GPGRT_LOG_WITH_TIME
1072 |GPGRT_LOG_WITH_PID));
1073 current_logfile = xstrdup (logfile);
1076 log_set_prefix (NULL, 0);
1081 http_register_netactivity_cb (netactivity_action);
1082 handle_connections (3);
1085 #endif /*HAVE_W32_SYSTEM*/
1086 else if (cmd == aDaemon)
1091 struct sockaddr_un serv_addr;
1094 wrong_args ("--daemon");
1096 /* Now start with logging to a file if this is desired. */
1099 log_set_file (logfile);
1100 log_set_prefix (NULL, (GPGRT_LOG_WITH_PREFIX
1101 |GPGRT_LOG_WITH_TIME
1102 |GPGRT_LOG_WITH_PID));
1103 current_logfile = xstrdup (logfile);
1106 #ifndef HAVE_W32_SYSTEM
1107 if (strchr (socket_name, ':'))
1109 log_error (_("colons are not allowed in the socket name\n"));
1113 fd = assuan_sock_new (AF_UNIX, SOCK_STREAM, 0);
1114 if (fd == ASSUAN_INVALID_FD)
1116 log_error (_("can't create socket: %s\n"), strerror (errno));
1124 if (assuan_sock_set_sockaddr_un (socket_name,
1125 (struct sockaddr*)&serv_addr,
1128 if (errno == ENAMETOOLONG)
1129 log_error (_("socket name '%s' is too long\n"), socket_name);
1131 log_error ("error preparing socket '%s': %s\n",
1133 gpg_strerror (gpg_error_from_syserror ()));
1138 redir_socket_name = xstrdup (serv_addr.sun_path);
1140 log_info ("redirecting socket '%s' to '%s'\n",
1141 socket_name, redir_socket_name);
1145 len = SUN_LEN (&serv_addr);
1147 rc = assuan_sock_bind (fd, (struct sockaddr*) &serv_addr, len);
1149 && (errno == EADDRINUSE
1150 #ifdef HAVE_W32_SYSTEM
1155 /* Fixme: We should test whether a dirmngr is already running. */
1156 gnupg_remove (redir_socket_name? redir_socket_name : socket_name);
1157 rc = assuan_sock_bind (fd, (struct sockaddr*) &serv_addr, len);
1160 && (rc = assuan_sock_get_nonce ((struct sockaddr*) &serv_addr, len, &socket_nonce)))
1161 log_error (_("error getting nonce for the socket\n"));
1164 log_error (_("error binding socket to '%s': %s\n"),
1166 gpg_strerror (gpg_error_from_errno (errno)));
1167 assuan_sock_close (fd);
1172 if (gnupg_chmod (serv_addr.sun_path, "-rwx"))
1173 log_error (_("can't set permissions of '%s': %s\n"),
1174 serv_addr.sun_path, strerror (errno));
1176 if (listen (FD2INT (fd), 5) == -1)
1178 log_error (_("listen() failed: %s\n"), strerror (errno));
1179 assuan_sock_close (fd);
1184 log_info (_("listening on socket '%s'\n"), serv_addr.sun_path);
1188 /* Note: We keep the dirmngr_info output only for the sake of
1189 existing scripts which might use this to detect a successful
1190 start of the dirmngr. */
1191 #ifdef HAVE_W32_SYSTEM
1196 es_printf ("set %s=%s;%lu;1\n",
1197 DIRMNGR_INFO_NAME, socket_name, (ulong) pid);
1200 if (pid == (pid_t)-1)
1202 log_fatal (_("error forking process: %s\n"), strerror (errno));
1207 { /* We are the parent */
1210 /* Don't let cleanup() remove the socket - the child is
1211 responsible for doing that. */
1216 /* Create the info string: <name>:<pid>:<protocol_version> */
1217 if (asprintf (&infostr, "%s=%s:%lu:1",
1218 DIRMNGR_INFO_NAME, serv_addr.sun_path, (ulong)pid ) < 0)
1220 log_error (_("out of core\n"));
1221 kill (pid, SIGTERM);
1224 /* Print the environment string, so that the caller can use
1225 shell's eval to set it. But see above. */
1228 *strchr (infostr, '=') = ' ';
1229 es_printf ( "setenv %s;\n", infostr);
1233 es_printf ( "%s; export %s;\n", infostr, DIRMNGR_INFO_NAME);
1245 /* Detach from tty and put process into a new session */
1249 unsigned int oldflags;
1251 /* Close stdin, stdout and stderr unless it is the log stream */
1252 for (i=0; i <= 2; i++)
1254 if (!log_test_fd (i) && i != fd )
1257 && open ("/dev/null", i? O_WRONLY : O_RDONLY) == -1)
1259 log_error ("failed to open '%s': %s\n",
1260 "/dev/null", strerror (errno));
1269 log_error ("setsid() failed: %s\n", strerror(errno) );
1273 log_get_prefix (&oldflags);
1274 log_set_prefix (NULL, oldflags | GPGRT_LOG_RUN_DETACHED);
1275 opt.running_detached = 1;
1279 log_error ("chdir to / failed: %s\n", strerror (errno));
1288 http_register_netactivity_cb (netactivity_action);
1289 handle_connections (fd);
1292 else if (cmd == aListCRLs)
1294 /* Just list the CRL cache and exit. */
1296 wrong_args ("--list-crls");
1298 crl_cache_list (es_stdout);
1300 else if (cmd == aLoadCRL)
1302 struct server_control_s ctrlbuf;
1304 memset (&ctrlbuf, 0, sizeof ctrlbuf);
1305 dirmngr_init_default_ctrl (&ctrlbuf);
1311 rc = crl_cache_load (&ctrlbuf, NULL);
1314 for (; !rc && argc; argc--, argv++)
1315 rc = crl_cache_load (&ctrlbuf, *argv);
1317 dirmngr_deinit_default_ctrl (&ctrlbuf);
1319 else if (cmd == aFetchCRL)
1321 ksba_reader_t reader;
1322 struct server_control_s ctrlbuf;
1325 wrong_args ("--fetch-crl URL");
1327 memset (&ctrlbuf, 0, sizeof ctrlbuf);
1328 dirmngr_init_default_ctrl (&ctrlbuf);
1333 rc = crl_fetch (&ctrlbuf, argv[0], &reader);
1335 log_error (_("fetching CRL from '%s' failed: %s\n"),
1336 argv[0], gpg_strerror (rc));
1339 rc = crl_cache_insert (&ctrlbuf, argv[0], reader);
1341 log_error (_("processing CRL from '%s' failed: %s\n"),
1342 argv[0], gpg_strerror (rc));
1343 crl_close_reader (reader);
1345 dirmngr_deinit_default_ctrl (&ctrlbuf);
1347 else if (cmd == aFlush)
1349 /* Delete cache and exit. */
1351 wrong_args ("--flush");
1352 rc = crl_cache_flush();
1354 else if (cmd == aGPGConfTest)
1356 else if (cmd == aGPGConfList)
1358 unsigned long flags = 0;
1362 /* First the configuration file. This is not an option, but it
1363 is vital information for GPG Conf. */
1364 if (!opt.config_filename)
1365 opt.config_filename = make_filename (gnupg_homedir (),
1366 "dirmngr.conf", NULL );
1368 filename = percent_escape (opt.config_filename, NULL);
1369 es_printf ("gpgconf-dirmngr.conf:%lu:\"%s\n",
1370 GC_OPT_FLAG_DEFAULT, filename);
1373 es_printf ("verbose:%lu:\n", flags | GC_OPT_FLAG_NONE);
1374 es_printf ("quiet:%lu:\n", flags | GC_OPT_FLAG_NONE);
1375 es_printf ("debug-level:%lu:\"none\n", flags | GC_OPT_FLAG_DEFAULT);
1376 es_printf ("log-file:%lu:\n", flags | GC_OPT_FLAG_NONE);
1377 es_printf ("force:%lu:\n", flags | GC_OPT_FLAG_NONE);
1379 /* --csh and --sh are mutually exclusive, something we can not
1380 express in GPG Conf. --options is only usable from the
1381 command line, really. --debug-all interacts with --debug,
1382 and having both of them is thus problematic. --no-detach is
1383 also only usable on the command line. --batch is unused. */
1385 filename = make_filename (gnupg_homedir (),
1386 "dirmngr_ldapservers.conf",
1388 filename_esc = percent_escape (filename, NULL);
1389 es_printf ("ldapserverlist-file:%lu:\"%s\n", flags | GC_OPT_FLAG_DEFAULT,
1391 xfree (filename_esc);
1394 es_printf ("ldaptimeout:%lu:%u\n",
1395 flags | GC_OPT_FLAG_DEFAULT, DEFAULT_LDAP_TIMEOUT);
1396 es_printf ("max-replies:%lu:%u\n",
1397 flags | GC_OPT_FLAG_DEFAULT, DEFAULT_MAX_REPLIES);
1398 es_printf ("allow-ocsp:%lu:\n", flags | GC_OPT_FLAG_NONE);
1399 es_printf ("allow-version-check:%lu:\n", flags | GC_OPT_FLAG_NONE);
1400 es_printf ("ocsp-responder:%lu:\n", flags | GC_OPT_FLAG_NONE);
1401 es_printf ("ocsp-signer:%lu:\n", flags | GC_OPT_FLAG_NONE);
1403 es_printf ("faked-system-time:%lu:\n", flags | GC_OPT_FLAG_NONE);
1404 es_printf ("no-greeting:%lu:\n", flags | GC_OPT_FLAG_NONE);
1406 es_printf ("disable-http:%lu:\n", flags | GC_OPT_FLAG_NONE);
1407 es_printf ("disable-ldap:%lu:\n", flags | GC_OPT_FLAG_NONE);
1408 es_printf ("honor-http-proxy:%lu\n", flags | GC_OPT_FLAG_NONE);
1409 es_printf ("http-proxy:%lu:\n", flags | GC_OPT_FLAG_NONE);
1410 es_printf ("ldap-proxy:%lu:\n", flags | GC_OPT_FLAG_NONE);
1411 es_printf ("only-ldap-proxy:%lu:\n", flags | GC_OPT_FLAG_NONE);
1412 es_printf ("ignore-ldap-dp:%lu:\n", flags | GC_OPT_FLAG_NONE);
1413 es_printf ("ignore-http-dp:%lu:\n", flags | GC_OPT_FLAG_NONE);
1414 es_printf ("ignore-ocsp-service-url:%lu:\n", flags | GC_OPT_FLAG_NONE);
1415 /* Note: The next one is to fix a typo in gpgconf - should be
1416 removed eventually. */
1417 es_printf ("ignore-ocsp-servic-url:%lu:\n", flags | GC_OPT_FLAG_NONE);
1419 es_printf ("use-tor:%lu:\n", flags | GC_OPT_FLAG_NONE);
1420 es_printf ("keyserver:%lu:\n", flags | GC_OPT_FLAG_NONE);
1421 es_printf ("nameserver:%lu:\n", flags | GC_OPT_FLAG_NONE);
1422 es_printf ("resolver-timeout:%lu:%u\n",
1423 flags | GC_OPT_FLAG_DEFAULT, 0);
1433 crl_cache_deinit ();
1434 cert_cache_deinit (1);
1435 reload_dns_stuff (1);
1438 ldapserver_list_free (opt.ldapservers);
1440 opt.ldapservers = NULL;
1445 if (redir_socket_name)
1446 gnupg_remove (redir_socket_name);
1447 else if (socket_name && *socket_name)
1448 gnupg_remove (socket_name);
1454 dirmngr_exit (int rc)
1462 dirmngr_init_default_ctrl (ctrl_t ctrl)
1465 ctrl->http_proxy = xstrdup (opt.http_proxy);
1470 dirmngr_deinit_default_ctrl (ctrl_t ctrl)
1474 xfree (ctrl->http_proxy);
1475 ctrl->http_proxy = NULL;
1479 /* Create a list of LDAP servers from the file FILENAME. Returns the
1480 list or NULL in case of errors.
1482 The format fo such a file is line oriented where empty lines and
1483 lines starting with a hash mark are ignored. All other lines are
1484 assumed to be colon seprated with these fields:
1487 2. field: Portnumber
1494 static ldap_server_t
1495 parse_ldapserver_file (const char* filename)
1499 ldap_server_t server, serverstart, *serverend;
1501 unsigned int lineno = 0;
1504 fp = es_fopen (filename, "r");
1507 log_error (_("error opening '%s': %s\n"), filename, strerror (errno));
1512 serverend = &serverstart;
1513 while (es_fgets (buffer, sizeof buffer, fp))
1516 if (!*buffer || buffer[strlen(buffer)-1] != '\n')
1518 if (*buffer && es_feof (fp))
1519 ; /* Last line not terminated - continue. */
1522 log_error (_("%s:%u: line too long - skipped\n"),
1524 while ( (c=es_fgetc (fp)) != EOF && c != '\n')
1525 ; /* Skip until end of line. */
1529 /* Skip empty and comment lines.*/
1530 for (p=buffer; spacep (p); p++)
1532 if (!*p || *p == '\n' || *p == '#')
1535 /* Parse the colon separated fields. */
1536 server = ldapserver_parse_one (buffer, filename, lineno);
1539 *serverend = server;
1540 serverend = &server->next;
1545 log_error (_("error reading '%s': %s\n"), filename, strerror (errno));
1552 static fingerprint_list_t
1553 parse_ocsp_signer (const char *string)
1560 fingerprint_list_t list, *list_tail, item;
1561 unsigned int lnr = 0;
1566 /* Check whether this is not a filename and treat it as a direct
1567 fingerprint specification. */
1568 if (!strpbrk (string, "/.~\\"))
1570 item = xcalloc (1, sizeof *item);
1571 for (i=j=0; (string[i] == ':' || hexdigitp (string+i)) && j < 40; i++)
1572 if ( string[i] != ':' )
1573 item->hexfpr[j++] = string[i] >= 'a'? (string[i] & 0xdf): string[i];
1574 item->hexfpr[j] = 0;
1575 if (j != 40 || !(spacep (string+i) || !string[i]))
1577 log_error (_("%s:%u: invalid fingerprint detected\n"),
1578 "--ocsp-signer", 0);
1585 /* Well, it is a filename. */
1586 if (*string == '/' || (*string == '~' && string[1] == '/'))
1587 fname = make_filename (string, NULL);
1590 if (string[0] == '.' && string[1] == '/' )
1592 fname = make_filename (gnupg_homedir (), string, NULL);
1595 fp = es_fopen (fname, "r");
1598 err = gpg_error_from_syserror ();
1599 log_error (_("can't open '%s': %s\n"), fname, gpg_strerror (err));
1608 if (!es_fgets (line, DIM(line)-1, fp) )
1612 err = gpg_error_from_syserror ();
1613 log_error (_("%s:%u: read error: %s\n"),
1614 fname, lnr, gpg_strerror (err));
1622 fingerprint_list_t tmp = list->next;
1628 return list; /* Ready. */
1632 if (!*line || line[strlen(line)-1] != '\n')
1634 /* Eat until end of line. */
1635 while ( (c=es_getc (fp)) != EOF && c != '\n')
1637 err = gpg_error (*line? GPG_ERR_LINE_TOO_LONG
1638 /* */: GPG_ERR_INCOMPLETE_LINE);
1639 log_error (_("%s:%u: read error: %s\n"),
1640 fname, lnr, gpg_strerror (err));
1645 /* Allow for empty lines and spaces */
1646 for (p=line; spacep (p); p++)
1648 if (!*p || *p == '\n' || *p == '#')
1651 item = xcalloc (1, sizeof *item);
1653 list_tail = &item->next;
1655 for (i=j=0; (p[i] == ':' || hexdigitp (p+i)) && j < 40; i++)
1657 item->hexfpr[j++] = p[i] >= 'a'? (p[i] & 0xdf): p[i];
1658 item->hexfpr[j] = 0;
1659 if (j != 40 || !(spacep (p+i) || p[i] == '\n'))
1661 log_error (_("%s:%u: invalid fingerprint detected\n"), fname, lnr);
1665 while (spacep (p+i))
1667 if (p[i] && p[i] != '\n')
1668 log_info (_("%s:%u: garbage at end of line ignored\n"), fname, lnr);
1677 Stuff used in daemon mode.
1682 /* Reread parts of the configuration. Note, that this function is
1683 obviously not thread-safe and should only be called from the NPTH
1686 Fixme: Due to the way the argument parsing works, we create a
1687 memory leak here for all string type arguments. There is currently
1688 no clean way to tell whether the memory for the argument has been
1689 allocated or points into the process' original arguments. Unless
1690 we have a mechanism to tell this, we need to live on with this. */
1692 reread_configuration (void)
1694 ARGPARSE_ARGS pargs;
1696 unsigned int configlineno = 0;
1699 if (!opt.config_filename)
1700 return; /* No config file. */
1702 fp = fopen (opt.config_filename, "r");
1705 log_error (_("option file '%s': %s\n"),
1706 opt.config_filename, strerror(errno) );
1710 parse_rereadable_options (NULL, 1); /* Start from the default values. */
1712 memset (&pargs, 0, sizeof pargs);
1714 pargs.argc = &dummy;
1715 pargs.flags = 1; /* do not remove the args */
1716 while (optfile_parse (fp, opt.config_filename, &configlineno, &pargs, opts) )
1718 if (pargs.r_opt < -1)
1719 pargs.err = 1; /* Print a warning. */
1720 else /* Try to parse this option - ignore unchangeable ones. */
1721 parse_rereadable_options (&pargs, 1);
1730 /* A global function which allows us to trigger the reload stuff from
1733 dirmngr_sighup_action (void)
1735 log_info (_("SIGHUP received - "
1736 "re-reading configuration and flushing caches\n"));
1737 reread_configuration ();
1738 cert_cache_deinit (0);
1739 crl_cache_deinit ();
1742 reload_dns_stuff (0);
1747 /* This function is called if some network activity was done. At this
1748 * point we know the we have a network and we can decide whether to
1749 * run scheduled background tasks soon. The function should return
1750 * quickly and only trigger actions for another thread. */
1752 netactivity_action (void)
1754 network_activity_seen = 1;
1758 /* The signal handler. */
1759 #ifndef HAVE_W32_SYSTEM
1761 handle_signal (int signo)
1766 dirmngr_sighup_action ();
1770 cert_cache_print_stats ();
1774 log_info (_("SIGUSR2 received - no action defined\n"));
1778 if (!shutdown_pending)
1779 log_info (_("SIGTERM received - shutting down ...\n"));
1781 log_info (_("SIGTERM received - still %d active connections\n"),
1782 active_connections);
1784 if (shutdown_pending > 2)
1786 log_info (_("shutdown forced\n"));
1787 log_info ("%s %s stopped\n", strusage(11), strusage(13) );
1794 log_info (_("SIGINT received - immediate shutdown\n"));
1795 log_info( "%s %s stopped\n", strusage(11), strusage(13));
1801 log_info (_("signal %d received - no action defined\n"), signo);
1804 #endif /*!HAVE_W32_SYSTEM*/
1807 /* Check the nonce on a new connection. This is a NOP unless we are
1808 using our Unix domain socket emulation under Windows. */
1810 check_nonce (assuan_fd_t fd, assuan_sock_nonce_t *nonce)
1812 if (assuan_sock_check_nonce (fd, nonce))
1814 log_info (_("error reading nonce on fd %d: %s\n"),
1815 FD2INT (fd), strerror (errno));
1816 assuan_sock_close (fd);
1824 /* Helper to call a connection's main function. */
1826 start_connection_thread (void *arg)
1828 union int_and_ptr_u argval;
1831 memset (&argval, 0, sizeof argval);
1835 if (check_nonce (fd, &socket_nonce))
1837 log_error ("handler nonce check FAILED\n");
1841 #ifndef HAVE_W32_SYSTEM
1842 npth_setspecific (my_tlskey_current_fd, argval.aptr);
1845 active_connections++;
1847 log_info (_("handler for fd %d started\n"), FD2INT (fd));
1849 start_command_handler (fd);
1852 log_info (_("handler for fd %d terminated\n"), FD2INT (fd));
1853 active_connections--;
1855 #ifndef HAVE_W32_SYSTEM
1856 argval.afd = ASSUAN_INVALID_FD;
1857 npth_setspecific (my_tlskey_current_fd, argval.aptr);
1864 #ifdef HAVE_INOTIFY_INIT
1865 /* Read an inotify event and return true if it matches NAME. */
1867 my_inotify_is_name (int fd, const char *name)
1870 struct inotify_event ev;
1871 char _buf[sizeof (struct inotify_event) + 100 + 1];
1876 s = strrchr (name, '/');
1880 n = npth_read (fd, &buf, sizeof buf);
1881 if (n < sizeof (struct inotify_event))
1883 if (buf.ev.len < strlen (name)+1)
1885 if (strcmp (buf.ev.name, name))
1886 return 0; /* Not the desired file. */
1888 return 1; /* Found. */
1890 #endif /*HAVE_INOTIFY_INIT*/
1893 /* Main loop in daemon mode. Note that LISTEN_FD will be owned by
1896 handle_connections (assuan_fd_t listen_fd)
1899 #ifndef HAVE_W32_SYSTEM
1902 struct sockaddr_un paddr;
1903 socklen_t plen = sizeof( paddr );
1906 fd_set fdset, read_fdset;
1908 int my_inotify_fd = -1;
1910 npth_attr_init (&tattr);
1911 npth_attr_setdetachstate (&tattr, NPTH_CREATE_DETACHED);
1913 #ifndef HAVE_W32_SYSTEM /* FIXME */
1915 npth_sigev_add (SIGHUP);
1916 npth_sigev_add (SIGUSR1);
1917 npth_sigev_add (SIGUSR2);
1918 npth_sigev_add (SIGINT);
1919 npth_sigev_add (SIGTERM);
1923 #ifdef HAVE_INOTIFY_INIT
1924 if (disable_check_own_socket)
1926 else if ((my_inotify_fd = inotify_init ()) == -1)
1927 log_info ("error enabling fast daemon termination: %s\n",
1931 /* We need to watch the directory for the file because there
1932 * won't be an IN_DELETE_SELF for a socket file. */
1933 char *slash = strrchr (socket_name, '/');
1934 log_assert (slash && slash[1]);
1936 if (inotify_add_watch (my_inotify_fd, socket_name, IN_DELETE) == -1)
1938 close (my_inotify_fd);
1943 #endif /*HAVE_INOTIFY_INIT*/
1946 /* Setup the fdset. */
1948 FD_SET (FD2INT (listen_fd), &fdset);
1949 nfd = FD2INT (listen_fd);
1950 if (my_inotify_fd != -1)
1952 FD_SET (my_inotify_fd, &fdset);
1953 if (my_inotify_fd > nfd)
1954 nfd = my_inotify_fd;
1960 /* Shutdown test. */
1961 if (shutdown_pending)
1963 if (!active_connections)
1966 /* Do not accept new connections but keep on running the
1967 * select loop to wait for signals (e.g. SIGCHLD).
1969 * Note that we do not close the listening socket because a
1970 * client trying to connect to that socket would instead
1971 * restart a new dirmngr instance - which is unlikely the
1972 * intention of a shutdown. */
1973 /* assuan_sock_close (listen_fd); */
1974 /* listen_fd = -1; */
1977 if (my_inotify_fd != -1)
1979 FD_SET (my_inotify_fd, &fdset);
1980 nfd = my_inotify_fd;
1984 /* Take a copy of the fdset. */
1987 #ifndef HAVE_W32_SYSTEM
1988 ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, NULL, npth_sigev_sigmask());
1989 saved_errno = errno;
1991 while (npth_sigev_get_pending(&signo))
1992 handle_signal (signo);
1994 ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, NULL, NULL, NULL);
1995 saved_errno = errno;
1998 if (ret == -1 && saved_errno != EINTR)
2000 log_error (_("npth_pselect failed: %s - waiting 1s\n"),
2001 strerror (saved_errno));
2008 /* Interrupt. Will be handled at the top of the next loop. */
2012 if (shutdown_pending)
2014 /* Do not anymore accept connections. */
2018 #ifdef HAVE_INOTIFY_INIT
2019 if (my_inotify_fd != -1 && FD_ISSET (my_inotify_fd, &read_fdset)
2020 && my_inotify_is_name (my_inotify_fd, socket_name))
2022 shutdown_pending = 1;
2023 log_info ("socket file has been removed - shutting down\n");
2025 #endif /*HAVE_INOTIFY_INIT*/
2027 if (FD_ISSET (FD2INT (listen_fd), &read_fdset))
2029 plen = sizeof paddr;
2030 fd = INT2FD (npth_accept (FD2INT(listen_fd),
2031 (struct sockaddr *)&paddr, &plen));
2032 if (fd == GNUPG_INVALID_FD)
2034 log_error ("accept failed: %s\n", strerror (errno));
2038 char threadname[50];
2039 union int_and_ptr_u argval;
2042 memset (&argval, 0, sizeof argval);
2044 snprintf (threadname, sizeof threadname,
2045 "conn fd=%d", FD2INT(fd));
2047 ret = npth_create (&thread, &tattr,
2048 start_connection_thread, argval.aptr);
2051 log_error ("error spawning connection handler: %s\n",
2053 assuan_sock_close (fd);
2055 npth_setname_np (thread, threadname);
2057 fd = GNUPG_INVALID_FD;
2061 #ifdef HAVE_INOTIFY_INIT
2062 if (my_inotify_fd != -1)
2063 close (my_inotify_fd);
2064 #endif /*HAVE_INOTIFY_INIT*/
2065 npth_attr_destroy (&tattr);
2066 if (listen_fd != -1)
2067 assuan_sock_close (fd);
2069 log_info ("%s %s stopped\n", strusage(11), strusage(13));
2073 dirmngr_get_current_socket_name (void)
2078 return dirmngr_socket_name ();