/* * Processes input from the client and the program. Input data is stored * in buffers and processed later. */ static void process_input(struct ssh *ssh, fd_set *readset) { int len, r; char buf[16384]; /* Read and buffer any input data from the client. */ if (FD_ISSET(connection_in, readset)) { len = read(connection_in, buf, sizeof(buf)); if (len == 0) { verbose("Connection closed by %.100s", ssh_remote_ipaddr(ssh)); connection_closed = 1; if (compat20) return; cleanup_exit(255); } else if (len < 0) { if (errno != EINTR && errno != EAGAIN) { verbose("Read error from remote host " "%.100s: %.100s", ssh_remote_ipaddr(ssh), strerror(errno)); cleanup_exit(255); } } else { /* Buffer any received data. */ ssh_packet_process_incoming(ssh, buf, len); } } if (compat20) return; /* Read and buffer any available stdout data from the program. */ if (!fdout_eof && FD_ISSET(fdout, readset)) { len = read(fdout, buf, sizeof(buf)); if (len < 0 && (errno == EINTR || errno == EAGAIN)) { /* do nothing */ } else if (len <= 0) { fdout_eof = 1; } else { if ((r = sshbuf_put(stdout_buffer, buf, len)) != 0) fatal("%s: buffer error: %s", __func__, ssh_err(r)); fdout_bytes += len; } } /* Read and buffer any available stderr data from the program. */ if (!fderr_eof && FD_ISSET(fderr, readset)) { len = read(fderr, buf, sizeof(buf)); if (len < 0 && (errno == EINTR || errno == EAGAIN)) { /* do nothing */ } else if (len <= 0) { fderr_eof = 1; } else { if ((r = sshbuf_put(stderr_buffer, buf, len)) != 0) fatal("%s: buffer error: %s", __func__, ssh_err(r)); } } }
void packet_process_incoming(const char *buf, u_int len) { int r; if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0) sshpkt_fatal(active_state, __func__, r); }