|
@@ -296,12 +296,21 @@ int process_child_io(libvchan_t *data_vchan,
|
|
|
|
|
|
/* if all done, exit the loop */
|
|
|
if ((!child_process_pid || child_process_status > -1) &&
|
|
|
+ (child_process_pid || remote_process_status > -1) &&
|
|
|
stdin_fd == -1 && stdout_fd == -1 && stderr_fd == -1) {
|
|
|
if (child_process_status > -1) {
|
|
|
send_exit_code(data_vchan, child_process_status);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
+ /* also if vchan is disconnected (and we processed all the data), there
|
|
|
+ * is no sense of processing further data */
|
|
|
+ if (!libvchan_data_ready(data_vchan) && !libvchan_is_open(data_vchan)) {
|
|
|
+ if (child_process_pid)
|
|
|
+ return remote_process_status;
|
|
|
+ else
|
|
|
+ return child_process_status;
|
|
|
+ }
|
|
|
/* child signaled desire to use single socket for both stdin and stdout */
|
|
|
if (stdio_socket_requested) {
|
|
|
if (stdout_fd != -1)
|