if (!ss2)
goto fail;
- if (ss2->ss_family == AF_CUST_SOCKPAIR) {
- socklen_t addr_len;
-
- fd = ((struct sockaddr_in *)ss2)->sin_addr.s_addr;
- addr_len = sizeof(*ss2);
- if (getsockname(fd, (struct sockaddr *)ss2, &addr_len) == -1) {
- memprintf(err, "cannot use file descriptor '%d' : %s.\n", fd, strerror(errno));
- goto fail;
- }
-
- ss2->ss_family = AF_CUST_SOCKPAIR; /* reassign AF_CUST_SOCKPAIR because of getsockname */
- port = end = 0;
- }
-
/* OK the address looks correct */
if (!create_listeners(bind_conf, ss2, port, end, fd, err)) {
memprintf(err, "%s for address '%s'.\n", *err, str);
ss.ss_family = AF_UNSPEC;
if (ss.ss_family == AF_CUST_SOCKPAIR) {
+ struct sockaddr_storage ss2;
+ socklen_t addr_len;
char *endptr;
new_fd = strtol(str2, &endptr, 10);
goto out;
}
+ /* just verify that it's a socket */
+ addr_len = sizeof(ss2);
+ if (getsockname(new_fd, (struct sockaddr *)&ss2, &addr_len) == -1) {
+ memprintf(err, "cannot use file descriptor '%d' : %s.\n", new_fd, strerror(errno));
+ goto out;
+ }
+
((struct sockaddr_in *)&ss)->sin_addr.s_addr = new_fd;
((struct sockaddr_in *)&ss)->sin_port = 0;
}