aboutsummaryrefslogtreecommitdiff
path: root/networking/nc.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-02-16 17:17:17 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2017-02-16 17:17:17 +0100
commit5b3b468ec0c6e6dfe772722dbd6b2c57cef817b5 (patch)
tree2c5e5af238764211a7e9972a7879e54ffa9edb4b /networking/nc.c
parent0ec4d08ea357e680506d9f7df90fa1e53a180509 (diff)
downloadbusybox-w32-5b3b468ec0c6e6dfe772722dbd6b2c57cef817b5.tar.gz
busybox-w32-5b3b468ec0c6e6dfe772722dbd6b2c57cef817b5.tar.bz2
busybox-w32-5b3b468ec0c6e6dfe772722dbd6b2c57cef817b5.zip
nc: use poll() instead of select()
function old new delta nc_main 943 866 -77 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/nc.c')
-rw-r--r--networking/nc.c33
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)
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 fd_set readfds, testfds; 120 struct pollfd pfds[2];
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,29 +235,28 @@ 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 /* Select loop copying stdin to cfd, and cfd to stdout */ 238 /* loop copying stdin to cfd, and cfd to stdout */
239 239
240 FD_ZERO(&readfds); 240 pfds[0].fd = STDIN_FILENO;
241 FD_SET(cfd, &readfds); 241 pfds[0].events = POLLIN;
242 FD_SET(STDIN_FILENO, &readfds); 242 pfds[1].fd = cfd;
243 pfds[1].events = POLLIN;
243 244
244#define iobuf bb_common_bufsiz1 245#define iobuf bb_common_bufsiz1
245 setup_common_bufsiz(); 246 setup_common_bufsiz();
246 for (;;) { 247 for (;;) {
247 int fd; 248 int fdidx;
248 int ofd; 249 int ofd;
249 int nread; 250 int nread;
250 251
251 testfds = readfds; 252 if (safe_poll(pfds, 2, -1) < 0)
253 bb_perror_msg_and_die("poll");
252 254
253 if (select(cfd + 1, &testfds, NULL, NULL, NULL) < 0) 255 fdidx = 0;
254 bb_perror_msg_and_die("select");
255
256 fd = STDIN_FILENO;
257 while (1) { 256 while (1) {
258 if (FD_ISSET(fd, &testfds)) { 257 if (pfds[fdidx].revents) {
259 nread = safe_read(fd, iobuf, COMMON_BUFSIZE); 258 nread = safe_read(pfds[fdidx].fd, iobuf, COMMON_BUFSIZE);
260 if (fd == cfd) { 259 if (fdidx != 0) {
261 if (nread < 1) 260 if (nread < 1)
262 exit(EXIT_SUCCESS); 261 exit(EXIT_SUCCESS);
263 ofd = STDOUT_FILENO; 262 ofd = STDOUT_FILENO;
@@ -266,7 +265,7 @@ int nc_main(int argc, char **argv)
266 /* Close outgoing half-connection so they get EOF, 265 /* Close outgoing half-connection so they get EOF,
267 * but leave incoming alone so we can see response */ 266 * but leave incoming alone so we can see response */
268 shutdown(cfd, SHUT_WR); 267 shutdown(cfd, SHUT_WR);
269 FD_CLR(STDIN_FILENO, &readfds); 268 pfds[0].fd = -1;
270 } 269 }
271 ofd = cfd; 270 ofd = cfd;
272 } 271 }
@@ -274,9 +273,9 @@ int nc_main(int argc, char **argv)
274 if (delay > 0) 273 if (delay > 0)
275 sleep(delay); 274 sleep(delay);
276 } 275 }
277 if (fd == cfd) 276 if (fdidx == 1)
278 break; 277 break;
279 fd = cfd; 278 fdidx++;
280 } 279 }
281 } 280 }
282} 281}