diff --git a/src/authradius.c b/src/authradius.c index 652a317..8847969 100644 --- a/src/authradius.c +++ b/src/authradius.c @@ -554,6 +554,7 @@ int radsend(struct clientparam * param, int auth, int stop){ } else remsock = radiuslist[loop].logsock; */ + so._bind(param->remsock,(struct sockaddr *)&radiuslist[loop].localaddr,SASIZE(&radiuslist[loop].localaddr)); len = so._sendto(remsock, (char *)&packet, total_length, 0, (struct sockaddr *)&saremote, sizeof(saremote)); if(len != ntohs(packet.length)){ diff --git a/src/conf.c b/src/conf.c index 01b5664..6626ea9 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1329,13 +1329,19 @@ static int h_radius(int argc, unsigned char **argv){ if(strlen(argv[1]) > 63) argv[1][63] = 0; strcpy(radiussecret, argv[1]); for( nradservers=0; nradservers < MAXRADIUS && nradservers < argc -2; nradservers++){ + char *s = 0; + if(strchr(argv[nradservers + 2], '/')){ + *s = 0; + s++; + } if( !getip46(46, argv[nradservers + 2], (struct sockaddr *)&radiuslist[nradservers].authaddr)) return 1; + if( s && !getip46(46, s, (struct sockaddr *)&radiuslist[nradservers].localaddr)) return 2; if(!*SAPORT(&radiuslist[nradservers].authaddr))*SAPORT(&radiuslist[nradservers].authaddr) = htons(1812); port = ntohs(*SAPORT(&radiuslist[nradservers].authaddr)); radiuslist[nradservers].logaddr = radiuslist[nradservers].authaddr; *SAPORT(&radiuslist[nradservers].logaddr) = htons(port+1); /* - bindaddr = conf.intsa; + bindaddr = radiuslist[nradservers].localaddr; if ((radiuslist[nradservers].logsock = so._socket(SASOCK(&radiuslist[nradservers].logaddr), SOCK_DGRAM, 0)) < 0) return 2; if (so._bind(radiuslist[nradservers].logsock, (struct sockaddr *)&bindaddr, SASIZE(&bindaddr))) return 3; */ diff --git a/src/proxy.h b/src/proxy.h index 2912962..85beda4 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -320,9 +320,9 @@ extern struct commands commandhandlers[]; extern struct radserver { #ifdef NOIPV6 - struct sockaddr_in authaddr, logaddr; + struct sockaddr_in authaddr, logaddr, localaddr; #else - struct sockaddr_in6 authaddr, logaddr; + struct sockaddr_in6 authaddr, logaddr, localaddr; #endif /* SOCKET logsock; diff --git a/src/proxymain.c b/src/proxymain.c index 9388955..7844c84 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -61,7 +61,7 @@ void * threadfunc (void *p) { #ifndef _WIN32 sigset_t mask; sigfillset(&mask); - pthread_sigmask(SIG_SETMASK, &mask, NULL); + if(param->srv->service != S_UDPPM)pthread_sigmask(SIG_SETMASK, &mask, NULL); #endif ((struct clientparam *) p)->srv->pf((struct clientparam *)p);