98 lines
3.4 KiB
C
98 lines
3.4 KiB
C
/*
|
|
* 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 <http://www.fsf.org/copyleft/gpl.txt>.
|
|
*
|
|
* 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 <utils/utils.h>
|
|
|
|
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_ @}*/
|