| From 089c9c701a1b68b721f479dfc0c58c35b9dd4175 Mon Sep 17 00:00:00 2001 |
| From: Khem Raj <raj.khem@gmail.com> |
| Date: Wed, 20 Jan 2016 04:39:53 +0000 |
| Subject: [PATCH 1/4] implement libc specific _reopen_stream |
| |
| musl defines stdin/stdio/stderr as constant types which means |
| we can not assign to them as we are doing here but works ok with glibc |
| therefore abstract out the _reopen_stream definition depending upon if |
| we are using glibc or otherwise |
| |
| Origin: |
| http://git.alpinelinux.org/cgit/aports/tree/main/lvm2/fix-stdio-usage.patch |
| |
| Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| --- |
| Upstream-Status: Pending |
| |
| lib/commands/toolcontext.c | 22 +++++++++++----------- |
| tools/lvmcmdline.c | 6 +++--- |
| 2 files changed, 14 insertions(+), 14 deletions(-) |
| |
| diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c |
| index a2f21b8..7f796e4 100644 |
| --- a/lib/commands/toolcontext.c |
| +++ b/lib/commands/toolcontext.c |
| @@ -1637,7 +1637,10 @@ static void _init_globals(struct cmd_context *cmd) |
| /* |
| * Close and reopen stream on file descriptor fd. |
| */ |
| -static int _reopen_stream(FILE *stream, int fd, const char *mode, const char *name, FILE **new_stream) |
| +#ifdef __GLIBC__ |
| +#define _reopen_stream(stream, fd, mode, name) __reopen_stream(stream, fd, mode, name, &stream) |
| + |
| +static int __reopen_stream(FILE *stream, int fd, const char *mode, const char *name, FILE **new_stream) |
| { |
| int fd_copy, new_fd; |
| |
| @@ -1664,6 +1667,9 @@ static int _reopen_stream(FILE *stream, int fd, const char *mode, const char *na |
| |
| return 1; |
| } |
| +#else |
| +#define _reopen_stream(stream, fd, mode, name) (freopen(NULL, mode, stream) != NULL) |
| +#endif |
| |
| static int _init_lvmetad(struct cmd_context *cmd) |
| { |
| @@ -1741,7 +1747,6 @@ struct cmd_context *create_toolcontext(unsigned is_long_lived, |
| unsigned set_filters) |
| { |
| struct cmd_context *cmd; |
| - FILE *new_stream; |
| int flags; |
| |
| #ifdef M_MMAP_MAX |
| @@ -1791,9 +1796,8 @@ struct cmd_context *create_toolcontext(unsigned is_long_lived, |
| if (is_valid_fd(STDIN_FILENO) && |
| ((flags = fcntl(STDIN_FILENO, F_GETFL)) > 0) && |
| (flags & O_ACCMODE) != O_WRONLY) { |
| - if (!_reopen_stream(stdin, STDIN_FILENO, "r", "stdin", &new_stream)) |
| + if (!_reopen_stream(stdin, STDIN_FILENO, "r", "stdin")) |
| goto_out; |
| - stdin = new_stream; |
| if (setvbuf(stdin, cmd->linebuffer, _IOLBF, linebuffer_size)) { |
| log_sys_error("setvbuf", ""); |
| goto out; |
| @@ -1803,9 +1807,8 @@ struct cmd_context *create_toolcontext(unsigned is_long_lived, |
| if (is_valid_fd(STDOUT_FILENO) && |
| ((flags = fcntl(STDOUT_FILENO, F_GETFL)) > 0) && |
| (flags & O_ACCMODE) != O_RDONLY) { |
| - if (!_reopen_stream(stdout, STDOUT_FILENO, "w", "stdout", &new_stream)) |
| + if (!_reopen_stream(stdout, STDOUT_FILENO, "w", "stdout")) |
| goto_out; |
| - stdout = new_stream; |
| if (setvbuf(stdout, cmd->linebuffer + linebuffer_size, |
| _IOLBF, linebuffer_size)) { |
| log_sys_error("setvbuf", ""); |
| @@ -2131,7 +2134,6 @@ int refresh_toolcontext(struct cmd_context *cmd) |
| void destroy_toolcontext(struct cmd_context *cmd) |
| { |
| struct dm_config_tree *cft_cmdline; |
| - FILE *new_stream; |
| int flags; |
| |
| if (cmd->dump_filter && cmd->filter && cmd->filter->dump && |
| @@ -2167,8 +2169,7 @@ void destroy_toolcontext(struct cmd_context *cmd) |
| if (is_valid_fd(STDIN_FILENO) && |
| ((flags = fcntl(STDIN_FILENO, F_GETFL)) > 0) && |
| (flags & O_ACCMODE) != O_WRONLY) { |
| - if (_reopen_stream(stdin, STDIN_FILENO, "r", "stdin", &new_stream)) { |
| - stdin = new_stream; |
| + if (_reopen_stream(stdin, STDIN_FILENO, "r", "stdin")) { |
| setlinebuf(stdin); |
| } else |
| cmd->linebuffer = NULL; /* Leave buffer in place (deliberate leak) */ |
| @@ -2177,8 +2178,7 @@ void destroy_toolcontext(struct cmd_context *cmd) |
| if (is_valid_fd(STDOUT_FILENO) && |
| ((flags = fcntl(STDOUT_FILENO, F_GETFL)) > 0) && |
| (flags & O_ACCMODE) != O_RDONLY) { |
| - if (_reopen_stream(stdout, STDOUT_FILENO, "w", "stdout", &new_stream)) { |
| - stdout = new_stream; |
| + if (_reopen_stream(stdout, STDOUT_FILENO, "w", "stdout")) { |
| setlinebuf(stdout); |
| } else |
| cmd->linebuffer = NULL; /* Leave buffer in place (deliberate leak) */ |
| diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c |
| index 6577977..a33258a 100644 |
| --- a/tools/lvmcmdline.c |
| +++ b/tools/lvmcmdline.c |
| @@ -1744,7 +1744,7 @@ static int _check_standard_fds(void) |
| int err = is_valid_fd(STDERR_FILENO); |
| |
| if (!is_valid_fd(STDIN_FILENO) && |
| - !(stdin = fopen(_PATH_DEVNULL, "r"))) { |
| + !freopen(_PATH_DEVNULL, "r", stdin)) { |
| if (err) |
| perror("stdin stream open"); |
| else |
| @@ -1754,7 +1754,7 @@ static int _check_standard_fds(void) |
| } |
| |
| if (!is_valid_fd(STDOUT_FILENO) && |
| - !(stdout = fopen(_PATH_DEVNULL, "w"))) { |
| + !freopen(_PATH_DEVNULL, "w", stdout)) { |
| if (err) |
| perror("stdout stream open"); |
| /* else no stdout */ |
| @@ -1762,7 +1762,7 @@ static int _check_standard_fds(void) |
| } |
| |
| if (!is_valid_fd(STDERR_FILENO) && |
| - !(stderr = fopen(_PATH_DEVNULL, "w"))) { |
| + !freopen(_PATH_DEVNULL, "w", stderr)) { |
| printf("stderr stream open: %s\n", |
| strerror(errno)); |
| return 0; |
| -- |
| 2.7.0 |
| |