static int listen_all_addrinfo(struct addrinfo *ai_head, int sockfdlist[], int maxsockfd) { struct addrinfo *ai; int ret, nsockfd = 0; const size_t ai_buf_size = NI_MAXHOST + NI_MAXSERV + 2; char ai_buf[ai_buf_size]; for (ai = ai_head; ai && nsockfd < maxsockfd; ai = ai->ai_next) { int sock; addrinfo_to_text(ai, ai_buf, ai_buf_size); printf("opening %s\n", ai_buf); sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (sock < 0) { printf("socket: %s: %d (%s)", ai_buf, errno, strerror(errno)); continue; } usbip_net_set_reuseaddr(sock); usbip_net_set_nodelay(sock); /* We use seperate sockets for IPv4 and IPv6 * (see do_standalone_mode()) */ usbip_net_set_v6only(sock); if (sock >= FD_SETSIZE) { printf("FD_SETSIZE: %s: sock=%d, max=%d", ai_buf, sock, FD_SETSIZE); close(sock); continue; } ret = bind(sock, ai->ai_addr, ai->ai_addrlen); if (ret < 0) { printf("bind: %s: %d (%s)", ai_buf, errno, strerror(errno)); close(sock); continue; } ret = listen(sock, SOMAXCONN); if (ret < 0) { printf("listen: %s: %d (%s)", ai_buf, errno, strerror(errno)); close(sock); continue; } printf("listening on %s\n", ai_buf); sockfdlist[nsockfd++] = sock; } return nsockfd; }
static int listen_all_addrinfo(struct addrinfo *ai_head, int sockfdlist[]) { struct addrinfo *ai; int ret, nsockfd = 0; for (ai = ai_head; ai && nsockfd < MAXSOCKFD; ai = ai->ai_next) { sockfdlist[nsockfd] = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (sockfdlist[nsockfd] < 0) continue; usbip_net_set_reuseaddr(sockfdlist[nsockfd]); usbip_net_set_nodelay(sockfdlist[nsockfd]); if (sockfdlist[nsockfd] >= FD_SETSIZE) { close(sockfdlist[nsockfd]); sockfdlist[nsockfd] = -1; continue; } ret = bind(sockfdlist[nsockfd], ai->ai_addr, ai->ai_addrlen); if (ret < 0) { close(sockfdlist[nsockfd]); sockfdlist[nsockfd] = -1; continue; } ret = listen(sockfdlist[nsockfd], SOMAXCONN); if (ret < 0) { close(sockfdlist[nsockfd]); sockfdlist[nsockfd] = -1; continue; } log_addrinfo(ai); nsockfd++; } if (nsockfd == 0) return -1; dbg("listening on %d address%s", nsockfd, (nsockfd == 1) ? "" : "es"); return nsockfd; }