120 static void get_spawn_args(
struct spawn_args * args,
int init_key, va_list ap)
122 const char *myname =
"get_spawn_args";
133 args->
uid = (uid_t) - 1;
134 args->
gid = (gid_t) - 1;
143 for (key = init_key; key !=
SPAWN_CMD_END; key = va_arg(ap,
int)) {
147 msg_panic(
"%s: specify SPAWN_CMD_ARGV or SPAWN_CMD_COMMAND",
149 args->
argv = va_arg(ap,
char **);
153 msg_panic(
"%s: specify SPAWN_CMD_ARGV or SPAWN_CMD_COMMAND",
155 args->
command = va_arg(ap,
char *);
167 args->
uid = va_arg(ap, uid_t);
168 if (args->
uid == (uid_t) (-1))
169 msg_panic(
"spawn_command: request with reserved user ID: -1");
172 args->
gid = va_arg(ap, gid_t);
173 if (args->
gid == (gid_t) (-1))
174 msg_panic(
"spawn_command: request with reserved group ID: -1");
180 args->
env = va_arg(ap,
char **);
183 args->
export = va_arg(ap,
char **);
186 args->
shell = va_arg(ap,
char *);
189 msg_panic(
"%s: unknown key: %d", myname, key);
193 msg_panic(
"%s: missing SPAWN_CMD_ARGV or SPAWN_CMD_COMMAND", myname);
195 msg_panic(
"%s: SPAWN_CMD_ARGV cannot be used with SPAWN_CMD_SHELL",
203 const char *myname =
"spawn_comand";
217 get_spawn_args(&args, key, ap);
232 switch (pid = fork()) {
246 if (args.
uid != (uid_t) - 1 || args.
gid != (gid_t) - 1)
264 if (setenv(
"PATH", _PATH_DEFPATH, 1))
267 for (cpp = args.
env; *cpp; cpp += 2)
268 if (setenv(cpp[0], cpp[1], 1))
303 && errno == ETIMEDOUT) {
304 msg_warn(
"%s: process id %lu: command time limit exceeded",
305 args.
command, (
unsigned long) pid);
307 err = waitpid(pid, &wait_status, 0);
311 return (wait_status);
NORETURN msg_panic(const char *fmt,...)
WAIT_STATUS_T spawn_command(int key,...)
#define SPAWN_CMD_COMMAND
void argv_add(ARGV *argvp,...)
#define SPAWN_CMD_TIME_LIMIT
void clean_env(char **preserve_list)
void msg_warn(const char *fmt,...)
int timed_waitpid(pid_t pid, WAIT_STATUS_T *statusp, int options, int time_limit)
NORETURN msg_fatal(const char *fmt,...)
ARGV * argv_split(const char *, const char *)
void set_ugid(uid_t uid, gid_t gid)
NORETURN exec_command(const char *command)
void argv_terminate(ARGV *argvp)