Skip to content

Commit

Permalink
Add run_command_v_opt_cd: chdir into a directory before exec
Browse files Browse the repository at this point in the history
It can make code simplier (no need to preserve cwd) and safer
(no chance the cwd of the current process is accidentally forgotten).

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Alex Riesen authored and Junio C Hamano committed May 24, 2007
1 parent 98ee818 commit 1568fea
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 5 deletions.
27 changes: 22 additions & 5 deletions run-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ int start_command(struct child_process *cmd)
close(cmd->out);
}

if (cmd->dir && chdir(cmd->dir))
die("exec %s: cd to %s failed (%s)", cmd->argv[0],
cmd->dir, strerror(errno));
if (cmd->git_cmd) {
execv_git_cmd(cmd->argv);
} else {
Expand Down Expand Up @@ -133,13 +136,27 @@ int run_command(struct child_process *cmd)
return finish_command(cmd);
}

static void prepare_run_command_v_opt(struct child_process *cmd,
const char **argv, int opt)
{
memset(cmd, 0, sizeof(*cmd));
cmd->argv = argv;
cmd->no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
cmd->git_cmd = opt & RUN_GIT_CMD ? 1 : 0;
cmd->stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
}

int run_command_v_opt(const char **argv, int opt)
{
struct child_process cmd;
memset(&cmd, 0, sizeof(cmd));
cmd.argv = argv;
cmd.no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
cmd.git_cmd = opt & RUN_GIT_CMD ? 1 : 0;
cmd.stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
prepare_run_command_v_opt(&cmd, argv, opt);
return run_command(&cmd);
}

int run_command_v_opt_cd(const char **argv, int opt, const char *dir)
{
struct child_process cmd;
prepare_run_command_v_opt(&cmd, argv, opt);
cmd.dir = dir;
return run_command(&cmd);
}
2 changes: 2 additions & 0 deletions run-command.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct child_process {
pid_t pid;
int in;
int out;
const char *dir;
unsigned close_in:1;
unsigned close_out:1;
unsigned no_stdin:1;
Expand All @@ -32,5 +33,6 @@ int run_command(struct child_process *);
#define RUN_GIT_CMD 2 /*If this is to be git sub-command */
#define RUN_COMMAND_STDOUT_TO_STDERR 4
int run_command_v_opt(const char **argv, int opt);
int run_command_v_opt_cd(const char **argv, int opt, const char *dir);

#endif

0 comments on commit 1568fea

Please sign in to comment.