Mercurial > hg > toybox
annotate toys/netcat.c @ 241:4121825716b8
Fix crash when running unknown command via symlink.
(The error message was trying to print an uninitialied field. Oops.)
author | Rob Landley <rob@landley.net> |
---|---|
date | Tue, 22 Jan 2008 15:33:50 -0600 |
parents | 7cb15eae1664 |
children | dfbfbaeb69c9 |
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 * |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
3 * nc: mini-netcat - 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> |
194
30a6db5a95c2
Add comments about SUSv3 specs (or lack thereof).
Rob Landley <rob@landley.net>
parents:
189
diff
changeset
|
6 * |
30a6db5a95c2
Add comments about SUSv3 specs (or lack thereof).
Rob Landley <rob@landley.net>
parents:
189
diff
changeset
|
7 * Not in SUSv3. |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
8 |
234
163498bf547b
Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents:
233
diff
changeset
|
9 USE_NETCAT(OLDTOY(nc, netcat, "i#w#l@p#s:q#f:e", TOYFLAG_BIN)) |
163498bf547b
Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents:
233
diff
changeset
|
10 USE_NETCAT(NEWTOY(netcat, "i#w#l@p#s:q#f:e", TOYFLAG_BIN)) |
163498bf547b
Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents:
233
diff
changeset
|
11 |
233
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
12 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
|
13 bool "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 default n |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
15 help |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
16 usage: netcat [-iwlp] {IPADDR PORTNUM|-f FILENAME} [-e COMMAND] |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
17 |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
18 -e exec the rest of the command line |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
19 -i SECONDS delay after each line sent |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
20 -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
|
21 -f filename use file (ala /dev/ttyS0) instead of network |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
22 -l listen for incoming connection (twice for persistent connection) |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
23 -p local port number |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
24 -s local source address |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
25 -q SECONDS quit this many seconds after EOF on stdin. |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
26 |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
27 Use -l twice with -e for a quick-and-dirty server. |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
28 |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
29 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
|
30 netcat -f to connect to a serial port. |
d4176f3f3835
Zap toys/Config.in and instead create generated/Config.in from contents of
Rob Landley <rob@landley.net>
parents:
194
diff
changeset
|
31 */ |
189
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 #include "toys.h" |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 #include "toynet.h" |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 |
237
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
36 DEFINE_GLOBALS( |
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
37 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
|
38 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
|
39 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
|
40 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
|
41 long listen; // -l Listen for connection instead of dialing out. |
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
42 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
|
43 long delay; // -i delay between lines sent |
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
44 ) |
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
45 |
7cb15eae1664
Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents:
234
diff
changeset
|
46 #define TT this.netcat |
189
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 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
|
49 { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 error_exit("Timeout"); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 // Translate x.x.x.x numeric IPv4 address, or else DNS lookup an IPv4 name. |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 void lookup_name(char *name, uint32_t *result) |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 struct hostent *hostbyname; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 hostbyname = gethostbyname(*toys.optargs); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 if (!hostbyname) error_exit("name lookup failed"); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 *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
|
61 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 // Worry about a fancy lookup later. |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 void lookup_port(char *str, uint16_t *port) |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 *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
|
67 } |
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 void netcat_main(void) |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 int sockfd, pollcount; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 struct pollfd pollfds[2]; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 if (TT.wait) { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 signal(SIGALRM, timeout); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 alarm(TT.wait); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 } |
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 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
|
80 else { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 int temp; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 struct sockaddr_in address; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 // The argument parsing logic can't make "<2" conditional on "-f", so... |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 if (!*toys.optargs || !toys.optargs[1]) { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 toys.exithelp++; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 error_exit("Need address and port"); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 // Setup socket |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 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
|
92 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
|
93 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
|
94 temp = 1; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 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
|
96 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
|
97 address.sin_family = AF_INET; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 if (TT.port) { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 address.sin_port = TT.port; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 if (-1 == bind(sockfd, &address, sizeof(address))) |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 perror_exit("bind"); |
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 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 // Figure out where to dial out to. |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 lookup_name(*toys.optargs, (uint32_t *)&address.sin_addr); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 lookup_port(toys.optargs[1], &address.sin_port); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 temp = connect(sockfd, (struct sockaddr *)&address, sizeof(address)); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 if (temp<0) perror_exit("connect"); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 pollfds[0].fd = sockfd; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 // We have a connection. Disarm timeout. |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 if (TT.wait) { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 alarm(0); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 signal(SIGALRM, SIG_DFL); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 pollcount = 2; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 pollfds[1].fd = 0; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 pollfds[0].events = pollfds[1].events = POLLIN; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 // 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
|
123 for (;;) { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 int i; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 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
|
127 |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 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
|
129 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
|
130 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
|
131 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
|
132 xwrite(i ? pollfds[0].fd : 1, toybuf, len); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 if (pollfds[i].revents & POLLHUP) { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 dohupnow: |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 // Close half-connect. This is needed for things like |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 // "echo GET / | netcat landley.net 80" to work. |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 if (i) { |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 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
|
140 pollcount--; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 } else goto cleanup; |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 } |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 cleanup: |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 close(pollfds[0].fd); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 // close(sockfd); |
22d22427dec6
Add first pass at netcat. Base applet, -f, and -w implemented.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 } |