xref: /aosp_15_r20/external/ltp/include/tst_cmd.h (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1*49cdfc7eSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-or-later
2*49cdfc7eSAndroid Build Coastguard Worker  * Copyright (c) 2015-2016 Cyril Hrubis <[email protected]>
3*49cdfc7eSAndroid Build Coastguard Worker  */
4*49cdfc7eSAndroid Build Coastguard Worker 
5*49cdfc7eSAndroid Build Coastguard Worker #ifndef TST_CMD_H__
6*49cdfc7eSAndroid Build Coastguard Worker #define TST_CMD_H__
7*49cdfc7eSAndroid Build Coastguard Worker 
8*49cdfc7eSAndroid Build Coastguard Worker enum tst_cmd_flags {
9*49cdfc7eSAndroid Build Coastguard Worker 	/*
10*49cdfc7eSAndroid Build Coastguard Worker 	 * return the program exit code, otherwise it will call cleanup_fn() if the
11*49cdfc7eSAndroid Build Coastguard Worker 	 * program exit code is not zero.
12*49cdfc7eSAndroid Build Coastguard Worker 	 */
13*49cdfc7eSAndroid Build Coastguard Worker 	TST_CMD_PASS_RETVAL = 1,
14*49cdfc7eSAndroid Build Coastguard Worker 
15*49cdfc7eSAndroid Build Coastguard Worker 	/* exit with TCONF if program is not in path */
16*49cdfc7eSAndroid Build Coastguard Worker 	TST_CMD_TCONF_ON_MISSING = 2,
17*49cdfc7eSAndroid Build Coastguard Worker };
18*49cdfc7eSAndroid Build Coastguard Worker 
19*49cdfc7eSAndroid Build Coastguard Worker /*
20*49cdfc7eSAndroid Build Coastguard Worker  * vfork() + execvp() specified program.
21*49cdfc7eSAndroid Build Coastguard Worker  *
22*49cdfc7eSAndroid Build Coastguard Worker  * @param argv A list of two (at least program name + NULL) or more pointers that
23*49cdfc7eSAndroid Build Coastguard Worker  * represent the argument list to the new program. The array of pointers
24*49cdfc7eSAndroid Build Coastguard Worker  * must be terminated by a NULL pointer.
25*49cdfc7eSAndroid Build Coastguard Worker  * @param stdout_fd File descriptor where to redirect stdout. Set -1 if
26*49cdfc7eSAndroid Build Coastguard Worker  * redirection is not needed.
27*49cdfc7eSAndroid Build Coastguard Worker  * @param stderr_fd File descriptor where to redirect stderr. Set -1 if
28*49cdfc7eSAndroid Build Coastguard Worker  * redirection is not needed.
29*49cdfc7eSAndroid Build Coastguard Worker  * @param flags enum tst_cmd_flags.
30*49cdfc7eSAndroid Build Coastguard Worker  * @return The exit status of the program.
31*49cdfc7eSAndroid Build Coastguard Worker  */
32*49cdfc7eSAndroid Build Coastguard Worker int tst_cmd_fds_(void (cleanup_fn)(void),
33*49cdfc7eSAndroid Build Coastguard Worker 			const char *const argv[],
34*49cdfc7eSAndroid Build Coastguard Worker 			int stdout_fd,
35*49cdfc7eSAndroid Build Coastguard Worker 			int stderr_fd,
36*49cdfc7eSAndroid Build Coastguard Worker 			enum tst_cmd_flags flags);
37*49cdfc7eSAndroid Build Coastguard Worker 
38*49cdfc7eSAndroid Build Coastguard Worker /*
39*49cdfc7eSAndroid Build Coastguard Worker  * Executes tst_cmd_fds() and redirects its output to a file.
40*49cdfc7eSAndroid Build Coastguard Worker  *
41*49cdfc7eSAndroid Build Coastguard Worker  * @param stdout_path Path where to redirect stdout. Set NULL if redirection is
42*49cdfc7eSAndroid Build Coastguard Worker  * not needed.
43*49cdfc7eSAndroid Build Coastguard Worker  * @param stderr_path Path where to redirect stderr. Set NULL if redirection is
44*49cdfc7eSAndroid Build Coastguard Worker  * not needed.
45*49cdfc7eSAndroid Build Coastguard Worker  * @param flags enum tst_cmd_flags.
46*49cdfc7eSAndroid Build Coastguard Worker  * @return The exit status of the program.
47*49cdfc7eSAndroid Build Coastguard Worker  */
48*49cdfc7eSAndroid Build Coastguard Worker int tst_cmd_(void (cleanup_fn)(void),
49*49cdfc7eSAndroid Build Coastguard Worker 		const char *const argv[],
50*49cdfc7eSAndroid Build Coastguard Worker 		const char *stdout_path,
51*49cdfc7eSAndroid Build Coastguard Worker 		const char *stderr_path,
52*49cdfc7eSAndroid Build Coastguard Worker 		enum tst_cmd_flags flags);
53*49cdfc7eSAndroid Build Coastguard Worker 
54*49cdfc7eSAndroid Build Coastguard Worker #ifdef TST_TEST_H__
tst_cmd_fds(const char * const argv[],int stdout_fd,int stderr_fd,enum tst_cmd_flags flags)55*49cdfc7eSAndroid Build Coastguard Worker static inline int tst_cmd_fds(const char *const argv[],
56*49cdfc7eSAndroid Build Coastguard Worker 				  int stdout_fd,
57*49cdfc7eSAndroid Build Coastguard Worker 				  int stderr_fd,
58*49cdfc7eSAndroid Build Coastguard Worker 				  enum tst_cmd_flags flags)
59*49cdfc7eSAndroid Build Coastguard Worker {
60*49cdfc7eSAndroid Build Coastguard Worker 	return tst_cmd_fds_(NULL, argv,
61*49cdfc7eSAndroid Build Coastguard Worker 	                        stdout_fd, stderr_fd, flags);
62*49cdfc7eSAndroid Build Coastguard Worker }
63*49cdfc7eSAndroid Build Coastguard Worker 
tst_cmd(const char * const argv[],const char * stdout_path,const char * stderr_path,enum tst_cmd_flags flags)64*49cdfc7eSAndroid Build Coastguard Worker static inline int tst_cmd(const char *const argv[],
65*49cdfc7eSAndroid Build Coastguard Worker 			      const char *stdout_path,
66*49cdfc7eSAndroid Build Coastguard Worker 			      const char *stderr_path,
67*49cdfc7eSAndroid Build Coastguard Worker 			      enum tst_cmd_flags flags)
68*49cdfc7eSAndroid Build Coastguard Worker {
69*49cdfc7eSAndroid Build Coastguard Worker 	return tst_cmd_(NULL, argv,
70*49cdfc7eSAndroid Build Coastguard Worker 	                    stdout_path, stderr_path, flags);
71*49cdfc7eSAndroid Build Coastguard Worker }
72*49cdfc7eSAndroid Build Coastguard Worker #else
tst_cmd_fds(void (cleanup_fn)(void),const char * const argv[],int stdout_fd,int stderr_fd,enum tst_cmd_flags flags)73*49cdfc7eSAndroid Build Coastguard Worker static inline int tst_cmd_fds(void (cleanup_fn)(void),
74*49cdfc7eSAndroid Build Coastguard Worker 				  const char *const argv[],
75*49cdfc7eSAndroid Build Coastguard Worker 				  int stdout_fd,
76*49cdfc7eSAndroid Build Coastguard Worker 				  int stderr_fd,
77*49cdfc7eSAndroid Build Coastguard Worker 				  enum tst_cmd_flags flags)
78*49cdfc7eSAndroid Build Coastguard Worker {
79*49cdfc7eSAndroid Build Coastguard Worker 	return tst_cmd_fds_(cleanup_fn, argv,
80*49cdfc7eSAndroid Build Coastguard Worker 	                        stdout_fd, stderr_fd, flags);
81*49cdfc7eSAndroid Build Coastguard Worker }
82*49cdfc7eSAndroid Build Coastguard Worker 
tst_cmd(void (cleanup_fn)(void),const char * const argv[],const char * stdout_path,const char * stderr_path,enum tst_cmd_flags flags)83*49cdfc7eSAndroid Build Coastguard Worker static inline int tst_cmd(void (cleanup_fn)(void),
84*49cdfc7eSAndroid Build Coastguard Worker 			      const char *const argv[],
85*49cdfc7eSAndroid Build Coastguard Worker 			      const char *stdout_path,
86*49cdfc7eSAndroid Build Coastguard Worker 			      const char *stderr_path,
87*49cdfc7eSAndroid Build Coastguard Worker 			      enum tst_cmd_flags flags)
88*49cdfc7eSAndroid Build Coastguard Worker {
89*49cdfc7eSAndroid Build Coastguard Worker 	return tst_cmd_(cleanup_fn, argv,
90*49cdfc7eSAndroid Build Coastguard Worker 	                    stdout_path, stderr_path, flags);
91*49cdfc7eSAndroid Build Coastguard Worker }
92*49cdfc7eSAndroid Build Coastguard Worker #endif
93*49cdfc7eSAndroid Build Coastguard Worker 
94*49cdfc7eSAndroid Build Coastguard Worker /* Wrapper function for system(3), ignorcing SIGCHLD signal.
95*49cdfc7eSAndroid Build Coastguard Worker  * @param command The command to be run.
96*49cdfc7eSAndroid Build Coastguard Worker  */
97*49cdfc7eSAndroid Build Coastguard Worker int tst_system(const char *command);
98*49cdfc7eSAndroid Build Coastguard Worker 
99*49cdfc7eSAndroid Build Coastguard Worker #endif	/* TST_CMD_H__ */
100