* assuan-pipe-connect.c (assuan_pipe_connect2): New to extend
authorWerner Koch <wk@gnupg.org>
Fri, 3 May 2002 18:19:44 +0000 (18:19 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 3 May 2002 18:19:44 +0000 (18:19 +0000)
assuan_pipe_connect with some flags.  Implemented a bitbucket for
stderr.

trunk/assuan/ChangeLog
trunk/assuan/assuan-pipe-connect.c
trunk/assuan/assuan.h

index 0ddf65ccff8dc5129016dfa283f990b6e98fd7a4..0cf53b89e6e61d2bc75f5c0e411213fb2809d945 100644 (file)
@@ -1,3 +1,9 @@
+2002-05-03  Werner Koch  <wk@gnupg.org>
+
+       * assuan-pipe-connect.c (assuan_pipe_connect2): New to extend
+       assuan_pipe_connect with some flags.  Implemented a bitbucket for
+       stderr. 
+
 2002-04-26  Werner Koch  <wk@gnupg.org>
 
        * Makefile.am: Create libtool libraries
index ccfc1f016920c2a7db065a3cf112cd8b372ef3fa..6614dab9eec97601868facff99449a8a3932b391 100644 (file)
@@ -30,6 +30,8 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
 #include "assuan-defs.h"
 
@@ -102,8 +104,9 @@ 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_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[],
-                    int *fd_child_list)
+assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name,
+                      char *const argv[], int *fd_child_list,
+                      unsigned int connect_flags)
 {
   static int fixed_signals = 0;
   AssuanError err;
@@ -217,6 +220,23 @@ assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[],
           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);
+            }
+          if (dup2 (fdzero, 2) == -1)
+            {
+              LOGERROR1 ("dup2(dev/null, 2) failed: %s\n", strerror (errno));
+              _exit (4);
+            }
+          close (fdzero);
+        }
+
       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",
@@ -254,6 +274,15 @@ assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name, char *const argv[],
   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);
+}
+
+
+
 
 
 
index a9340019ffa450c9ad90d2fedff1c8985f5f080f..e18c46e6b60bd9447ba06898a866f1b6bfd360b0 100644 (file)
@@ -175,6 +175,10 @@ int assuan_init_socket_server (ASSUAN_CONTEXT *r_ctx, int listen_fd);
 /*-- assuan-pipe-connect.c --*/
 AssuanError assuan_pipe_connect (ASSUAN_CONTEXT *ctx, const char *name,
                                  char *const argv[], int *fd_child_list);
+AssuanError assuan_pipe_connect2 (ASSUAN_CONTEXT *ctx, const char *name,
+                                  char *const argv[], int *fd_child_list,
+                                  unsigned int connect_flags);
+
 /*-- assuan-socket-connect.c --*/
 AssuanError assuan_socket_connect (ASSUAN_CONTEXT *ctx, const char *name,
                                    pid_t server_pid);