From f71f8c9c220fb74edab66fbdfcbed32f3fcbe521 Mon Sep 17 00:00:00 2001 From: Nate Straz Date: Thu, 25 Aug 2005 20:16:02 +0000 Subject: Rework the pselect loop. - Only read once, let select tell us when to read. - When select is interrupted, only check signals --- qarsh/qarsh.c | 88 ++++++++++++++++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/qarsh/qarsh.c b/qarsh/qarsh.c index 4a96147..b0c4aab 100644 --- a/qarsh/qarsh.c +++ b/qarsh/qarsh.c @@ -209,64 +209,58 @@ run_remote_cmd(char *cmdline) nset = pselect(FD_SETSIZE, &testfds, NULL, NULL, NULL, &pselect_sigmask); if (nset == -1 && errno == EINTR) { - nset = 0; - } - - if (signal_to_send) { - qp = make_qp_kill(signal_to_send); - send_packet(qarsh_fd, qp); - qpfree(qp); - signal_to_send = 0; - } - if (nset && FD_ISSET(fileno(stdin), &testfds)) { - do { + /* Only test signals */ + if (signal_to_send) { + qp = make_qp_kill(signal_to_send); + send_packet(qarsh_fd, qp); + qpfree(qp); + signal_to_send = 0; + } + } else if (nset > 0) { + if (nset && FD_ISSET(fileno(stdin), &testfds)) { bufsize = read(fileno(stdin), buf, 1024); - if (bufsize > 0) + if (bufsize > 0) { write(c_in, buf, bufsize); - } while (bufsize == 1024); - if (bufsize == 0) { - FD_CLR(fileno(stdin), &readfds); - close(c_in); - c_in = 0; + } else if (bufsize == 0) { + FD_CLR(fileno(stdin), &readfds); + close(fileno(stdin)); + close(c_in); + c_in = 0; + } + nset--; } - nset--; - } - if (nset && c_out && FD_ISSET(c_out, &testfds)) { - do { + if (nset && c_out && FD_ISSET(c_out, &testfds)) { bufsize = read(c_out, buf, 1024); - if (bufsize > 0) + if (bufsize > 0) { write(fileno(stdout), buf, bufsize); - } while (bufsize == 1024); - if (bufsize == 0) { - FD_CLR(c_out, &readfds); - close(c_out); - c_out = 0; + } else if (bufsize == 0) { + FD_CLR(c_out, &readfds); + close(c_out); + c_out = 0; + } + nset--; } - nset--; - } - if (nset && c_err && FD_ISSET(c_err, &testfds)) { - do { + if (nset && c_err && FD_ISSET(c_err, &testfds)) { bufsize = read(c_err, buf, 1024); - if (bufsize > 0) + if (bufsize > 0) { write(fileno(stderr), buf, bufsize); - } while (bufsize == 1024); - if (bufsize == 0) { - FD_CLR(c_err, &readfds); - close(c_err); - c_err = 0; + } else if (bufsize == 0) { + FD_CLR(c_err, &readfds); + close(c_err); + c_err = 0; + } + nset--; } - nset--; - } - if (nset && FD_ISSET(qarsh_fd, &testfds)) { - qp = recv_packet(qarsh_fd); - - /* dump_qp(qp); */ - if (qp && qp->qp_type == QP_CMDEXIT) { - break; + if (nset && FD_ISSET(qarsh_fd, &testfds)) { + qp = recv_packet(qarsh_fd); + + /* dump_qp(qp); */ + if (qp && qp->qp_type == QP_CMDEXIT) { + break; + } + nset--; } - nset--; } - } if (c_out) close(c_out); if (c_err) close(c_err); -- cgit