diff options
Diffstat (limited to 'networking')
-rw-r--r-- | networking/nc.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/networking/nc.c b/networking/nc.c index 1b70434ac..d2b1ddcce 100644 --- a/networking/nc.c +++ b/networking/nc.c @@ -117,7 +117,7 @@ int nc_main(int argc, char **argv) IF_NOT_NC_EXTRA (const) unsigned delay = 0; IF_NOT_NC_EXTRA (const int execparam = 0;) IF_NC_EXTRA (char **execparam = NULL;) - fd_set readfds, testfds; + struct pollfd pfds[2]; int opt; /* must be signed (getopt returns -1) */ if (ENABLE_NC_SERVER || ENABLE_NC_EXTRA) { @@ -235,29 +235,28 @@ int nc_main(int argc, char **argv) IF_NC_EXTRA(bb_perror_msg_and_die("can't execute '%s'", execparam[0]);) } - /* Select loop copying stdin to cfd, and cfd to stdout */ + /* loop copying stdin to cfd, and cfd to stdout */ - FD_ZERO(&readfds); - FD_SET(cfd, &readfds); - FD_SET(STDIN_FILENO, &readfds); + pfds[0].fd = STDIN_FILENO; + pfds[0].events = POLLIN; + pfds[1].fd = cfd; + pfds[1].events = POLLIN; #define iobuf bb_common_bufsiz1 setup_common_bufsiz(); for (;;) { - int fd; + int fdidx; int ofd; int nread; - testfds = readfds; + if (safe_poll(pfds, 2, -1) < 0) + bb_perror_msg_and_die("poll"); - if (select(cfd + 1, &testfds, NULL, NULL, NULL) < 0) - bb_perror_msg_and_die("select"); - - fd = STDIN_FILENO; + fdidx = 0; while (1) { - if (FD_ISSET(fd, &testfds)) { - nread = safe_read(fd, iobuf, COMMON_BUFSIZE); - if (fd == cfd) { + if (pfds[fdidx].revents) { + nread = safe_read(pfds[fdidx].fd, iobuf, COMMON_BUFSIZE); + if (fdidx != 0) { if (nread < 1) exit(EXIT_SUCCESS); ofd = STDOUT_FILENO; @@ -266,7 +265,7 @@ int nc_main(int argc, char **argv) /* Close outgoing half-connection so they get EOF, * but leave incoming alone so we can see response */ shutdown(cfd, SHUT_WR); - FD_CLR(STDIN_FILENO, &readfds); + pfds[0].fd = -1; } ofd = cfd; } @@ -274,9 +273,9 @@ int nc_main(int argc, char **argv) if (delay > 0) sleep(delay); } - if (fd == cfd) + if (fdidx == 1) break; - fd = cfd; + fdidx++; } } } |