/* * Copyright (C) 2014 Martin Willi * Copyright (C) 2014 revosec AG * * This program 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. See . * * This program 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. */ /** * @defgroup process process * @{ @ingroup utils */ #ifndef PROCESS_H_ #define PROCESS_H_ #include typedef struct process_t process_t; /** * Child process spawning abstraction */ struct process_t { /** * Wait for a started process to terminate. * * The process object gets destroyed by this call, regardless of the * return value. * * The returned code is the exit code, not the status returned by waitpid(). * If the program could not be executed or has terminated abnormally * (by signals etc.), FALSE is returned. * * @param code process exit code, set only if TRUE returned * @return TRUE if program exited normally through exit() */ bool (*wait)(process_t *this, int *code); }; /** * Spawn a child process with redirected I/O. * * Forks the current process, optionally redirects stdin/out/err to the current * process, and executes the provided program with arguments. * * The process to execute is specified as argv[0], followed by the process * arguments, followed by NULL. envp[] has a NULL terminated list of arguments * to invoke the process with. * * If any of in/out/err is given, stdin/out/err from the child process get * connected over pipe()s to the caller. If close_all is TRUE, all other * open file descriptors get closed, regardless of any CLOEXEC setting. * * A caller must close all of the returned file descriptors to avoid file * descriptor leaks. * * A non-NULL return value does not guarantee that the process has been * invoked successfully. * * @param argv NULL terminated process arguments, with argv[0] as program * @param envp NULL terminated list of environment variables * @param in pipe fd returned for redirecting data to child stdin * @param out pipe fd returned to redirect child stdout data to * @param err pipe fd returned to redirect child stderr data to * @param close_all close all open file descriptors above 2 before execve() * @return process, NULL on failure */ process_t* process_start(char *const argv[], char *const envp[], int *in, int *out, int *err, bool close_all); /** * Spawn a command in a shell child process. * * Same as process_start(), but passes a single command to a shell, such as * "sh -c". See process_start() for I/O redirection notes. * * @param envp NULL terminated list of environment variables * @param in pipe fd returned for redirecting data to child stdin * @param out pipe fd returned to redirect child stdout data to * @param err pipe fd returned to redirect child stderr data to * @param fmt printf format string for command * @param ... arguments for fmt * @return process, NULL on failure */ process_t* process_start_shell(char *const envp[], int *in, int *out, int *err, char *fmt, ...); #endif /** PROCESS_H_ @}*/