summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNate Straz <nstraz@redhat.com>2005-08-25 20:16:02 +0000
committerNate Straz <nstraz@redhat.com>2005-08-25 20:16:02 +0000
commitf71f8c9c220fb74edab66fbdfcbed32f3fcbe521 (patch)
treecaea266a35e5b9ff36affe332b2e251c24146951
parent73a1801311d4a7ae542aa4d0a2b3fe09704cb849 (diff)
downloadqarsh-f71f8c9c220fb74edab66fbdfcbed32f3fcbe521.tar.gz
qarsh-f71f8c9c220fb74edab66fbdfcbed32f3fcbe521.tar.xz
qarsh-f71f8c9c220fb74edab66fbdfcbed32f3fcbe521.zip
Rework the pselect loop.
- Only read once, let select tell us when to read. - When select is interrupted, only check signals
-rw-r--r--qarsh/qarsh.c88
1 files 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);