* srv.c (getsrv): Raise maximum packet size to 2048, as PACKETSZ is
[gnupg.git] / common / exechelp.h
index 9e482b7..0efee29 100644 (file)
@@ -1,5 +1,5 @@
 /* exechelp.h - Definitions for the fork and exec helpers
- *     Copyright (C) 2004 Free Software Foundation, Inc.
+ *     Copyright (C) 2004, 2009 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
 #ifndef GNUPG_COMMON_EXECHELP_H
 #define GNUPG_COMMON_EXECHELP_H
 
+/* Return the maximum number of currently allowed file descriptors.
+   Only useful on POSIX systems.  */
+int get_max_fds (void);
+
+
+/* Close all file descriptors starting with descriptor FIRST.  If
+   EXCEPT is not NULL, it is expected to be a list of file descriptors
+   which are not to close.  This list shall be sorted in ascending
+   order with its end marked by -1.  */
+void close_all_fds (int first, int *except);
+
+
+/* Returns an array with all currently open file descriptors.  The end
+   of the array is marked by -1.  The caller needs to release this
+   array using the *standard free* and not with xfree.  This allow the
+   use of this fucntion right at startup even before libgcrypt has
+   been initialized.  Returns NULL on error and sets ERRNO accordingly.  */
+int *get_all_open_fds (void);
+
+
+/* Portable function to create a pipe.  Under Windows the write end is
+   inheritable.  */
+gpg_error_t gnupg_create_inbound_pipe (int filedes[2]);
 
 
 /* Fork and exec the PGMNAME, connect the file descriptor of INFILE to
    stdin, write the output to OUTFILE, return a new stream in
    STATUSFILE for stderr and the pid of the process in PID. The
    arguments for the process are expected in the NULL terminated array
-   ARGV.  The program name itself should not be included there.  if
+   ARGV.  The program name itself should not be included there.  If
    PREEXEC is not NULL, that function will be called right before the
-   exec.  Returns 0 on success or an error code. */
+   exec.  FLAGS is currently only useful for W32, see the source for
+   details.  Calling gnupg_wait_process is required.  Returns 0 on
+   success or an error code. */
 gpg_error_t gnupg_spawn_process (const char *pgmname, const char *argv[],
                                  FILE *infile, FILE *outfile,
-                                 void (*preexec)(void),
+                                 void (*preexec)(void), unsigned int flags,
                                  FILE **statusfile, pid_t *pid);
 
+
+/* Simplified version of gnupg_spawn_process.  This function forks and
+   then execs PGMNAME, while connecting INFD to stdin, OUTFD to stdout
+   and ERRFD to stderr (any of them may be -1 to connect them to
+   /dev/null).  The arguments for the process are expected in the NULL
+   terminated array ARGV.  The program name itself should not be
+   included there.  Calling gnupg_wait_process is required.  Returns 0
+   on success or an error code. */
+gpg_error_t gnupg_spawn_process_fd (const char *pgmname, 
+                                    const char *argv[],
+                                    int infd, int outfd, int errfd,
+                                    pid_t *pid);
+
+
 /* Wait for the process identified by PID to terminate. PGMNAME should
-   be the same as suplieed to the spawn fucntion and is only used for
-   diagnostics. Returns 0 if the process succeded, GPG_ERR_GENERAL for
-   any failures of the spawned program or other error codes.*/
-gpg_error_t gnupg_wait_process (const char *pgmname, pid_t pid);
+   be the same as supplied to the spawn fucntion and is only used for
+   diagnostics.  Returns 0 if the process succeded, GPG_ERR_GENERAL
+   for any failures of the spawned program or other error codes.  If
+   EXITCODE is not NULL the exit code of the process is stored at this
+   address or -1 if it could not be retrieved.  */
+gpg_error_t gnupg_wait_process (const char *pgmname, pid_t pid, int *exitcode);
 
 
 /* Spawn a new process and immediatley detach from it.  The name of