Merge branch 'cb/maint-exec-error-report' into maint
* cb/maint-exec-error-report: notice error exit from pager error_routine: use parent's stderr if exec failsmaint
						commit
						36bad9dee0
					
				|  | @ -236,6 +236,7 @@ extern char *gitbasename(char *); | ||||||
|  |  | ||||||
| /* 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))); | ||||||
|  | @ -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 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_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 prefixcmp(const char *str, const char *prefix); | ||||||
| extern int suffixcmp(const char *str, const char *suffix); | extern int suffixcmp(const char *str, const char *suffix); | ||||||
|  |  | ||||||
|  | @ -77,16 +77,14 @@ static void notify_parent(void) | ||||||
|  |  | ||||||
| static NORETURN void die_child(const char *err, va_list params) | static NORETURN void die_child(const char *err, va_list params) | ||||||
| { | { | ||||||
| 	char msg[4096]; | 	vwritef(child_err, "fatal: ", err, params); | ||||||
| 	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); |  | ||||||
| 	exit(128); | 	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) | ||||||
|  | @ -127,9 +125,6 @@ static int wait_or_whine(pid_t pid, const char *argv0, int silent_exec_failure) | ||||||
| 		if (code == 127) { | 		if (code == 127) { | ||||||
| 			code = -1; | 			code = -1; | ||||||
| 			failed_errno = ENOENT; | 			failed_errno = ENOENT; | ||||||
| 			if (!silent_exec_failure) |  | ||||||
| 				error("cannot run %s: %s", argv0, |  | ||||||
| 					strerror(ENOENT)); |  | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		error("waitpid is confused (%s)", argv0); | 		error("waitpid is confused (%s)", argv0); | ||||||
|  | @ -217,6 +212,7 @@ fail_pipe: | ||||||
| 			set_cloexec(child_err); | 			set_cloexec(child_err); | ||||||
| 		} | 		} | ||||||
| 		set_die_routine(die_child); | 		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]); | ||||||
|  | @ -283,15 +279,15 @@ fail_pipe: | ||||||
| 		} else { | 		} else { | ||||||
| 			execvp(cmd->argv[0], (char *const*) cmd->argv); | 			execvp(cmd->argv[0], (char *const*) cmd->argv); | ||||||
| 		} | 		} | ||||||
| 		/* | 		if (errno == ENOENT) { | ||||||
| 		 * Do not check for cmd->silent_exec_failure; the parent | 			if (!cmd->silent_exec_failure) | ||||||
| 		 * process will check it when it sees this exit code. | 				error("cannot run %s: %s", cmd->argv[0], | ||||||
| 		 */ | 					strerror(ENOENT)); | ||||||
| 		if (errno == ENOENT) |  | ||||||
| 			exit(127); | 			exit(127); | ||||||
| 		else | 		} else { | ||||||
| 			die_errno("cannot exec '%s'", cmd->argv[0]); | 			die_errno("cannot exec '%s'", cmd->argv[0]); | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
| 	if (cmd->pid < 0) | 	if (cmd->pid < 0) | ||||||
| 		error("cannot fork() for %s: %s", cmd->argv[0], | 		error("cannot fork() for %s: %s", cmd->argv[0], | ||||||
| 			strerror(failed_errno = errno)); | 			strerror(failed_errno = errno)); | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								usage.c
								
								
								
								
							
							
						
						
									
										18
									
								
								usage.c
								
								
								
								
							|  | @ -4,6 +4,7 @@ | ||||||
|  * Copyright (C) Linus Torvalds, 2005 |  * Copyright (C) Linus Torvalds, 2005 | ||||||
|  */ |  */ | ||||||
| #include "git-compat-util.h" | #include "git-compat-util.h" | ||||||
|  | #include "cache.h" | ||||||
|  |  | ||||||
| void vreportf(const char *prefix, const char *err, va_list params) | void vreportf(const char *prefix, const char *err, va_list params) | ||||||
| { | { | ||||||
|  | @ -12,6 +13,18 @@ void vreportf(const char *prefix, const char *err, va_list params) | ||||||
| 	fprintf(stderr, "%s%s\n", prefix, msg); | 	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) | static NORETURN void usage_builtin(const char *err, va_list params) | ||||||
| { | { | ||||||
| 	vreportf("usage: ", err, params); | 	vreportf("usage: ", err, params); | ||||||
|  | @ -46,6 +59,11 @@ void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list param | ||||||
| 	die_routine = routine; | 	die_routine = routine; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void set_error_routine(void (*routine)(const char *err, va_list params)) | ||||||
|  | { | ||||||
|  | 	error_routine = routine; | ||||||
|  | } | ||||||
|  |  | ||||||
| void NORETURN usagef(const char *err, ...) | void NORETURN usagef(const char *err, ...) | ||||||
| { | { | ||||||
| 	va_list params; | 	va_list params; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano