9 |
|
|
10 |
#include "libbb.h" |
#include "libbb.h" |
11 |
|
|
12 |
#if ENABLE_DESKTOP |
//config:config NC |
13 |
#include "nc_bloaty.c" |
//config: bool "nc" |
14 |
|
//config: default y |
15 |
|
//config: help |
16 |
|
//config: A simple Unix utility which reads and writes data across network |
17 |
|
//config: connections. |
18 |
|
//config: |
19 |
|
//config:config NC_SERVER |
20 |
|
//config: bool "Netcat server options (-l)" |
21 |
|
//config: default y |
22 |
|
//config: depends on NC |
23 |
|
//config: help |
24 |
|
//config: Allow netcat to act as a server. |
25 |
|
//config: |
26 |
|
//config:config NC_EXTRA |
27 |
|
//config: bool "Netcat extensions (-eiw and filename)" |
28 |
|
//config: default y |
29 |
|
//config: depends on NC |
30 |
|
//config: help |
31 |
|
//config: Add -e (support for executing the rest of the command line after |
32 |
|
//config: making or receiving a successful connection), -i (delay interval for |
33 |
|
//config: lines sent), -w (timeout for initial connection). |
34 |
|
//config: |
35 |
|
//config:config NC_110_COMPAT |
36 |
|
//config: bool "Netcat 1.10 compatibility (+2.5k)" |
37 |
|
//config: default n # off specially for Rob |
38 |
|
//config: depends on NC |
39 |
|
//config: help |
40 |
|
//config: This option makes nc closely follow original nc-1.10. |
41 |
|
//config: The code is about 2.5k bigger. It enables |
42 |
|
//config: -s ADDR, -n, -u, -v, -o FILE, -z options, but loses |
43 |
|
//config: busybox-specific extensions: -f FILE and -ll. |
44 |
|
|
45 |
|
#if ENABLE_NC_110_COMPAT |
46 |
|
# include "nc_bloaty.c" |
47 |
#else |
#else |
48 |
|
|
49 |
|
//usage:#if !ENABLE_NC_110_COMPAT |
50 |
|
//usage: |
51 |
|
//usage:#if ENABLE_NC_SERVER || ENABLE_NC_EXTRA |
52 |
|
//usage:#define NC_OPTIONS_STR "\n\nOptions:" |
53 |
|
//usage:#else |
54 |
|
//usage:#define NC_OPTIONS_STR |
55 |
|
//usage:#endif |
56 |
|
//usage: |
57 |
|
//usage:#define nc_trivial_usage |
58 |
|
//usage: IF_NC_EXTRA("[-iN] [-wN] ")IF_NC_SERVER("[-l] [-p PORT] ") |
59 |
|
//usage: "["IF_NC_EXTRA("-f FILE|")"IPADDR PORT]"IF_NC_EXTRA(" [-e PROG]") |
60 |
|
//usage:#define nc_full_usage "\n\n" |
61 |
|
//usage: "Open a pipe to IP:PORT" IF_NC_EXTRA(" or FILE") |
62 |
|
//usage: NC_OPTIONS_STR |
63 |
|
//usage: IF_NC_EXTRA( |
64 |
|
//usage: "\n -e PROG Run PROG after connect" |
65 |
|
//usage: IF_NC_SERVER( |
66 |
|
//usage: "\n -l Listen mode, for inbound connects" |
67 |
|
//usage: IF_NC_EXTRA( |
68 |
|
//usage: "\n (use -l twice with -e for persistent server)") |
69 |
|
//usage: "\n -p PORT Local port" |
70 |
|
//usage: ) |
71 |
|
//usage: "\n -w SEC Timeout for connect" |
72 |
|
//usage: "\n -i SEC Delay interval for lines sent" |
73 |
|
//usage: "\n -f FILE Use file (ala /dev/ttyS0) instead of network" |
74 |
|
//usage: ) |
75 |
|
//usage: |
76 |
|
//usage:#define nc_notes_usage "" |
77 |
|
//usage: IF_NC_EXTRA( |
78 |
|
//usage: "To use netcat as a terminal emulator on a serial port:\n\n" |
79 |
|
//usage: "$ stty 115200 -F /dev/ttyS0\n" |
80 |
|
//usage: "$ stty raw -echo -ctlecho && nc -f /dev/ttyS0\n" |
81 |
|
//usage: ) |
82 |
|
//usage: |
83 |
|
//usage:#define nc_example_usage |
84 |
|
//usage: "$ nc foobar.somedomain.com 25\n" |
85 |
|
//usage: "220 foobar ESMTP Exim 3.12 #1 Sat, 15 Apr 2000 00:03:02 -0600\n" |
86 |
|
//usage: "help\n" |
87 |
|
//usage: "214-Commands supported:\n" |
88 |
|
//usage: "214- HELO EHLO MAIL RCPT DATA AUTH\n" |
89 |
|
//usage: "214 NOOP QUIT RSET HELP\n" |
90 |
|
//usage: "quit\n" |
91 |
|
//usage: "221 foobar closing connection\n" |
92 |
|
//usage: |
93 |
|
//usage:#endif |
94 |
|
|
95 |
/* Lots of small differences in features |
/* Lots of small differences in features |
96 |
* when compared to "standard" nc |
* when compared to "standard" nc |
97 |
*/ |
*/ |
118 |
|
|
119 |
if (ENABLE_NC_SERVER || ENABLE_NC_EXTRA) { |
if (ENABLE_NC_SERVER || ENABLE_NC_EXTRA) { |
120 |
/* getopt32 is _almost_ usable: |
/* getopt32 is _almost_ usable: |
121 |
** it cannot handle "... -e prog -prog-opt" */ |
** it cannot handle "... -e PROG -prog-opt" */ |
122 |
while ((opt = getopt(argc, argv, |
while ((opt = getopt(argc, argv, |
123 |
"" IF_NC_SERVER("lp:") IF_NC_EXTRA("w:i:f:e:") )) > 0 |
"" IF_NC_SERVER("lp:") IF_NC_EXTRA("w:i:f:e:") )) > 0 |
124 |
) { |
) { |
136 |
/* We cannot just 'break'. We should let getopt finish. |
/* We cannot just 'break'. We should let getopt finish. |
137 |
** Or else we won't be able to find where |
** Or else we won't be able to find where |
138 |
** 'host' and 'port' params are |
** 'host' and 'port' params are |
139 |
** (think "nc -w 60 host port -e prog"). */ |
** (think "nc -w 60 host port -e PROG"). */ |
140 |
IF_NC_EXTRA( |
IF_NC_EXTRA( |
141 |
char **p; |
char **p; |
142 |
// +2: one for progname (optarg) and one for NULL |
// +2: one for progname (optarg) and one for NULL |
149 |
) |
) |
150 |
/* optind points to argv[arvc] (NULL) now. |
/* optind points to argv[arvc] (NULL) now. |
151 |
** FIXME: we assume that getopt will not count options |
** FIXME: we assume that getopt will not count options |
152 |
** possibly present on "-e prog args" and will not |
** possibly present on "-e PROG ARGS" and will not |
153 |
** include them into final value of optind |
** include them into final value of optind |
154 |
** which is to be used ... */ |
** which is to be used ... */ |
155 |
} else bb_show_usage(); |
} else bb_show_usage(); |
216 |
if (execparam) { |
if (execparam) { |
217 |
pid_t pid; |
pid_t pid; |
218 |
/* With more than one -l, repeatedly act as server */ |
/* With more than one -l, repeatedly act as server */ |
219 |
if (do_listen > 1 && (pid = vfork()) != 0) { |
if (do_listen > 1 && (pid = xvfork()) != 0) { |
220 |
/* parent or error */ |
/* parent */ |
|
if (pid < 0) |
|
|
bb_perror_msg_and_die("vfork"); |
|
221 |
/* prevent zombies */ |
/* prevent zombies */ |
222 |
signal(SIGCHLD, SIG_IGN); |
signal(SIGCHLD, SIG_IGN); |
223 |
close(cfd); |
close(cfd); |