From ad4d81f528229e0ecda3246aee3fcf88f0e9c3c3 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 27 Jun 2002 07:29:57 +0000 Subject: [PATCH] * gpgsm.c (main): Use GNUPG_DEFAULT_HOMEDIR constant. * call-agent.c (start_agent): Create and pass the list of FD to keep in the child to assuan. * call-dirmngr.c (start_dirmngr): Ditto. * scdaemon.c (main): Use GNUPG_DEFAULT_HOMEDIR constant. * assuan-pipe-connect.c (assuan_pipe_connect): No special handling for the log_fd and stderr. Connect stderr to /dev/null if it should not be retained. --- assuan/ChangeLog | 6 +++++ assuan/assuan-pipe-connect.c | 43 ++++++++++++++++++++++++++---------- scd/ChangeLog | 4 ++++ scd/scdaemon.c | 8 +------ sm/ChangeLog | 8 +++++++ sm/call-agent.c | 11 ++++++++- sm/call-dirmngr.c | 11 ++++++++- sm/gpgsm.c | 4 +--- 8 files changed, 71 insertions(+), 24 deletions(-) diff --git a/assuan/ChangeLog b/assuan/ChangeLog index 8b9bd3f55..0a420fed8 100644 --- a/assuan/ChangeLog +++ b/assuan/ChangeLog @@ -1,3 +1,9 @@ +2002-06-27 Werner Koch + + * assuan-pipe-connect.c (assuan_pipe_connect): No special handling + for the log_fd and stderr. Connect stderr to /dev/null if it + should not be retained. + 2002-06-26 Werner Koch * assuan-buffer.c (assuan_write_line): Make sure we never diff --git a/assuan/assuan-pipe-connect.c b/assuan/assuan-pipe-connect.c index ccfc1f016..40f6b5463 100644 --- a/assuan/assuan-pipe-connect.c +++ b/assuan/assuan-pipe-connect.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -169,18 +170,16 @@ assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[], { int i, n; char errbuf[512]; -#ifdef HAVE_JNLIB_LOGGING - int log_fd = log_get_fd (); -#endif - /* close all files which will not be duped but keep stderr - and log_stream for now */ + int *fdp; + + /* Close all files which will not be duped and are not in the + fd_child_list. */ n = sysconf (_SC_OPEN_MAX); if (n < 0) n = MAX_OPEN_FDS; for (i=0; i < n; i++) { - int *fdp = fd_child_list; - + fdp = fd_child_list; if (fdp) { while (*fdp != -1 && *fdp != i) @@ -188,16 +187,36 @@ assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[], } if (!(fdp && *fdp != -1) - && i != fileno (stderr) -#ifdef HAVE_JNLIB_LOGGING - && i != log_fd -#endif && i != rp[1] && i != wp[0]) close(i); } errno = 0; - /* Dup handles and to stdin/stdout and exec */ + /* Dup stderr to /dev/null unless it is in the list of FDs to be + passed to the child. */ + fdp = fd_child_list; + if (fdp) + { + for (; *fdp != -1 && *fdp != STDERR_FILENO; fdp++) + ; + } + if (!fdp || *fdp == -1) + { + int fd = open ("/dev/null", O_WRONLY); + if (fd == -1) + { + LOGERROR1 ("can't open `/dev/null': %s\n", strerror (errno)); + _exit (4); + } + if (dup2 (fd, STDERR_FILENO) == -1) + { + LOGERROR1 ("dup2(dev/null, 2) failed: %s\n", strerror (errno)); + _exit (4); + } + close (fd); + } + + /* Dup handles and to stdin/stdout and exec. */ if (rp[1] != STDOUT_FILENO) { if (dup2 (rp[1], STDOUT_FILENO) == -1) diff --git a/scd/ChangeLog b/scd/ChangeLog index 13ac0c07c..b06603315 100644 --- a/scd/ChangeLog +++ b/scd/ChangeLog @@ -1,3 +1,7 @@ +2002-06-27 Werner Koch + + * scdaemon.c (main): Use GNUPG_DEFAULT_HOMEDIR constant. + 2002-06-15 Werner Koch * card-dinsig.c: Documented some stuff from the DIN norm. diff --git a/scd/scdaemon.c b/scd/scdaemon.c index a6f18cc36..d1402b5ee 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -261,13 +261,7 @@ main (int argc, char **argv ) looking at the uid or ebtter use an explict option for this */ opt.homedir = getenv("GNUPGHOME"); if (!opt.homedir || !*opt.homedir) - { -#ifdef HAVE_DRIVE_LETTERS - opt.homedir = "c:/gnupg-test"; -#else - opt.homedir = "~/.gnupg-test"; -#endif - } + opt.homedir = GNUPG_DEFAULT_HOMEDIR; /* check whether we have a config file on the commandline */ orig_argc = argc; diff --git a/sm/ChangeLog b/sm/ChangeLog index a5112a190..bcc61360d 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,3 +1,11 @@ +2002-06-27 Werner Koch + + * gpgsm.c (main): Use GNUPG_DEFAULT_HOMEDIR constant. + + * call-agent.c (start_agent): Create and pass the list of FD to + keep in the child to assuan. + * call-dirmngr.c (start_dirmngr): Ditto. + 2002-06-26 Werner Koch * import.c (gpgsm_import): Print an STATUS_IMPORTED. diff --git a/sm/call-agent.c b/sm/call-agent.c index f4b6087e2..b3c78579c 100644 --- a/sm/call-agent.c +++ b/sm/call-agent.c @@ -151,6 +151,8 @@ start_agent (void) { const char *pgmname; const char *argv[3]; + int no_close_list[3]; + int i; if (opt.verbose) log_info (_("no running gpg-agent - starting one\n")); @@ -172,8 +174,15 @@ start_agent (void) argv[1] = "--server"; argv[2] = NULL; + i=0; + if (log_get_fd () != -1) + no_close_list[i++] = log_get_fd (); + no_close_list[i++] = fileno (stderr); + no_close_list[i] = -1; + /* connect to the agent and perform initial handshaking */ - rc = assuan_pipe_connect (&ctx, opt.agent_program, (char**)argv, 0); + rc = assuan_pipe_connect (&ctx, opt.agent_program, (char**)argv, + no_close_list); } else { diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c index 1cdf3e243..017191dbe 100644 --- a/sm/call-dirmngr.c +++ b/sm/call-dirmngr.c @@ -143,6 +143,8 @@ start_dirmngr (void) { const char *pgmname; const char *argv[3]; + int no_close_list[3]; + int i; if (opt.verbose) log_info (_("no running dirmngr - starting one\n")); @@ -164,8 +166,15 @@ start_dirmngr (void) argv[1] = "--server"; argv[2] = NULL; + i=0; + if (log_get_fd () != -1) + no_close_list[i++] = log_get_fd (); + no_close_list[i++] = fileno (stderr); + no_close_list[i] = -1; + /* connect to the agent and perform initial handshaking */ - rc = assuan_pipe_connect (&ctx, opt.dirmngr_program, (char**)argv, 0); + rc = assuan_pipe_connect (&ctx, opt.dirmngr_program, (char**)argv, + no_close_list); } else { diff --git a/sm/gpgsm.c b/sm/gpgsm.c index e650e941c..9d91cd9db 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -636,9 +636,7 @@ main ( int argc, char **argv) opt.homedir = getenv ("GNUPGHOME"); #endif if (!opt.homedir || !*opt.homedir ) - { - opt.homedir = "~/.gnupg-test" /*fixme: GNUPG_HOMEDIR*/; - } + opt.homedir = GNUPG_DEFAULT_HOMEDIR; /* first check whether we have a config file on the commandline */ orig_argc = argc;