aboutsummaryrefslogtreecommitdiff
path: root/libbb/xconnect.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-01-10 20:19:56 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-01-10 20:19:56 +0000
commitbbe514683a43e81cab1d5ccc0436b9aaf984294b (patch)
tree5faad36440333e8f1c46c367167e03be65ce8a93 /libbb/xconnect.c
parent9de420c27cbbbd99bedc95782a6937039ff071bb (diff)
downloadbusybox-w32-bbe514683a43e81cab1d5ccc0436b9aaf984294b.tar.gz
busybox-w32-bbe514683a43e81cab1d5ccc0436b9aaf984294b.tar.bz2
busybox-w32-bbe514683a43e81cab1d5ccc0436b9aaf984294b.zip
a bit more IPv6-ization work
syslogd: converted to use it (in -R host:port)
Diffstat (limited to 'libbb/xconnect.c')
-rw-r--r--libbb/xconnect.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index 93c3cd5c6..6e85322cf 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -83,25 +83,13 @@ int xconnect_tcp_v4(struct sockaddr_in *s_addr)
83/* "New" networking API */ 83/* "New" networking API */
84 84
85 85
86/* So far we do not expose struct and helpers to libbb */
87typedef struct len_and_sockaddr {
88 int len;
89 union {
90 struct sockaddr sa;
91 struct sockaddr_in sin;
92#if ENABLE_FEATURE_IPV6
93 struct sockaddr_in6 sin6;
94#endif
95 };
96} len_and_sockaddr;
97//extern int xsocket_stream_ip4or6(sa_family_t *fp); 86//extern int xsocket_stream_ip4or6(sa_family_t *fp);
98//extern len_and_sockaddr* host2sockaddr(const char *host, int def_port);
99//extern len_and_sockaddr* dotted2sockaddr(const char *dotted, int def_port); 87//extern len_and_sockaddr* dotted2sockaddr(const char *dotted, int def_port);
100 88
101/* peer: "1.2.3.4[:port]", "www.google.com[:port]" 89/* peer: "1.2.3.4[:port]", "www.google.com[:port]"
102 * def_port: if neither of above specifies port # 90 * port: if neither of above specifies port #
103 */ 91 */
104static len_and_sockaddr* str2sockaddr(const char *host, int def_port, int ai_flags) 92static len_and_sockaddr* str2sockaddr(const char *host, int port, int ai_flags)
105{ 93{
106 int rc; 94 int rc;
107 len_and_sockaddr *r; // = NULL; 95 len_and_sockaddr *r; // = NULL;
@@ -126,12 +114,13 @@ static len_and_sockaddr* str2sockaddr(const char *host, int def_port, int ai_fla
126 } 114 }
127 } 115 }
128 if (cp) { 116 if (cp) {
129 host = safe_strncpy(alloca(cp - host + 1), host, cp - host); 117 int sz = cp - host + 1;
118 host = safe_strncpy(alloca(sz), host, sz);
130 if (ENABLE_FEATURE_IPV6 && *cp != ':') 119 if (ENABLE_FEATURE_IPV6 && *cp != ':')
131 cp++; /* skip ']' */ 120 cp++; /* skip ']' */
132 cp++; /* skip ':' */ 121 cp++; /* skip ':' */
133 } else { 122 } else {
134 utoa_to_buf(def_port, service, sizeof(service)); 123 utoa_to_buf(port, service, sizeof(service));
135 cp = service; 124 cp = service;
136 } 125 }
137 126
@@ -154,14 +143,14 @@ static len_and_sockaddr* str2sockaddr(const char *host, int def_port, int ai_fla
154 return r; 143 return r;
155} 144}
156 145
157static len_and_sockaddr* host2sockaddr(const char *host, int def_port) 146len_and_sockaddr* host2sockaddr(const char *host, int port)
158{ 147{
159 return str2sockaddr(host, def_port, 0); 148 return str2sockaddr(host, port, 0);
160} 149}
161 150
162static len_and_sockaddr* dotted2sockaddr(const char *host, int def_port) 151static len_and_sockaddr* dotted2sockaddr(const char *host, int port)
163{ 152{
164 return str2sockaddr(host, def_port, NI_NUMERICHOST); 153 return str2sockaddr(host, port, NI_NUMERICHOST);
165} 154}
166 155
167static int xsocket_stream_ip4or6(len_and_sockaddr *lsa) 156static int xsocket_stream_ip4or6(len_and_sockaddr *lsa)
@@ -185,7 +174,7 @@ int create_and_bind_stream_or_die(const char *bindaddr, int port)
185 int fd; 174 int fd;
186 len_and_sockaddr *lsa; 175 len_and_sockaddr *lsa;
187 176
188 if (bindaddr) { 177 if (bindaddr && bindaddr[0]) {
189 lsa = dotted2sockaddr(bindaddr, port); 178 lsa = dotted2sockaddr(bindaddr, port);
190 /* currently NULL check is in str2sockaddr */ 179 /* currently NULL check is in str2sockaddr */
191 //if (!lsa) 180 //if (!lsa)