Revision 4f085c82 qemu-sockets.c
b/qemu-sockets.c | ||
---|---|---|
396 | 396 |
struct addrinfo ai, *peer = NULL, *local = NULL; |
397 | 397 |
const char *addr; |
398 | 398 |
const char *port; |
399 |
char uaddr[INET6_ADDRSTRLEN+1]; |
|
400 |
char uport[33]; |
|
401 | 399 |
int sock = -1, rc; |
402 | 400 |
|
403 | 401 |
/* lookup peer addr */ |
... | ... | |
412 | 410 |
addr = "localhost"; |
413 | 411 |
} |
414 | 412 |
if (port == NULL || strlen(port) == 0) { |
415 |
fprintf(stderr, "inet_dgram: port not specified\n");
|
|
413 |
error_setg(errp, "remote port not specified");
|
|
416 | 414 |
return -1; |
417 | 415 |
} |
418 | 416 |
|
... | ... | |
422 | 420 |
ai.ai_family = PF_INET6; |
423 | 421 |
|
424 | 422 |
if (0 != (rc = getaddrinfo(addr, port, &ai, &peer))) { |
425 |
fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port,
|
|
426 |
gai_strerror(rc)); |
|
423 |
error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
|
|
424 |
gai_strerror(rc));
|
|
427 | 425 |
return -1; |
428 | 426 |
} |
429 | 427 |
|
... | ... | |
442 | 440 |
port = "0"; |
443 | 441 |
|
444 | 442 |
if (0 != (rc = getaddrinfo(addr, port, &ai, &local))) { |
445 |
fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port,
|
|
446 |
gai_strerror(rc)); |
|
443 |
error_setg(errp, "address resolution failed for %s:%s: %s", addr, port,
|
|
444 |
gai_strerror(rc));
|
|
447 | 445 |
goto err; |
448 | 446 |
} |
449 | 447 |
|
450 | 448 |
/* create socket */ |
451 | 449 |
sock = qemu_socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol); |
452 | 450 |
if (sock < 0) { |
453 |
fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__, |
|
454 |
inet_strfamily(peer->ai_family), strerror(errno)); |
|
451 |
error_set_errno(errp, errno, QERR_SOCKET_CREATE_FAILED); |
|
455 | 452 |
goto err; |
456 | 453 |
} |
457 | 454 |
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); |
458 | 455 |
|
459 | 456 |
/* bind socket */ |
460 |
if (getnameinfo((struct sockaddr*)local->ai_addr,local->ai_addrlen, |
|
461 |
uaddr,INET6_ADDRSTRLEN,uport,32, |
|
462 |
NI_NUMERICHOST | NI_NUMERICSERV) != 0) { |
|
463 |
fprintf(stderr, "%s: getnameinfo: oops\n", __FUNCTION__); |
|
464 |
goto err; |
|
465 |
} |
|
466 | 457 |
if (bind(sock, local->ai_addr, local->ai_addrlen) < 0) { |
467 |
fprintf(stderr,"%s: bind(%s,%s,%d): OK\n", __FUNCTION__, |
|
468 |
inet_strfamily(local->ai_family), uaddr, inet_getport(local)); |
|
458 |
error_set_errno(errp, errno, QERR_SOCKET_BIND_FAILED); |
|
469 | 459 |
goto err; |
470 | 460 |
} |
471 | 461 |
|
472 | 462 |
/* connect to peer */ |
473 |
if (getnameinfo((struct sockaddr*)peer->ai_addr, peer->ai_addrlen, |
|
474 |
uaddr, INET6_ADDRSTRLEN, uport, 32, |
|
475 |
NI_NUMERICHOST | NI_NUMERICSERV) != 0) { |
|
476 |
fprintf(stderr, "%s: getnameinfo: oops\n", __FUNCTION__); |
|
477 |
goto err; |
|
478 |
} |
|
479 | 463 |
if (connect(sock,peer->ai_addr,peer->ai_addrlen) < 0) { |
480 |
fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n", __FUNCTION__, |
|
481 |
inet_strfamily(peer->ai_family), |
|
482 |
peer->ai_canonname, uaddr, uport, strerror(errno)); |
|
464 |
error_set_errno(errp, errno, QERR_SOCKET_CONNECT_FAILED); |
|
483 | 465 |
goto err; |
484 | 466 |
} |
485 | 467 |
|
Also available in: Unified diff