diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-02-16 17:17:17 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-02-16 17:17:17 +0100 |
commit | 5b3b468ec0c6e6dfe772722dbd6b2c57cef817b5 (patch) | |
tree | 2c5e5af238764211a7e9972a7879e54ffa9edb4b /networking/nc.c | |
parent | 0ec4d08ea357e680506d9f7df90fa1e53a180509 (diff) | |
download | busybox-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.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) | |||
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 | } |