Revision 39b6efc8
b/qemu-sockets.c | ||
---|---|---|
161 | 161 |
|
162 | 162 |
/* create socket + bind */ |
163 | 163 |
for (e = res; e != NULL; e = e->ai_next) { |
164 |
getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
|
|
165 |
uaddr,INET6_ADDRSTRLEN,uport,32, |
|
166 |
NI_NUMERICHOST | NI_NUMERICSERV); |
|
164 |
getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
|
|
165 |
uaddr,INET6_ADDRSTRLEN,uport,32,
|
|
166 |
NI_NUMERICHOST | NI_NUMERICSERV);
|
|
167 | 167 |
slisten = socket(e->ai_family, e->ai_socktype, e->ai_protocol); |
168 |
if (slisten < 0) {
|
|
168 |
if (slisten < 0) {
|
|
169 | 169 |
fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__, |
170 | 170 |
inet_strfamily(e->ai_family), strerror(errno)); |
171 |
continue;
|
|
172 |
}
|
|
171 |
continue;
|
|
172 |
}
|
|
173 | 173 |
|
174 | 174 |
setsockopt(slisten,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); |
175 | 175 |
#ifdef IPV6_V6ONLY |
176 | 176 |
if (e->ai_family == PF_INET6) { |
177 | 177 |
/* listen on both ipv4 and ipv6 */ |
178 |
setsockopt(slisten,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&off,sizeof(off)); |
|
178 |
setsockopt(slisten,IPPROTO_IPV6,IPV6_V6ONLY,(void*)&off, |
|
179 |
sizeof(off)); |
|
179 | 180 |
} |
180 | 181 |
#endif |
181 | 182 |
|
... | ... | |
183 | 184 |
if (bind(slisten, e->ai_addr, e->ai_addrlen) == 0) { |
184 | 185 |
if (sockets_debug) |
185 | 186 |
fprintf(stderr,"%s: bind(%s,%s,%d): OK\n", __FUNCTION__, |
186 |
inet_strfamily(e->ai_family), uaddr, inet_getport(e));
|
|
187 |
inet_strfamily(e->ai_family), uaddr, inet_getport(e)); |
|
187 | 188 |
goto listen; |
188 | 189 |
} |
189 | 190 |
try_next = to && (inet_getport(e) <= to + port_offset); |
... | ... | |
207 | 208 |
if (listen(slisten,1) != 0) { |
208 | 209 |
perror("listen"); |
209 | 210 |
closesocket(slisten); |
211 |
freeaddrinfo(res); |
|
210 | 212 |
return -1; |
211 | 213 |
} |
212 | 214 |
if (ostr) { |
... | ... | |
278 | 280 |
inet_print_addrinfo(__FUNCTION__, res); |
279 | 281 |
|
280 | 282 |
for (e = res; e != NULL; e = e->ai_next) { |
281 |
if (getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
|
|
282 |
uaddr,INET6_ADDRSTRLEN,uport,32, |
|
283 |
NI_NUMERICHOST | NI_NUMERICSERV) != 0) { |
|
283 |
if (getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen,
|
|
284 |
uaddr,INET6_ADDRSTRLEN,uport,32,
|
|
285 |
NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
|
|
284 | 286 |
fprintf(stderr,"%s: getnameinfo: oops\n", __FUNCTION__); |
285 |
continue;
|
|
286 |
}
|
|
287 |
continue;
|
|
288 |
}
|
|
287 | 289 |
sock = socket(e->ai_family, e->ai_socktype, e->ai_protocol); |
288 |
if (sock < 0) {
|
|
290 |
if (sock < 0) {
|
|
289 | 291 |
fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__, |
290 |
inet_strfamily(e->ai_family), strerror(errno));
|
|
291 |
continue;
|
|
292 |
}
|
|
292 |
inet_strfamily(e->ai_family), strerror(errno)); |
|
293 |
continue;
|
|
294 |
}
|
|
293 | 295 |
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); |
294 | 296 |
|
295 |
/* connect to peer */
|
|
296 |
if (connect(sock,e->ai_addr,e->ai_addrlen) < 0) {
|
|
297 |
/* connect to peer */
|
|
298 |
if (connect(sock,e->ai_addr,e->ai_addrlen) < 0) {
|
|
297 | 299 |
if (sockets_debug || NULL == e->ai_next) |
298 | 300 |
fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n", __FUNCTION__, |
299 | 301 |
inet_strfamily(e->ai_family), |
300 | 302 |
e->ai_canonname, uaddr, uport, strerror(errno)); |
301 | 303 |
closesocket(sock); |
302 |
continue;
|
|
303 |
}
|
|
304 |
continue;
|
|
305 |
}
|
|
304 | 306 |
if (sockets_debug) |
305 | 307 |
fprintf(stderr, "%s: connect(%s,%s,%s,%s): OK\n", __FUNCTION__, |
306 | 308 |
inet_strfamily(e->ai_family), |
307 | 309 |
e->ai_canonname, uaddr, uport); |
308 | 310 |
freeaddrinfo(res); |
309 |
return sock;
|
|
311 |
return sock;
|
|
310 | 312 |
} |
311 | 313 |
freeaddrinfo(res); |
312 | 314 |
return -1; |
... | ... | |
322 | 324 |
|
323 | 325 |
sock = socket(PF_UNIX, SOCK_STREAM, 0); |
324 | 326 |
if (sock < 0) { |
325 |
perror("socket(unix)");
|
|
326 |
return -1;
|
|
327 |
perror("socket(unix)");
|
|
328 |
return -1;
|
|
327 | 329 |
} |
328 | 330 |
|
329 | 331 |
opts = strchr(str, ','); |
330 | 332 |
if (opts) { |
331 | 333 |
len = opts - str; |
332 |
path = malloc(len+1); |
|
334 |
path = qemu_malloc(len+1);
|
|
333 | 335 |
snprintf(path, len+1, "%.*s", len, str); |
334 | 336 |
} else |
335 |
path = strdup(str); |
|
337 |
path = qemu_strdup(str);
|
|
336 | 338 |
|
337 | 339 |
memset(&un, 0, sizeof(un)); |
338 | 340 |
un.sun_family = AF_UNIX; |
... | ... | |
365 | 367 |
|
366 | 368 |
if (sockets_debug) |
367 | 369 |
fprintf(stderr, "bind(unix:%s): OK\n", un.sun_path); |
368 |
free(path); |
|
370 |
qemu_free(path);
|
|
369 | 371 |
return sock; |
370 | 372 |
|
371 | 373 |
err: |
372 |
free(path); |
|
374 |
qemu_free(path);
|
|
373 | 375 |
closesocket(sock); |
374 | 376 |
return -1; |
375 | 377 |
} |
... | ... | |
381 | 383 |
|
382 | 384 |
sock = socket(PF_UNIX, SOCK_STREAM, 0); |
383 | 385 |
if (sock < 0) { |
384 |
perror("socket(unix)");
|
|
385 |
return -1;
|
|
386 |
perror("socket(unix)");
|
|
387 |
return -1;
|
|
386 | 388 |
} |
387 | 389 |
|
388 | 390 |
memset(&un, 0, sizeof(un)); |
Also available in: Unified diff