diff options
Diffstat (limited to 'radsecproxy.c')
| -rw-r--r-- | radsecproxy.c | 95 | 
1 files changed, 26 insertions, 69 deletions
| diff --git a/radsecproxy.c b/radsecproxy.c index 9c44328..280cb41 100644 --- a/radsecproxy.c +++ b/radsecproxy.c @@ -390,52 +390,6 @@ 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; - -    s = -1; -    for (res = addrinfo; res; res = res->ai_next) { -	s = bindtoaddr(src, res->ai_family, 1, 1); -        if (s < 0) { -            debug(DBG_WARN, "connecttoserver: socket failed"); -            continue; -        } -        if (connect(s, res->ai_addr, res->ai_addrlen) == 0) -            break; -        debug(DBG_WARN, "connecttoserver: connect failed"); -        close(s); -        s = -1; -    } -    return s; -}	   -  /* returns 1 if the len first bits are equal, else 0 */  int prefixmatch(void *a1, void *a2, uint8_t len) {      static uint8_t mask[] = { 0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe }; @@ -590,6 +544,24 @@ struct client *addclient(struct clsrvconf *conf, uint8_t lock) {      return new;  } +void removeclientrqs(struct client *client) { +    struct request *rq; +    struct rqout *rqout; +    int i; + +    for (i = 0; i < MAX_REQUESTS; i++) { +	rq = client->rqs[i]; +	if (!rq) +	    continue; +	rqout = rq->to->requests + rq->newid; +	pthread_mutex_lock(rqout->lock); +	if (rqout->rq == rq) /* still pointing to our request */ +	    freerqoutdata(rqout); +	pthread_mutex_unlock(rqout->lock);				 +	freerq(rq); +    } +} +  void removeclient(struct client *client) {      struct clsrvconf *conf; @@ -598,6 +570,7 @@ void removeclient(struct client *client) {      conf = client->conf;      pthread_mutex_lock(conf->lock);      if (conf->clients) { +	removeclientrqs(client);  	removequeue(client->replyq);  	list_removedata(conf->clients, client);  	free(client->addr); @@ -606,26 +579,6 @@ void removeclient(struct client *client) {      pthread_mutex_unlock(conf->lock);  } -void removeclientrqs(struct client *client) { -    struct list_node *entry; -    struct server *server; -    struct rqout *rqout; -    int i; -     -    for (entry = list_first(srvconfs); entry; entry = list_next(entry)) { -	server = ((struct clsrvconf *)entry->data)->servers; -	if (!server) -	    continue; -	for (i = 0; i < MAX_REQUESTS; i++) { -	    rqout = server->requests + i; -	    pthread_mutex_lock(rqout->lock); -	    if (rqout->rq && rqout->rq->from == client) -		freerqoutdata(rqout); -	    pthread_mutex_unlock(rqout->lock); -	} -    } -} -  void freeserver(struct server *server, uint8_t destroymutex) {      struct rqout *rqout, *end; @@ -955,8 +908,9 @@ void freerqoutdata(struct rqout *rqout) {      memset(&rqout->expiry, 0, sizeof(struct timeval));  } -void sendrq(struct server *to, struct request *rq) { +void sendrq(struct request *rq) {      int i, start; +    struct server *to = rq->to;      start = to->conf->statusserver ? 1 : 0;      pthread_mutex_lock(&to->newrq_mutex); @@ -995,6 +949,7 @@ void sendrq(struct server *to, struct request *rq) {  	    }  	}      } +    rq->newid = (uint8_t)i;      rq->msg->id = (uint8_t)i;      rq->buf = radmsg2buf(rq->msg, (uint8_t *)to->conf->secret);      if (!rq->buf) { @@ -1884,7 +1839,8 @@ int radsrv(struct request *rq) {  	goto rmclrqexit;      free(userascii); -    sendrq(to, rq); +    rq->to = to; +    sendrq(rq);      return 1;   rmclrqexit: @@ -2193,8 +2149,9 @@ void *clientwr(void *arg) {  		laststatsrv = now;  		statsrvrq = createstatsrvrq();  		if (statsrvrq) { +		    statsrvrq->to = server;  		    debug(DBG_DBG, "clientwr: sending status server to %s", conf->host); -		    sendrq(server, statsrvrq); +		    sendrq(statsrvrq);  		}  	    }  	} | 
