zcip: fix unaligned trap on ARM
[oweals/busybox.git] / networking / nc.c
index 09d89b0a8c6dead45e76065e7905d4309c259955..e7bd519e06106d0b08d82668972da820b0a6444b 100644 (file)
@@ -7,7 +7,11 @@
  *  Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include "busybox.h"
+#include "libbb.h"
+
+#if ENABLE_DESKTOP
+#include "nc_bloaty.c"
+#else
 
 /* Lots of small differences in features
  * when compared to "standard" nc
@@ -18,6 +22,7 @@ static void timeout(int signum)
        bb_error_msg_and_die("timed out");
 }
 
+int nc_main(int argc, char **argv);
 int nc_main(int argc, char **argv)
 {
        /* sfd sits _here_ only because of "repeat" option (-l -l). */
@@ -43,10 +48,10 @@ int nc_main(int argc, char **argv)
                        else if (ENABLE_NC_SERVER && opt=='p') {
                                USE_NC_SERVER(lport = bb_lookup_port(optarg, "tcp", 0));
                        }
-                       else if (ENABLE_NC_EXTRA  && opt=='w') USE_NC_EXTRA( wsecs = xatou(optarg));
-                       else if (ENABLE_NC_EXTRA  && opt=='i') USE_NC_EXTRA( delay = xatou(optarg));
-                       else if (ENABLE_NC_EXTRA  && opt=='f') USE_NC_EXTRA( cfd = xopen(optarg, O_RDWR));
-                       else if (ENABLE_NC_EXTRA  && opt=='e' && optind<=argc) {
+                       else if (ENABLE_NC_EXTRA && opt=='w') USE_NC_EXTRA( wsecs = xatou(optarg));
+                       else if (ENABLE_NC_EXTRA && opt=='i') USE_NC_EXTRA( delay = xatou(optarg));
+                       else if (ENABLE_NC_EXTRA && opt=='f') USE_NC_EXTRA( cfd = xopen(optarg, O_RDWR));
+                       else if (ENABLE_NC_EXTRA && opt=='e' && optind<=argc) {
                                /* We cannot just 'break'. We should let getopt finish.
                                ** Or else we won't be able to find where
                                ** 'host' and 'port' params are
@@ -91,8 +96,6 @@ int nc_main(int argc, char **argv)
 
        if (!cfd) {
                if (do_listen) {
-                       socklen_t addrlen;
-
                        /* create_and_bind_stream_or_die(NULL, lport)
                         * would've work wonderfully, but we need
                         * to know lsa */
@@ -105,15 +108,14 @@ int nc_main(int argc, char **argv)
                        /* If we didn't specify a port number,
                         * query and print it after listen() */
                        if (!lport) {
-                               addrlen = lsa->len;
+                               socklen_t addrlen = lsa->len;
                                getsockname(sfd, &lsa->sa, &addrlen);
-                               lport = get_nport(lsa);
+                               lport = get_nport(&lsa->sa);
                                fdprintf(2, "%d\n", ntohs(lport));
                        }
                        fcntl(sfd, F_SETFD, FD_CLOEXEC);
  accept_again:
-                       addrlen = lsa->len;
-                       cfd = accept(sfd, NULL, 0); /* &lsa->sa, &addrlen); */
+                       cfd = accept(sfd, NULL, 0);
                        if (cfd < 0)
                                bb_perror_msg_and_die("accept");
                        if (!execparam)
@@ -151,7 +153,7 @@ int nc_main(int argc, char **argv)
                }
                dup2(0, 1);
                dup2(0, 2);
-               USE_NC_EXTRA(execvp(execparam[0], execparam);)
+               USE_NC_EXTRA(BB_EXECVP(execparam[0], execparam);)
                /* Don't print stuff or it will go over the wire.... */
                _exit(127);
        }
@@ -172,11 +174,10 @@ int nc_main(int argc, char **argv)
                if (select(FD_SETSIZE, &testfds, NULL, NULL, NULL) < 0)
                        bb_perror_msg_and_die("select");
 
+#define iobuf bb_common_bufsiz1
                for (fd = 0; fd < FD_SETSIZE; fd++) {
                        if (FD_ISSET(fd, &testfds)) {
-                               nread = safe_read(fd, bb_common_bufsiz1,
-                                                       sizeof(bb_common_bufsiz1));
-
+                               nread = safe_read(fd, iobuf, sizeof(iobuf));
                                if (fd == cfd) {
                                        if (nread < 1)
                                                exit(0);
@@ -190,10 +191,10 @@ int nc_main(int argc, char **argv)
                                        }
                                        ofd = cfd;
                                }
-
-                               xwrite(ofd, bb_common_bufsiz1, nread);
+                               xwrite(ofd, iobuf, nread);
                                if (delay > 0) sleep(delay);
                        }
                }
        }
 }
+#endif