Skip to content

Commit fce117d

Browse files
committed
Grab ssh stderr
1 parent 64510a4 commit fce117d

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

src/utils/remote.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#define MAX_CMDLINE_LENGTH 4096
1212
#define MAX_CMDLINE_OPTIONS 256
13+
#define ERR_BUF_SIZE 1024
1314

1415
static int append_option(char* buf, size_t buf_size, size_t dst, char const* src)
1516
{
@@ -78,6 +79,7 @@ int remote_execute(int argc, char* argv[], bool listen)
7879
int i;
7980
int outfd[2];
8081
int infd[2];
82+
int errfd[2];
8183
char* pg_probackup = argv[0];
8284

8385
ssh_argc = 0;
@@ -116,31 +118,45 @@ int remote_execute(int argc, char* argv[], bool listen)
116118

117119
SYS_CHECK(pipe(infd));
118120
SYS_CHECK(pipe(outfd));
121+
SYS_CHECK(pipe(errfd));
119122

120123
SYS_CHECK(child_pid = fork());
121124

122125
if (child_pid == 0) { /* child */
123126
SYS_CHECK(close(STDIN_FILENO));
124127
SYS_CHECK(close(STDOUT_FILENO));
128+
SYS_CHECK(close(STDERR_FILENO));
125129

126130
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));
128133

129134
SYS_CHECK(close(infd[0]));
130135
SYS_CHECK(close(infd[1]));
131136
SYS_CHECK(close(outfd[0]));
132137
SYS_CHECK(close(outfd[1]));
138+
SYS_CHECK(close(errfd[0]));
139+
SYS_CHECK(close(errfd[1]));
133140

134141
SYS_CHECK(execvp(ssh_argv[0], ssh_argv));
135142
return -1;
136143
} 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]));
139147
atexit(kill_child);
140148
if (listen) {
141149
int status;
142150
fio_communicate(infd[0], outfd[1]);
143151
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+
}
144160
return status;
145161
} else {
146162
fio_redirect(infd[0], outfd[1]); /* write to stdout */

0 commit comments

Comments
 (0)