diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-01-10 20:19:56 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-01-10 20:19:56 +0000 |
commit | bbe514683a43e81cab1d5ccc0436b9aaf984294b (patch) | |
tree | 5faad36440333e8f1c46c367167e03be65ce8a93 /libbb/xconnect.c | |
parent | 9de420c27cbbbd99bedc95782a6937039ff071bb (diff) | |
download | busybox-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.c | 31 |
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 */ | ||
87 | typedef 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 | */ |
104 | static len_and_sockaddr* str2sockaddr(const char *host, int def_port, int ai_flags) | 92 | static 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 | ||
157 | static len_and_sockaddr* host2sockaddr(const char *host, int def_port) | 146 | len_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 | ||
162 | static len_and_sockaddr* dotted2sockaddr(const char *host, int def_port) | 151 | static 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 | ||
167 | static int xsocket_stream_ip4or6(len_and_sockaddr *lsa) | 156 | static 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) |