aboutsummaryrefslogtreecommitdiff
path: root/ipsvd
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-04-05 20:26:28 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-04-05 20:26:28 +0000
commit29fe7265b8c1917ebc03283f22a3eb61e9195979 (patch)
tree231771f61046cc95c765fc91f65cff26081d8fab /ipsvd
parent00c2c4868a5bd90fe36beaf9236f23f60cd5e8e1 (diff)
downloadbusybox-w32-29fe7265b8c1917ebc03283f22a3eb61e9195979.tar.gz
busybox-w32-29fe7265b8c1917ebc03283f22a3eb61e9195979.tar.bz2
busybox-w32-29fe7265b8c1917ebc03283f22a3eb61e9195979.zip
nc: port nc 1.10 to busybox
Diffstat (limited to 'ipsvd')
-rw-r--r--ipsvd/tcpudp.c2
-rw-r--r--ipsvd/udp_io.c163
2 files changed, 0 insertions, 165 deletions
diff --git a/ipsvd/tcpudp.c b/ipsvd/tcpudp.c
index d2e34e3e8..8c15d4b3e 100644
--- a/ipsvd/tcpudp.c
+++ b/ipsvd/tcpudp.c
@@ -33,8 +33,6 @@
33#include <linux/netfilter_ipv4.h> /* wants <limits.h> */ 33#include <linux/netfilter_ipv4.h> /* wants <limits.h> */
34 34
35#include "busybox.h" 35#include "busybox.h"
36
37#include "udp_io.c"
38#include "ipsvd_perhost.h" 36#include "ipsvd_perhost.h"
39 37
40#ifdef SSLSVD 38#ifdef SSLSVD
diff --git a/ipsvd/udp_io.c b/ipsvd/udp_io.c
deleted file mode 100644
index 592d98b58..000000000
--- a/ipsvd/udp_io.c
+++ /dev/null
@@ -1,163 +0,0 @@
1/* Thus far used only by udpsvd.c */
2
3void socket_want_pktinfo(int fd);
4ssize_t send_to_from(int fd, void *buf, size_t len, int flags,
5 const struct sockaddr *from, const struct sockaddr *to,
6 socklen_t tolen);
7ssize_t recv_from_to(int fd, void *buf, size_t len, int flags,
8 struct sockaddr *from, struct sockaddr *to,
9 socklen_t sa_size);
10
11/*
12 * This asks kernel to let us know dst addr/port of incoming packets
13 * We don't check for errors here. Not supported == won't be used
14 */
15void
16socket_want_pktinfo(int fd)
17{
18#ifdef IP_PKTINFO
19 setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &const_int_1, sizeof(int));
20#endif
21#if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
22 setsockopt(fd, IPPROTO_IPV6, IPV6_PKTINFO, &const_int_1, sizeof(int));
23#endif
24}
25
26
27#ifdef UNUSED
28ssize_t
29send_to_from(int fd, void *buf, size_t len, int flags,
30 const struct sockaddr *from, const struct sockaddr *to,
31 socklen_t tolen)
32{
33#ifndef IP_PKTINFO
34 return sendto(fd, buf, len, flags, to, tolen);
35#else
36 struct iovec iov[1];
37 struct msghdr msg;
38 char cbuf[sizeof(struct in_pktinfo)
39#if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
40 | sizeof(struct in6_pktinfo) /* (a|b) is poor man's max(a,b) */
41#endif
42 ];
43 struct cmsghdr* cmsgptr;
44
45 if (from->sa_family != AF_INET
46#if ENABLE_FEATURE_IPV6
47 && from->sa_family != AF_INET6
48#endif
49 ) {
50 /* ANY local address */
51 return sendto(fd, buf, len, flags, to, tolen);
52 }
53
54 /* man recvmsg and man cmsg is needed to make sense of code below */
55
56 iov[0].iov_base = buf;
57 iov[0].iov_len = len;
58
59 memset(cbuf, 0, sizeof(cbuf));
60
61 memset(&msg, 0, sizeof(msg));
62 msg.msg_name = (void *)(struct sockaddr *)to; /* or compiler will annoy us */
63 msg.msg_namelen = tolen;
64 msg.msg_iov = iov;
65 msg.msg_iovlen = 1;
66 msg.msg_control = cbuf;
67 msg.msg_controllen = sizeof(cbuf);
68 msg.msg_flags = flags;
69
70 cmsgptr = CMSG_FIRSTHDR(&msg);
71 if (to->sa_family == AF_INET && from->sa_family == AF_INET) {
72 struct in_pktinfo *pktptr;
73 cmsgptr->cmsg_level = IPPROTO_IP;
74 cmsgptr->cmsg_type = IP_PKTINFO;
75 cmsgptr->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
76 pktptr = (struct in_pktinfo *)(CMSG_DATA(cmsgptr));
77 /* pktptr->ipi_ifindex = 0; -- already done by memset(cbuf...) */
78 pktptr->ipi_spec_dst = ((struct sockaddr_in*)from)->sin_addr;
79 }
80#if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
81 else if (to->sa_family == AF_INET6 && from->sa_family == AF_INET6) {
82 struct in6_pktinfo *pktptr;
83 cmsgptr->cmsg_level = IPPROTO_IPV6;
84 cmsgptr->cmsg_type = IPV6_PKTINFO;
85 cmsgptr->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
86 pktptr = (struct in6_pktinfo *)(CMSG_DATA(cmsgptr));
87 /* pktptr->ipi6_ifindex = 0; -- already done by memset(cbuf...) */
88 pktptr->ipi6_addr = ((struct sockaddr_in6*)from)->sin6_addr;
89 }
90#endif
91 return sendmsg(fd, &msg, flags);
92#endif
93}
94#endif /* UNUSED */
95
96/* NB: this will never set port# in 'to'!
97 * _Only_ IP/IPv6 address part of 'to' is _maybe_ modified.
98 * Typical usage is to preinit 'to' with "default" value
99 * before calling recv_from_to(). */
100ssize_t
101recv_from_to(int fd, void *buf, size_t len, int flags,
102 struct sockaddr *from, struct sockaddr *to,
103 socklen_t sa_size)
104{
105#ifndef IP_PKTINFO
106 return recvfrom(fd, buf, len, flags, from, &sa_size);
107#else
108 /* man recvmsg and man cmsg is needed to make sense of code below */
109 struct iovec iov[1];
110 union {
111 char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))];
112 char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
113 } u;
114 struct cmsghdr *cmsgptr;
115 struct msghdr msg;
116 socklen_t recv_length;
117
118 iov[0].iov_base = buf;
119 iov[0].iov_len = len;
120
121 memset(&msg, 0, sizeof(msg));
122 msg.msg_name = (struct sockaddr *)from;
123 msg.msg_namelen = sa_size;
124 msg.msg_iov = iov;
125 msg.msg_iovlen = 1;
126 msg.msg_control = &u;
127 msg.msg_controllen = sizeof(u);
128
129 recv_length = recvmsg(fd, &msg, flags);
130 if (recv_length < 0)
131 return recv_length;
132
133 /* Here we try to retrieve destination IP and memorize it */
134 for (cmsgptr = CMSG_FIRSTHDR(&msg);
135 cmsgptr != NULL;
136 cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)
137 ) {
138 if (cmsgptr->cmsg_level == IPPROTO_IP
139 && cmsgptr->cmsg_type == IP_PKTINFO
140 ) {
141#define pktinfo(cmsgptr) ( (struct in_pktinfo*)(CMSG_DATA(cmsgptr)) )
142 to->sa_family = AF_INET;
143 ((struct sockaddr_in*)to)->sin_addr = pktinfo(cmsgptr)->ipi_addr;
144 /* ((struct sockaddr_in*)to)->sin_port = 123; */
145#undef pktinfo
146 break;
147 }
148#if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
149 if (cmsgptr->cmsg_level == IPPROTO_IPV6
150 && cmsgptr->cmsg_type == IPV6_PKTINFO
151 ) {
152#define pktinfo(cmsgptr) ( (struct in6_pktinfo*)(CMSG_DATA(cmsgptr)) )
153 to->sa_family = AF_INET6;
154 ((struct sockaddr_in6*)to)->sin6_addr = pktinfo(cmsgptr)->ipi6_addr;
155 /* ((struct sockaddr_in6*)to)->sin6_port = 123; */
156#undef pktinfo
157 break;
158 }
159#endif
160 }
161 return recv_length;
162#endif
163}