|
10 | 10 |
|
11 | 11 | #define MAX_CMDLINE_LENGTH 4096
|
12 | 12 | #define MAX_CMDLINE_OPTIONS 256
|
| 13 | +#define ERR_BUF_SIZE 1024 |
13 | 14 |
|
14 | 15 | static int append_option(char* buf, size_t buf_size, size_t dst, char const* src)
|
15 | 16 | {
|
@@ -78,6 +79,7 @@ int remote_execute(int argc, char* argv[], bool listen)
|
78 | 79 | int i;
|
79 | 80 | int outfd[2];
|
80 | 81 | int infd[2];
|
| 82 | + int errfd[2]; |
81 | 83 | char* pg_probackup = argv[0];
|
82 | 84 |
|
83 | 85 | ssh_argc = 0;
|
@@ -116,31 +118,45 @@ int remote_execute(int argc, char* argv[], bool listen)
|
116 | 118 |
|
117 | 119 | SYS_CHECK(pipe(infd));
|
118 | 120 | SYS_CHECK(pipe(outfd));
|
| 121 | + SYS_CHECK(pipe(errfd)); |
119 | 122 |
|
120 | 123 | SYS_CHECK(child_pid = fork());
|
121 | 124 |
|
122 | 125 | if (child_pid == 0) { /* child */
|
123 | 126 | SYS_CHECK(close(STDIN_FILENO));
|
124 | 127 | SYS_CHECK(close(STDOUT_FILENO));
|
| 128 | + SYS_CHECK(close(STDERR_FILENO)); |
125 | 129 |
|
126 | 130 | SYS_CHECK(dup2(outfd[0], STDIN_FILENO));
|
127 |
| - SYS_CHECK(dup2(infd[1], STDOUT_FILENO)); |
| 131 | + SYS_CHECK(dup2(infd[1], STDOUT_FILENO)); |
| 132 | + SYS_CHECK(dup2(errfd[1], STDERR_FILENO)); |
128 | 133 |
|
129 | 134 | SYS_CHECK(close(infd[0]));
|
130 | 135 | SYS_CHECK(close(infd[1]));
|
131 | 136 | SYS_CHECK(close(outfd[0]));
|
132 | 137 | SYS_CHECK(close(outfd[1]));
|
| 138 | + SYS_CHECK(close(errfd[0])); |
| 139 | + SYS_CHECK(close(errfd[1])); |
133 | 140 |
|
134 | 141 | SYS_CHECK(execvp(ssh_argv[0], ssh_argv));
|
135 | 142 | return -1;
|
136 | 143 | } else {
|
137 |
| - SYS_CHECK(close(outfd[0])); /* These are being used by the child */ |
138 |
| - SYS_CHECK(close(infd[1])); |
| 144 | + SYS_CHECK(close(infd[1])); /* These are being used by the child */ |
| 145 | + SYS_CHECK(close(outfd[0])); |
| 146 | + SYS_CHECK(close(errfd[1])); |
139 | 147 | atexit(kill_child);
|
140 | 148 | if (listen) {
|
141 | 149 | int status;
|
142 | 150 | fio_communicate(infd[0], outfd[1]);
|
143 | 151 | SYS_CHECK(wait(&status));
|
| 152 | + if (status != 0) |
| 153 | + { |
| 154 | + char buf[ERR_BUF_SIZE]; |
| 155 | + int offs, rc; |
| 156 | + for (offs = 0; (rc = read(errfd[0], &buf[offs], sizeof(buf) - offs)) > 0; offs += rc); |
| 157 | + buf[offs] = '\0'; |
| 158 | + elog(ERROR, buf); |
| 159 | + } |
144 | 160 | return status;
|
145 | 161 | } else {
|
146 | 162 | fio_redirect(infd[0], outfd[1]); /* write to stdout */
|
|
0 commit comments