diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-04 02:39:08 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-04 02:39:08 +0000 |
commit | 42823d597a9029ac497edda9102f61283630635b (patch) | |
tree | 848e71f864ad0675e19c8dcdce94c11a5dcc3d7a /libbb | |
parent | 45854b5e3ff265c23dc36c139f09ea8eb3790ad1 (diff) | |
download | busybox-w32-42823d597a9029ac497edda9102f61283630635b.tar.gz busybox-w32-42823d597a9029ac497edda9102f61283630635b.tar.bz2 busybox-w32-42823d597a9029ac497edda9102f61283630635b.zip |
add x to IPv6 functions which can die
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/xconnect.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/libbb/xconnect.c b/libbb/xconnect.c index 2b35baab7..e5bdaac38 100644 --- a/libbb/xconnect.c +++ b/libbb/xconnect.c | |||
@@ -111,16 +111,19 @@ void set_nport(len_and_sockaddr *lsa, unsigned port) | |||
111 | /* What? UNIX socket? IPX?? :) */ | 111 | /* What? UNIX socket? IPX?? :) */ |
112 | } | 112 | } |
113 | 113 | ||
114 | /* We hijack this constant to mean something else */ | ||
115 | /* It doesn't hurt because we will remove this bit anyway */ | ||
116 | #define DIE_ON_ERROR AI_CANONNAME | ||
117 | |||
114 | /* host: "1.2.3.4[:port]", "www.google.com[:port]" | 118 | /* host: "1.2.3.4[:port]", "www.google.com[:port]" |
115 | * port: if neither of above specifies port # | 119 | * port: if neither of above specifies port # */ |
116 | */ | ||
117 | static len_and_sockaddr* str2sockaddr( | 120 | static len_and_sockaddr* str2sockaddr( |
118 | const char *host, int port, | 121 | const char *host, int port, |
119 | USE_FEATURE_IPV6(sa_family_t af,) | 122 | USE_FEATURE_IPV6(sa_family_t af,) |
120 | int ai_flags) | 123 | int ai_flags) |
121 | { | 124 | { |
122 | int rc; | 125 | int rc; |
123 | len_and_sockaddr *r; // = NULL; | 126 | len_and_sockaddr *r = NULL; |
124 | struct addrinfo *result = NULL; | 127 | struct addrinfo *result = NULL; |
125 | const char *org_host = host; /* only for error msg */ | 128 | const char *org_host = host; /* only for error msg */ |
126 | const char *cp; | 129 | const char *cp; |
@@ -158,14 +161,18 @@ USE_FEATURE_IPV6(sa_family_t af,) | |||
158 | /* Needed. Or else we will get each address thrice (or more) | 161 | /* Needed. Or else we will get each address thrice (or more) |
159 | * for each possible socket type (tcp,udp,raw...): */ | 162 | * for each possible socket type (tcp,udp,raw...): */ |
160 | hint.ai_socktype = SOCK_STREAM; | 163 | hint.ai_socktype = SOCK_STREAM; |
161 | hint.ai_flags = ai_flags; | 164 | hint.ai_flags = ai_flags & ~DIE_ON_ERROR; |
162 | rc = getaddrinfo(host, NULL, &hint, &result); | 165 | rc = getaddrinfo(host, NULL, &hint, &result); |
163 | if (rc || !result) | 166 | if (rc || !result) { |
164 | bb_error_msg_and_die("bad address '%s'", org_host); | 167 | if (ai_flags & DIE_ON_ERROR) |
168 | bb_error_msg_and_die("bad address '%s'", org_host); | ||
169 | goto ret; | ||
170 | } | ||
165 | r = xmalloc(offsetof(len_and_sockaddr, sa) + result->ai_addrlen); | 171 | r = xmalloc(offsetof(len_and_sockaddr, sa) + result->ai_addrlen); |
166 | r->len = result->ai_addrlen; | 172 | r->len = result->ai_addrlen; |
167 | memcpy(&r->sa, result->ai_addr, result->ai_addrlen); | 173 | memcpy(&r->sa, result->ai_addr, result->ai_addrlen); |
168 | set_nport(r, htons(port)); | 174 | set_nport(r, htons(port)); |
175 | ret: | ||
169 | freeaddrinfo(result); | 176 | freeaddrinfo(result); |
170 | return r; | 177 | return r; |
171 | } | 178 | } |
@@ -174,20 +181,20 @@ USE_FEATURE_IPV6(sa_family_t af,) | |||
174 | #endif | 181 | #endif |
175 | 182 | ||
176 | #if ENABLE_FEATURE_IPV6 | 183 | #if ENABLE_FEATURE_IPV6 |
177 | len_and_sockaddr* host_and_af2sockaddr(const char *host, int port, sa_family_t af) | 184 | len_and_sockaddr* xhost_and_af2sockaddr(const char *host, int port, sa_family_t af) |
178 | { | 185 | { |
179 | return str2sockaddr(host, port, af, 0); | 186 | return str2sockaddr(host, port, af, DIE_ON_ERROR); |
180 | } | 187 | } |
181 | #endif | 188 | #endif |
182 | 189 | ||
183 | len_and_sockaddr* host2sockaddr(const char *host, int port) | 190 | len_and_sockaddr* xhost2sockaddr(const char *host, int port) |
184 | { | 191 | { |
185 | return str2sockaddr(host, port, AF_UNSPEC, 0); | 192 | return str2sockaddr(host, port, AF_UNSPEC, DIE_ON_ERROR); |
186 | } | 193 | } |
187 | 194 | ||
188 | static len_and_sockaddr* dotted2sockaddr(const char *host, int port) | 195 | static len_and_sockaddr* xdotted2sockaddr(const char *host, int port) |
189 | { | 196 | { |
190 | return str2sockaddr(host, port, AF_UNSPEC, NI_NUMERICHOST); | 197 | return str2sockaddr(host, port, AF_UNSPEC, AI_NUMERICHOST | DIE_ON_ERROR); |
191 | } | 198 | } |
192 | 199 | ||
193 | int xsocket_stream(len_and_sockaddr **lsap) | 200 | int xsocket_stream(len_and_sockaddr **lsap) |
@@ -220,10 +227,7 @@ int create_and_bind_stream_or_die(const char *bindaddr, int port) | |||
220 | len_and_sockaddr *lsa; | 227 | len_and_sockaddr *lsa; |
221 | 228 | ||
222 | if (bindaddr && bindaddr[0]) { | 229 | if (bindaddr && bindaddr[0]) { |
223 | lsa = dotted2sockaddr(bindaddr, port); | 230 | lsa = xdotted2sockaddr(bindaddr, port); |
224 | /* currently NULL check is in str2sockaddr */ | ||
225 | //if (!lsa) | ||
226 | // bb_error_msg_and_die("bad address '%s'", bindaddr); | ||
227 | /* user specified bind addr dictates family */ | 231 | /* user specified bind addr dictates family */ |
228 | fd = xsocket(lsa->sa.sa_family, SOCK_STREAM, 0); | 232 | fd = xsocket(lsa->sa.sa_family, SOCK_STREAM, 0); |
229 | } else { | 233 | } else { |
@@ -241,10 +245,7 @@ int create_and_connect_stream_or_die(const char *peer, int port) | |||
241 | int fd; | 245 | int fd; |
242 | len_and_sockaddr *lsa; | 246 | len_and_sockaddr *lsa; |
243 | 247 | ||
244 | lsa = host2sockaddr(peer, port); | 248 | lsa = xhost2sockaddr(peer, port); |
245 | /* currently NULL check is in str2sockaddr */ | ||
246 | //if (!lsa) | ||
247 | // bb_error_msg_and_die("bad address '%s'", peer); | ||
248 | fd = xsocket(lsa->sa.sa_family, SOCK_STREAM, 0); | 249 | fd = xsocket(lsa->sa.sa_family, SOCK_STREAM, 0); |
249 | setsockopt_reuseaddr(fd); | 250 | setsockopt_reuseaddr(fd); |
250 | xconnect(fd, &lsa->sa, lsa->len); | 251 | xconnect(fd, &lsa->sa, lsa->len); |