annotate toys/other/netcat.c @ 674:7e846e281e38

New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
author Rob Landley <rob@landley.net>
date Mon, 08 Oct 2012 00:02:30 -0500
parents 6df4ccc0acbe
children 786841fdb1e0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
1 /* vi: set sw=4 ts=4:
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
2 *
656
6df4ccc0acbe Regularize command headers, update links to standards documents.
Rob Landley <rob@landley.net>
parents: 653
diff changeset
3 * netcat.c - Forward stdin/stdout to a file or network connection.
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * Copyright 2007 Rob Landley <rob@landley.net>
674
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 656
diff changeset
6 *
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 656
diff changeset
7 * TODO: udp, ipv6, genericize for telnet/microcom/tail-f
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 656
diff changeset
8
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
9
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
10 USE_NETCAT(OLDTOY(nc, netcat, USE_NETCAT_LISTEN("tl^L^")"w#p#s:q#f:", TOYFLAG_BIN))
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
11 USE_NETCAT(NEWTOY(netcat, USE_NETCAT_LISTEN("tl^L^")"w#p#s:q#f:", TOYFLAG_BIN))
234
163498bf547b Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents: 233
diff changeset
12
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
13 config NETCAT
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
14 bool "netcat"
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
15 default y
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
16 help
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
17 usage: netcat [-wpq #] [-s addr] {IPADDR PORTNUM|-f FILENAME|-let} [-e COMMAND]
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
18
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
19 -w SECONDS timeout for connection
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
20 -p local port number
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
21 -s local ipv4 address
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
22 -q SECONDS quit this many seconds after EOF on stdin.
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
23 -f use FILENAME (ala /dev/ttyS0) instead of network
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
24
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
25 Use "stty 115200 -F /dev/ttyS0 && stty raw -echo -ctlecho" with
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
26 netcat -f to connect to a serial port.
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
27
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
28
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
29 config NETCAT_LISTEN
656
6df4ccc0acbe Regularize command headers, update links to standards documents.
Rob Landley <rob@landley.net>
parents: 653
diff changeset
30 bool "netcat server options (-let)"
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
31 default y
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
32 depends on NETCAT
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
33 help
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
34 -t allocate tty (must come before -l or -L)
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
35 -l listen for one incoming connection.
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
36 -L listen for multiple incoming connections (server mode).
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
37
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
38 Any additional command line arguments after -l or -L are executed
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
39 to handle each incoming connection. If none, the connection is
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
40 forwarded to stdin/stdout.
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
41
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
42 For a quick-and-dirty server, try something like:
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
43 netcat -s 127.0.0.1 -p 1234 -tL /bin/bash -l
233
d4176f3f3835 Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents: 194
diff changeset
44 */
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
45
674
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 656
diff changeset
46 #define FOR_netcat
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 #include "toys.h"
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 #include "toynet.h"
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
49
674
7e846e281e38 New build infrastructure to generate FLAG_ macros and TT alias, #define FOR_commandname before #including toys.h to trigger it. Rename DEFINE_GLOBALS() to just GLOBALS() (because I could never remember if it was DECLARE_GLOBALS). Convert existing commands to use new infrastructure, and replace optflag constants with FLAG_ macros where appropriate.
Rob Landley <rob@landley.net>
parents: 656
diff changeset
50 GLOBALS(
237
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
51 char *filename; // -f read from filename instead of network
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
52 long quit_delay; // -q Exit after EOF from stdin after # seconds.
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
53 char *source_address; // -s Bind to a specific source address.
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
54 long port; // -p Bind to a specific source port.
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
55 long wait; // -w Wait # seconds for a connection.
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
56 )
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
57
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 static void timeout(int signum)
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 {
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
60 if (TT.wait) error_exit("Timeout");
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
61 exit(0);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
62 }
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
63
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
64 static void set_alarm(int seconds)
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
65 {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
66 signal(SIGALRM, seconds ? timeout : SIG_DFL);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
67 alarm(seconds);
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
69
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 // Translate x.x.x.x numeric IPv4 address, or else DNS lookup an IPv4 name.
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
71 static void lookup_name(char *name, uint32_t *result)
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 {
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 struct hostent *hostbyname;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
74
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
75 hostbyname = gethostbyname(name);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
76 if (!hostbyname) error_exit("no host '%s'", name);
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 *result = *(uint32_t *)*hostbyname->h_addr_list;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
79
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 // Worry about a fancy lookup later.
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
81 static void lookup_port(char *str, uint16_t *port)
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 {
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 *port = SWAP_BE16(atoi(str));
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
85
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 void netcat_main(void)
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 {
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
88 int sockfd=-1, pollcount=2;
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 struct pollfd pollfds[2];
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
90
324
50c8afc263ee More than 4k of input can be queued up in a pipe, so loop needs to continue reading until POLLIN is exhausted before acknowledging POLLHUP.
Rob Landley <rob@landley.net>
parents: 323
diff changeset
91 memset(pollfds, 0, 2*sizeof(struct pollfd));
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
92 pollfds[0].events = pollfds[1].events = POLLIN;
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
93 set_alarm(TT.wait);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
94
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
95 // The argument parsing logic can't make "<2" conditional on other
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
96 // arguments like -f and -l, so we do it by hand here.
328
48e0f1f45181 Fix netcat -f
Rob Landley <rob@landley.net>
parents: 324
diff changeset
97 if (toys.optflags&FLAG_f) {
48e0f1f45181 Fix netcat -f
Rob Landley <rob@landley.net>
parents: 324
diff changeset
98 if (toys.optc) toys.exithelp++;
48e0f1f45181 Fix netcat -f
Rob Landley <rob@landley.net>
parents: 324
diff changeset
99 } else if (!(toys.optflags&(FLAG_l|FLAG_L)) && toys.optc!=2) toys.exithelp++;
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
100
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
101 if (toys.exithelp) error_exit("Argument count wrong");
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
102
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 if (TT.filename) pollfds[0].fd = xopen(TT.filename, O_RDWR);
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 else {
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
105 int temp;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 struct sockaddr_in address;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
107
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
108 // Setup socket
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
109 sockfd = socket(AF_INET, SOCK_STREAM, 0);
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
110 if (-1 == sockfd) perror_exit("socket");
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
111 fcntl(sockfd, F_SETFD, FD_CLOEXEC);
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
112 temp = 1;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
113 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &temp, sizeof(temp));
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
114 memset(&address, 0, sizeof(address));
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
115 address.sin_family = AF_INET;
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
116 if (TT.source_address || TT.port) {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
117 address.sin_port = SWAP_BE16(TT.port);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
118 if (TT.source_address)
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
119 lookup_name(TT.source_address, (uint32_t *)&address.sin_addr);
532
d44eb064da41 Silence a couple pointless warnings.
Rob Landley <rob@landley.net>
parents: 328
diff changeset
120 if (bind(sockfd, (struct sockaddr *)&address, sizeof(address)))
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
121 perror_exit("bind");
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
122 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
123
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
124 // Dial out
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
125
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
126 if (!CFG_NETCAT_LISTEN || !(toys.optflags&(FLAG_L|FLAG_l))) {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
127 // Figure out where to dial out to.
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
128 lookup_name(*toys.optargs, (uint32_t *)&address.sin_addr);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
129 lookup_port(toys.optargs[1], &address.sin_port);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
130 temp = connect(sockfd, (struct sockaddr *)&address, sizeof(address));
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
131 if (temp<0) perror_exit("connect");
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
132 pollfds[0].fd = sockfd;
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
133
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
134 // Listen for incoming connections
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
135
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
136 } else {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
137 socklen_t len = sizeof(address);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
138
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
139 if (listen(sockfd, 5)) error_exit("listen");
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
140 if (!TT.port) {
532
d44eb064da41 Silence a couple pointless warnings.
Rob Landley <rob@landley.net>
parents: 328
diff changeset
141 getsockname(sockfd, (struct sockaddr *)&address, &len);
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
142 printf("%d\n", SWAP_BE16(address.sin_port));
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
143 fflush(stdout);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
144 }
322
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
145 // Do we need to return immediately because -l has arguments?
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
146
323
dd0b130edf6d Shell $(netcat) won't return unless child's stdin/stdout/stderr are closed.
Rob Landley <rob@landley.net>
parents: 322
diff changeset
147 if ((toys.optflags&FLAG_l) && toys.optc) {
322
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
148 if (fork()) goto cleanup;
323
dd0b130edf6d Shell $(netcat) won't return unless child's stdin/stdout/stderr are closed.
Rob Landley <rob@landley.net>
parents: 322
diff changeset
149 close(0);
dd0b130edf6d Shell $(netcat) won't return unless child's stdin/stdout/stderr are closed.
Rob Landley <rob@landley.net>
parents: 322
diff changeset
150 close(1);
dd0b130edf6d Shell $(netcat) won't return unless child's stdin/stdout/stderr are closed.
Rob Landley <rob@landley.net>
parents: 322
diff changeset
151 close(2);
dd0b130edf6d Shell $(netcat) won't return unless child's stdin/stdout/stderr are closed.
Rob Landley <rob@landley.net>
parents: 322
diff changeset
152 }
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
153
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
154 for (;;) {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
155 pid_t child = 0;
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
156
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
157 // For -l, call accept from the _new_ thread.
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
158
322
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
159 pollfds[0].fd = accept(sockfd, (struct sockaddr *)&address,
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
160 &len);
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
161 if (pollfds[0].fd<0) perror_exit("accept");
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
162
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
163 // Do we need a tty?
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
164
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
165 if (toys.optflags&FLAG_t)
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
166 child = forkpty(&(pollfds[1].fd), NULL, NULL, NULL);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
167
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
168 // Do we need to fork and/or redirect for exec?
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
169
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
170 else {
322
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
171 if (toys.optflags&FLAG_L) child = fork();
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
172 if (!child && toys.optc) {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
173 int fd = pollfds[0].fd;
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
174
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
175 if (!temp) close(sockfd);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
176 dup2(fd, 0);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
177 dup2(fd, 1);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
178 dup2(fd, 2);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
179 if (fd>2) close(fd);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
180 }
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
181 }
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
182
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
183 if (child<0) error_msg("Fork failed\n");
322
fa0a95ae4303 Second attempt at making netcat -l work properly.
Rob Landley <rob@landley.net>
parents: 321
diff changeset
184 if (child<1) break;
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
185 close(pollfds[0].fd);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
186 }
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
187 }
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
188 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
190 // We have a connection. Disarm timeout.
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
191 // (Does not play well with -L, but what _should_ that do?)
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
192 set_alarm(0);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
193
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
194 if (CFG_NETCAT_LISTEN && (toys.optflags&(FLAG_L|FLAG_l) && toys.optc)) {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
195 execvp(*toys.optargs, toys.optargs);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
196 error_exit("Exec failed");
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
197 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
198
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
199 // Poll loop copying stdin->socket and socket->stdout.
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
200 for (;;) {
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
201 int i;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
202
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
203 if (0>poll(pollfds, pollcount, -1)) perror_exit("poll");
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
204
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
205 for (i=0; i<pollcount; i++) {
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
206 if (pollfds[i].revents & POLLIN) {
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
207 int len = read(pollfds[i].fd, toybuf, sizeof(toybuf));
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
208 if (len<1) goto dohupnow;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
209 xwrite(i ? pollfds[0].fd : 1, toybuf, len);
324
50c8afc263ee More than 4k of input can be queued up in a pipe, so loop needs to continue reading until POLLIN is exhausted before acknowledging POLLHUP.
Rob Landley <rob@landley.net>
parents: 323
diff changeset
210 } else if (pollfds[i].revents & POLLHUP) {
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
211 dohupnow:
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
212 // Close half-connection. This is needed for things like
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
213 // "echo GET / | netcat landley.net 80"
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
214 if (i) {
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
215 shutdown(pollfds[0].fd, SHUT_WR);
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
216 pollcount--;
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
217 set_alarm(TT.quit_delay);
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
218 } else goto cleanup;
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
219 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
220 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
221 }
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
222 cleanup:
321
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
223 if (CFG_TOYBOX_FREE) {
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
224 close(pollfds[0].fd);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
225 close(sockfd);
dfbfbaeb69c9 Add netcat server mode, -l, -L, and -t.
Rob Landley <rob@landley.net>
parents: 237
diff changeset
226 }
189
22d22427dec6 Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff changeset
227 }