aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2017-05-29 16:09:57 +0100
committerRon Yorston <rmy@pobox.com>2017-05-29 16:09:57 +0100
commitc2002eae394c230d6b89073c9ff71bc86a7875e8 (patch)
treef544d05a8df6f1793f6818085af0381d951aa387
parenta664104c168722cb046e0bd54d1d932855a03341 (diff)
downloadbusybox-w32-c2002eae394c230d6b89073c9ff71bc86a7875e8.tar.gz
busybox-w32-c2002eae394c230d6b89073c9ff71bc86a7875e8.tar.bz2
busybox-w32-c2002eae394c230d6b89073c9ff71bc86a7875e8.zip
Revert "nc: use poll() instead of select()"
This reverts commit 5b3b468ec0c6e6dfe772722dbd6b2c57cef817b5.
-rw-r--r--networking/nc.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/networking/nc.c b/networking/nc.c
index d2b1ddcce..1b70434ac 100644
--- a/networking/nc.c
+++ b/networking/nc.c
@@ -117,7 +117,7 @@ int nc_main(int argc, char **argv)
117 IF_NOT_NC_EXTRA (const) unsigned delay = 0; 117 IF_NOT_NC_EXTRA (const) unsigned delay = 0;
118 IF_NOT_NC_EXTRA (const int execparam = 0;) 118 IF_NOT_NC_EXTRA (const int execparam = 0;)
119 IF_NC_EXTRA (char **execparam = NULL;) 119 IF_NC_EXTRA (char **execparam = NULL;)
120 struct pollfd pfds[2]; 120 fd_set readfds, testfds;
121 int opt; /* must be signed (getopt returns -1) */ 121 int opt; /* must be signed (getopt returns -1) */
122 122
123 if (ENABLE_NC_SERVER || ENABLE_NC_EXTRA) { 123 if (ENABLE_NC_SERVER || ENABLE_NC_EXTRA) {
@@ -235,28 +235,29 @@ int nc_main(int argc, char **argv)
235 IF_NC_EXTRA(bb_perror_msg_and_die("can't execute '%s'", execparam[0]);) 235 IF_NC_EXTRA(bb_perror_msg_and_die("can't execute '%s'", execparam[0]);)
236 } 236 }
237 237
238 /* loop copying stdin to cfd, and cfd to stdout */ 238 /* Select loop copying stdin to cfd, and cfd to stdout */
239 239
240 pfds[0].fd = STDIN_FILENO; 240 FD_ZERO(&readfds);
241 pfds[0].events = POLLIN; 241 FD_SET(cfd, &readfds);
242 pfds[1].fd = cfd; 242 FD_SET(STDIN_FILENO, &readfds);
243 pfds[1].events = POLLIN;
244 243
245#define iobuf bb_common_bufsiz1 244#define iobuf bb_common_bufsiz1
246 setup_common_bufsiz(); 245 setup_common_bufsiz();
247 for (;;) { 246 for (;;) {
248 int fdidx; 247 int fd;
249 int ofd; 248 int ofd;
250 int nread; 249 int nread;
251 250
252 if (safe_poll(pfds, 2, -1) < 0) 251 testfds = readfds;
253 bb_perror_msg_and_die("poll");
254 252
255 fdidx = 0; 253 if (select(cfd + 1, &testfds, NULL, NULL, NULL) < 0)
254 bb_perror_msg_and_die("select");
255
256 fd = STDIN_FILENO;
256 while (1) { 257 while (1) {
257 if (pfds[fdidx].revents) { 258 if (FD_ISSET(fd, &testfds)) {
258 nread = safe_read(pfds[fdidx].fd, iobuf, COMMON_BUFSIZE); 259 nread = safe_read(fd, iobuf, COMMON_BUFSIZE);
259 if (fdidx != 0) { 260 if (fd == cfd) {
260 if (nread < 1) 261 if (nread < 1)
261 exit(EXIT_SUCCESS); 262 exit(EXIT_SUCCESS);
262 ofd = STDOUT_FILENO; 263 ofd = STDOUT_FILENO;
@@ -265,7 +266,7 @@ int nc_main(int argc, char **argv)
265 /* Close outgoing half-connection so they get EOF, 266 /* Close outgoing half-connection so they get EOF,
266 * but leave incoming alone so we can see response */ 267 * but leave incoming alone so we can see response */
267 shutdown(cfd, SHUT_WR); 268 shutdown(cfd, SHUT_WR);
268 pfds[0].fd = -1; 269 FD_CLR(STDIN_FILENO, &readfds);
269 } 270 }
270 ofd = cfd; 271 ofd = cfd;
271 } 272 }
@@ -273,9 +274,9 @@ int nc_main(int argc, char **argv)
273 if (delay > 0) 274 if (delay > 0)
274 sleep(delay); 275 sleep(delay);
275 } 276 }
276 if (fdidx == 1) 277 if (fd == cfd)
277 break; 278 break;
278 fdidx++; 279 fd = cfd;
279 } 280 }
280 } 281 }
281} 282}