agent: Cleanups to prepare implementation of Ed25519.
[gnupg.git] / common / exechelp.h
1 /* exechelp.h - Definitions for the fork and exec helpers
2  * Copyright (C) 2004, 2009, 2010 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * This file is free software; you can redistribute it and/or modify
7  * it under the terms of either
8  *
9  *   - the GNU Lesser General Public License as published by the Free
10  *     Software Foundation; either version 3 of the License, or (at
11  *     your option) any later version.
12  *
13  * or
14  *
15  *   - the GNU General Public License as published by the Free
16  *     Software Foundation; either version 2 of the License, or (at
17  *     your option) any later version.
18  *
19  * or both in parallel, as here.
20  *
21  * This file is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, see <http://www.gnu.org/licenses/>.
28  */
29
30 #ifndef GNUPG_COMMON_EXECHELP_H
31 #define GNUPG_COMMON_EXECHELP_H
32
33 #include "../common/estream.h"
34
35
36 /* Return the maximum number of currently allowed file descriptors.
37    Only useful on POSIX systems.  */
38 int get_max_fds (void);
39
40
41 /* Close all file descriptors starting with descriptor FIRST.  If
42    EXCEPT is not NULL, it is expected to be a list of file descriptors
43    which are not to close.  This list shall be sorted in ascending
44    order with its end marked by -1.  */
45 void close_all_fds (int first, int *except);
46
47
48 /* Returns an array with all currently open file descriptors.  The end
49    of the array is marked by -1.  The caller needs to release this
50    array using the *standard free* and not with xfree.  This allow the
51    use of this fucntion right at startup even before libgcrypt has
52    been initialized.  Returns NULL on error and sets ERRNO accordingly.  */
53 int *get_all_open_fds (void);
54
55
56 /* Portable function to create a pipe.  Under Windows the write end is
57    inheritable.  */
58 gpg_error_t gnupg_create_inbound_pipe (int filedes[2]);
59
60 /* Portable function to create a pipe.  Under Windows the read end is
61    inheritable.  */
62 gpg_error_t gnupg_create_outbound_pipe (int filedes[2]);
63
64
65 /* Fork and exec the PGMNAME.  If INFP is NULL connect /dev/null to
66    stdin of the new process; if it is not NULL connect the file
67    descriptor retrieved from INFP to stdin.  If R_OUTFP is NULL
68    connect stdout of the new process to /dev/null; if it is not NULL
69    store the address of a pointer to a new estream there.  If R_ERRFP
70    is NULL connect stderr of the new process to /dev/null; if it is
71    not NULL store the address of a pointer to a new estream there.  On
72    success the pid of the new process is stored at PID.  On error -1
73    is stored at PID and if R_OUTFP or R_ERRFP are not NULL, NULL is
74    stored there.
75
76    The arguments for the process are expected in the NULL terminated
77    array ARGV.  The program name itself should not be included there.
78    If PREEXEC is not NULL, the given function will be called right
79    before the exec.
80
81    Returns 0 on success or an error code.  Calling gnupg_wait_process
82    and gnupg_release_process is required if the function succeeded.
83
84    FLAGS is a bit vector:
85
86    Bit 7: If set the process will be started as a background process.
87           This flag is only useful under W32 (but not W32CE) systems,
88           so that no new console is created and pops up a console
89           window when starting the server.  Does not work on W32CE.
90
91    Bit 6: On W32 (but not on W32CE) run AllowSetForegroundWindow for
92           the child.  Note that due to unknown problems this actually
93           allows SetForegroundWindow for all childs of this process.
94
95  */
96 gpg_error_t
97 gnupg_spawn_process (const char *pgmname, const char *argv[],
98                      gpg_err_source_t errsource,
99                      void (*preexec)(void), unsigned int flags,
100                      estream_t infp,
101                      estream_t *r_outfp,
102                      estream_t *r_errfp,
103                      pid_t *pid);
104
105
106 /* Simplified version of gnupg_spawn_process.  This function forks and
107    then execs PGMNAME, while connecting INFD to stdin, OUTFD to stdout
108    and ERRFD to stderr (any of them may be -1 to connect them to
109    /dev/null).  The arguments for the process are expected in the NULL
110    terminated array ARGV.  The program name itself should not be
111    included there.  Calling gnupg_wait_process and
112    gnupg_release_process is required.  Returns 0 on success or an
113    error code. */
114 gpg_error_t gnupg_spawn_process_fd (const char *pgmname,
115                                     const char *argv[],
116                                     int infd, int outfd, int errfd,
117                                     pid_t *pid);
118
119
120 /* If HANG is true, waits for the process identified by PID to exit;
121    if HANG is false, checks whether the process has terminated.
122    PGMNAME should be the same as supplied to the spawn function and is
123    only used for diagnostics.  Return values:
124
125    0
126        The process exited successful.  0 is stored at R_EXITCODE.
127
128    GPG_ERR_GENERAL
129        The process exited without success.  The exit code of process
130        is then stored at R_EXITCODE.  An exit code of -1 indicates
131        that the process terminated abnormally (e.g. due to a signal).
132
133    GPG_ERR_TIMEOUT
134        The process is still running (returned only if HANG is false).
135
136    GPG_ERR_INV_VALUE
137        An invalid PID has been specified.
138
139    Other error codes may be returned as well.  Unless otherwise noted,
140    -1 will be stored at R_EXITCODE.  R_EXITCODE may be passed as NULL
141    if the exit code is not required (in that case an error messge will
142    be printed).  Note that under Windows PID is not the process id but
143    the handle of the process.  */
144 gpg_error_t gnupg_wait_process (const char *pgmname, pid_t pid, int hang,
145                                 int *r_exitcode);
146
147
148 /* Kill a process; that is send an appropriate signal to the process.
149    gnupg_wait_process must be called to actually remove the process
150    from the system.  An invalid PID is ignored.  */
151 void gnupg_kill_process (pid_t pid);
152
153 /* Release the process identified by PID.  This function is actually
154    only required for Windows but it does not harm to always call it.
155    It is a nop if PID is invalid.  */
156 void gnupg_release_process (pid_t pid);
157
158
159 /* Spawn a new process and immediatley detach from it.  The name of
160    the program to exec is PGMNAME and its arguments are in ARGV (the
161    programname is automatically passed as first argument).
162    Environment strings in ENVP are set.  An error is returned if
163    pgmname is not executable; to make this work it is necessary to
164    provide an absolute file name.  */
165 gpg_error_t gnupg_spawn_process_detached (const char *pgmname,
166                                           const char *argv[],
167                                           const char *envp[] );
168
169
170
171 #endif /*GNUPG_COMMON_EXECHELP_H*/