run-command.h revision e6817ec1d8ab31fc7b01906e305f848542df6413
1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#ifndef __PERF_RUN_COMMAND_H
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define __PERF_RUN_COMMAND_H
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengenum {
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	ERR_RUN_COMMAND_FORK = 10000,
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	ERR_RUN_COMMAND_EXEC,
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	ERR_RUN_COMMAND_PIPE,
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	ERR_RUN_COMMAND_WAITPID,
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	ERR_RUN_COMMAND_WAITPID_WRONG_PID,
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	ERR_RUN_COMMAND_WAITPID_SIGNAL,
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	ERR_RUN_COMMAND_WAITPID_NOEXIT,
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define IS_RUN_COMMAND_ERR(x) (-(x) >= ERR_RUN_COMMAND_FORK)
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstruct child_process {
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	const char **argv;
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	pid_t pid;
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	/*
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 * Using .in, .out, .err:
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 * - Specify 0 for no redirections (child inherits stdin, stdout,
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *   stderr from parent).
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 * - Specify -1 to have a pipe allocated as follows:
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *     .in: returns the writable pipe end; parent writes to it,
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *          the readable pipe end becomes child's stdin
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *     .out, .err: returns the readable pipe end; parent reads from
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *          it, the writable pipe end becomes child's stdout/stderr
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *   The caller of start_command() must close the returned FDs
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *   after it has completed reading from/writing to it!
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 * - Specify > 0 to set a channel to a particular FD as follows:
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *     .in: a readable FD, becomes child's stdin
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *     .out: a writable FD, becomes child's stdout/stderr
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *     .err > 0 not supported
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *   The specified FD is closed by start_command(), even in case
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 *   of errors!
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	 */
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	int in;
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	int out;
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	int err;
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	const char *dir;
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	const char *const *env;
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	unsigned no_stdin:1;
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	unsigned no_stdout:1;
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	unsigned no_stderr:1;
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	unsigned perf_cmd:1; /* if this is to be perf sub-command */
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	unsigned stdout_to_stderr:1;
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	void (*preexec_cb)(void);
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng};
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint start_command(struct child_process *);
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint finish_command(struct child_process *);
51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint run_command(struct child_process *);
52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define RUN_COMMAND_NO_STDIN 1
54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define RUN_PERF_CMD	     2	/*If this is to be perf sub-command */
55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define RUN_COMMAND_STDOUT_TO_STDERR 4
56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint run_command_v_opt(const char **argv, int opt);
57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#endif /* __PERF_RUN_COMMAND_H */
59