Mercurial > hg > toybox
annotate toys/pending/tcpsvd.c @ 1231:ee5a6875d695 draft
Fix cpio -it: don't close(fd) unless we opened it.
author | Isaac Dunham <ibid.ag@gmail.com> |
---|---|
date | Thu, 27 Mar 2014 07:02:01 -0500 |
parents | 0752b2d58909 |
children | 85f297591693 |
rev | line source |
---|---|
1138
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* tcpsvd.c - TCP(UDP)/IP service daemon |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2013 Ashwini Kumar <ak.ashwini@gmail.com> |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * Copyright 2013 Sandeep Sharma <sandeep.jack2756@gmail.com> |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 * No Standard. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 USE_TCPSVD(NEWTOY(tcpsvd, "^<3c#=30<1C:b#=20<0u:l:hEv", TOYFLAG_USR|TOYFLAG_BIN)) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 USE_TCPSVD(OLDTOY(udpsvd, tcpsvd, OPTSTR_tcpsvd, TOYFLAG_USR|TOYFLAG_BIN)) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 config TCPSVD |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 bool "tcpsvd" |
1140
ef0bf6560071
Forgot to set new pending entry to default n.
Rob Landley <rob@landley.net>
parents:
1138
diff
changeset
|
14 default n |
1138
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 help |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 usage: tcpsvd [-hEv] [-c N] [-C N[:MSG]] [-b N] [-u User] [-l Name] IP Port Prog |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 udpsvd [-hEv] [-c N] [-u User] [-l Name] IP Port Prog |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 Create TCP/UDP socket, bind to IP:PORT and listen for incoming connection. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 Run PROG for each connection. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 IP IP to listen on, 0 = all |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 PORT Port to listen on |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 PROG ARGS Program to run |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 -l NAME Local hostname (else looks up local hostname in DNS) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 -u USER[:GRP] Change to user/group after bind |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 -c N Handle up to N (> 0) connections simultaneously |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 -b N (TCP Only) Allow a backlog of approximately N TCP SYNs |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 -C N[:MSG] (TCP Only) Allow only up to N (> 0) connections from the same IP |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 New connections from this IP address are closed |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 immediately. MSG is written to the peer before close |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 -h Look up peer's hostname |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 -E Don't set up environment variables |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 -v Verbose |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 */ |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 #define FOR_tcpsvd |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 #include "toys.h" |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 GLOBALS( |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 char *name; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 char *user; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 long bn; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 char *nmsg; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 long cn; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 int maxc; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 int count_all; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 int udp; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 ) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 struct list_pid { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 struct list_pid *next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 char *ip; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 int pid; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 }; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 struct list { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 struct list* next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 char *d; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 int count; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 }; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 struct hashed { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 struct list *head; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 }; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 #define HASH_NR 256 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 struct hashed h[HASH_NR]; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 struct list_pid *pids = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 // convert IP address to string. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 static char *sock_to_address(struct sockaddr *sock, int flags) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 char hbuf[NI_MAXHOST] = {0,}; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 char sbuf[NI_MAXSERV] = {0,}; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 int status = 0; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 socklen_t len = sizeof(struct sockaddr_in6); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 if (!(status = getnameinfo(sock, len, hbuf, sizeof(hbuf), sbuf, |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 sizeof(sbuf), flags))) { |
1183
0752b2d58909
Rename xmsprintf() to just xmprintf().
Rob Landley <rob@landley.net>
parents:
1140
diff
changeset
|
82 if (flags & NI_NUMERICSERV) return xmprintf("%s:%s",hbuf, sbuf); |
0752b2d58909
Rename xmsprintf() to just xmprintf().
Rob Landley <rob@landley.net>
parents:
1140
diff
changeset
|
83 return xmprintf("%s",hbuf); |
1138
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 error_exit("getnameinfo: %s", gai_strerror(status)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 // Insert pid, ip and fd in the list. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 static void insert(struct list_pid **l, int pid, char *addr) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 struct list_pid *newnode = xmalloc(sizeof(struct list_pid)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 newnode->pid = pid; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 newnode->ip = addr; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 newnode->next = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 if (!*l) *l = newnode; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 else { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 newnode->next = (*l); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 *l = newnode; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 // Hashing of IP address. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 static int haship( char *addr) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 uint32_t ip[8] = {0,}; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 int count = 0, i = 0; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 if (!addr) error_exit("NULL ip"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 while (i < strlen(addr)) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 while (addr[i] && (addr[i] != ':') && (addr[i] != '.')) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 ip[count] = ip[count]*10 + (addr[i]-'0'); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 i++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 if (i >= strlen(addr)) break; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 count++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 i++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 return (ip[0]^ip[1]^ip[2]^ip[3]^ip[4]^ip[5]^ip[6]^ip[7])%HASH_NR; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 // Remove a node from the list. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 static char *delete(struct list_pid **pids, int pid) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 struct list_pid *prev, *free_node, *head = *pids; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 char *ip = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 if (!head) return NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 prev = free_node = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 while (head) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 if (head->pid == pid) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 ip = head->ip; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 free_node = head; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 if (!prev) *pids = head->next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 else prev->next = head->next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 free(free_node); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 return ip; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 prev = head; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 head = head->next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 return NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 // decrement the ref count fora connection, if count reches ZERO then remove the node |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 static void remove_connection(char *ip) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 struct list *head, *prev = NULL, *free_node = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 int hash = haship(ip); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 head = h[hash].head; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 while (head) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 if (!strcmp(ip, head->d)) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 head->count--; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 free_node = head; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 if (!head->count) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 if (!prev) h[hash].head = head->next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 else prev->next = head->next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 free(free_node); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 break; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 prev = head; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 head = head->next; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 free(ip); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 // Handler function. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 static void handle_exit(int sig) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 int status; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 pid_t pid_n = wait(&status); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 if (pid_n <= 0) return; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 char *ip = delete(&pids, pid_n); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 if (!ip) return; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 remove_connection(ip); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 TT.count_all--; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 if (toys.optflags & FLAG_v) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 if (WIFEXITED(status)) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 xprintf("%s: end %d exit %d\n",toys.which->name, pid_n, WEXITSTATUS(status)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
182 else if (WIFSIGNALED(status)) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 xprintf("%s: end %d signaled %d\n",toys.which->name, pid_n, WTERMSIG(status)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 if (TT.cn > 1) xprintf("%s: status %d/%d\n",toys.which->name, TT.count_all, TT.cn); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 // Grab uid and gid |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 static void get_uidgid(uid_t *uid, gid_t *gid, char *ug) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 struct passwd *pass = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 struct group *grp = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 char *user = NULL, *group = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 unsigned int n; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 user = ug; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 group = strchr(ug,':'); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 if (group) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 *group = '\0'; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 group++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
202 if (!(pass = getpwnam(user))) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 n = atolx_range(user, 0, INT_MAX); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 if (!(pass = getpwuid(n))) perror_exit("Invalid user '%s'", user); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 *uid = pass->pw_uid; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 *gid = pass->pw_gid; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 if (group) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 if (!(grp = getgrnam(group))) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 n = atolx_range(group, 0, INT_MAX); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 if (!(grp = getgrgid(n))) perror_exit("Invalid group '%s'",group); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 if (grp) *gid = grp->gr_gid; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 // Bind socket. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 static int create_bind_sock(char *host, struct sockaddr *haddr) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 struct addrinfo hints, *res = NULL, *rp; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 int sockfd, ret, set = 1; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 char *ptr; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 unsigned long port; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 errno = 0; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 port = strtoul(toys.optargs[1], &ptr, 10); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 if (errno || port > 65535) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 error_exit("Invalid port, Range is [0-65535]"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 if (*ptr) ptr = toys.optargs[1]; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 else { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
232 sprintf(toybuf, "%lu", port); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 ptr = toybuf; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 memset(&hints, 0, sizeof hints); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 hints.ai_family = AF_UNSPEC; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 hints.ai_socktype = ((TT.udp) ?SOCK_DGRAM : SOCK_STREAM); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
239 if ((ret = getaddrinfo(host, ptr, &hints, &res))) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 perror_exit("%s", gai_strerror(ret)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 for (rp = res; rp; rp = rp->ai_next) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 if ( (rp->ai_family == AF_INET) || (rp->ai_family == AF_INET6)) break; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 if (!rp) error_exit("Invalid IP %s", host); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 sockfd = xsocket(rp->ai_family, TT.udp ?SOCK_DGRAM :SOCK_STREAM, 0); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(set)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 if (TT.udp) setsockopt(sockfd, IPPROTO_IP, IP_PKTINFO, &set, sizeof(set)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 if ((bind(sockfd, rp->ai_addr, rp->ai_addrlen)) < 0) perror_exit("Bind failed"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 if(haddr) memcpy(haddr, rp->ai_addr, rp->ai_addrlen); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 freeaddrinfo(res); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 return sockfd; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 static void handle_signal(int sig) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 if (toys.optflags & FLAG_v) xprintf("got signal %d, exit\n", sig); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 raise(sig); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 _exit(sig + 128); //should not reach here |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 void tcpsvd_main(void) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 uid_t uid = 0; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 gid_t gid = 0; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 pid_t pid; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 char haddr[sizeof(struct sockaddr_in6)]; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 struct list *head, *newnode; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 int hash, fd, newfd, j; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 char *ptr = NULL, *addr, *server, buf[sizeof(struct sockaddr_in6)]; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 socklen_t len = sizeof(buf); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 TT.udp = (*toys.which->name == 'u'); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 if (TT.udp) toys.optflags &= ~FLAG_C; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 memset(buf, 0, len); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 if (toys.optflags & FLAG_C) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 if ((ptr = strchr(TT.nmsg, ':'))) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 *ptr = '\0'; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 ptr++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 TT.maxc = atolx_range(TT.nmsg, 1, INT_MAX); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 fd = create_bind_sock(toys.optargs[0], (struct sockaddr*)&haddr); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 if(toys.optflags & FLAG_u) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 get_uidgid(&uid, &gid, TT.user); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 setuid(uid); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 setgid(gid); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 if (!TT.udp && (listen(fd, TT.bn) < 0)) perror_exit("Listen failed"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 server = sock_to_address((struct sockaddr*)&haddr, NI_NUMERICHOST|NI_NUMERICSERV); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 if (toys.optflags & FLAG_v) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 if (toys.optflags & FLAG_u) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 xprintf("%s: listening on %s, starting, uid %u, gid %u\n" |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 ,toys.which->name, server, uid, gid); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 else |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 xprintf("%s: listening on %s, starting\n", toys.which->name, server); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 for (j = 0; j < HASH_NR; j++) h[j].head = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 sigatexit(handle_signal); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 signal(SIGCHLD, handle_exit); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 while (1) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 if (TT.count_all < TT.cn) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 if (TT.udp) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 if(recvfrom(fd, NULL, 0, MSG_PEEK, (struct sockaddr *)buf, &len) < 0) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 perror_exit("recvfrom"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 newfd = fd; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 } else { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 newfd = accept(fd, (struct sockaddr *)buf, &len); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
313 if (newfd < 0) perror_exit("Error on accept"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
314 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 } else { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 sigset_t ss; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 sigemptyset(&ss); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 sigsuspend(&ss); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 continue; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 TT.count_all++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 addr = sock_to_address((struct sockaddr*)buf, NI_NUMERICHOST); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 hash = haship(addr); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 if (toys.optflags & FLAG_C) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 for (head = h[hash].head; head; head = head->next) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 if (!strcmp(head->d, addr)) break; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 if (head && head->count >= TT.maxc) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 if (ptr) write(newfd, ptr, strlen(ptr)+1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 close(newfd); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 TT.count_all--; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 continue; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
337 newnode = (struct list*)xzalloc(sizeof(struct list)); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 newnode->d = addr; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 for (head = h[hash].head; head; head = head->next) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 if (!strcmp(addr, head->d)) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 head->count++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 free(newnode); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 break; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
345 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 if (!head) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 newnode->next = h[hash].head; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 h[hash].head = newnode; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 h[hash].head->count++; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 if (!(pid = fork())) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 char *serv = NULL, *clie = NULL; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
355 char *client = sock_to_address((struct sockaddr*)buf, NI_NUMERICHOST | NI_NUMERICSERV); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 if (toys.optflags & FLAG_h) { //lookup name |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 if (toys.optflags & FLAG_l) serv = xstrdup(TT.name); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 else serv = sock_to_address((struct sockaddr*)&haddr, 0); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 clie = sock_to_address((struct sockaddr*)buf, 0); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 if (!(toys.optflags & FLAG_E)) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 setenv("PROTO", TT.udp ?"UDP" :"TCP", 1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 setenv("PROTOLOCALADDR", server, 1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 setenv("PROTOREMOTEADDR", client, 1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 if (toys.optflags & FLAG_h) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 setenv("PROTOLOCALHOST", serv, 1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 setenv("PROTOREMOTEHOST", clie, 1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 if (!TT.udp) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 char max_c[32]; |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 sprintf(max_c, "%d", TT.maxc); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 setenv("TCPCONCURRENCY", max_c, 1); //Not valid for udp |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 if (toys.optflags & FLAG_v) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 xprintf("%s: start %d %s-%s",toys.which->name, getpid(), server, client); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 if (toys.optflags & FLAG_h) xprintf(" (%s-%s)", serv, clie); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 xputc('\n'); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 if (TT.cn > 1) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 xprintf("%s: status %d/%d\n",toys.which->name, TT.count_all, TT.cn); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 free(client); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 if (toys.optflags & FLAG_h) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 free(serv); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 free(clie); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
387 } |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 if (TT.udp && (connect(newfd, (struct sockaddr *)buf, sizeof(buf)) < 0)) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 perror_exit("connect"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
391 close(0); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
392 close(1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 dup2(newfd, 0); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 dup2(newfd, 1); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 xexec_optargs(2); //skip IP PORT |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 } else if(pid > 0) { |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 insert(&pids, pid, addr); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
398 xclose(newfd); //close and reopen for next client. |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 if (TT.udp) fd = create_bind_sock(toys.optargs[0], |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 (struct sockaddr*)&haddr); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
401 } else error_msg(" fork failed"); |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 } //while(1) |
ecc409de9976
Ashwini Sharma submitted tcpsvd/udpsvd.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 } |