X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=inline;f=nc.c;h=a2be8ec46dbb87a48eb4898912d85f82c6daa6b6;hb=05ebdd03d4507bb92bff395906a3076fecc1010d;hp=a544f32fc7488c662fa356d73373d3df55bf0135;hpb=bf181b9338152759fd56c8009e9a962a84808e7c;p=oweals%2Fbusybox.git diff --git a/nc.c b/nc.c index a544f32fc..a2be8ec46 100644 --- a/nc.c +++ b/nc.c @@ -25,7 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "internal.h" +#include "busybox.h" #include #include #include @@ -38,14 +38,10 @@ #include #include -#define BUFSIZE 100 - int nc_main(int argc, char **argv) { int sfd; - int result; - int len; - char ch[BUFSIZE]; + char buf[BUFSIZ]; struct sockaddr_in address; struct hostent *hostinfo; @@ -54,34 +50,26 @@ int nc_main(int argc, char **argv) argc--; argv++; - if (argc < 2 || **(argv + 1) == '-') { + if (argc < 2 || **argv == '-') { usage(nc_usage); } - sfd = socket(AF_INET, SOCK_STREAM, 0); - - hostinfo = (struct hostent *) gethostbyname(*argv); + if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) + perror_msg_and_die("socket"); - if (!hostinfo) { - fatalError("cannot resolve %s\n", *argv); - } + if ((hostinfo = gethostbyname(*argv)) == NULL) + error_msg_and_die("cannot resolve %s\n", *argv); address.sin_family = AF_INET; address.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list; address.sin_port = htons(atoi(*(++argv))); - len = sizeof(address); - - result = connect(sfd, (struct sockaddr *) &address, len); - - if (result < 0) { - perror("nc: connect"); - exit(2); - } + if (connect(sfd, (struct sockaddr *) &address, sizeof(address)) < 0) + perror_msg_and_die("connect"); FD_ZERO(&readfds); FD_SET(sfd, &readfds); - FD_SET(fileno(stdin), &readfds); + FD_SET(STDIN_FILENO, &readfds); while (1) { int fd; @@ -90,39 +78,26 @@ int nc_main(int argc, char **argv) testfds = readfds; - result = - select(FD_SETSIZE, &testfds, (fd_set *) NULL, (fd_set *) NULL, - (struct timeval *) 0); - - if (result < 1) { - perror("nc: select"); - exit(3); - } + if (select(FD_SETSIZE, &testfds, NULL, NULL, NULL) < 0) + perror_msg_and_die("select"); for (fd = 0; fd < FD_SETSIZE; fd++) { if (FD_ISSET(fd, &testfds)) { - int trn = 0; - int rn; - - ioctl(fd, FIONREAD, &nread); + if ((nread = safe_read(fd, buf, sizeof(buf))) < 0) + perror_msg_and_die("read"); if (fd == sfd) { if (nread == 0) exit(0); - ofd = fileno(stdout); + ofd = STDOUT_FILENO; } else { + if (nread == 0) + shutdown(sfd, 1); ofd = sfd; } - - - do { - rn = (BUFSIZE < nread - trn) ? BUFSIZE : nread - trn; - trn += rn; - read(fd, ch, rn); - write(ofd, ch, rn); - } - while (trn < nread); + if (full_write(ofd, buf, nread) < 0) + perror_msg_and_die("write"); } } }