From 3b2d664563394fab37bdd48636fb88fbf2568cb1 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Tue, 13 Oct 2026 15:39:37 +0300 Subject: [PATCH] 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 --- src/authradius.c | 22 +++++++++------------- src/common.c | 1 - src/conf.c | 38 +++++++++++++++++++------------------- src/dnspr.c | 12 ++++++------ src/plugins.c | 4 ++-- src/proxy.h | 10 ---------- src/resolve.c | 20 +++++++++----------- src/structures.h | 13 ++++++++++++- 8 files changed, 57 insertions(+), 63 deletions(-) diff --git a/src/authradius.c b/src/authradius.c index c66586c..6434f0c 100644 --- a/src/authradius.c +++ b/src/authradius.c @@ -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; } diff --git a/src/common.c b/src/common.c index 0edf0ea..83bceb2 100644 --- a/src/common.c +++ b/src/common.c @@ -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"; diff --git a/src/conf.c b/src/conf.c index 7316194..0b87c63 100644 --- a/src/conf.c +++ b/src/conf.c @@ -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; diff --git a/src/dnspr.c b/src/dnspr.c index 551a2a6..b321b49 100644 --- a/src/dnspr.c +++ b/src/dnspr.c @@ -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(¶m->sinsl, 0, sizeof(param->sinsl)); - *SAFAMILY(¶m->sinsl) = *SAFAMILY(&nservers[0].addr); + *SAFAMILY(¶m->sinsl) = *SAFAMILY(&conf.nservers[0].addr); if(bindwithrange(param, param->remsock, ¶m->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 *)¶m->sinsr,SASIZE(¶m->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); diff --git a/src/plugins.c b/src/plugins.c index e414059..f134d9d 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -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, diff --git a/src/proxy.h b/src/proxy.h index 6be4219..50af07c 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -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; diff --git a/src/resolve.c b/src/resolve.c index 4b296a8..532076a 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -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