Skip to content

Commit

Permalink
error_routine: use parent's stderr if exec fails
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Clemens Buchacher authored and Junio C Hamano committed Aug 1, 2011
1 parent 2579e1d commit 3bc4181
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 8 deletions.
2 changes: 2 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ extern char *gitbasename(char *);

/* General helper functions */
extern void vreportf(const char *prefix, const char *err, va_list params);
extern void vwritef(int fd, const char *prefix, const char *err, va_list params);
extern NORETURN void usage(const char *err);
extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
Expand All @@ -244,6 +245,7 @@ extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));

extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
extern void set_error_routine(void (*routine)(const char *err, va_list params));

extern int prefixcmp(const char *str, const char *prefix);
extern int suffixcmp(const char *str, const char *suffix);
Expand Down
15 changes: 7 additions & 8 deletions run-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,14 @@ static void notify_parent(void)

static NORETURN void die_child(const char *err, va_list params)
{
char msg[4096];
int len = vsnprintf(msg, sizeof(msg), err, params);
if (len > sizeof(msg))
len = sizeof(msg);

write_in_full(child_err, "fatal: ", 7);
write_in_full(child_err, msg, len);
write_in_full(child_err, "\n", 1);
vwritef(child_err, "fatal: ", err, params);
exit(128);
}

static void error_child(const char *err, va_list params)
{
vwritef(child_err, "error: ", err, params);
}
#endif

static inline void set_cloexec(int fd)
Expand Down Expand Up @@ -217,6 +215,7 @@ int start_command(struct child_process *cmd)
set_cloexec(child_err);
}
set_die_routine(die_child);
set_error_routine(error_child);

close(notify_pipe[0]);
set_cloexec(notify_pipe[1]);
Expand Down
18 changes: 18 additions & 0 deletions usage.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* Copyright (C) Linus Torvalds, 2005
*/
#include "git-compat-util.h"
#include "cache.h"

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

void vwritef(int fd, const char *prefix, const char *err, va_list params)
{
char msg[4096];
int len = vsnprintf(msg, sizeof(msg), err, params);
if (len > sizeof(msg))
len = sizeof(msg);

write_in_full(fd, prefix, strlen(prefix));
write_in_full(fd, msg, len);
write_in_full(fd, "\n", 1);
}

static NORETURN void usage_builtin(const char *err, va_list params)
{
vreportf("usage: ", err, params);
Expand Down Expand Up @@ -46,6 +59,11 @@ void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list param
die_routine = routine;
}

void set_error_routine(void (*routine)(const char *err, va_list params))
{
error_routine = routine;
}

void NORETURN usagef(const char *err, ...)
{
va_list params;
Expand Down

0 comments on commit 3bc4181

Please sign in to comment.