summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Daniel Barkalow <barkalow@iabervon.org>2005-12-07 21:04:38 -0500
committerLibravatar Junio C Hamano <junkio@cox.net>2005-12-07 21:05:39 -0800
commit128aed684d0b3099092b7597c8644599b45b7503 (patch)
tree52e84bd6a1c9bf70ea8dc44f7759d93cd43f1283
parentrefs.c: make sure leading directories exist before writing a ref. (diff)
downloadtgif-128aed684d0b3099092b7597c8644599b45b7503.tar.xz
Clean up file descriptors when calling hooks.
When calling post-update hook, don't leave stdin and stdout connected to the pushing connection. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--receive-pack.c2
-rw-r--r--run-command.c15
-rw-r--r--run-command.h3
3 files changed, 17 insertions, 3 deletions
diff --git a/receive-pack.c b/receive-pack.c
index 1873506120..cbe37e7239 100644
--- a/receive-pack.c
+++ b/receive-pack.c
@@ -173,7 +173,7 @@ static void run_update_post_hook(struct command *cmd)
argc++;
}
argv[argc] = NULL;
- run_command_v(argc, argv);
+ run_command_v_opt(argc, argv, RUN_COMMAND_NO_STDIO);
}
/*
diff --git a/run-command.c b/run-command.c
index 5787a50955..8bf5922fc3 100644
--- a/run-command.c
+++ b/run-command.c
@@ -2,13 +2,19 @@
#include "run-command.h"
#include <sys/wait.h>
-int run_command_v(int argc, char **argv)
+int run_command_v_opt(int argc, char **argv, int flags)
{
pid_t pid = fork();
if (pid < 0)
return -ERR_RUN_COMMAND_FORK;
if (!pid) {
+ if (flags & RUN_COMMAND_NO_STDIO) {
+ int fd = open("/dev/null", O_RDWR);
+ dup2(fd, 0);
+ dup2(fd, 1);
+ close(fd);
+ }
execvp(argv[0], (char *const*) argv);
die("exec %s failed.", argv[0]);
}
@@ -36,6 +42,11 @@ int run_command_v(int argc, char **argv)
}
}
+int run_command_v(int argc, char **argv)
+{
+ return run_command_v_opt(argc, argv, 0);
+}
+
int run_command(const char *cmd, ...)
{
int argc;
@@ -54,5 +65,5 @@ int run_command(const char *cmd, ...)
va_end(param);
if (MAX_RUN_COMMAND_ARGS <= argc)
return error("too many args to run %s", cmd);
- return run_command_v(argc, argv);
+ return run_command_v_opt(argc, argv, 0);
}
diff --git a/run-command.h b/run-command.h
index 5ee0972241..2469eeaefb 100644
--- a/run-command.h
+++ b/run-command.h
@@ -11,6 +11,9 @@ enum {
ERR_RUN_COMMAND_WAITPID_NOEXIT,
};
+#define RUN_COMMAND_NO_STDIO 1
+
+int run_command_v_opt(int argc, char **argv, int opt);
int run_command_v(int argc, char **argv);
int run_command(const char *cmd, ...);