aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-10-07 15:56:47 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2016-10-07 15:56:47 +0200
commitec1ea16337623824e3e71bb5dc0e011259664d7e (patch)
tree61cde58288c1f247a572eac2571c7d2969bb5df4
parent561639a68c6a5468eaa95912592f9d01ba9dcbdd (diff)
downloadbusybox-w32-ec1ea16337623824e3e71bb5dc0e011259664d7e.tar.gz
busybox-w32-ec1ea16337623824e3e71bb5dc0e011259664d7e.tar.bz2
busybox-w32-ec1ea16337623824e3e71bb5dc0e011259664d7e.zip
tcpsvd: don't keep shared fd open if fd limit is reached. closes 9331
Also, much improved help text. function old new delta packed_usage 30652 30851 +199 tcpudpsvd_main 1782 1784 +2 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/tcpudp.c69
1 files changed, 46 insertions, 23 deletions
diff --git a/networking/tcpudp.c b/networking/tcpudp.c
index fbd1f1c45..b27cf3ea9 100644
--- a/networking/tcpudp.c
+++ b/networking/tcpudp.c
@@ -34,37 +34,56 @@
34/* with not-implemented options: */ 34/* with not-implemented options: */
35/* //usage: "[-hpEvv] [-c N] [-C N[:MSG]] [-b N] [-u USER] [-l NAME] [-i DIR|-x CDB] [-t SEC] IP PORT PROG" */ 35/* //usage: "[-hpEvv] [-c N] [-C N[:MSG]] [-b N] [-u USER] [-l NAME] [-i DIR|-x CDB] [-t SEC] IP PORT PROG" */
36//usage:#define tcpsvd_full_usage "\n\n" 36//usage:#define tcpsvd_full_usage "\n\n"
37//usage: "Create TCP socket, bind to IP:PORT and listen\n" 37//usage: "Create TCP socket, bind to IP:PORT and listen for incoming connections.\n"
38//usage: "for incoming connection. Run PROG for each connection.\n" 38//usage: "Run PROG for each connection.\n"
39//usage: "\n IP IP to listen on, 0 = all" 39//usage: "\n IP PORT IP:PORT to listen on"
40//usage: "\n PORT Port to listen on"
41//usage: "\n PROG ARGS Program to run" 40//usage: "\n PROG ARGS Program to run"
42//usage: "\n -l NAME Local hostname (else looks up local hostname in DNS)"
43//usage: "\n -u USER[:GRP] Change to user/group after bind" 41//usage: "\n -u USER[:GRP] Change to user/group after bind"
44//usage: "\n -c N Handle up to N connections simultaneously" 42//usage: "\n -c N Up to N connections simultaneously (default 30)"
45//usage: "\n -b N Allow a backlog of approximately N TCP SYNs" 43//usage: "\n -b N Allow backlog of approximately N TCP SYNs (default 20)"
46//usage: "\n -C N[:MSG] Allow only up to N connections from the same IP" 44//usage: "\n -C N[:MSG] Allow only up to N connections from the same IP:"
47//usage: "\n New connections from this IP address are closed" 45//usage: "\n new connections from this IP address are closed"
48//usage: "\n immediately. MSG is written to the peer before close" 46//usage: "\n immediately, MSG is written to the peer before close"
47//usage: "\n -E Don't set up environment"
49//usage: "\n -h Look up peer's hostname" 48//usage: "\n -h Look up peer's hostname"
50//usage: "\n -E Don't set up environment variables" 49//usage: "\n -l NAME Local hostname (else look up local hostname in DNS)"
51//usage: "\n -v Verbose" 50//usage: "\n -v Verbose"
51//usage: "\n"
52//usage: "\nEnvironment if no -E:"
53//usage: "\nPROTO='TCP'"
54//usage: "\nTCPREMOTEADDR='ip:port'" IF_FEATURE_IPV6(" ('[ip]:port' for IPv6)")
55//usage: "\nTCPLOCALADDR='ip:port'"
56//usage: "\nTCPORIGDSTADDR='ip:port' of destination before firewall"
57//usage: "\n Useful for REDIRECTed-to-local connections:"
58//usage: "\n iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080"
59//usage: "\nTCPCONCURRENCY=num_of_connects_from_this_ip"
60//usage: "\nIf -h:"
61//usage: "\nTCPLOCALHOST='hostname' (-l NAME is used if specified)"
62//usage: "\nTCPREMOTEHOST='hostname'"
63
52//usage: 64//usage:
53//usage:#define udpsvd_trivial_usage 65//usage:#define udpsvd_trivial_usage
54//usage: "[-hEv] [-c N] [-u USER] [-l NAME] IP PORT PROG" 66//usage: "[-hEv] [-c N] [-u USER] [-l NAME] IP PORT PROG"
55//usage:#define udpsvd_full_usage "\n\n" 67//usage:#define udpsvd_full_usage "\n\n"
56//usage: "Create UDP socket, bind to IP:PORT and wait\n" 68//usage: "Create UDP socket, bind to IP:PORT and wait for incoming packets.\n"
57//usage: "for incoming packets. Run PROG for each packet,\n" 69//usage: "Run PROG for each packet, redirecting all further packets with same\n"
58//usage: "redirecting all further packets with same peer ip:port to it.\n" 70//usage: "peer ip:port to it.\n"
59//usage: "\n IP IP to listen on, 0 = all" 71//usage: "\n IP PORT IP:PORT to listen on"
60//usage: "\n PORT Port to listen on"
61//usage: "\n PROG ARGS Program to run" 72//usage: "\n PROG ARGS Program to run"
62//usage: "\n -l NAME Local hostname (else looks up local hostname in DNS)"
63//usage: "\n -u USER[:GRP] Change to user/group after bind" 73//usage: "\n -u USER[:GRP] Change to user/group after bind"
64//usage: "\n -c N Handle up to N connections simultaneously" 74//usage: "\n -c N Up to N connections simultaneously (default 30)"
75//usage: "\n -E Don't set up environment"
65//usage: "\n -h Look up peer's hostname" 76//usage: "\n -h Look up peer's hostname"
66//usage: "\n -E Don't set up environment variables" 77//usage: "\n -l NAME Local hostname (else look up local hostname in DNS)"
67//usage: "\n -v Verbose" 78//usage: "\n -v Verbose"
79//usage: "\n"
80//usage: "\nEnvironment if no -E:"
81//usage: "\nPROTO='UDP'"
82//usage: "\nUDPREMOTEADDR='ip:port'" IF_FEATURE_IPV6(" ('[ip]:port' for IPv6)")
83//usage: "\nUDPLOCALADDR='ip:port'"
84//usage: "\nIf -h:"
85//usage: "\nUDPLOCALHOST='hostname' (-l NAME is used if specified)"
86//usage: "\nUDPREMOTEHOST='hostname'"
68 87
69#include "libbb.h" 88#include "libbb.h"
70#include "common_bufsiz.h" 89#include "common_bufsiz.h"
@@ -240,7 +259,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
240 ); 259 );
241#else 260#else
242 /* "+": stop on first non-option */ 261 /* "+": stop on first non-option */
243 opts = getopt32(argv, "+c:C:i:x:u:l:Eb:hpt:v", 262 opts = getopt32(argv, "+c:+C:i:x:u:l:Eb:hpt:v",
244 &cmax, &str_C, &instructs, &instructs, &user, &preset_local_hostname, 263 &cmax, &str_C, &instructs, &instructs, &user, &preset_local_hostname,
245 &backlog, &str_t, &verbose 264 &backlog, &str_t, &verbose
246 ); 265 );
@@ -349,16 +368,20 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
349 again: 368 again:
350 hccp = NULL; 369 hccp = NULL;
351 370
371 again1:
372 close(0);
373 /* It's important to close(0) _before_ wait loop:
374 * fd#0 can be a shared connection fd.
375 * If kept open by us, peer can't detect PROG closing it.
376 */
352 while (cnum >= cmax) 377 while (cnum >= cmax)
353 wait_for_any_sig(); /* expecting SIGCHLD */ 378 wait_for_any_sig(); /* expecting SIGCHLD */
354 379
355 /* Accept a connection to fd #0 */
356 again1:
357 close(0);
358 again2: 380 again2:
359 sig_unblock(SIGCHLD); 381 sig_unblock(SIGCHLD);
360 local.len = remote.len = sa_len; 382 local.len = remote.len = sa_len;
361 if (tcp) { 383 if (tcp) {
384 /* Accept a connection to fd #0 */
362 conn = accept(sock, &remote.u.sa, &remote.len); 385 conn = accept(sock, &remote.u.sa, &remote.len);
363 } else { 386 } else {
364 /* In case recv_from_to won't be able to recover local addr. 387 /* In case recv_from_to won't be able to recover local addr.