diff options
Diffstat (limited to 'dirmngr/dirmngr.c')
-rw-r--r-- | dirmngr/dirmngr.c | 95 |
1 files changed, 57 insertions, 38 deletions
diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 12b74bd00..5a913905d 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -37,7 +37,9 @@ #endif #include <sys/stat.h> #include <unistd.h> -#include <signal.h> +#ifdef HAVE_SIGNAL_H +# include <signal.h> +#endif #include <pth.h> @@ -53,6 +55,16 @@ #include "ldapserver.h" #include "asshelp.h" +/* The plain Windows version uses the windows service system. For + example to start the service you may use "sc start dirmngr". + WindowsCE does not support this; the service system over there is + based on a single process with all services being DLLs - we can't + support this easily. */ +#if defined(HAVE_W32_SYSTEM) && !defined(HAVE_W32CE_SYSTEM) +# define USE_W32_SERVICE 1 +#endif + + enum cmd_and_opt_values { aNull = 0, oCsh = 'c', @@ -119,7 +131,7 @@ static ARGPARSE_OPTS opts[] = { ARGPARSE_c (aServer, "server", N_("run in server mode (foreground)") ), ARGPARSE_c (aDaemon, "daemon", N_("run in daemon mode (background)") ), -#ifdef HAVE_W32_SYSTEM +#ifdef USE_W32_SERVICE ARGPARSE_c (aService, "service", N_("run as windows service (background)")), #endif ARGPARSE_c (aListCRLs, "list-crls", N_("list the contents of the CRL cache")), @@ -374,9 +386,9 @@ set_debug (void) static void wrong_args (const char *text) { - fputs (_("usage: dirmngr [options] "), stderr); - fputs (text, stderr); - putc ('\n', stderr); + es_fputs (_("usage: dirmngr [options] "), es_stderr); + es_fputs (text, es_stderr); + es_putc ('\n', es_stderr); dirmngr_exit (2); } @@ -514,7 +526,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread) } -#ifdef HAVE_W32_SYSTEM +#ifdef USE_W32_SERVICE /* The global status of our service. */ SERVICE_STATUS_HANDLE service_handle; SERVICE_STATUS service_status; @@ -544,7 +556,7 @@ w32_service_control (DWORD control, DWORD event_type, LPVOID event_data, } return 0; } -#endif /*HAVE_W32_SYSTEM*/ +#endif /*USE_W32_SERVICE*/ #ifndef HAVE_W32_SYSTEM static int @@ -559,14 +571,14 @@ pid_suffix_callback (unsigned long *r_suffix) #endif /*!HAVE_W32_SYSTEM*/ -#ifdef HAVE_W32_SYSTEM -#define main real_main +#ifdef USE_W32_SERVICE +# define main real_main #endif int main (int argc, char **argv) { -#ifdef HAVE_W32_SYSTEM -#undef main +#ifdef USE_W32_SERVICE +# undef main #endif enum cmd_and_opt_values cmd = 0; ARGPARSE_ARGS pargs; @@ -589,7 +601,7 @@ main (int argc, char **argv) int homedir_seen = 0; struct assuan_malloc_hooks malloc_hooks; -#ifdef HAVE_W32_SYSTEM +#ifdef USE_W32_SERVICE /* The option will be set by main() below if we should run as a system daemon. */ if (opt.system_service) @@ -610,7 +622,7 @@ main (int argc, char **argv) service_status.dwWaitHint = 10000; /* 10 seconds timeout. */ SetServiceStatus (service_handle, &service_status); } -#endif /*HAVE_W32_SYSTEM*/ +#endif /*USE_W32_SERVICE*/ set_strusage (my_strusage); log_set_prefix ("dirmngr", 1|4); @@ -833,7 +845,7 @@ main (int argc, char **argv) } if (configfp) { - fclose( configfp ); + fclose (configfp); configfp = NULL; /* Keep a copy of the name so that it can be read on SIGHUP. */ opt.config_filename = configname; @@ -854,15 +866,22 @@ main (int argc, char **argv) if (greeting) { - fprintf (stderr, "%s %s; %s\n", - strusage(11), strusage(13), strusage(14) ); - fprintf (stderr, "%s\n", strusage(15) ); + es_fprintf (es_stderr, "%s %s; %s\n", + strusage(11), strusage(13), strusage(14) ); + es_fprintf (es_stderr, "%s\n", strusage(15) ); } #ifdef IS_DEVELOPMENT_VERSION log_info ("NOTE: this is a development version!\n"); #endif + if (!access ("/etc/dirmngr", F_OK) && !strncmp (opt.homedir, "/etc/", 5)) + log_info + ("NOTE: DirMngr is now a proper part of GnuPG. The configuration and" + " other directory names changed. Please check that no other version" + " of dirmngr is still installed. To disable this warning, remove the" + " directory `/etc/dirmngr'.\n"); + if (gnupg_faked_time_p ()) { gnupg_isotime_t tbuf; @@ -975,7 +994,7 @@ main (int argc, char **argv) rc = assuan_sock_bind (fd, (struct sockaddr*) &serv_addr, len); if (rc == -1 && errno == EADDRINUSE) { - remove (socket_name); + gnupg_remove (socket_name); rc = assuan_sock_bind (fd, (struct sockaddr*) &serv_addr, len); } if (rc != -1 @@ -1000,7 +1019,7 @@ main (int argc, char **argv) if (opt.verbose) log_info (_("listening on socket `%s'\n"), socket_name ); - fflush (NULL); + es_fflush (NULL); #ifdef HAVE_W32_SYSTEM pid = getpid (); @@ -1085,7 +1104,7 @@ main (int argc, char **argv) launch_reaper_thread (); cert_cache_init (); crl_cache_init (); -#ifdef HAVE_W32_SYSTEM +#ifdef USE_W32_SERVICE if (opt.system_service) { service_status.dwCurrentState = SERVICE_RUNNING; @@ -1095,7 +1114,7 @@ main (int argc, char **argv) handle_connections (fd); assuan_sock_close (fd); shutdown_reaper (); -#ifdef HAVE_W32_SYSTEM +#ifdef USE_W32_SERVICE if (opt.system_service) { service_status.dwCurrentState = SERVICE_STOPPED; @@ -1110,7 +1129,7 @@ main (int argc, char **argv) wrong_args ("--list-crls"); launch_reaper_thread (); crl_cache_init (); - crl_cache_list (stdout); + crl_cache_list (es_stdout); } else if (cmd == aLoadCRL) { @@ -1260,7 +1279,7 @@ main (int argc, char **argv) } -#ifdef HAVE_W32_SYSTEM +#ifdef USE_W32_SERVICE int main (int argc, char *argv[]) { @@ -1291,7 +1310,7 @@ main (int argc, char *argv[]) return 0; } } -#endif +#endif /*USE_W32_SERVICE*/ static void @@ -1307,7 +1326,7 @@ cleanup (void) { cleanup_socket = 0; if (socket_name && *socket_name) - remove (socket_name); + gnupg_remove (socket_name); } } @@ -1351,9 +1370,9 @@ parse_ldapserver_file (const char* filename) ldap_server_t server, serverstart, *serverend; int c; unsigned int lineno = 0; - FILE *fp; + estream_t fp; - fp = fopen (filename, "r"); + fp = es_fopen (filename, "r"); if (!fp) { log_error (_("error opening `%s': %s\n"), filename, strerror (errno)); @@ -1362,18 +1381,18 @@ parse_ldapserver_file (const char* filename) serverstart = NULL; serverend = &serverstart; - while (fgets (buffer, sizeof buffer, fp)) + while (es_fgets (buffer, sizeof buffer, fp)) { lineno++; if (!*buffer || buffer[strlen(buffer)-1] != '\n') { - if (*buffer && feof (fp)) + if (*buffer && es_feof (fp)) ; /* Last line not terminated - continue. */ else { log_error (_("%s:%u: line too long - skipped\n"), filename, lineno); - while ( (c=fgetc (fp)) != EOF && c != '\n') + while ( (c=es_fgetc (fp)) != EOF && c != '\n') ; /* Skip until end of line. */ continue; } @@ -1393,9 +1412,9 @@ parse_ldapserver_file (const char* filename) } } - if (ferror (fp)) + if (es_ferror (fp)) log_error (_("error reading `%s': %s\n"), filename, strerror (errno)); - fclose (fp); + es_fclose (fp); return serverstart; } @@ -1406,7 +1425,7 @@ parse_ocsp_signer (const char *string) { gpg_error_t err; char *fname; - FILE *fp; + estream_t fp; char line[256]; char *p; fingerprint_list_t list, *list_tail, item; @@ -1444,7 +1463,7 @@ parse_ocsp_signer (const char *string) fname = make_filename (opt.homedir, string, NULL); } - fp = fopen (fname, "r"); + fp = es_fopen (fname, "r"); if (!fp) { err = gpg_error_from_syserror (); @@ -1457,16 +1476,16 @@ parse_ocsp_signer (const char *string) list_tail = &list; for (;;) { - if (!fgets (line, DIM(line)-1, fp) ) + if (!es_fgets (line, DIM(line)-1, fp) ) { - if (!feof (fp)) + if (!es_feof (fp)) { err = gpg_error_from_syserror (); log_error (_("%s:%u: read error: %s\n"), fname, lnr, gpg_strerror (err)); errflag = 1; } - fclose (fp); + es_fclose (fp); if (errflag) { while (list) @@ -1484,7 +1503,7 @@ parse_ocsp_signer (const char *string) if (!*line || line[strlen(line)-1] != '\n') { /* Eat until end of line. */ - while ( (c=getc (fp)) != EOF && c != '\n') + while ( (c=es_getc (fp)) != EOF && c != '\n') ; err = gpg_error (*line? GPG_ERR_LINE_TOO_LONG /* */: GPG_ERR_INCOMPLETE_LINE); |