Keep the name servers and RADIUS servers in conf

nservers, numservers and authnserver (resolve.c, common.c) and
radiuslist, nradservers and radiussecret (authradius.c) were globals of
their own; they are configuration, set by nserver, authnserver and
radius, and now live in struct extparam with the rest of it.
MAXNSERVERS, MAXRADIUS and struct radserver move to structures.h, which
plugins include without proxy.h.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Vladimir Dubrovin 2026-10-13 15:39:37 +03:00
parent 18c0ebda0f
commit 3b2d664563
8 changed files with 57 additions and 63 deletions

View File

@ -162,11 +162,7 @@
struct radserver radiuslist[MAXRADIUS];
static int ntry = 0;
int nradservers = 0;
char radiussecret[64]="";
_3proxy_mutex_t rad_mutex;
@ -310,7 +306,7 @@ int radsend(struct clientparam * param, int auth, int stop){
char buf[64];
if(!nradservers) {
if(!conf.nradservers) {
return 4;
}
@ -510,7 +506,7 @@ int radsend(struct clientparam * param, int auth, int stop){
memcpy(ptr, param->password, len);
rad_pwencode((char *)ptr,
&len,
radiussecret,
conf.radiussecret,
(char *)packet.vector);
*(ptr-1) = len + 2;
ptr+=len;
@ -521,17 +517,17 @@ int radsend(struct clientparam * param, int auth, int stop){
packet.length = htons(total_length);
if(!auth){
len = strlen(radiussecret);
memcpy(ptr,radiussecret,len);
len = strlen(conf.radiussecret);
memcpy(ptr,conf.radiussecret,len);
md5_calc(packet.vector, (u_char *)&packet, total_length + len);
}
memcpy(vector, packet.vector, AUTH_VECTOR_LEN);
for (loop = 0; loop < nradservers && loop < MAXRADIUS; loop++) {
for (loop = 0; loop < conf.nradservers && loop < MAXRADIUS; loop++) {
SOCKET remsock;
saremote = auth?radiuslist[loop].authaddr : radiuslist[loop].logaddr;
saremote = auth?conf.radiuslist[loop].authaddr : conf.radiuslist[loop].logaddr;
#ifdef NOIPV6
if(*SAFAMILY(&saremote)!= AF_INET) {
continue;
@ -552,9 +548,9 @@ int radsend(struct clientparam * param, int auth, int stop){
remsock = sockfd;
/*
}
else remsock = radiuslist[loop].logsock;
else remsock = conf.radiuslist[loop].logsock;
*/
so._bind(so.state, remsock,(struct sockaddr *)&radiuslist[loop].localaddr,SASIZE(&radiuslist[loop].localaddr));
so._bind(so.state, remsock,(struct sockaddr *)&conf.radiuslist[loop].localaddr,SASIZE(&conf.radiuslist[loop].localaddr));
len = so._sendto(so.state, remsock, (char *)&packet, total_length, 0,
(struct sockaddr *)&saremote, sizeof(saremote));
if(len != ntohs(packet.length)){
@ -586,7 +582,7 @@ int radsend(struct clientparam * param, int auth, int stop){
continue;
}
if (calc_replydigest((char *)&rpacket, (char *)packet.vector, radiussecret,
if (calc_replydigest((char *)&rpacket, (char *)packet.vector, conf.radiussecret,
data_len) ){
continue;
}

View File

@ -296,7 +296,6 @@ struct extparam conf = {
.delimchar = '@',
};
int numservers=0;
char* NULLADDR="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

View File

@ -675,16 +675,16 @@ static int h_flushusers(int argc, unsigned char **argv){
static int h_nserver(int argc, unsigned char **argv){
char *str;
if(numservers < MAXNSERVERS) {
if(conf.numservers < MAXNSERVERS) {
if((str = strchr((char *)argv[1], '/')))
*str = 0;
*SAPORT(&nservers[numservers].addr) = htons(53);
if(parsehost(46, argv[1], (struct sockaddr *)&nservers[numservers].addr)) return 1;
*SAPORT(&conf.nservers[conf.numservers].addr) = htons(53);
if(parsehost(46, argv[1], (struct sockaddr *)&conf.nservers[conf.numservers].addr)) return 1;
if(str) {
nservers[numservers].usetcp = strstr(str + 1, "tcp")? 1:0;
conf.nservers[conf.numservers].usetcp = strstr(str + 1, "tcp")? 1:0;
*str = '/';
}
numservers++;
conf.numservers++;
}
resolvfunc = myresolver;
@ -696,10 +696,10 @@ static int h_authnserver(int argc, unsigned char **argv){
if((str = strchr((char *)argv[1], '/')))
*str = 0;
if(parsehost(46, argv[1], (struct sockaddr *)&authnserver.addr)) return 1;
*SAPORT(&authnserver.addr) = htons(53);
if(parsehost(46, argv[1], (struct sockaddr *)&conf.authnserver.addr)) return 1;
*SAPORT(&conf.authnserver.addr) = htons(53);
if(str) {
authnserver.usetcp = strstr(str + 1, "tcp")? 1:0;
conf.authnserver.usetcp = strstr(str + 1, "tcp")? 1:0;
*str = '/';
}
return 0;
@ -1773,21 +1773,21 @@ static int h_delimchar(int argc, unsigned char **argv){
static int h_radius(int argc, unsigned char **argv){
uint16_t port;
memset(radiuslist, 0, sizeof(radiuslist));
memset(conf.radiuslist, 0, sizeof(conf.radiuslist));
if(strlen((char *)argv[1]) > 63) argv[1][63] = 0;
strcpy(radiussecret, (char *)argv[1]);
for( nradservers=0; nradservers < MAXRADIUS && nradservers < argc -2; nradservers++){
strcpy(conf.radiussecret, (char *)argv[1]);
for( conf.nradservers=0; conf.nradservers < MAXRADIUS && conf.nradservers < argc -2; conf.nradservers++){
char *s = 0;
if((s=strchr((char *)argv[nradservers + 2], '/'))){
if((s=strchr((char *)argv[conf.nradservers + 2], '/'))){
*s = 0;
s++;
}
if( !getip46(46, argv[nradservers + 2], (struct sockaddr *)&radiuslist[nradservers].authaddr)) return 1;
if( s && !getip46(46, (unsigned char *)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);
if( !getip46(46, argv[conf.nradservers + 2], (struct sockaddr *)&conf.radiuslist[conf.nradservers].authaddr)) return 1;
if( s && !getip46(46, (unsigned char *)s, (struct sockaddr *)&conf.radiuslist[conf.nradservers].localaddr)) return 2;
if(!*SAPORT(&conf.radiuslist[conf.nradservers].authaddr))*SAPORT(&conf.radiuslist[conf.nradservers].authaddr) = htons(1812);
port = ntohs(*SAPORT(&conf.radiuslist[conf.nradservers].authaddr));
conf.radiuslist[conf.nradservers].logaddr = conf.radiuslist[conf.nradservers].authaddr;
*SAPORT(&conf.radiuslist[conf.nradservers].logaddr) = htons(port+1);
}
return 0;
}
@ -2419,7 +2419,7 @@ void freeconf(struct extparam *confp){
confp->maxchild = DEFAULT_MAXCHILD;
confp->backlog = 0;
resolvfunc = NULL;
numservers = 0;
conf.numservers = 0;
acl = confp->acl;
confp->acl = NULL;

View File

@ -145,17 +145,17 @@ void * dnsprchild(struct clientparam* param) {
}
else ip = 0;
}
if(!ip && numservers){
if((param->remsock=param->srv->so._socket(param->sostate, SASOCK(&nservers[0].addr), nservers[0].usetcp? SOCK_STREAM:SOCK_DGRAM, nservers[0].usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {
if(!ip && conf.numservers){
if((param->remsock=param->srv->so._socket(param->sostate, SASOCK(&conf.nservers[0].addr), conf.nservers[0].usetcp? SOCK_STREAM:SOCK_DGRAM, conf.nservers[0].usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {
RETURN(818);
}
memset(&param->sinsl, 0, sizeof(param->sinsl));
*SAFAMILY(&param->sinsl) = *SAFAMILY(&nservers[0].addr);
*SAFAMILY(&param->sinsl) = *SAFAMILY(&conf.nservers[0].addr);
if(bindwithrange(param, param->remsock, &param->sinsl, param->extport)) {
RETURN(819);
}
param->sinsr = nservers[0].addr;
if(nservers[0].usetcp) {
param->sinsr = conf.nservers[0].addr;
if(conf.nservers[0].usetcp) {
if(connectwithpoll(param, param->remsock,(struct sockaddr *)&param->sinsr,SASIZE(&param->sinsr),param->srv->timeouts[CONNECT_TO])) RETURN(830);
buf-=2;
*(unsigned short*)buf = htons(i);
@ -180,7 +180,7 @@ void * dnsprchild(struct clientparam* param) {
}
param->statssrv64 += len;
param->nreads++;
if(nservers[0].usetcp) {
if(conf.nservers[0].usetcp) {
unsigned short us;
us = ntohs(*(unsigned short *)buf);
if(us > 4096) RETURN(833);

View File

@ -45,7 +45,7 @@ struct symbol symbols[] = {
{symbols+18, "ipauth", (void *) ipauth},
{symbols+19, "strongauth", (void *) strongauth},
{symbols+20, "checkACL", (void *) checkACL},
{symbols+21, "nservers", (void *) nservers},
{symbols+21, "nservers", (void *) conf.nservers},
{symbols+22, "udpresolve", (void *) udpresolve},
{symbols+23, "bandlim_mutex", (void *) &bandlim_mutex},
{symbols+24, "tc_mutex", (void *) &tc_mutex},
@ -87,7 +87,7 @@ static void * findbyname(const char *name){
struct pluginlink pluginlink = {
{symbols, "", NULL},
&conf,
nservers,
conf.nservers,
&linenum,
authfuncs,
commandhandlers,

View File

@ -34,7 +34,6 @@
#define MAXUSERNAME 128
#define _PASSWORD_LEN 256
#define MAXNSERVERS 5
#define DEFAULT_MAXCHILD 500
/* How much of a connection's buffer is read into at once: all of it, or
@ -203,7 +202,6 @@ size_t threadstacksize(int extra);
#include "structures.h"
#define MAXRADIUS 5
#define DEFLOGFORMAT "G%y%m%d%H%M%S.%. %p %E %U %C:%c %R:%r %O %I %h %T"
@ -298,8 +296,6 @@ int handleredirect(struct clientparam * param, struct ace * acentry);
int scanaddr(const unsigned char *s, uint32_t * ip, uint32_t * mask);
int myinet_ntop(int af, void *src, char *dst, socklen_t size);
extern struct nserver nservers[MAXNSERVERS];
extern struct nserver authnserver;
uint32_t getip(unsigned char *name);
uint32_t getip46(int family, unsigned char *name, struct sockaddr *sa);
int afdetect(unsigned char *name);
@ -502,12 +498,6 @@ void make_un(const unsigned char *path, struct sockaddr_un * sun);
#endif
extern struct radserver {
PROXYSOCKADDRTYPE authaddr, logaddr, localaddr;
} radiuslist[MAXRADIUS];
extern char radiussecret[64];
extern int nradservers;
extern struct socketoptions {
int opt;
char * optname;

View File

@ -1,7 +1,5 @@
#include "proxy.h"
struct nserver nservers[MAXNSERVERS] = {{{0},0}, {{0},0}, {{0},0}, {{0},0}, {{0},0}};
struct nserver authnserver;
static int dnsqmatch(const unsigned char *a, const unsigned char *b, int len){
int i;
@ -28,7 +26,7 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_
if((af == AF_INET6) && (retval = hashresolv(&dns6_table, name, value, retttl))) {
return retval;
}
n = (makeauth && !SAISNULL(&authnserver.addr))? 1 : numservers;
n = (makeauth && !SAISNULL(&conf.authnserver.addr))? 1 : conf.numservers;
for(i=0; i<n; i++){
unsigned short nq, na;
unsigned char b[4098], *buf, *s1, *s2;
@ -51,13 +49,13 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_
memset(sinsr, 0, sizeof(addr));
if(makeauth && !SAISNULL(&authnserver.addr)){
usetcp = authnserver.usetcp;
*SAFAMILY(sinsl) = *SAFAMILY(&authnserver.addr);
if(makeauth && !SAISNULL(&conf.authnserver.addr)){
usetcp = conf.authnserver.usetcp;
*SAFAMILY(sinsl) = *SAFAMILY(&conf.authnserver.addr);
}
else {
usetcp = nservers[i].usetcp;
*SAFAMILY(sinsl) = *SAFAMILY(&nservers[i].addr);
usetcp = conf.nservers[i].usetcp;
*SAFAMILY(sinsl) = *SAFAMILY(&conf.nservers[i].addr);
}
if((sock=so._socket(so.state, SASOCK(sinsl), usetcp?SOCK_STREAM:SOCK_DGRAM, usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) break;
if(so._bind(so.state, sock,(struct sockaddr *)sinsl,SASIZE(sinsl))){
@ -65,11 +63,11 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_
so._closesocket(so.state, sock);
break;
}
if(makeauth && !SAISNULL(&authnserver.addr)){
*sinsr = authnserver.addr;
if(makeauth && !SAISNULL(&conf.authnserver.addr)){
*sinsr = conf.authnserver.addr;
}
else {
*sinsr = nservers[i].addr;
*sinsr = conf.nservers[i].addr;
}
if(usetcp){
if(connectwithpoll(NULL, sock,(struct sockaddr *)sinsr,SASIZE(sinsr),conf.timeouts[CONNECT_TO])) {

View File

@ -488,7 +488,13 @@ struct nserver {
PROXYSOCKADDRTYPE addr;
int usetcp;
};
extern int numservers;
#define MAXNSERVERS 5
#define MAXRADIUS 5
struct radserver {
PROXYSOCKADDRTYPE authaddr, logaddr, localaddr;
};
typedef void * (* PROXYFUNC)(struct clientparam *);
@ -886,6 +892,11 @@ struct extparam {
time_t logtime, time;
unsigned logdumpsrv, logdumpcli;
char delimchar;
struct nserver nservers[MAXNSERVERS], authnserver;
int numservers;
struct radserver radiuslist[MAXRADIUS];
int nradservers;
char radiussecret[64];
};
struct property {