check_sha1_signature: check return value from read_istream
[gitweb.git] / run-command.c
index 04712191e8acfbf000c526a5b1b0a80541e8e174..765c2ce0567ad0d75270283397d63eac3674c01a 100644 (file)
@@ -273,7 +273,8 @@ int start_command(struct child_process *cmd)
 {
        int need_in, need_out, need_err;
        int fdin[2], fdout[2], fderr[2];
-       int failed_errno = failed_errno;
+       int failed_errno;
+       char *str;
 
        /*
         * In case of errors we must keep the promise to close FDs
@@ -286,6 +287,7 @@ int start_command(struct child_process *cmd)
                        failed_errno = errno;
                        if (cmd->out > 0)
                                close(cmd->out);
+                       str = "standard input";
                        goto fail_pipe;
                }
                cmd->in = fdin[1];
@@ -301,6 +303,7 @@ int start_command(struct child_process *cmd)
                                close_pair(fdin);
                        else if (cmd->in)
                                close(cmd->in);
+                       str = "standard output";
                        goto fail_pipe;
                }
                cmd->out = fdout[0];
@@ -318,9 +321,10 @@ int start_command(struct child_process *cmd)
                                close_pair(fdout);
                        else if (cmd->out)
                                close(cmd->out);
+                       str = "standard error";
 fail_pipe:
-                       error("cannot create pipe for %s: %s",
-                               cmd->argv[0], strerror(failed_errno));
+                       error("cannot create %s pipe for %s: %s",
+                               str, cmd->argv[0], strerror(failed_errno));
                        errno = failed_errno;
                        return -1;
                }
@@ -337,6 +341,7 @@ int start_command(struct child_process *cmd)
                notify_pipe[0] = notify_pipe[1] = -1;
 
        cmd->pid = fork();
+       failed_errno = errno;
        if (!cmd->pid) {
                /*
                 * Redirect the channel to write syscall error messages to
@@ -416,7 +421,7 @@ int start_command(struct child_process *cmd)
        }
        if (cmd->pid < 0)
                error("cannot fork() for %s: %s", cmd->argv[0],
-                       strerror(failed_errno = errno));
+                       strerror(errno));
        else if (cmd->clean_on_exit)
                mark_child_for_cleanup(cmd->pid);
 
@@ -735,6 +740,15 @@ int finish_async(struct async *async)
 #endif
 }
 
+char *find_hook(const char *name)
+{
+       char *path = git_path("hooks/%s", name);
+       if (access(path, X_OK) < 0)
+               path = NULL;
+
+       return path;
+}
+
 int run_hook(const char *index_file, const char *name, ...)
 {
        struct child_process hook;
@@ -744,11 +758,13 @@ int run_hook(const char *index_file, const char *name, ...)
        va_list args;
        int ret;
 
-       if (access(git_path("hooks/%s", name), X_OK) < 0)
+       p = find_hook(name);
+       if (!p)
                return 0;
 
+       argv_array_push(&argv, p);
+
        va_start(args, name);
-       argv_array_push(&argv, git_path("hooks/%s", name));
        while ((p = va_arg(args, const char *)))
                argv_array_push(&argv, p);
        va_end(args);