Clean up file descriptors when calling hooks.
authorDaniel Barkalow <barkalow@iabervon.org>
Thu, 8 Dec 2005 02:04:38 +0000 (21:04 -0500)
committerJunio C Hamano <junkio@cox.net>
Thu, 8 Dec 2005 05:05:39 +0000 (21:05 -0800)
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>
receive-pack.c
run-command.c
run-command.h

index 1873506..cbe37e7 100644 (file)
@@ -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);
 }
 
 /*
index 5787a50..8bf5922 100644 (file)
@@ -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);
 }
index 5ee0972..2469eea 100644 (file)
@@ -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, ...);