error_routine: use parent's stderr if exec fails

The new process's error output may be redirected elsewhere, but if the exec fails, output should still go to the parent's stderr. This has already been done for the die_routine. Do the same for error_routine. Signed-off-by: Clemens Buchacher <drizzd@aon.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Clemens Buchacher committed Jul 27, 2011 at 23:32 UTC 3bc4181fde899e02aff89f7c0a47f18d37311cb3
3 files changed +27 -8
git-compat-util.h
+2
@@ -236,6 +236,7 @@ extern char *gitbasename(char *);
236
237 /* General helper functions */
238 extern void vreportf(const char *prefix, const char *err, va_list params);
239 +extern void vwritef(int fd, const char *prefix, const char *err, va_list params);
240 extern NORETURN void usage(const char *err);
241 extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
242 extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
@@ -244,6 +245,7 @@ extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
245 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
246
247 extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
248 +extern void set_error_routine(void (*routine)(const char *err, va_list params));
249
250 extern int prefixcmp(const char *str, const char *prefix);
251 extern int suffixcmp(const char *str, const char *suffix);
run-command.c
+7 -8
@@ -77,16 +77,14 @@ static void notify_parent(void)
77
78 static NORETURN void die_child(const char *err, va_list params)
79 {
80 - char msg[4096];
81 - int len = vsnprintf(msg, sizeof(msg), err, params);
82 - if (len > sizeof(msg))
83 - len = sizeof(msg);
84 -
85 - write_in_full(child_err, "fatal: ", 7);
86 - write_in_full(child_err, msg, len);
87 - write_in_full(child_err, "\n", 1);
80 + vwritef(child_err, "fatal: ", err, params);
81 exit(128);
82 }
83 +
84 +static void error_child(const char *err, va_list params)
85 +{
86 + vwritef(child_err, "error: ", err, params);
87 +}
88 #endif
89
90 static inline void set_cloexec(int fd)
@@ -217,6 +215,7 @@ fail_pipe:
215 set_cloexec(child_err);
216 }
217 set_die_routine(die_child);
218 + set_error_routine(error_child);
219
220 close(notify_pipe[0]);
221 set_cloexec(notify_pipe[1]);
usage.c
+18
@@ -4,6 +4,7 @@
4 * Copyright (C) Linus Torvalds, 2005
5 */
6 #include "git-compat-util.h"
7 +#include "cache.h"
8
9 void vreportf(const char *prefix, const char *err, va_list params)
10 {
@@ -12,6 +13,18 @@ void vreportf(const char *prefix, const char *err, va_list params)
13 fprintf(stderr, "%s%s\n", prefix, msg);
14 }
15
16 +void vwritef(int fd, const char *prefix, const char *err, va_list params)
17 +{
18 + char msg[4096];
19 + int len = vsnprintf(msg, sizeof(msg), err, params);
20 + if (len > sizeof(msg))
21 + len = sizeof(msg);
22 +
23 + write_in_full(fd, prefix, strlen(prefix));
24 + write_in_full(fd, msg, len);
25 + write_in_full(fd, "\n", 1);
26 +}
27 +
28 static NORETURN void usage_builtin(const char *err, va_list params)
29 {
30 vreportf("usage: ", err, params);
@@ -46,6 +59,11 @@ void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list param
59 die_routine = routine;
60 }
61
62 +void set_error_routine(void (*routine)(const char *err, va_list params))
63 +{
64 + error_routine = routine;
65 +}
66 +
67 void NORETURN usagef(const char *err, ...)
68 {
69 va_list params;