*/
#define _GNU_SOURCE
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/un.h>
+#include <sys/types.h>
+#include <sys/socket.h>
#include <netdb.h>
/* At least NetBSD needs these. */
static int makesock_addrinfo(unsigned l4type, bool passive, struct addrinfo *ai,
struct flowopts *fo)
{
- struct addrinfo *local, *remote, *src = NULL, *dst = NULL;
+ struct addrinfo *local, *remote, *src, *dst;
int ret = -E_MAKESOCK, on = 1, sockfd = -1;
if (passive) {
/* Iterate over all src/dst combination, exhausting dst first */
for (src = local, dst = remote; src != NULL || dst != NULL; /* no op */ ) {
- if (src && dst && src->ai_family == AF_INET
- && dst->ai_family == AF_INET6)
- goto get_next_dst; /* v4 -> v6 is not possible */
-
ret = socket(src ? src->ai_family : dst->ai_family,
sock_type(l4type), l4type);
if (ret < 0)
}
flowopt_setopts(sockfd, fo);
- if (src) {
+ if (passive) {
if (bind(sockfd, src->ai_addr, src->ai_addrlen) < 0) {
close(sockfd);
goto get_next_src;
}
- if (!dst) /* bind-only completed successfully */
- break;
+ /* bind completed successfully */
+ break;
+ } else {
+ if (connect(sockfd, dst->ai_addr, dst->ai_addrlen) == 0)
+ break; /* connection completed successfully */
}
-
- if (dst && connect(sockfd, dst->ai_addr, dst->ai_addrlen) == 0)
- break; /* connection completed successfully */
close(sockfd);
get_next_dst:
if (dst && (dst = dst->ai_next))