Skip to content

Commit 3bc4181

Browse files
Clemens Buchachergitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 2579e1d commit 3bc4181

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

git-compat-util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ extern char *gitbasename(char *);
236236

237237
/* General helper functions */
238238
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);
239240
extern NORETURN void usage(const char *err);
240241
extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
241242
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)));
244245
extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
245246

246247
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));
247249

248250
extern int prefixcmp(const char *str, const char *prefix);
249251
extern int suffixcmp(const char *str, const char *suffix);

run-command.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,14 @@ static void notify_parent(void)
7777

7878
static NORETURN void die_child(const char *err, va_list params)
7979
{
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);
8881
exit(128);
8982
}
83+
84+
static void error_child(const char *err, va_list params)
85+
{
86+
vwritef(child_err, "error: ", err, params);
87+
}
9088
#endif
9189

9290
static inline void set_cloexec(int fd)
@@ -217,6 +215,7 @@ int start_command(struct child_process *cmd)
217215
set_cloexec(child_err);
218216
}
219217
set_die_routine(die_child);
218+
set_error_routine(error_child);
220219

221220
close(notify_pipe[0]);
222221
set_cloexec(notify_pipe[1]);

usage.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Copyright (C) Linus Torvalds, 2005
55
*/
66
#include "git-compat-util.h"
7+
#include "cache.h"
78

89
void vreportf(const char *prefix, const char *err, va_list params)
910
{
@@ -12,6 +13,18 @@ void vreportf(const char *prefix, const char *err, va_list params)
1213
fprintf(stderr, "%s%s\n", prefix, msg);
1314
}
1415

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+
1528
static NORETURN void usage_builtin(const char *err, va_list params)
1629
{
1730
vreportf("usage: ", err, params);
@@ -46,6 +59,11 @@ void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list param
4659
die_routine = routine;
4760
}
4861

62+
void set_error_routine(void (*routine)(const char *err, va_list params))
63+
{
64+
error_routine = routine;
65+
}
66+
4967
void NORETURN usagef(const char *err, ...)
5068
{
5169
va_list params;

0 commit comments

Comments
 (0)