| @@ -1,15 +1,20 @@ |
| - | /* |
| - | # /usr/bin/tcpsvd -v 0 1234 true |
| - | tcpsvd: info: pid 24916 from 127.0.0.1 |
| - | tcpsvd: info: start 24916 localhost:127.0.0.1 ::127.0.0.1:47905 |
| - | tcpsvd: info: pid 24918 from 127.0.0.1 |
| - | tcpsvd: info: start 24918 localhost:127.0.0.1 ::127.0.0.1:47906 |
| - | # ./busybox tcpsvd -v 0 1234 true |
| - | tcpsvd: info: pid 24924 from 127.0.0.1 |
| - | tcpsvd: info: start 24924 localhost:1234:127.0.0.1:1234 ::127.0.0.1:47908 |
| - | tcpsvd: info: pid 24926 from 127.0.0.1 |
| - | tcpsvd: info: start 24926 localhost:1234:127.0.0.1:1234 ::127.0.0.1:47909 |
| - | */ |
| + | /* Based on ipsvd utilities written by Gerrit Pape <[email protected]> |
| + | * which are released into public domain by the author. |
| + | * Homepage: http://smarden.sunsite.dk/ipsvd/ |
| + | * |
| + | * Copyright (C) 2007 by Denis Vlasenko. |
| + | * |
| + | * Licensed under GPLv2, see file LICENSE in this tarball for details. |
| + | */ |
| + | |
| + | /* Based on ipsvd ipsvd-0.12.1. This tcpsvd accepts all options |
| + | * which are supported by one from ipsvd-0.12.1, but not all are |
| + | * functional. See help text at the end of this file for details. |
| + | * |
| + | * Code inside "#ifdef SSLSVD" is for sslsvd and is currently unused. |
| + | * Code inside #if 0" is parts of original tcpsvd which are not implemented |
| + | * for busyboxed version. |
| + | */ |
| |
| #include "busybox.h" |
| #include "ipsvd_perhost.h" |
| @@ -297,15 +302,15 @@ int tcpsvd_main(int argc, char **argv) |
| if (!max_per_host) |
| remote_ip = xmalloc_sockaddr2dotted_noport(&sock_adr.sa, sizeof(sock_adr)); |
| /* else it is already done */ |
| - | |
| + | |
| remote_port = get_nport(&sock_adr.sa); |
| remote_port = ntohs(remote_port); |
| - | |
| + | |
| if (verbose) { |
| pid = getpid(); |
| printf("%s: info: pid %d from %s\n", applet_name, pid, remote_ip); |
| } |
| - | |
| + | |
| if (need_addresses && (option_mask32 & OPT_h)) { |
| remote_hostname = xmalloc_sockaddr2host(&sock_adr.sa, sizeof(sock_adr)); |
| if (!remote_hostname) { |
| @@ -313,7 +318,7 @@ int tcpsvd_main(int argc, char **argv) |
| remote_hostname = (char*)""; |
| } |
| } |
| - | |
| + | |
| sockadr_size = sizeof(sock_adr); |
| /* Errors ignored (I'm not paranoid enough to imagine kernel |
| * which doesn't know local ip) */ |
| @@ -329,7 +334,7 @@ int tcpsvd_main(int argc, char **argv) |
| bb_error_msg_and_die("cannot look up local hostname for %s", local_ip); |
| } |
| } |
| - | |
| + | |
| if (!(option_mask32 & OPT_E)) { |
| /* setup ucspi env */ |
| xsetenv("PROTO", "TCP"); |
| @@ -346,7 +351,7 @@ int tcpsvd_main(int argc, char **argv) |
| if (cur_per_host > 0) |
| xsetenv("TCPCONCURRENCY", utoa(cur_per_host)); |
| } |
| - | |
| + | |
| #if 0 |
| if (instructs) { |
| ac = ipsvd_check(iscdb, &inst, &match, (char*)instructs, |
| @@ -356,11 +361,11 @@ int tcpsvd_main(int argc, char **argv) |
| } else |
| ac = IPSVD_DEFAULT; |
| #endif |
| - | |
| + | |
| if (max_per_host && verbose) |
| printf("%s: info: concurrency %u %s %u/%u\n", |
| applet_name, pid, remote_ip, cur_per_host, max_per_host); |
| - | |
| + | |
| if (verbose) { |
| printf("%s: info: start %u %s:%s :%s:%s:%u\n", |
| applet_name, pid, |
| @@ -445,6 +450,8 @@ host |
| host either is a hostname, or a dotted-decimal IP address, |
| or 0. If host is 0, tcpsvd accepts connections to any local |
| IP address. |
| + | * busybox accepts IPv6 addresses and host:port pairs too |
| + | In this case second parameter is ignored |
| port |
| tcpsvd accepts connections to host:port. port may be a name |
| from /etc/services or a number. |
| @@ -453,14 +460,16 @@ prog |
| tcpsvd normally runs prog, with file descriptor 0 reading from |
| the network, and file descriptor 1 writing to the network. |
| By default it also sets up TCP-related environment variables, |
| - | see tcp-environ(5) |
| + | see tcp-environ(5) |
| -i dir |
| read instructions for handling new connections from the instructions |
| - | directory dir. See ipsvd-instruct(5) for details. |
| + | directory dir. See ipsvd-instruct(5) for details. |
| + | * ignored by busyboxed version |
| -x cdb |
| read instructions for handling new connections from the constant database |
| cdb. The constant database normally is created from an instructions |
| - | directory by running ipsvd-cdb(8). |
| + | directory by running ipsvd-cdb(8). |
| + | * ignored by busyboxed version |
| -t sec |
| timeout. This option only takes effect if the -i option is given. |
| While checking the instructions directory, check the time of last access |
| @@ -468,47 +477,50 @@ prog |
| and remove the file if it wasn't accessed within the last sec seconds; |
| tcpsvd does not discard or remove a file if the user's write permission |
| is not set, for those files the timeout is disabled. Default is 0, |
| - | which means that the timeout is disabled. |
| + | which means that the timeout is disabled. |
| + | * ignored by busyboxed version |
| -l name |
| local hostname. Do not look up the local hostname in DNS, but use name |
| as hostname. This option must be set if tcpsvd listens on port 53 |
| - | to avoid loops. |
| + | to avoid loops. |
| -u user[:group] |
| drop permissions. Switch user ID to user's UID, and group ID to user's |
| primary GID after creating and binding to the socket. If user is followed |
| by a colon and a group name, the group ID is switched to the GID of group |
| - | instead. All supplementary groups are removed. |
| + | instead. All supplementary groups are removed. |
| -c n |
| concurrency. Handle up to n connections simultaneously. Default is 30. |
| If there are n connections active, tcpsvd defers acceptance of a new |
| - | connection until an active connection is closed. |
| + | connection until an active connection is closed. |
| -C n[:msg] |
| per host concurrency. Allow only up to n connections from the same IP |
| - | address simultaneously. If there are n active connections from one IP |
| + | address simultaneously. If there are n active connections from one IP |
| address, new incoming connections from this IP address are closed |
| - | immediately. If n is followed by :msg, the message msg is written |
| + | immediately. If n is followed by :msg, the message msg is written |
| to the client if possible, before closing the connection. By default |
| msg is empty. See ipsvd-instruct(5) for supported escape sequences in msg. |
| |
| For each accepted connection, the current per host concurrency is |
| available through the environment variable TCPCONCURRENCY. n and msg |
| can be overwritten by ipsvd(7) instructions, see ipsvd-instruct(5). |
| - | By default tcpsvd doesn't keep track of connections. |
| + | By default tcpsvd doesn't keep track of connections. |
| -h |
| - | Look up the client's hostname in DNS. |
| + | Look up the client's hostname in DNS. |
| -p |
| paranoid. After looking up the client's hostname in DNS, look up the IP |
| addresses in DNS for that hostname, and forget about the hostname |
| if none of the addresses match the client's IP address. You should |
| set this option if you use hostname based instructions. The -p option |
| - | implies the -h option. |
| + | implies the -h option. |
| + | * ignored by busyboxed version |
| -b n |
| backlog. Allow a backlog of approximately n TCP SYNs. On some systems n |
| - | is silently limited. Default is 20. |
| + | is silently limited. Default is 20. |
| -E |
| - | no special environment. Do not set up TCP-related environment variables. |
| + | no special environment. Do not set up TCP-related environment variables. |
| -v |
| - | verbose. Print verbose messsages to standard output. |
| + | verbose. Print verbose messsages to standard output. |
| -vv |
| - | more verbose. Print more verbose messages to standard output. |
| + | more verbose. Print more verbose messages to standard output. |
| + | * no difference between -v and -vv in busyboxed version |
| */ |