static int listen_all_addrinfo(struct addrinfo *ai_head, int lsock[]) { struct addrinfo *ai; int n = 0; /* number of sockets */ for (ai = ai_head; ai && n < MAXSOCK; ai = ai->ai_next) { int ret; lsock[n] = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (lsock[n] < 0) continue; usbip_set_reuseaddr(lsock[n]); usbip_set_nodelay(lsock[n]); if (lsock[n] >= FD_SETSIZE) { close(lsock[n]); lsock[n] = -1; continue; } ret = bind(lsock[n], ai->ai_addr, ai->ai_addrlen); if (ret < 0) { close(lsock[n]); lsock[n] = -1; continue; } ret = listen(lsock[n], SOMAXCONN); if (ret < 0) { close(lsock[n]); lsock[n] = -1; continue; } log_addrinfo(ai); /* next if succeed */ n++; } if (n == 0) { err("no socket to listen to"); return -1; } dbg("listen %d address%s", n, (n==1)?"":"es"); return n; }
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; }