|
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 */ |
|