X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=822f70def6aee8f6cf6e202832ab02c4553628b8;hp=5e4f13164c26fce85bcbeea55494a0e48244e1ea;hb=6ac9ff30a69753606cc76913515ae34f5ce2868d;hpb=166c7ec3e1b77ee8d4d8e50dd8314ca4c683ae26 diff --git a/net.c b/net.c index 5e4f1316..822f70de 100644 --- a/net.c +++ b/net.c @@ -422,61 +422,37 @@ static int lookup_address(unsigned l4type, bool passive, const char *host, static int makesock_addrinfo(unsigned l4type, bool passive, struct addrinfo *ai, struct flowopts *fo) { - struct addrinfo *local, *remote, *src, *dst; int ret = -E_MAKESOCK, on = 1, sockfd = -1; - if (passive) { - local = ai; - remote = NULL; - } else { - local = NULL; - remote = ai; - } - - /* Iterate over all src/dst combination, exhausting dst first */ - for (src = local, dst = remote; src != NULL || dst != NULL; /* no op */ ) { - ret = socket(src ? src->ai_family : dst->ai_family, - sock_type(l4type), l4type); + for (; ai; ai = ai->ai_next) { + ret = socket(ai->ai_family, sock_type(l4type), l4type); if (ret < 0) - goto get_next_dst; + continue; sockfd = ret; + flowopt_setopts(sockfd, fo); + if (!passive) { + if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) == 0) + return sockfd; + close(sockfd); + continue; + } /* * Reuse the address on passive sockets to avoid failure on * restart (protocols using listen()) and when creating * multiple listener instances (UDP multicast). */ - if (passive && setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, - &on, sizeof(on)) == -1) { - ret = -ERRNO_TO_PARA_ERROR(errno); + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, + sizeof(on)) == -1) { close(sockfd); - PARA_ERROR_LOG("can not set SO_REUSEADDR: %s\n", - para_strerror(-ret)); - break; - } - flowopt_setopts(sockfd, fo); - - if (passive) { - if (bind(sockfd, src->ai_addr, src->ai_addrlen) < 0) { - close(sockfd); - goto get_next_src; - } - /* bind completed successfully */ - break; - } else { - if (connect(sockfd, dst->ai_addr, dst->ai_addrlen) == 0) - break; /* connection completed successfully */ + continue; } - close(sockfd); -get_next_dst: - if (dst && (dst = dst->ai_next)) + if (bind(sockfd, ai->ai_addr, ai->ai_addrlen) < 0) { + close(sockfd); continue; -get_next_src: - if (src && (src = src->ai_next)) /* restart inner loop */ - dst = remote; + } + return sockfd; } - if (src == NULL && dst == NULL) - return ret < 0? ret : -E_MAKESOCK; - return sockfd; + return -E_MAKESOCK; } /**