|
10 | 10 |
|
11 | 11 | #defineMAX_CMDLINE_LENGTH 4096
|
12 | 12 | #defineMAX_CMDLINE_OPTIONS 256
|
| 13 | +#defineERR_BUF_SIZE 1024 |
13 | 14 |
|
14 | 15 | staticintappend_option(char*buf,size_tbuf_size,size_tdst,charconst*src)
|
15 | 16 | {
|
@@ -78,6 +79,7 @@ int remote_execute(int argc, char* argv[], bool listen)
|
78 | 79 | inti;
|
79 | 80 | intoutfd[2];
|
80 | 81 | intinfd[2];
|
| 82 | +interrfd[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 | intstatus;
|
142 | 150 | fio_communicate(infd[0],outfd[1]);
|
143 | 151 | SYS_CHECK(wait(&status));
|
| 152 | +if (status!=0) |
| 153 | +{ |
| 154 | +charbuf[ERR_BUF_SIZE]; |
| 155 | +intoffs,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 | returnstatus;
|
145 | 161 | }else {
|
146 | 162 | fio_redirect(infd[0],outfd[1]);/* write to stdout */
|
|