| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- /* include tcp_listen */
- #include "unp.h"
- int
- tcp_listen(const char *host, const char *serv, socklen_t *addrlenp)
- {
- int listenfd, n;
- const int on = 1;
- struct addrinfo hints, *res, *ressave;
- bzero(&hints, sizeof(struct addrinfo));
- hints.ai_flags = AI_PASSIVE;
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)
- err_quit("tcp_listen error for %s, %s: %s",
- host, serv, gai_strerror(n));
- ressave = res;
- do {
- listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
- if (listenfd < 0)
- continue; /* error, try next one */
- Setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
- if (bind(listenfd, res->ai_addr, res->ai_addrlen) == 0)
- break; /* success */
- Close(listenfd); /* bind error, close and try next one */
- } while ( (res = res->ai_next) != NULL);
- if (res == NULL) /* errno from final socket() or bind() */
- err_sys("tcp_listen error for %s, %s", host, serv);
- Listen(listenfd, LISTENQ);
- if (addrlenp)
- *addrlenp = res->ai_addrlen; /* return size of protocol address */
- freeaddrinfo(ressave);
- return(listenfd);
- }
- /* end tcp_listen */
- /*
- * We place the wrapper function here, not in wraplib.c, because some
- * XTI programs need to include wraplib.c, and it also defines
- * a Tcp_listen() function.
- */
- int
- Tcp_listen(const char *host, const char *serv, socklen_t *addrlenp)
- {
- return(tcp_listen(host, serv, addrlenp));
- }
|