-#if 0
- memset(&a6,'\0',sizeof(struct sockaddr_in6));
-#endif
- hints.ai_flags = AI_NUMERICHOST;
- hints.ai_family = address_family;
- hints.ai_socktype = 0;
- hints.ai_protocol = 0;
- hints.ai_addrlen = 0;
- hints.ai_addr = NULL;
- hints.ai_canonname = NULL;
- hints.ai_next = NULL;
- sprintf(portstr, "%d", port);
- if (srcaddr != NULL && getaddrinfo(srcaddr, portstr, &hints, &ai) == 0)
- retcode = bind(s, ai->ai_addr, ai->ai_addrlen);
- else
-#if 0
- {
- /*
- * FIXME: Need two listening sockets, in principle, one for v4
- * and one for v6
- */
- if (local_host_only)
- a6.sin6_addr = in6addr_loopback;
- else
- a6.sin6_addr = in6addr_any;
- a6.sin6_port = htons(port);
- } else
-#endif
+ hints.ai_flags = AI_NUMERICHOST;
+ hints.ai_family = address_family;
+ hints.ai_socktype = 0;
+ hints.ai_protocol = 0;
+ hints.ai_addrlen = 0;
+ hints.ai_addr = NULL;
+ hints.ai_canonname = NULL;
+ hints.ai_next = NULL;
+ sprintf(portstr, "%d", port);
+ retcode = getaddrinfo(srcaddr, portstr, &hints, &ai);
+ addr = ai->ai_addr;
+ addrlen = ai->ai_addrlen;
+#else
+ memset(&a,'\0',sizeof(struct sockaddr_in));
+ a.sin_family = AF_INET;
+ a.sin_port = htons(port);
+ a.sin_addr.s_addr = inet_addr(srcaddr);
+ if (a.sin_addr.s_addr != (in_addr_t)(-1)) {
+ /* Override localhost_only with specified listen addr. */
+ ret->localhost_only = ipv4_is_loopback(a.sin_addr);
+ got_addr = 1;
+ }
+ addr = (struct sockaddr *)a;
+ addrlen = sizeof(a);
+ retcode = 0;