diff options
Diffstat (limited to 'assuan/assuan-pipe-connect.c')
-rw-r--r-- | assuan/assuan-pipe-connect.c | 123 |
1 files changed, 56 insertions, 67 deletions
diff --git a/assuan/assuan-pipe-connect.c b/assuan/assuan-pipe-connect.c index 6614dab9..d7595c9f 100644 --- a/assuan/assuan-pipe-connect.c +++ b/assuan/assuan-pipe-connect.c @@ -1,21 +1,21 @@ /* assuan-pipe-connect.c - Establish a pipe connection (client) - * Copyright (C) 2001 Free Software Foundation, Inc. + * Copyright (C) 2001, 2002 Free Software Foundation, Inc. * - * This file is part of GnuPG. + * This file is part of Assuan. * - * 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 2 of the License, or - * (at your option) any later version. + * Assuan 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. * - * 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. + * Assuan 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 + * Lesser General Public License for more details. * - * You should have received a copy of the GNU 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 + * 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 */ #ifdef HAVE_CONFIG_H @@ -28,10 +28,9 @@ #include <signal.h> #include <unistd.h> #include <errno.h> +#include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> -#include <sys/stat.h> -#include <fcntl.h> #include "assuan-defs.h" @@ -104,9 +103,8 @@ do_deinit (ASSUAN_CONTEXT ctx) vector in ARGV. FD_CHILD_LIST is a -1 terminated list of file descriptors not to close in the child. */ AssuanError -assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, - char *const argv[], int *fd_child_list, - unsigned int connect_flags) +assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[], + int *fd_child_list) { static int fixed_signals = 0; AssuanError err; @@ -172,35 +170,9 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, { 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 */ - n = sysconf (_SC_OPEN_MAX); - if (n < 0) - n = MAX_OPEN_FDS; - for (i=0; i < n; i++) - { - int *fdp = fd_child_list; + int *fdp; - if (fdp) - { - while (*fdp != -1 && *fdp != i) - fdp++; - } - - 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 handles to stdin/stdout. */ if (rp[1] != STDOUT_FILENO) { if (dup2 (rp[1], STDOUT_FILENO) == -1) @@ -208,7 +180,6 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, LOGERROR1 ("dup2 failed in child: %s\n", strerror (errno)); _exit (4); } - close (rp[1]); } if (wp[0] != STDIN_FILENO) { @@ -217,26 +188,53 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, LOGERROR1 ("dup2 failed in child: %s\n", strerror (errno)); _exit (4); } - close (wp[0]); } - if ((connect_flags & 1)) - { /* dup stderr to /dev/null so that the application output - won't get clobbered with output from the backend */ - int fdzero = open ("/dev/null", O_WRONLY); - if (fdzero == -1) - { - LOGERROR1 ("can't open `/dev/null': %s\n", strerror (errno)); - _exit (4); + /* 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 (fdzero, 2) == -1) + if (dup2 (fd, STDERR_FILENO) == -1) { LOGERROR1 ("dup2(dev/null, 2) failed: %s\n", strerror (errno)); _exit (4); } - close (fdzero); } + + /* 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++) + { + if ( i == STDIN_FILENO || i == STDOUT_FILENO || i == STDERR_FILENO) + continue; + fdp = fd_child_list; + if (fdp) + { + while (*fdp != -1 && *fdp != i) + fdp++; + } + + if (!(fdp && *fdp != -1)) + close(i); + } + errno = 0; + execv (name, argv); /* oops - use the pipe to tell the parent about it */ snprintf (errbuf, sizeof(errbuf)-1, "ERR %d can't exec `%s': %.50s\n", @@ -274,15 +272,6 @@ assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name, return err; } -AssuanError -assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[], - int *fd_child_list) -{ - return assuan_pipe_connect2 (ctx, name, argv, fd_child_list, 0); -} - - - |