BusyBox on Termux can't use ports less than 1024 it's patched to change default 
port for httpd to 8080 and telnetd to 8023.

https://github.com/termux/termux-packages/blob/master/packages/busybox/0011-networking-telnetd-default-port.patch
https://github.com/termux/termux-packages/blob/master/packages/busybox/0010-networking-httpd-default-port.patch

To avoid such patches we can make port configurable.
The macros STR(s) is copied from ftpd.c and it's needed to convert int to 
string.

For httpd.c made a refactoring of openServer():
* bind_addr_or_port is not preset with "80" and user not specified -p then it 
will remain a NULL
* Extracted variable fd instead of reusing n var
* 0xffff replaced with 65535 as it done in other places

function                                             old     new   delta
httpd_main                                           668     677      +9
packed_usage                                        2699    2701      +2
.rodata                                            11051   11048      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 11/-3)               Total: 8 bytes
   text    data     bss     dec     hex filename
 186936    4027   69256  260219   3f87b busybox_old
 186944    4027   69256  260227   3f883 busybox_unstripped

Signed-off-by: Sergey Ponomarev <stok...@gmail.com>
---
 networking/httpd.c   | 31 ++++++++++++++++++++++---------
 networking/telnetd.c | 16 ++++++++++++++--
 2 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/networking/httpd.c b/networking/httpd.c
index 568b5f72b..aff8f994e 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -102,6 +102,13 @@
 //config:      help
 //config:      HTTP server.
 //config:
+//config:config HTTPD_PORT_DEFAULT
+//config:      int "Default port"
+//config:      default 80
+//config:      range 1 65535
+//config:      help
+//config:      Port to listen on
+//config:
 //config:config FEATURE_HTTPD_RANGES
 //config:      bool "Support 'Ranges:' header"
 //config:      default y
@@ -257,6 +264,8 @@
 
 //kbuild:lib-$(CONFIG_HTTPD) += httpd.o
 
+//usage:#define STR1(s) #s
+//usage:#define STR(s) STR1(s)
 //usage:#define httpd_trivial_usage
 //usage:       "[-ifv[v]]"
 //usage:       " [-c CONFFILE]"
@@ -270,7 +279,7 @@
 //usage:     "\n       -i              Inetd mode"
 //usage:     "\n       -f              Don't daemonize"
 //usage:     "\n       -v[v]           Verbose"
-//usage:     "\n       -p [IP:]PORT    Bind to IP:PORT (default *:80)"
+//usage:     "\n       -p [IP:]PORT    Bind to IP:PORT. Default " 
STR(CONFIG_HTTPD_PORT_DEFAULT)
 //usage:       IF_FEATURE_HTTPD_SETUID(
 //usage:     "\n       -u USER[:GRP]   Set uid/gid after binding to port")
 //usage:       IF_FEATURE_HTTPD_BASIC_AUTH(
@@ -542,7 +551,7 @@ enum {
        SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
        IF_FEATURE_HTTPD_BASIC_AUTH(g_realm = "Web Server Authentication";) \
        IF_FEATURE_HTTPD_RANGES(range_start = -1;) \
-       bind_addr_or_port = "80"; \
+       bind_addr_or_port = NULL; \
        index_page = index_html; \
        file_size = -1; \
 } while (0)
@@ -1030,13 +1039,17 @@ static void decodeBase64(char *data)
  */
 static int openServer(void)
 {
-       unsigned n = bb_strtou(bind_addr_or_port, NULL, 10);
-       if (!errno && n && n <= 0xffff)
-               n = create_and_bind_stream_or_die(NULL, n);
-       else
-               n = create_and_bind_stream_or_die(bind_addr_or_port, 80);
-       xlisten(n, 9);
-       return n;
+       int fd;
+       if (bind_addr_or_port != NULL) {
+               unsigned port = bb_strtou(bind_addr_or_port, NULL, 10);
+               if (!errno && port && port <= 65535) // PORT
+                       fd = create_and_bind_stream_or_die(NULL, port);
+               else // IP:PORT
+                       fd = create_and_bind_stream_or_die(bind_addr_or_port, 
CONFIG_HTTPD_PORT_DEFAULT);
+       } else // Nothing specified, use default port
+               fd = create_and_bind_stream_or_die(NULL, 
CONFIG_HTTPD_PORT_DEFAULT);
+       xlisten(fd, 9);
+       return fd;
 }
 
 /*
diff --git a/networking/telnetd.c b/networking/telnetd.c
index de4d733f9..af83ba3d4 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -68,6 +68,14 @@
 //config:      help
 //config:      Selecting this will make telnetd able to run standalone.
 //config:
+//config:config TELNETD_PORT_DEFAULT
+//config:      int "Default port"
+//config:      default "23"
+//config:      range 1 65535
+//config:      depends on FEATURE_TELNETD_STANDALONE
+//config:      help
+//config:      Port to listen on
+//config:
 //config:config FEATURE_TELNETD_INETD_WAIT
 //config:      bool "Support -w SEC option (inetd wait mode)"
 //config:      default y
@@ -93,6 +101,8 @@
 
 //kbuild:lib-$(CONFIG_TELNETD) += telnetd.o
 
+//usage:#define STR1(s) #s
+//usage:#define STR(s) STR1(s)
 //usage:#define telnetd_trivial_usage
 //usage:       "[OPTIONS]"
 //usage:#define telnetd_full_usage "\n\n"
@@ -103,7 +113,7 @@
 //usage:     "\n       -K              Close connection as soon as login exits"
 //usage:     "\n                       (normally wait until all programs close 
slave pty)"
 //usage:       IF_FEATURE_TELNETD_STANDALONE(
-//usage:     "\n       -p PORT         Port to listen on"
+//usage:     "\n       -p PORT         Port to listen on. Default " 
STR(CONFIG_TELNETD_PORT_DEFAULT)
 //usage:     "\n       -b ADDR[:PORT]  Address to bind to"
 //usage:     "\n       -F              Run in foreground"
 //usage:     "\n       -i              Inetd mode"
@@ -708,9 +718,11 @@ int telnetd_main(int argc UNUSED_PARAM, char **argv)
        } else {
                master_fd = 0;
                if (!(opt & OPT_WAIT)) {
-                       unsigned portnbr = 23;
+                       unsigned portnbr;
                        if (opt & OPT_PORT)
                                portnbr = xatou16(opt_portnbr);
+                       else
+                               portnbr = CONFIG_TELNETD_PORT_DEFAULT;
                        master_fd = create_and_bind_stream_or_die(opt_bindaddr, 
portnbr);
                        xlisten(master_fd, 1);
                }
-- 
2.30.2

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to