X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_os_lib.h;h=e4bbab8a97ac77a6b0d27cd985b08638e4abc453;hb=9e249590e5d750c70ec61d1100c70d325374dbd8;hp=aed5e3b0137ac9080594bed6e1eeaa5262f94dae;hpb=71ea5bd2d05058008e604ffd42993be9c7250e04;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_os_lib.h b/src/include/gnunet_os_lib.h index aed5e3b01..e4bbab8a9 100644 --- a/src/include/gnunet_os_lib.h +++ b/src/include/gnunet_os_lib.h @@ -27,6 +27,16 @@ * @author Ioana Patrascu * @author Tzvetan Horozov * @author Milan + * + * This code manages child processes. We can communicate with child + * processes using signals. Because signals are not supported on W32 + * and Java (at least not nicely), we can alternatively use a pipe + * to send signals to the child processes (if the child process is + * a full-blown GNUnet process that supports reading signals from + * a pipe, of course). Naturally, this also only works for 'normal' + * termination via signals, and not as a replacement for SIGKILL. + * Thus using pipes to communicate signals should only be enabled if + * the child is a Java process OR if we are on Windoze. */ #ifndef GNUNET_OS_LIB_H @@ -44,6 +54,51 @@ extern "C" #include "gnunet_configuration_lib.h" #include "gnunet_scheduler_lib.h" + +/** + * Flags that determine which of the standard streams + * should be inherited by the child process. + */ +enum GNUNET_OS_InheritStdioFlags +{ + + /** + * No standard streams should be inherited. + */ + GNUNET_OS_INHERIT_STD_NONE = 0, + + /** + * When this flag is set, the child process will + * inherit stdin of the parent. + */ + GNUNET_OS_INHERIT_STD_IN = 1, + + /** + * When this flag is set, the child process will + * inherit stdout of the parent. + */ + GNUNET_OS_INHERIT_STD_OUT = 2, + + /** + * When this flag is set, the child process will + * inherit stderr of the parent. + */ + GNUNET_OS_INHERIT_STD_ERR = 4, + + /** + * When these flags are set, the child process will + * inherit stdout and stderr of the parent. + */ + GNUNET_OS_INHERIT_STD_OUT_AND_ERR = 6, + + /** + * Use this option to have all of the standard streams + * (stdin, stdout and stderror) be inherited. + */ + GNUNET_OS_INHERIT_STD_ALL = 7 +}; + + /** * Process information (OS-dependent) */ @@ -66,12 +121,12 @@ enum GNUNET_OS_InstallationPathKind GNUNET_OS_IPK_BINDIR, /** - * Return the directory where libraries are installed. (lib/) + * Return the directory where libraries are installed. (lib/gnunet/) */ GNUNET_OS_IPK_LIBDIR, /** - * Return the directory where data is installed (share/) + * Return the directory where data is installed (share/gnunet/) */ GNUNET_OS_IPK_DATADIR, @@ -88,9 +143,20 @@ enum GNUNET_OS_InstallationPathKind GNUNET_OS_IPK_SELF_PREFIX, /** - * Return the prefix of the path with application icons. + * Return the prefix of the path with application icons (share/icons/). */ - GNUNET_OS_IPK_ICONDIR + GNUNET_OS_IPK_ICONDIR, + + /** + * Return the prefix of the path with documentation files, including the + * license (share/doc/gnunet/). + */ + GNUNET_OS_IPK_DOCDIR, + + /** + * Return the directory where helper binaries are installed (lib/gnunet/libexec/) + */ + GNUNET_OS_IPK_LIBEXECDIR }; @@ -139,6 +205,18 @@ char * GNUNET_OS_installation_get_path (enum GNUNET_OS_InstallationPathKind dirkind); +/** + * Given the name of a gnunet-helper, gnunet-service or gnunet-daemon + * binary, try to prefix it with the libexec/-directory to get the + * full path. + * + * @param progname name of the binary + * @return full path to the binary, if possible, otherwise copy of 'progname' + */ +char * +GNUNET_OS_get_libexec_binary_path (const char *progname); + + /** * Callback function invoked for each interface found. * @@ -195,7 +273,7 @@ GNUNET_OS_process_current (void); /** - * Sends sig to the process + * Sends a signal to the process * * @param proc pointer to process structure * @param sig signal @@ -211,7 +289,8 @@ GNUNET_OS_process_kill (struct GNUNET_OS_Process *proc, int sig); * @param proc pointer to process structure */ void -GNUNET_OS_process_close (struct GNUNET_OS_Process *proc); +GNUNET_OS_process_destroy (struct GNUNET_OS_Process *proc); + /** * Get the pid of the process in question @@ -223,6 +302,7 @@ GNUNET_OS_process_close (struct GNUNET_OS_Process *proc); pid_t GNUNET_OS_process_get_pid (struct GNUNET_OS_Process *proc); + /** * Set process priority * @@ -238,6 +318,28 @@ GNUNET_OS_set_process_priority (struct GNUNET_OS_Process *proc, /** * Start a process. * + * @param pipe_control should a pipe be used to send signals to the child? + * @param std_inheritance a set of GNUNET_OS_INHERIT_STD_* flags + * @param pipe_stdin pipe to use to send input to child process (or NULL) + * @param pipe_stdout pipe to use to get output from child process (or NULL) + * @param filename name of the binary + * @param argv NULL-terminated array of arguments to the process + * @return pointer to process structure of the new process, NULL on error + */ +struct GNUNET_OS_Process * +GNUNET_OS_start_process_vap (int pipe_control, + enum GNUNET_OS_InheritStdioFlags std_inheritance, + struct GNUNET_DISK_PipeHandle *pipe_stdin, + struct GNUNET_DISK_PipeHandle *pipe_stdout, + const char *filename, + char *const argv[]); + + +/** + * Start a process. + * + * @param pipe_control should a pipe be used to send signals to the child? + * @param std_inheritance a set of GNUNET_OS_INHERIT_STD_* flags * @param pipe_stdin pipe to use to send input to child process (or NULL) * @param pipe_stdout pipe to use to get output from child process (or NULL) * @param filename name of the binary @@ -245,7 +347,9 @@ GNUNET_OS_set_process_priority (struct GNUNET_OS_Process *proc, * @return pointer to process structure of the new process, NULL on error */ struct GNUNET_OS_Process * -GNUNET_OS_start_process (struct GNUNET_DISK_PipeHandle *pipe_stdin, +GNUNET_OS_start_process (int pipe_control, + enum GNUNET_OS_InheritStdioFlags std_inheritance, + struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, const char *filename, ...); @@ -253,6 +357,8 @@ GNUNET_OS_start_process (struct GNUNET_DISK_PipeHandle *pipe_stdin, /** * Start a process. * + * @param pipe_control should a pipe be used to send signals to the child? + * @param std_inheritance a set of GNUNET_OS_INHERIT_STD_* flags * @param pipe_stdin pipe to use to send input to child process (or NULL) * @param pipe_stdout pipe to use to get output from child process (or NULL) * @param filename name of the binary @@ -260,13 +366,17 @@ GNUNET_OS_start_process (struct GNUNET_DISK_PipeHandle *pipe_stdin, * @return pointer to process structure of the new process, NULL on error */ struct GNUNET_OS_Process * -GNUNET_OS_start_process_va (struct GNUNET_DISK_PipeHandle *pipe_stdin, +GNUNET_OS_start_process_va (int pipe_control, + enum GNUNET_OS_InheritStdioFlags std_inheritance, + struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, const char *filename, va_list va); /** * Start a process. * + * @param pipe_control should a pipe be used to send signals to the child? + * @param std_inheritance a set of GNUNET_OS_INHERIT_STD_* flags * @param lsocks array of listen sockets to dup systemd-style (or NULL); * must be NULL on platforms where dup is not supported * @param filename name of the binary @@ -275,7 +385,10 @@ GNUNET_OS_start_process_va (struct GNUNET_DISK_PipeHandle *pipe_stdin, * @return pointer to process structure of the new process, NULL on error */ struct GNUNET_OS_Process * -GNUNET_OS_start_process_v (const int *lsocks, const char *filename, +GNUNET_OS_start_process_v (int pipe_control, + enum GNUNET_OS_InheritStdioFlags std_inheritance, + const SOCKTYPE *lsocks, + const char *filename, char *const argv[]); @@ -284,6 +397,7 @@ GNUNET_OS_start_process_v (const int *lsocks, const char *filename, */ struct GNUNET_OS_CommandHandle; + /** * Type of a function to process a line of output. * @@ -292,6 +406,7 @@ struct GNUNET_OS_CommandHandle; */ typedef void (*GNUNET_OS_LineProcessor) (void *cls, const char *line); + /** * Stop/kill a command. * @@ -319,7 +434,8 @@ GNUNET_OS_command_run (GNUNET_OS_LineProcessor proc, void *proc_cls, /** - * Retrieve the status of a process. Nonblocking version. + * Retrieve the status of a process, waiting on him if dead. + * Nonblocking version. * * @param proc pointer to process structure * @param type status type @@ -347,7 +463,13 @@ GNUNET_OS_process_wait (struct GNUNET_OS_Process *proc); /** - * Connects this process to its parent via pipe + * Connects this process to its parent via pipe; + * essentially, the parent control handler will read signal numbers + * from the 'GNUNET_OS_CONTROL_PIPE' (as given in an environment + * variable) and raise those signals. + * + * @param cls closure (unused) + * @param tc scheduler context (unused) */ void GNUNET_OS_install_parent_control_handler (void *cls,