Merge branch 'jk/long-error-messages'

The codepath to produce error messages had a hard-coded limit to
the size of the message, primarily to avoid memory allocation while
calling die().

* jk/long-error-messages:
  vreportf: avoid intermediate buffer
  vreportf: report to arbitrary filehandles
This commit is contained in:
Junio C Hamano 2015-08-25 14:57:06 -07:00
commit 1302c9f514
3 changed files with 21 additions and 29 deletions

View File

@ -389,7 +389,6 @@ struct strbuf;
/* General helper functions */ /* General helper functions */
extern void vreportf(const char *prefix, const char *err, va_list params); 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 usage(const char *err);
extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2))); extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2))); extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
@ -425,6 +424,7 @@ static inline int const_error(void)
extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params)); 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 void set_error_routine(void (*routine)(const char *err, va_list params));
extern void set_die_is_recursing_routine(int (*routine)(void)); extern void set_die_is_recursing_routine(int (*routine)(void));
extern void set_error_handle(FILE *);
extern int starts_with(const char *str, const char *prefix); extern int starts_with(const char *str, const char *prefix);

View File

@ -200,7 +200,6 @@ static int execv_shell_cmd(const char **argv)
#endif #endif
#ifndef GIT_WINDOWS_NATIVE #ifndef GIT_WINDOWS_NATIVE
static int child_err = 2;
static int child_notifier = -1; static int child_notifier = -1;
static void notify_parent(void) static void notify_parent(void)
@ -212,17 +211,6 @@ static void notify_parent(void)
*/ */
xwrite(child_notifier, "", 1); xwrite(child_notifier, "", 1);
} }
static NORETURN void die_child(const char *err, va_list params)
{
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 #endif
static inline void set_cloexec(int fd) static inline void set_cloexec(int fd)
@ -362,11 +350,10 @@ fail_pipe:
* in subsequent call paths use the parent's stderr. * in subsequent call paths use the parent's stderr.
*/ */
if (cmd->no_stderr || need_err) { if (cmd->no_stderr || need_err) {
child_err = dup(2); int child_err = dup(2);
set_cloexec(child_err); set_cloexec(child_err);
set_error_handle(fdopen(child_err, "w"));
} }
set_die_routine(die_child);
set_error_routine(error_child);
close(notify_pipe[0]); close(notify_pipe[0]);
set_cloexec(notify_pipe[1]); set_cloexec(notify_pipe[1]);

31
usage.c
View File

@ -6,23 +6,22 @@
#include "git-compat-util.h" #include "git-compat-util.h"
#include "cache.h" #include "cache.h"
static FILE *error_handle;
static int tweaked_error_buffering;
void vreportf(const char *prefix, const char *err, va_list params) void vreportf(const char *prefix, const char *err, va_list params)
{ {
char msg[4096]; FILE *fh = error_handle ? error_handle : stderr;
vsnprintf(msg, sizeof(msg), err, params);
fprintf(stderr, "%s%s\n", prefix, msg);
}
void vwritef(int fd, const char *prefix, const char *err, va_list params) fflush(fh);
{ if (!tweaked_error_buffering) {
char msg[4096]; setvbuf(fh, NULL, _IOLBF, 0);
int len = vsnprintf(msg, sizeof(msg), err, params); tweaked_error_buffering = 1;
if (len > sizeof(msg)) }
len = sizeof(msg);
write_in_full(fd, prefix, strlen(prefix)); fputs(prefix, fh);
write_in_full(fd, msg, len); vfprintf(fh, err, params);
write_in_full(fd, "\n", 1); fputc('\n', fh);
} }
static NORETURN void usage_builtin(const char *err, va_list params) static NORETURN void usage_builtin(const char *err, va_list params)
@ -76,6 +75,12 @@ void set_die_is_recursing_routine(int (*routine)(void))
die_is_recursing = routine; die_is_recursing = routine;
} }
void set_error_handle(FILE *fh)
{
error_handle = fh;
tweaked_error_buffering = 0;
}
void NORETURN usagef(const char *err, ...) void NORETURN usagef(const char *err, ...)
{ {
va_list params; va_list params;