| 112 | } |
| 113 | |
| 114 | static SOCK_UDP *sock_open(const char *addr) |
| 115 | { |
| 116 | SOCK_UDP *sock; |
| 117 | struct addrinfo *res0, *res; |
| 118 | int fd; |
| 119 | |
| 120 | res0 = host_addrinfo(addr); |
| 121 | if (res0 == NULL) |
| 122 | return NULL; |
| 123 | |
| 124 | fd = bind_addr(res0, &res); |
| 125 | if (fd == ACL_SOCKET_INVALID) { |
| 126 | acl_msg_error("%s(%d): invalid socket", __FILE__, __LINE__); |
| 127 | freeaddrinfo(res0); |
| 128 | return NULL; |
| 129 | } |
| 130 | |
| 131 | sock = (SOCK_UDP *) acl_mycalloc(1, sizeof(SOCK_UDP)); |
| 132 | sock->fd = fd; |
| 133 | memcpy(&sock->sa_local, res->ai_addr, res->ai_addrlen); |
| 134 | sock->sa_local_len = res->ai_addrlen; |
| 135 | |
| 136 | freeaddrinfo(res0); |
| 137 | return sock; |
| 138 | } |
| 139 | |
| 140 | SOCK_UDP *udp_client_open(const char *local, const char *peer) |
| 141 | { |
no test coverage detected
searching dependent graphs…