diff options
| -rw-r--r-- | radsecproxy.c | 26 | ||||
| -rw-r--r-- | radsecproxy.h | 1 | ||||
| -rw-r--r-- | util.c | 27 | ||||
| -rw-r--r-- | util.h | 1 | 
4 files changed, 27 insertions, 28 deletions
| diff --git a/radsecproxy.c b/radsecproxy.c index 853b594..c97e7ed 100644 --- a/radsecproxy.c +++ b/radsecproxy.c @@ -383,6 +383,32 @@ void freeclsrvres(struct clsrvconf *res) {      free(res);  } +int bindtoaddr(struct addrinfo *addrinfo, int family, int reuse, int v6only) { +    int s, on = 1; +    struct addrinfo *res; + +    for (res = addrinfo; res; res = res->ai_next) { +	if (family != AF_UNSPEC && family != res->ai_family) +	    continue; +	s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); +	if (s < 0) { +	    debug(DBG_WARN, "bindtoaddr: socket failed"); +	    continue; +	} +	if (reuse) +	    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); +#ifdef IPV6_V6ONLY +	if (v6only) +	    setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)); +#endif +	if (!bind(s, res->ai_addr, res->ai_addrlen)) +	    return s; +	debug(DBG_WARN, "bindtoaddr: bind failed"); +	close(s); +    } +    return -1; +} +	  int connecttcp(struct addrinfo *addrinfo, struct addrinfo *src) {      int s;      struct addrinfo *res; diff --git a/radsecproxy.h b/radsecproxy.h index ee85c79..2546470 100644 --- a/radsecproxy.h +++ b/radsecproxy.h @@ -213,3 +213,4 @@ X509 *verifytlscert(SSL *ssl);  int verifyconfcert(X509 *cert, struct clsrvconf *conf);  int replyh(struct server *server, unsigned char *buf);  int connecttcp(struct addrinfo *addrinfo, struct addrinfo *src); +int bindtoaddr(struct addrinfo *addrinfo, int family, int reuse, int v6only); @@ -98,33 +98,6 @@ char *addr2string(struct sockaddr *addr, socklen_t len) {      return addr_buf[i];  } -int bindtoaddr(struct addrinfo *addrinfo, int family, int reuse, int v6only) { -    int s, on = 1; -    struct addrinfo *res; - -    for (res = addrinfo; res; res = res->ai_next) { -	if (family != AF_UNSPEC && family != res->ai_family) -	    continue; -	s = socket(res->ai_family, res->ai_socktype, res->ai_protocol); -	if (s < 0) { -	    debug(DBG_WARN, "bindtoaddr: socket failed"); -	    continue; -	} -	if (reuse) -	    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); -	#ifdef IPV6_V6ONLY -	if (v6only) -	    setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)); -#endif - -	if (!bind(s, res->ai_addr, res->ai_addrlen)) -	    return s; -	debug(DBG_WARN, "bindtoaddr: bind failed"); -	close(s); -    } -    return -1; -} -  int connectport(int type, char *host, char *port) {      struct addrinfo hints, *res0, *res;      int s = -1; @@ -5,4 +5,3 @@ char *stringcopy(const char *s, int len);  char *addr2string(struct sockaddr *addr, socklen_t len);  void printfchars(char *prefixfmt, char *prefix, char *charfmt, char *chars, int len);  int connectport(int type, char *host, char *port); -int bindtoaddr(struct addrinfo *addrinfo, int family, int reuse, int v6only); | 
