diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/shell/ash.c b/shell/ash.c index 1f5a8dae0..f9c78ee78 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -1306,6 +1306,18 @@ ash_msg_and_raise_error(const char *msg, ...) va_end(ap); } +/* + * Use '%m' to append error string on platforms that support it, '%s' and + * strerror() on those that don't. + * + * 'fmt' must be a string literal. + */ +#ifdef HAVE_PRINTF_PERCENTM +#define ash_msg_and_raise_perror(fmt, ...) ash_msg_and_raise_error(fmt ": %m", ##__VA_ARGS__) +#else +#define ash_msg_and_raise_perror(fmt, ...) ash_msg_and_raise_error(fmt ": %s", ##__VA_ARGS__, strerror(errno)) +#endif + static void raise_error_syntax(const char *) NORETURN; static void raise_error_syntax(const char *msg) @@ -3827,7 +3839,7 @@ static void xtcsetpgrp(int fd, pid_t pgrp) { if (tcsetpgrp(fd, pgrp)) - ash_msg_and_raise_error("can't set tty process group (%m)"); + ash_msg_and_raise_perror("can't set tty process group"); } /* @@ -5313,7 +5325,7 @@ savefd(int from) err = newfd < 0 ? errno : 0; if (err != EBADF) { if (err) - ash_msg_and_raise_error("%d: %m", from); + ash_msg_and_raise_perror("%d", from); close(from); fcntl(newfd, F_SETFD, FD_CLOEXEC); } @@ -5328,7 +5340,7 @@ dup2_or_raise(int from, int to) newfd = (from != to) ? dup2(from, to) : to; if (newfd < 0) { /* Happens when source fd is not open: try "echo >&99" */ - ash_msg_and_raise_error("%d: %m", from); + ash_msg_and_raise_perror("%d", from); } return newfd; } @@ -5459,7 +5471,7 @@ redirect(union node *redir, int flags) /* "echo >&10" and 10 is a fd opened to a sh script? */ if (is_hidden_fd(sv, right_fd)) { errno = EBADF; /* as if it is closed */ - ash_msg_and_raise_error("%d: %m", right_fd); + ash_msg_and_raise_perror("%d", right_fd); } newfd = -1; } else { @@ -5493,7 +5505,7 @@ redirect(union node *redir, int flags) if (newfd >= 0) close(newfd); errno = i; - ash_msg_and_raise_error("%d: %m", fd); + ash_msg_and_raise_perror("%d", fd); /* NOTREACHED */ } /* EBADF: it is not open - good, remember to close it */ |