Lines Matching refs:cmd
12 #include "exec-cmd.h"
29 int start_command(struct child_process *cmd)
40 need_in = !cmd->no_stdin && cmd->in < 0;
43 if (cmd->out > 0)
44 close(cmd->out);
47 cmd->in = fdin[1];
50 need_out = !cmd->no_stdout
51 && !cmd->stdout_to_stderr
52 && cmd->out < 0;
57 else if (cmd->in)
58 close(cmd->in);
61 cmd->out = fdout[0];
64 need_err = !cmd->no_stderr && cmd->err < 0;
69 else if (cmd->in)
70 close(cmd->in);
73 else if (cmd->out)
74 close(cmd->out);
77 cmd->err = fderr[0];
81 cmd->pid = fork();
82 if (!cmd->pid) {
83 if (cmd->no_stdin)
88 } else if (cmd->in) {
89 dup2(cmd->in, 0);
90 close(cmd->in);
93 if (cmd->no_stderr)
100 if (cmd->no_stdout)
102 else if (cmd->stdout_to_stderr)
107 } else if (cmd->out > 1) {
108 dup2(cmd->out, 1);
109 close(cmd->out);
112 if (cmd->dir && chdir(cmd->dir))
113 die("exec %s: cd to %s failed (%s)", cmd->argv[0],
114 cmd->dir, str_error_r(errno, sbuf, sizeof(sbuf)));
115 if (cmd->env) {
116 for (; *cmd->env; cmd->env++) {
117 if (strchr(*cmd->env, '='))
118 putenv((char*)*cmd->env);
120 unsetenv(*cmd->env);
123 if (cmd->preexec_cb)
124 cmd->preexec_cb();
125 if (cmd->exec_cmd) {
126 execv_cmd(cmd->argv);
128 execvp(cmd->argv[0], (char *const*) cmd->argv);
133 if (cmd->pid < 0) {
137 else if (cmd->in)
138 close(cmd->in);
141 else if (cmd->out)
142 close(cmd->out);
152 else if (cmd->in)
153 close(cmd->in);
157 else if (cmd->out)
158 close(cmd->out);
200 int finish_command(struct child_process *cmd)
202 return wait_or_whine(cmd->pid);
205 int run_command(struct child_process *cmd)
207 int code = start_command(cmd);
210 return finish_command(cmd);
213 static void prepare_run_command_v_opt(struct child_process *cmd,
217 memset(cmd, 0, sizeof(*cmd));
218 cmd->argv = argv;
219 cmd->no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
220 cmd->exec_cmd = opt & RUN_EXEC_CMD ? 1 : 0;
221 cmd->stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
226 struct child_process cmd;
227 prepare_run_command_v_opt(&cmd, argv, opt);
228 return run_command(&cmd);