Reach the configuration through a pointer

conf is now a pointer to the current configuration rather than the
structure itself: at first confboot, which exists before main() runs, as
plugins and the standalone services use it too; later configurations
will start from confdefaults. Both are made from confinit.h, the one list
of initial values. The timeouts are an array of the configuration
instead of a pointer to a global one. Nothing behaves differently yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Vladimir Dubrovin 2026-10-13 19:12:54 +03:00
parent 8bd5c0f0fa
commit 737bdc7d24
19 changed files with 398 additions and 389 deletions

View File

@ -29,7 +29,7 @@ void httpsrv_init(void);
#endif #endif
#ifndef DEFAULTCONFIG #ifndef DEFAULTCONFIG
#define DEFAULTCONFIG conf.stringtable[25] #define DEFAULTCONFIG conf->stringtable[25]
#endif #endif
FILE * confopen(); FILE * confopen();
@ -73,13 +73,13 @@ void __stdcall CommandHandler( DWORD dwCommand )
case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_SHUTDOWN:
SetStatus( SERVICE_STOP_PENDING, 0, 1 ); SetStatus( SERVICE_STOP_PENDING, 0, 1 );
timetoexit = 1; timetoexit = 1;
conf.paused++; conf->paused++;
/* ServiceMain() reports the service stopped once cyclestep() has /* ServiceMain() reports the service stopped once cyclestep() has
seen this and the services are done */ seen this and the services are done */
break; break;
case SERVICE_CONTROL_PAUSE: case SERVICE_CONTROL_PAUSE:
SetStatus( SERVICE_PAUSE_PENDING, 0, 1 ); SetStatus( SERVICE_PAUSE_PENDING, 0, 1 );
conf.paused++; conf->paused++;
SetStatus( SERVICE_PAUSED, 0, 0 ); SetStatus( SERVICE_PAUSED, 0, 0 );
break; break;
case SERVICE_CONTROL_CONTINUE: case SERVICE_CONTROL_CONTINUE:
@ -95,7 +95,7 @@ void __stdcall CommandHandler( DWORD dwCommand )
void __stdcall ServiceMain(int argc, unsigned char* argv[] ) void __stdcall ServiceMain(int argc, unsigned char* argv[] )
{ {
hSrv = RegisterServiceCtrlHandler((LPCSTR)conf.stringtable[1], (LPHANDLER_FUNCTION)CommandHandler); hSrv = RegisterServiceCtrlHandler((LPCSTR)conf->stringtable[1], (LPHANDLER_FUNCTION)CommandHandler);
if( hSrv == 0 ) return; if( hSrv == 0 ) return;
SetStatus( SERVICE_START_PENDING, 0, 1 ); SetStatus( SERVICE_START_PENDING, 0, 1 );
@ -122,7 +122,7 @@ int even = 0;
void mysigpause (int sig){ void mysigpause (int sig){
conf.paused++; conf->paused++;
even = !even; even = !even;
if(!even){ if(!even){
needreload = 1; needreload = 1;
@ -130,7 +130,7 @@ void mysigpause (int sig){
} }
void mysigterm (int sig){ void mysigterm (int sig){
conf.paused++; conf->paused++;
timetoexit = 1; timetoexit = 1;
} }
@ -207,13 +207,13 @@ void dumpcounters(struct trafcount *tlin, int counterd){
if(counterd >= 0 && tlin) { if(counterd >= 0 && tlin) {
curtime = time(0); curtime = time(0);
if(cheader.updated && conf.countertype && timechanged(cheader.updated, curtime, conf.countertype)){ if(cheader.updated && conf->countertype && timechanged(cheader.updated, curtime, conf->countertype)){
FILE * cfp; FILE * cfp;
cfp = fopen((char *)dologname(tmpbuf, (unsigned char *)conf.counterfile, NULL, conf.countertype, cheader.updated), "w"); cfp = fopen((char *)dologname(tmpbuf, (unsigned char *)conf->counterfile, NULL, conf->countertype, cheader.updated), "w");
if(cfp){ if(cfp){
for(tl = tlin; cfp && tl; tl = tl->next){ for(tl = tlin; cfp && tl; tl = tl->next){
if(tl->type >= conf.countertype) if(tl->type >= conf->countertype)
fprintf(cfp, "%05d %020"PRIu64"%s%s\n", tl->number, tl->v->traf64, tl->comment?" #" : "", tl->comment? tl->comment : ""); fprintf(cfp, "%05d %020"PRIu64"%s%s\n", tl->number, tl->v->traf64, tl->comment?" #" : "", tl->comment? tl->comment : "");
} }
fclose(cfp); fclose(cfp);
@ -291,12 +291,12 @@ void cyclestep(void){
needreload = 0; needreload = 0;
} }
doschedule(); doschedule();
if(conf.stdlog)fflush(conf.stdlog); if(conf->stdlog)fflush(conf->stdlog);
if(timechanged(minutecounter, curtime, MINUTELY)) { if(timechanged(minutecounter, curtime, MINUTELY)) {
struct filemon *fm; struct filemon *fm;
struct stat sb; struct stat sb;
for(fm=conf.fmon; fm; fm=fm->next){ for(fm=conf->fmon; fm; fm=fm->next){
if(!stat(fm->path, &sb)){ if(!stat(fm->path, &sb)){
if(fm->sb.st_mtime != sb.st_mtime || fm->sb.st_size != sb.st_size){ if(fm->sb.st_mtime != sb.st_mtime || fm->sb.st_size != sb.st_size){
stat(fm->path, &fm->sb); stat(fm->path, &fm->sb);
@ -314,15 +314,15 @@ void cyclestep(void){
basetime = mktime(tm); basetime = mktime(tm);
} }
} }
if(conf.logname) { if(conf->logname) {
if(timechanged(conf.logtime, curtime, conf.logtype)) { if(timechanged(conf->logtime, curtime, conf->logtype)) {
if(conf.stdlog) conf.stdlog = freopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, curtime), "a", conf.stdlog); if(conf->stdlog) conf->stdlog = freopen((char *)dologname (tmpbuf, conf->logname, NULL, conf->logtype, curtime), "a", conf->stdlog);
else conf.stdlog = fopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, curtime), "a"); else conf->stdlog = fopen((char *)dologname (tmpbuf, conf->logname, NULL, conf->logtype, curtime), "a");
conf.logtime = curtime; conf->logtime = curtime;
if(conf.logtype != NONE && conf.rotate) { if(conf->logtype != NONE && conf->rotate) {
int t; int t;
t = 1; t = 1;
switch(conf.logtype){ switch(conf->logtype){
case ANNUALLY: case ANNUALLY:
t = t * 12; t = t * 12;
case MONTHLY: case MONTHLY:
@ -338,38 +338,38 @@ void cyclestep(void){
default: default:
break; break;
} }
dologname (tmpbuf, conf.logname, (conf.archiver)?conf.archiver[1]:NULL, conf.logtype, (conf.logtime - (time_t)t * conf.rotate)); dologname (tmpbuf, conf->logname, (conf->archiver)?conf->archiver[1]:NULL, conf->logtype, (conf->logtime - (time_t)t * conf->rotate));
remove ((char *) tmpbuf); remove ((char *) tmpbuf);
if(conf.archiver) { if(conf->archiver) {
int i; int i;
*tmpbuf = 0; *tmpbuf = 0;
for(i = 2; i < conf.archiverc && strlen((char *)tmpbuf) < 512; i++){ for(i = 2; i < conf->archiverc && strlen((char *)tmpbuf) < 512; i++){
strcat((char *)tmpbuf, " "); strcat((char *)tmpbuf, " ");
if(!strcmp((char *)conf.archiver[i], "%A")){ if(!strcmp((char *)conf->archiver[i], "%A")){
strcat((char *)tmpbuf, "\""); strcat((char *)tmpbuf, "\"");
dologname (tmpbuf + strlen((char *)tmpbuf), conf.logname, conf.archiver[1], conf.logtype, (conf.logtime - t)); dologname (tmpbuf + strlen((char *)tmpbuf), conf->logname, conf->archiver[1], conf->logtype, (conf->logtime - t));
strcat((char *)tmpbuf, "\""); strcat((char *)tmpbuf, "\"");
} }
else if(!strcmp((char *)conf.archiver[i], "%F")){ else if(!strcmp((char *)conf->archiver[i], "%F")){
strcat((char *)tmpbuf, "\""); strcat((char *)tmpbuf, "\"");
dologname (tmpbuf+strlen((char *)tmpbuf), conf.logname, NULL, conf.logtype, (conf.logtime-t)); dologname (tmpbuf+strlen((char *)tmpbuf), conf->logname, NULL, conf->logtype, (conf->logtime-t));
strcat((char *)tmpbuf, "\""); strcat((char *)tmpbuf, "\"");
} }
else else
strcat((char *)tmpbuf, (char *)conf.archiver[i]); strcat((char *)tmpbuf, (char *)conf->archiver[i]);
} }
if(system((char *)tmpbuf+1)){} if(system((char *)tmpbuf+1)){}
} }
} }
} }
} }
if(conf.counterd >= 0 && conf.trafcounter) { if(conf->counterd >= 0 && conf->trafcounter) {
if(timechanged(cheader.updated, curtime, MINUTELY)){ if(timechanged(cheader.updated, curtime, MINUTELY)){
dumpcounters(conf.trafcounter, conf.counterd); dumpcounters(conf->trafcounter, conf->counterd);
} }
} }
if(timetoexit){ if(timetoexit){
conf.paused++; conf->paused++;
doschedule(); doschedule();
waitservices(); waitservices();
pooldrain(); pooldrain();
@ -424,7 +424,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
hwnd = CreateWindowEx(0,L"3proxy",L"3proxy",WS_VISIBLE|WS_POPUP,0,0,0,0,0,0,hInstance,0); hwnd = CreateWindowEx(0,L"3proxy",L"3proxy",WS_VISIBLE|WS_POPUP,0,0,0,0,0,0,hInstance,0);
#endif #endif
conf.stringtable = strings; conf->stringtable = strings;
#ifdef _WIN32 #ifdef _WIN32
#ifndef _WINCE #ifndef _WINCE
if((argc == 2 || argc == 3)&& !strcmp((char *)argv[1], "--install")) { if((argc == 2 || argc == 3)&& !strcmp((char *)argv[1], "--install")) {
@ -432,8 +432,8 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
sprintf((char *)tmpbuf, "%s will be installed and started.\n" sprintf((char *)tmpbuf, "%s will be installed and started.\n"
"By clicking Yes you confirm you read and accepted License Agreement.\n" "By clicking Yes you confirm you read and accepted License Agreement.\n"
"You can use Administration/Services to control %s service.", "You can use Administration/Services to control %s service.",
conf.stringtable[1], conf.stringtable[2]); conf->stringtable[1], conf->stringtable[2]);
if(MessageBox(NULL, (LPCSTR)tmpbuf, (LPCSTR)conf.stringtable[2], MB_YESNO|MB_ICONASTERISK) != IDYES) return 1; if(MessageBox(NULL, (LPCSTR)tmpbuf, (LPCSTR)conf->stringtable[2], MB_YESNO|MB_ICONASTERISK) != IDYES) return 1;
*tmpbuf = '\"'; *tmpbuf = '\"';
@ -454,7 +454,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
perror("Failed to open Service Manager"); perror("Failed to open Service Manager");
RETURN(101); RETURN(101);
} }
if (!(sch = CreateService(sch, (LPCSTR)conf.stringtable[1], (LPCSTR)conf.stringtable[2], GENERIC_EXECUTE, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, (char *)tmpbuf, NULL, NULL, NULL, NULL, NULL))){ if (!(sch = CreateService(sch, (LPCSTR)conf->stringtable[1], (LPCSTR)conf->stringtable[2], GENERIC_EXECUTE, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, (char *)tmpbuf, NULL, NULL, NULL, NULL, NULL))){
perror("Failed to create service"); perror("Failed to create service");
RETURN(103); RETURN(103);
} }
@ -475,7 +475,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
RETURN(104); RETURN(104);
} }
if(RegSetValueEx( runsrv, if(RegSetValueEx( runsrv,
(LPCSTR)conf.stringtable[1], (LPCSTR)conf->stringtable[1],
0, 0,
REG_EXPAND_SZ, REG_EXPAND_SZ,
(BYTE *)tmpbuf, (BYTE *)tmpbuf,
@ -496,7 +496,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
perror("Failed to open Service Manager\n"); perror("Failed to open Service Manager\n");
RETURN(106); RETURN(106);
} }
if (!(sch = OpenService(sch, (LPCSTR)conf.stringtable[1], DELETE))){ if (!(sch = OpenService(sch, (LPCSTR)conf->stringtable[1], DELETE))){
perror("Failed to open service"); perror("Failed to open service");
RETURN(107); RETURN(107);
} }
@ -515,7 +515,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
perror("Failed to open registry"); perror("Failed to open registry");
RETURN(109); RETURN(109);
} }
if(RegDeleteValue(runsrv, (LPCSTR)conf.stringtable[1]) != ERROR_SUCCESS){ if(RegDeleteValue(runsrv, (LPCSTR)conf->stringtable[1]) != ERROR_SUCCESS){
perror("Failed to clear registry"); perror("Failed to clear registry");
RETURN(110); RETURN(110);
} }
@ -528,8 +528,8 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
} }
#endif #endif
#endif #endif
conf.conffile = strdup((argc==2)?argv[1]:(char*)DEFAULTCONFIG); conf->conffile = strdup((argc==2)?argv[1]:(char*)DEFAULTCONFIG);
if(conf.conffile && *conf.conffile != '-') { if(conf->conffile && *conf->conffile != '-') {
fp = confopen(); fp = confopen();
#ifndef _WIN32 #ifndef _WIN32
if(!fp) fp = stdin; if(!fp) fp = stdin;
@ -545,7 +545,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
fprintf(stderr, "\n if conffile is missing, configuration is expected from stdin\n"); fprintf(stderr, "\n if conffile is missing, configuration is expected from stdin\n");
#endif #endif
fprintf(stderr, "available socket options:\n\t%s\n", printopts("\n\t")); fprintf(stderr, "available socket options:\n\t%s\n", printopts("\n\t"));
fprintf(stderr, "\n%s %s\n%s\n", conf.stringtable[2], conf.stringtable[3], copyright); fprintf(stderr, "\n%s %s\n%s\n", conf->stringtable[2], conf->stringtable[3], copyright);
return 1; return 1;
} }
@ -581,10 +581,10 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
httpsrv_init(); httpsrv_init();
#endif #endif
freeconf(&conf); freeconf(conf);
initcommands(); initcommands();
res = readconfig(fp); res = readconfig(fp);
conf.version++; conf->version++;
/* readconfig() names the failing line, which an exit status would cut /* readconfig() names the failing line, which an exit status would cut
to 8 bits: a failed configuration exits with 1 */ to 8 bits: a failed configuration exits with 1 */
@ -597,7 +597,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
if(service){ if(service){
SERVICE_TABLE_ENTRY ste[] = SERVICE_TABLE_ENTRY ste[] =
{ {
{ (LPSTR)conf.stringtable[1], (LPSERVICE_MAIN_FUNCTION)ServiceMain}, { (LPSTR)conf->stringtable[1], (LPSERVICE_MAIN_FUNCTION)ServiceMain},
{ NULL, NULL } { NULL, NULL }
}; };
if(!StartServiceCtrlDispatcher( ste ))cyclestep(); if(!StartServiceCtrlDispatcher( ste ))cyclestep();

View File

@ -17,7 +17,7 @@ int alwaysauth(struct clientparam * param){
int countout = 0; int countout = 0;
if(conf.connlimiter && !param->connlim && startconnlims(param)) return 10; if(conf->connlimiter && !param->connlim && startconnlims(param)) return 10;
#ifdef WITH_HTTPSRV #ifdef WITH_HTTPSRV
/* The http server answers the request itself, so authorization must not /* The http server answers the request itself, so authorization must not
try to reach a destination that does not exist. A request it has handed try to reach a destination that does not exist. A request it has handed
@ -27,15 +27,15 @@ int alwaysauth(struct clientparam * param){
res = doconnect(param); res = doconnect(param);
#endif #endif
if(!res){ if(!res){
if(conf.bandlimfunc && (conf.bandlimiter||conf.bandlimiterout)){ if(conf->bandlimfunc && (conf->bandlimiter||conf->bandlimiterout)){
_3proxy_mutex_lock(&bandlim_mutex); _3proxy_mutex_lock(&bandlim_mutex);
initbandlims(param); initbandlims(param);
_3proxy_mutex_unlock(&bandlim_mutex); _3proxy_mutex_unlock(&bandlim_mutex);
} }
if(conf.trafcountfunc && conf.trafcounter) { if(conf->trafcountfunc && conf->trafcounter) {
_3proxy_mutex_lock(&tc_mutex); _3proxy_mutex_lock(&tc_mutex);
for(tc = conf.trafcounter; tc; tc = tc->next) { for(tc = conf->trafcounter; tc; tc = tc->next) {
if(tc->disabled) continue; if(tc->disabled) continue;
if(ACLmatches(tc->ace, param)){ if(ACLmatches(tc->ace, param)){
if(tc->ace->action == NOCOUNTIN) { if(tc->ace->action == NOCOUNTIN) {
@ -51,11 +51,11 @@ int alwaysauth(struct clientparam * param){
_3proxy_mutex_unlock(&tc_mutex); _3proxy_mutex_unlock(&tc_mutex);
return 10; return 10;
} }
param->trafcountfunc = conf.trafcountfunc; param->trafcountfunc = conf->trafcountfunc;
param->maxtrafin64 = tc->traflim64 - tc->v->traf64; param->maxtrafin64 = tc->traflim64 - tc->v->traf64;
} }
} }
if(countout)for(tc = conf.trafcounter; tc; tc = tc->next) { if(countout)for(tc = conf->trafcounter; tc; tc = tc->next) {
if(tc->disabled) continue; if(tc->disabled) continue;
if(ACLmatches(tc->ace, param)){ if(ACLmatches(tc->ace, param)){
if(tc->ace->action == NOCOUNTOUT || tc->ace->action == NOCOUNTALL) break; if(tc->ace->action == NOCOUNTOUT || tc->ace->action == NOCOUNTALL) break;
@ -66,7 +66,7 @@ int alwaysauth(struct clientparam * param){
_3proxy_mutex_unlock(&tc_mutex); _3proxy_mutex_unlock(&tc_mutex);
return 10; return 10;
} }
param->trafcountfunc = conf.trafcountfunc; param->trafcountfunc = conf->trafcountfunc;
param->maxtrafout64 = tc->traflim64 - tc->v->traf64; param->maxtrafout64 = tc->traflim64 - tc->v->traf64;
} }
} }

View File

@ -306,7 +306,7 @@ int radsend(struct clientparam * param, int auth, int stop){
char buf[64]; char buf[64];
if(!conf.nradservers) { if(!conf->nradservers) {
return 4; return 4;
} }
@ -371,12 +371,12 @@ int radsend(struct clientparam * param, int auth, int stop){
total_length += (2+len); total_length += (2+len);
/* NAS-Identifier */ /* NAS-Identifier */
if(conf.stringtable){ if(conf->stringtable){
*ptr++ = PW_NAS_IDENTIFIER; *ptr++ = PW_NAS_IDENTIFIER;
len = strlen((char *)conf.stringtable[SERVICES+param->service]); len = strlen((char *)conf->stringtable[SERVICES+param->service]);
if(len > 253) len = 253; if(len > 253) len = 253;
*ptr++ = (2 + len); *ptr++ = (2 + len);
memcpy(ptr, conf.stringtable[SERVICES+param->service], len); memcpy(ptr, conf->stringtable[SERVICES+param->service], len);
ptr += len; ptr += len;
total_length+=(len+2); total_length+=(len+2);
} }
@ -506,7 +506,7 @@ int radsend(struct clientparam * param, int auth, int stop){
memcpy(ptr, param->password, len); memcpy(ptr, param->password, len);
rad_pwencode((char *)ptr, rad_pwencode((char *)ptr,
&len, &len,
conf.radiussecret, conf->radiussecret,
(char *)packet.vector); (char *)packet.vector);
*(ptr-1) = len + 2; *(ptr-1) = len + 2;
ptr+=len; ptr+=len;
@ -517,17 +517,17 @@ int radsend(struct clientparam * param, int auth, int stop){
packet.length = htons(total_length); packet.length = htons(total_length);
if(!auth){ if(!auth){
len = strlen(conf.radiussecret); len = strlen(conf->radiussecret);
memcpy(ptr,conf.radiussecret,len); memcpy(ptr,conf->radiussecret,len);
md5_calc(packet.vector, (u_char *)&packet, total_length + len); md5_calc(packet.vector, (u_char *)&packet, total_length + len);
} }
memcpy(vector, packet.vector, AUTH_VECTOR_LEN); memcpy(vector, packet.vector, AUTH_VECTOR_LEN);
for (loop = 0; loop < conf.nradservers && loop < MAXRADIUS; loop++) { for (loop = 0; loop < conf->nradservers && loop < MAXRADIUS; loop++) {
SOCKET remsock; SOCKET remsock;
saremote = auth?conf.radiuslist[loop].authaddr : conf.radiuslist[loop].logaddr; saremote = auth?conf->radiuslist[loop].authaddr : conf->radiuslist[loop].logaddr;
#ifdef NOIPV6 #ifdef NOIPV6
if(*SAFAMILY(&saremote)!= AF_INET) { if(*SAFAMILY(&saremote)!= AF_INET) {
continue; continue;
@ -548,9 +548,9 @@ int radsend(struct clientparam * param, int auth, int stop){
remsock = sockfd; remsock = sockfd;
/* /*
} }
else remsock = conf.radiuslist[loop].logsock; else remsock = conf->radiuslist[loop].logsock;
*/ */
so._bind(so.state, remsock,(struct sockaddr *)&conf.radiuslist[loop].localaddr,SASIZE(&conf.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, len = so._sendto(so.state, remsock, (char *)&packet, total_length, 0,
(struct sockaddr *)&saremote, sizeof(saremote)); (struct sockaddr *)&saremote, sizeof(saremote));
if(len != ntohs(packet.length)){ if(len != ntohs(packet.length)){
@ -560,7 +560,7 @@ int radsend(struct clientparam * param, int auth, int stop){
memset(fds, 0, sizeof(fds)); memset(fds, 0, sizeof(fds));
fds[0].fd = remsock; fds[0].fd = remsock;
fds[0].events = POLLIN; fds[0].events = POLLIN;
if(so._poll(so.state, fds, 1, conf.timeouts[SINGLEBYTE_L]*1000) <= 0) { if(so._poll(so.state, fds, 1, conf->timeouts[SINGLEBYTE_L]*1000) <= 0) {
continue; continue;
} }
@ -582,7 +582,7 @@ int radsend(struct clientparam * param, int auth, int stop){
continue; continue;
} }
if (calc_replydigest((char *)&rpacket, (char *)packet.vector, conf.radiussecret, if (calc_replydigest((char *)&rpacket, (char *)packet.vector, conf->radiussecret,
data_len) ){ data_len) ){
continue; continue;
} }

View File

@ -204,20 +204,6 @@ char *rotations[] = {
time_t curtime; time_t curtime;
int timetoexit = 0, needreload = 0; int timetoexit = 0, needreload = 0;
int timeouts[12] = {
1, /* SINGLEBYTE_S */
5, /* SINGLEBYTE_L */
30, /* STRING_S */
60, /* STRING_L */
180, /* CONNECTION_S */
1800, /* CONNECTION_L */
15, /* DNS_TO */
60, /* CHAIN_TO */
15, /* CONNECT_TO */
5, /* CONNBACK_TO */
5, /* LINGER_TO */
0
};
#ifndef _WIN32 #ifndef _WIN32
/* PTHREAD_STACK_MIN is 128K on glibc/aarch64 and glibc/powerpc and may be /* PTHREAD_STACK_MIN is 128K on glibc/aarch64 and glibc/powerpc and may be
@ -234,67 +220,15 @@ size_t threadstacksize(int extra){
struct threadpool tpool; struct threadpool tpool;
struct extparam conf = { /* A configuration starts as confdefaults; conf is the current one, at first
.timeouts = timeouts, confboot, which exists before main() runs. */
.acl = NULL, const struct extparam confdefaults = {
.conffile = NULL, #include "confinit.h"
.bandlimiter = NULL,
.bandlimiterout = NULL,
.connlimiter = NULL,
.trafcounter = NULL,
.services = NULL,
.stacksize = 0,
.poolmax = -1,
.pooltimeout = 60,
.counterd = -1,
.rotate = 0,
.paused = 0,
.archiverc = 0,
.demon = 0,
.maxchild = DEFAULT_MAXCHILD,
.backlog = 0,
.version = 0,
.noforce = 0,
.bandlimver = 0,
.parentretries = 2,
.authcachetype = 6,
.authcachetime = 600,
.filtermaxsize = 1048576,
.gracetraf = 0,
.gracenum = 0,
.gracedelay = 0,
.maxseg = 0,
.logname = NULL,
.archiver = NULL,
.logtype = NONE,
.countertype = NONE,
.counterfile = NULL,
#ifndef NOIPV6
.intsa = {AF_INET},
.extsa6 = {AF_INET6},
.extsa = {AF_INET},
#else
.intsa = {AF_INET},
.extsa = {AF_INET},
#endif
.pwl = NULL,
.authenticate = NULL,
.authfunc = doconnect,
.logfunc = lognone,
.bandlimfunc = NULL,
.trafcountfunc = NULL,
.logtarget = NULL,
.logformat = NULL,
.fmon = NULL,
.filters = NULL,
.authfuncs = NULL,
.stdlog = NULL,
.stringtable = NULL,
.logtime = (time_t)0,
.logdumpsrv = 0,
.logdumpcli = 0,
.delimchar = '@',
}; };
struct extparam confboot = {
#include "confinit.h"
};
struct extparam *conf = &confboot;
char* NULLADDR="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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

@ -31,7 +31,7 @@ void transparent_install(void);
#endif #endif
#ifndef DEFAULTCONFIG #ifndef DEFAULTCONFIG
#define DEFAULTCONFIG conf.stringtable[25] #define DEFAULTCONFIG conf->stringtable[25]
#endif #endif
_3proxy_mutex_t bandlim_mutex; _3proxy_mutex_t bandlim_mutex;
@ -63,12 +63,12 @@ struct trafvalue * trafvalue(unsigned number){
if(!(tc = malloc(sizeof(*tc)))) return NULL; if(!(tc = malloc(sizeof(*tc)))) return NULL;
memset(tc, 0, sizeof(*tc)); memset(tc, 0, sizeof(*tc));
tc->number = number; tc->number = number;
if(conf.counterd >= 0) { if(conf->counterd >= 0) {
lseek(conf.counterd, lseek(conf->counterd,
sizeof(struct counter_header) + (number - 1) * sizeof(struct counter_record), sizeof(struct counter_header) + (number - 1) * sizeof(struct counter_record),
SEEK_SET); SEEK_SET);
memset(&crecord, 0, sizeof(struct counter_record)); memset(&crecord, 0, sizeof(struct counter_record));
if(read(conf.counterd, &crecord, sizeof(struct counter_record)) == sizeof(struct counter_record)){ if(read(conf->counterd, &crecord, sizeof(struct counter_record)) == sizeof(struct counter_record)){
if(crecord.cleared < 0 || crecord.cleared >= MAX_COUNTER_TIME || crecord.updated < 0 || crecord.updated >= MAX_COUNTER_TIME){ if(crecord.cleared < 0 || crecord.cleared >= MAX_COUNTER_TIME || crecord.updated < 0 || crecord.updated >= MAX_COUNTER_TIME){
free(tc); free(tc);
return NULL; return NULL;
@ -99,7 +99,7 @@ static pthread_attr_t pa;
char * curconf = NULL; char * curconf = NULL;
FILE * confopen(){ FILE * confopen(){
curconf = conf.conffile; curconf = conf->conffile;
#ifndef _WIN32 #ifndef _WIN32
if(chrootp){ if(chrootp){
if(strstr(curconf, chrootp) == curconf) if(strstr(curconf, chrootp) == curconf)
@ -206,15 +206,15 @@ int start_proxy_thread(struct child * chp){
_3proxy_mutex_unlock(&runningservices_mutex); _3proxy_mutex_unlock(&runningservices_mutex);
#ifdef _WIN32 #ifdef _WIN32
#ifndef _WINCE #ifndef _WINCE
h = (HANDLE)_beginthreadex((LPSECURITY_ATTRIBUTES )NULL, 16384+conf.stacksize, (void *)startsrv, service, (DWORD)0, &thread); h = (HANDLE)_beginthreadex((LPSECURITY_ATTRIBUTES )NULL, 16384+conf->stacksize, (void *)startsrv, service, (DWORD)0, &thread);
#else #else
h = (HANDLE)CreateThread((LPSECURITY_ATTRIBUTES )NULL, 16384+conf.stacksize, (void *)startsrv, service, (DWORD)0, &thread); h = (HANDLE)CreateThread((LPSECURITY_ATTRIBUTES )NULL, 16384+conf->stacksize, (void *)startsrv, service, (DWORD)0, &thread);
#endif #endif
if(h)CloseHandle(h); if(h)CloseHandle(h);
else { else {
#else #else
pthread_attr_init(&pa); pthread_attr_init(&pa);
pthread_attr_setstacksize(&pa,threadstacksize(conf.stacksize)); pthread_attr_setstacksize(&pa,threadstacksize(conf->stacksize));
pthread_attr_setdetachstate(&pa,PTHREAD_CREATE_DETACHED); pthread_attr_setdetachstate(&pa,PTHREAD_CREATE_DETACHED);
res = pthread_create(&thread, &pa, startsrv, service); res = pthread_create(&thread, &pa, startsrv, service);
pthread_attr_destroy(&pa); pthread_attr_destroy(&pa);
@ -360,11 +360,11 @@ static int h_proxy(int argc, unsigned char ** argv){
static int h_internal(int argc, unsigned char ** argv){ static int h_internal(int argc, unsigned char ** argv){
#ifdef WITH_UN #ifdef WITH_UN
if(!strncmp((char *)argv[1], "unix:", 5)){ if(!strncmp((char *)argv[1], "unix:", 5)){
make_un(argv[1] +5, (struct sockaddr_un *)&conf.intsa); make_un(argv[1] +5, (struct sockaddr_un *)&conf->intsa);
} }
else else
#endif #endif
getip46(46, argv[1], (struct sockaddr *)&conf.intsa); getip46(46, argv[1], (struct sockaddr *)&conf->intsa);
return 0; return 0;
} }
@ -375,10 +375,10 @@ static int h_external(int argc, unsigned char ** argv){
memset(&sa6, 0, sizeof(sa6)); memset(&sa6, 0, sizeof(sa6));
res = getip46(46, argv[1], (struct sockaddr *)&sa6); res = getip46(46, argv[1], (struct sockaddr *)&sa6);
if(!res) return 1; if(!res) return 1;
if (*SAFAMILY(&sa6)==AF_INET) conf.extsa = sa6; if (*SAFAMILY(&sa6)==AF_INET) conf->extsa = sa6;
else conf.extsa6 = sa6; else conf->extsa6 = sa6;
#else #else
res = getip46(46, argv[1], (struct sockaddr *)&conf.extsa); res = getip46(46, argv[1], (struct sockaddr *)&conf->extsa);
if(!res) return 1; if(!res) return 1;
#endif #endif
return 0; return 0;
@ -397,31 +397,31 @@ static int h_log(int argc, unsigned char ** argv){
havelog = 1; havelog = 1;
if(argc > 1 && conf.logtarget && !strcmp((char *)conf.logtarget, (char *)argv[1])) { if(argc > 1 && conf->logtarget && !strcmp((char *)conf->logtarget, (char *)argv[1])) {
notchanged = 1; notchanged = 1;
} }
if(!notchanged && conf.logtarget){ if(!notchanged && conf->logtarget){
free(conf.logtarget); free(conf->logtarget);
conf.logtarget = NULL; conf->logtarget = NULL;
} }
if(argc > 1) { if(argc > 1) {
if(!strcmp((char *) argv[1], "/dev/null")) { if(!strcmp((char *) argv[1], "/dev/null")) {
conf.logfunc = lognone; conf->logfunc = lognone;
return 0; return 0;
} }
if(!notchanged) conf.logtarget = (unsigned char *)strdup((char *)argv[1]); if(!notchanged) conf->logtarget = (unsigned char *)strdup((char *)argv[1]);
if(*argv[1]=='@'){ if(*argv[1]=='@'){
#ifndef _WIN32 #ifndef _WIN32
conf.logfunc = logsyslog; conf->logfunc = logsyslog;
if(notchanged) return 0; if(notchanged) return 0;
/* connected now: after a chroot there is no /dev/log to find */ /* connected now: after a chroot there is no /dev/log to find */
openlog((char *)conf.logtarget+1, LOG_PID | LOG_NDELAY, LOG_DAEMON); openlog((char *)conf->logtarget+1, LOG_PID | LOG_NDELAY, LOG_DAEMON);
#endif #endif
} }
#ifdef WITH_ODBC #ifdef WITH_ODBC
else if(*argv[1]=='&'){ else if(*argv[1]=='&'){
conf.logfunc = logsql; conf->logfunc = logsql;
if(conf.stacksize < LOGSTACKSIZE) conf.stacksize = LOGSTACKSIZE; if(conf->stacksize < LOGSTACKSIZE) conf->stacksize = LOGSTACKSIZE;
if(notchanged) return 0; if(notchanged) return 0;
_3proxy_mutex_lock(&log_mutex); _3proxy_mutex_lock(&log_mutex);
close_sql(); close_sql();
@ -431,50 +431,50 @@ static int h_log(int argc, unsigned char ** argv){
#endif #endif
#ifndef NORADIUS #ifndef NORADIUS
else if(!strcmp((char *)argv[1],"radius")){ else if(!strcmp((char *)argv[1],"radius")){
conf.logfunc = logradius; conf->logfunc = logradius;
} }
#endif #endif
else { else {
if(argc > 2) { if(argc > 2) {
conf.logtype = getrotate(*argv[2]); conf->logtype = getrotate(*argv[2]);
} }
conf.logfunc = logstdout; conf->logfunc = logstdout;
if(notchanged) return 0; if(notchanged) return 0;
conf.logtime = time(0); conf->logtime = time(0);
if(conf.logname)free(conf.logname); if(conf->logname)free(conf->logname);
conf.logname = (unsigned char *)strdup((char *)argv[1]); conf->logname = (unsigned char *)strdup((char *)argv[1]);
if(conf.stdlog) conf.stdlog = freopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, conf.logtime), "a", conf.stdlog); if(conf->stdlog) conf->stdlog = freopen((char *)dologname (tmpbuf, conf->logname, NULL, conf->logtype, conf->logtime), "a", conf->stdlog);
else conf.stdlog = fopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, conf.logtime), "a"); else conf->stdlog = fopen((char *)dologname (tmpbuf, conf->logname, NULL, conf->logtype, conf->logtime), "a");
if(!conf.stdlog){ if(!conf->stdlog){
perror((char *)tmpbuf); perror((char *)tmpbuf);
return 1; return 1;
} }
} }
} }
else conf.logfunc = logstdout; else conf->logfunc = logstdout;
return 0; return 0;
} }
static int h_stacksize(int argc, unsigned char **argv){ static int h_stacksize(int argc, unsigned char **argv){
conf.stacksize = atoi((char *)argv[1]); conf->stacksize = atoi((char *)argv[1]);
return 0; return 0;
} }
static int h_threadpool(int argc, unsigned char **argv){ static int h_threadpool(int argc, unsigned char **argv){
conf.poolmax = atoi((char *)argv[1]); conf->poolmax = atoi((char *)argv[1]);
if(argc > 2) conf.pooltimeout = atoi((char *)argv[2]); if(argc > 2) conf->pooltimeout = atoi((char *)argv[2]);
return 0; return 0;
} }
static int h_force(int argc, unsigned char **argv){ static int h_force(int argc, unsigned char **argv){
conf.noforce = 0; conf->noforce = 0;
return 0; return 0;
} }
static int h_noforce(int argc, unsigned char **argv){ static int h_noforce(int argc, unsigned char **argv){
conf.noforce = 1; conf->noforce = 1;
return 0; return 0;
} }
@ -483,15 +483,15 @@ static int h_service(int argc, unsigned char **argv){
} }
static int h_daemon(int argc, unsigned char **argv){ static int h_daemon(int argc, unsigned char **argv){
if(!conf.demon)daemonize(); if(!conf->demon)daemonize();
conf.demon = 1; conf->demon = 1;
return 0; return 0;
} }
static int h_config(int argc, unsigned char **argv){ static int h_config(int argc, unsigned char **argv){
if(conf.conffile)free(conf.conffile); if(conf->conffile)free(conf->conffile);
conf.conffile = strdup((char *)argv[1]); conf->conffile = strdup((char *)argv[1]);
if(!conf.conffile) return 21; if(!conf->conffile) return 21;
return 0; return 0;
} }
@ -512,23 +512,23 @@ static int h_include(int argc, unsigned char **argv){
static int h_archiver(int argc, unsigned char **argv){ static int h_archiver(int argc, unsigned char **argv){
int j; int j;
conf.archiver = malloc(argc * sizeof(char *)); conf->archiver = malloc(argc * sizeof(char *));
if(conf.archiver) { if(conf->archiver) {
conf.archiverc = argc; conf->archiverc = argc;
for(j = 0; j < conf.archiverc; j++) conf.archiver[j] = (unsigned char *)strdup((char *)argv[j]); for(j = 0; j < conf->archiverc; j++) conf->archiver[j] = (unsigned char *)strdup((char *)argv[j]);
} }
return 0; return 0;
} }
static int h_counter(int argc, unsigned char **argv){ static int h_counter(int argc, unsigned char **argv){
struct counter_header ch1; struct counter_header ch1;
if(conf.counterd >=0)close(conf.counterd); if(conf->counterd >=0)close(conf->counterd);
conf.counterd = open((char *)argv[1], O_BINARY|O_RDWR|O_CREAT, 0660); conf->counterd = open((char *)argv[1], O_BINARY|O_RDWR|O_CREAT, 0660);
if(conf.counterd<0){ if(conf->counterd<0){
fprintf(stderr, "Unable to open counter file %s, line %d\n", argv[1], linenum); fprintf(stderr, "Unable to open counter file %s, line %d\n", argv[1], linenum);
return 1; return 1;
} }
if(read(conf.counterd, &ch1, sizeof(ch1))==sizeof(ch1)){ if(read(conf->counterd, &ch1, sizeof(ch1))==sizeof(ch1)){
if(memcmp(&ch1, &cheader, 4)){ if(memcmp(&ch1, &cheader, 4)){
fprintf(stderr, "Not a counter file %s, line %d\n", argv[1], linenum); fprintf(stderr, "Not a counter file %s, line %d\n", argv[1], linenum);
return 2; return 2;
@ -540,26 +540,26 @@ static int h_counter(int argc, unsigned char **argv){
cheader.updated = ch1.updated; cheader.updated = ch1.updated;
} }
if(argc >=4) { if(argc >=4) {
conf.countertype = getrotate(*argv[2]); conf->countertype = getrotate(*argv[2]);
if(conf.counterfile) free(conf.counterfile); if(conf->counterfile) free(conf->counterfile);
conf.counterfile = strdup((char *)argv[3]); conf->counterfile = strdup((char *)argv[3]);
} }
return 0; return 0;
} }
static int h_rotate(int argc, unsigned char **argv){ static int h_rotate(int argc, unsigned char **argv){
conf.rotate = atoi((char *)argv[1]); conf->rotate = atoi((char *)argv[1]);
return 0; return 0;
} }
static int h_maxseg(int argc, unsigned char **argv){ static int h_maxseg(int argc, unsigned char **argv){
conf.maxseg = atoi((char *)argv[1]); conf->maxseg = atoi((char *)argv[1]);
return 0; return 0;
} }
static int h_logformat(int argc, unsigned char **argv){ static int h_logformat(int argc, unsigned char **argv){
unsigned char * old = conf.logformat; unsigned char * old = conf->logformat;
conf.logformat = (unsigned char *)strdup((char *)argv[1]); conf->logformat = (unsigned char *)strdup((char *)argv[1]);
if(old) free(old); if(old) free(old);
return 0; return 0;
} }
@ -567,8 +567,8 @@ static int h_logformat(int argc, unsigned char **argv){
static int h_timeouts(int argc, unsigned char **argv){ static int h_timeouts(int argc, unsigned char **argv){
int j; int j;
for(j = 0; conf.timeouts[j] && j + 1 < argc; j++) { for(j = 0; conf->timeouts[j] && j + 1 < argc; j++) {
if((conf.timeouts[j] = atoi((char *)argv[j + 1])) <= 0 || conf.timeouts[j] > 2000000){ if((conf->timeouts[j] = atoi((char *)argv[j + 1])) <= 0 || conf->timeouts[j] > 2000000){
fprintf(stderr, "Invalid timeout: %s, line %d\n", argv[j + 1], linenum); fprintf(stderr, "Invalid timeout: %s, line %d\n", argv[j + 1], linenum);
return(1); return(1);
} }
@ -583,9 +583,9 @@ static int h_noop(int argc, unsigned char **argv){
static int h_auth(int argc, unsigned char **argv){ static int h_auth(int argc, unsigned char **argv){
struct auth *au, * newau; struct auth *au, * newau;
freeauth(conf.authfuncs); freeauth(conf->authfuncs);
conf.authfuncs = NULL; conf->authfuncs = NULL;
if(!conf.bandlimfunc)conf.bandlimfunc = bandlimitfunc; if(!conf->bandlimfunc)conf->bandlimfunc = bandlimitfunc;
for(argc--; argc; argc--){ for(argc--; argc; argc--){
for(au = authfuncs; au; au=au->next){ for(au = authfuncs; au; au=au->next){
if(!strcmp((char *)argv[argc], au->desc)){ if(!strcmp((char *)argv[argc], au->desc)){
@ -593,17 +593,17 @@ static int h_auth(int argc, unsigned char **argv){
if(!newau) { if(!newau) {
return 21; return 21;
} }
newau->next = conf.authfuncs; newau->next = conf->authfuncs;
conf.authfuncs = newau; conf->authfuncs = newau;
conf.authfuncs->desc = au->desc; conf->authfuncs->desc = au->desc;
conf.authfuncs->authenticate = au->authenticate; conf->authfuncs->authenticate = au->authenticate;
conf.authfuncs->authorize = au->authorize; conf->authfuncs->authorize = au->authorize;
break; break;
} }
} }
if(!au) return 1; if(!au) return 1;
} }
conf.authfunc = doauth; conf->authfunc = doauth;
return 0; return 0;
} }
@ -667,19 +667,19 @@ static int h_users(int argc, unsigned char **argv){
} }
static int h_maxconn(int argc, unsigned char **argv){ static int h_maxconn(int argc, unsigned char **argv){
conf.maxchild = atoi((char *)argv[1]); conf->maxchild = atoi((char *)argv[1]);
if(!conf.maxchild) { if(!conf->maxchild) {
return(1); return(1);
} }
#ifndef _WIN32 #ifndef _WIN32
{ {
struct rlimit rl; struct rlimit rl;
if(!getrlimit(RLIMIT_NOFILE, &rl)){ if(!getrlimit(RLIMIT_NOFILE, &rl)){
if((conf.maxchild<<1) > rl.rlim_cur) if((conf->maxchild<<1) > rl.rlim_cur)
fprintf(stderr, "[line %d] Warning: current open file ulimits are too low (cur: %d/max: %d)," fprintf(stderr, "[line %d] Warning: current open file ulimits are too low (cur: %d/max: %d),"
" maxconn requires at least %d for every running service." " maxconn requires at least %d for every running service."
" Configure ulimits according to system documentation\n", " Configure ulimits according to system documentation\n",
linenum, (int)rl.rlim_cur, (int)rl.rlim_max, (conf.maxchild<<1)); linenum, (int)rl.rlim_cur, (int)rl.rlim_max, (conf->maxchild<<1));
} }
} }
#endif #endif
@ -687,23 +687,23 @@ static int h_maxconn(int argc, unsigned char **argv){
} }
static int h_backlog(int argc, unsigned char **argv){ static int h_backlog(int argc, unsigned char **argv){
conf.backlog = atoi((char *)argv[1]); conf->backlog = atoi((char *)argv[1]);
if(conf.backlog < 0) { if(conf->backlog < 0) {
return(1); return(1);
} }
return 0; return 0;
} }
static int h_flush(int argc, unsigned char **argv){ static int h_flush(int argc, unsigned char **argv){
freeacl(conf.acl); freeacl(conf->acl);
conf.acl = NULL; conf->acl = NULL;
return 0; return 0;
} }
/* /*
static int h_flushusers(int argc, unsigned char **argv){ static int h_flushusers(int argc, unsigned char **argv){
freepwl(conf.pwl); freepwl(conf->pwl);
conf.pwl = NULL; conf->pwl = NULL;
return 0; return 0;
} }
*/ */
@ -711,16 +711,16 @@ static int h_flushusers(int argc, unsigned char **argv){
static int h_nserver(int argc, unsigned char **argv){ static int h_nserver(int argc, unsigned char **argv){
char *str; char *str;
if(conf.numservers < MAXNSERVERS) { if(conf->numservers < MAXNSERVERS) {
if((str = strchr((char *)argv[1], '/'))) if((str = strchr((char *)argv[1], '/')))
*str = 0; *str = 0;
*SAPORT(&conf.nservers[conf.numservers].addr) = htons(53); *SAPORT(&conf->nservers[conf->numservers].addr) = htons(53);
if(parsehost(46, argv[1], (struct sockaddr *)&conf.nservers[conf.numservers].addr)) return 1; if(parsehost(46, argv[1], (struct sockaddr *)&conf->nservers[conf->numservers].addr)) return 1;
if(str) { if(str) {
conf.nservers[conf.numservers].usetcp = strstr(str + 1, "tcp")? 1:0; conf->nservers[conf->numservers].usetcp = strstr(str + 1, "tcp")? 1:0;
*str = '/'; *str = '/';
} }
conf.numservers++; conf->numservers++;
} }
resolvfunc = myresolver; resolvfunc = myresolver;
@ -732,10 +732,10 @@ static int h_authnserver(int argc, unsigned char **argv){
if((str = strchr((char *)argv[1], '/'))) if((str = strchr((char *)argv[1], '/')))
*str = 0; *str = 0;
if(parsehost(46, argv[1], (struct sockaddr *)&conf.authnserver.addr)) return 1; if(parsehost(46, argv[1], (struct sockaddr *)&conf->authnserver.addr)) return 1;
*SAPORT(&conf.authnserver.addr) = htons(53); *SAPORT(&conf->authnserver.addr) = htons(53);
if(str) { if(str) {
conf.authnserver.usetcp = strstr(str + 1, "tcp")? 1:0; conf->authnserver.usetcp = strstr(str + 1, "tcp")? 1:0;
*str = '/'; *str = '/';
} }
return 0; return 0;
@ -765,7 +765,7 @@ static int h_parentretries(int argc, unsigned char **argv){
int res; int res;
res = atoi((char *)argv[1]); res = atoi((char *)argv[1]);
if(res > 0) conf.parentretries = res; if(res > 0) conf->parentretries = res;
return 0; return 0;
} }
@ -833,8 +833,8 @@ static int h_monitor(int argc, unsigned char **argv){
else { else {
fm->path = strdup((char *)argv[1]); fm->path = strdup((char *)argv[1]);
if(!fm->path) return 21; if(!fm->path) return 21;
fm->next = conf.fmon; fm->next = conf->fmon;
conf.fmon = fm; conf->fmon = fm;
} }
return 0; return 0;
} }
@ -940,9 +940,9 @@ static int addhttprule(char *op, char *host, char *url, char *params)
} }
if(params) rule->params = (unsigned char *)strdup(params); if(params) rule->params = (unsigned char *)strdup(params);
if(!conf.httprules) conf.httprules = rule; if(!conf->httprules) conf->httprules = rule;
else { else {
for(tail = conf.httprules; tail->next; tail = tail->next); for(tail = conf->httprules; tail->next; tail = tail->next);
tail->next = rule; tail->next = rule;
} }
return 0; return 0;
@ -1048,7 +1048,7 @@ static int h_parent(int argc, unsigned char **argv){
char * cidr = NULL; char * cidr = NULL;
int i; int i;
acl = conf.acl; acl = conf->acl;
while(acl && acl->next) acl = acl->next; while(acl && acl->next) acl = acl->next;
if(!acl || (acl->action && acl->action != 2)) { if(!acl || (acl->action && acl->action != 2)) {
fprintf(stderr, "Chaining error: last ACL entry was not \"allow\" or \"redirect\" on line %d\n", linenum); fprintf(stderr, "Chaining error: last ACL entry was not \"allow\" or \"redirect\" on line %d\n", linenum);
@ -1244,9 +1244,9 @@ static int h_http(int argc, unsigned char **argv){
return(1); return(1);
} }
if(!conf.httprules) conf.httprules = rule; if(!conf->httprules) conf->httprules = rule;
else { else {
for(tail = conf.httprules; tail->next; tail = tail->next); for(tail = conf->httprules; tail->next; tail = tail->next);
tail->next = rule; tail->next = rule;
} }
return 0; return 0;
@ -1256,7 +1256,7 @@ static int h_http(int argc, unsigned char **argv){
static int h_nolog(int argc, unsigned char **argv){ static int h_nolog(int argc, unsigned char **argv){
struct ace *acl = NULL; struct ace *acl = NULL;
acl = conf.acl; acl = conf->acl;
if(!acl) { if(!acl) {
fprintf(stderr, "Chaining error: last ACL entry was not \"allow/deny\" on line %d\n", linenum); fprintf(stderr, "Chaining error: last ACL entry was not \"allow/deny\" on line %d\n", linenum);
return(1); return(1);
@ -1639,13 +1639,13 @@ static int h_ace(int argc, unsigned char **argv){
acl->chains->weight = WEIGHTSCALE; acl->chains->weight = WEIGHTSCALE;
case ALLOW: case ALLOW:
case DENY: case DENY:
if(!conf.acl){ if(!conf->acl){
conf.acl = acl; conf->acl = acl;
} }
else { else {
struct ace * acei; struct ace * acei;
for(acei = conf.acl; acei->next; acei = acei->next); for(acei = conf->acl; acei->next; acei = acei->next);
acei->next = acl; acei->next = acl;
} }
break; break;
@ -1663,13 +1663,13 @@ static int h_ace(int argc, unsigned char **argv){
sscanf((char *)argv[2], "%u", &ncl->period); sscanf((char *)argv[2], "%u", &ncl->period);
} }
_3proxy_mutex_lock(&connlim_mutex); _3proxy_mutex_lock(&connlim_mutex);
if(!conf.connlimiter){ if(!conf->connlimiter){
conf.connlimiter = ncl; conf->connlimiter = ncl;
} }
else { else {
struct connlim * cli; struct connlim * cli;
for(cli = conf.connlimiter; cli->next; cli = cli->next); for(cli = conf->connlimiter; cli->next; cli = cli->next);
cli->next = ncl; cli->next = ncl;
} }
_3proxy_mutex_unlock(&connlim_mutex); _3proxy_mutex_unlock(&connlim_mutex);
@ -1696,28 +1696,28 @@ static int h_ace(int argc, unsigned char **argv){
} }
_3proxy_mutex_lock(&bandlim_mutex); _3proxy_mutex_lock(&bandlim_mutex);
if(!strcmp((char *)argv[0], "bandlimin") || !strcmp((char *)argv[0], "nobandlimin")){ if(!strcmp((char *)argv[0], "bandlimin") || !strcmp((char *)argv[0], "nobandlimin")){
if(!conf.bandlimiter){ if(!conf->bandlimiter){
conf.bandlimiter = nbl; conf->bandlimiter = nbl;
} }
else { else {
struct bandlim * bli; struct bandlim * bli;
for(bli = conf.bandlimiter; bli->next; bli = bli->next); for(bli = conf->bandlimiter; bli->next; bli = bli->next);
bli->next = nbl; bli->next = nbl;
} }
} }
else { else {
if(!conf.bandlimiterout){ if(!conf->bandlimiterout){
conf.bandlimiterout = nbl; conf->bandlimiterout = nbl;
} }
else { else {
struct bandlim * bli; struct bandlim * bli;
for(bli = conf.bandlimiterout; bli->next; bli = bli->next); for(bli = conf->bandlimiterout; bli->next; bli = bli->next);
bli->next = nbl; bli->next = nbl;
} }
} }
conf.bandlimver++; conf->bandlimver++;
_3proxy_mutex_unlock(&bandlim_mutex); _3proxy_mutex_unlock(&bandlim_mutex);
break; break;
@ -1727,7 +1727,7 @@ static int h_ace(int argc, unsigned char **argv){
case NOCOUNTOUT: case NOCOUNTOUT:
case COUNTALL: case COUNTALL:
case NOCOUNTALL: case NOCOUNTALL:
if(!conf.trafcountfunc) conf.trafcountfunc = trafcountfunc; if(!conf->trafcountfunc) conf->trafcountfunc = trafcountfunc;
tl = malloc(sizeof(struct trafcount)); tl = malloc(sizeof(struct trafcount));
if(!tl) { if(!tl) {
freeacl(acl); freeacl(acl);
@ -1765,13 +1765,13 @@ static int h_ace(int argc, unsigned char **argv){
} }
else tl->v = &tl->own; else tl->v = &tl->own;
_3proxy_mutex_lock(&tc_mutex); _3proxy_mutex_lock(&tc_mutex);
if(!conf.trafcounter){ if(!conf->trafcounter){
conf.trafcounter = tl; conf->trafcounter = tl;
} }
else { else {
struct trafcount * ntl; struct trafcount * ntl;
for(ntl = conf.trafcounter; ntl->next; ntl = ntl->next); for(ntl = conf->trafcounter; ntl->next; ntl = ntl->next);
ntl->next = tl; ntl->next = tl;
} }
_3proxy_mutex_unlock(&tc_mutex); _3proxy_mutex_unlock(&tc_mutex);
@ -1781,19 +1781,19 @@ static int h_ace(int argc, unsigned char **argv){
} }
static int h_logdump(int argc, unsigned char **argv){ static int h_logdump(int argc, unsigned char **argv){
conf.logdumpsrv = (unsigned) atoi((char *) *(argv + 1)); conf->logdumpsrv = (unsigned) atoi((char *) *(argv + 1));
if(argc > 2) conf.logdumpcli = (unsigned) atoi((char *) *(argv + 2)); if(argc > 2) conf->logdumpcli = (unsigned) atoi((char *) *(argv + 2));
return 0; return 0;
} }
static int h_filtermaxsize(int argc, unsigned char **argv){ static int h_filtermaxsize(int argc, unsigned char **argv){
conf.filtermaxsize = atoi((char *) *(argv + 1)); conf->filtermaxsize = atoi((char *) *(argv + 1));
return 0; return 0;
} }
static int h_delimchar(int argc, unsigned char **argv){ static int h_delimchar(int argc, unsigned char **argv){
conf.delimchar = *argv[1]; conf->delimchar = *argv[1];
return 0; return 0;
} }
@ -1802,21 +1802,21 @@ static int h_delimchar(int argc, unsigned char **argv){
static int h_radius(int argc, unsigned char **argv){ static int h_radius(int argc, unsigned char **argv){
uint16_t port; uint16_t port;
memset(conf.radiuslist, 0, sizeof(conf.radiuslist)); memset(conf->radiuslist, 0, sizeof(conf->radiuslist));
if(strlen((char *)argv[1]) > 63) argv[1][63] = 0; if(strlen((char *)argv[1]) > 63) argv[1][63] = 0;
strcpy(conf.radiussecret, (char *)argv[1]); strcpy(conf->radiussecret, (char *)argv[1]);
for( conf.nradservers=0; conf.nradservers < MAXRADIUS && conf.nradservers < argc -2; conf.nradservers++){ for( conf->nradservers=0; conf->nradservers < MAXRADIUS && conf->nradservers < argc -2; conf->nradservers++){
char *s = 0; char *s = 0;
if((s=strchr((char *)argv[conf.nradservers + 2], '/'))){ if((s=strchr((char *)argv[conf->nradservers + 2], '/'))){
*s = 0; *s = 0;
s++; s++;
} }
if( !getip46(46, argv[conf.nradservers + 2], (struct sockaddr *)&conf.radiuslist[conf.nradservers].authaddr)) return 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( 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); if(!*SAPORT(&conf->radiuslist[conf->nradservers].authaddr))*SAPORT(&conf->radiuslist[conf->nradservers].authaddr) = htons(1812);
port = ntohs(*SAPORT(&conf.radiuslist[conf.nradservers].authaddr)); port = ntohs(*SAPORT(&conf->radiuslist[conf->nradservers].authaddr));
conf.radiuslist[conf.nradservers].logaddr = conf.radiuslist[conf.nradservers].authaddr; conf->radiuslist[conf->nradservers].logaddr = conf->radiuslist[conf->nradservers].authaddr;
*SAPORT(&conf.radiuslist[conf.nradservers].logaddr) = htons(port+1); *SAPORT(&conf->radiuslist[conf->nradservers].logaddr) = htons(port+1);
} }
return 0; return 0;
} }
@ -1824,23 +1824,23 @@ static int h_radius(int argc, unsigned char **argv){
static int h_authcache(int argc, unsigned char **argv){ static int h_authcache(int argc, unsigned char **argv){
int authcachesize = 0; int authcachesize = 0;
conf.authcachetype = 0; conf->authcachetype = 0;
if(strstr((char *) *(argv + 1), "ip")) conf.authcachetype |= 1; if(strstr((char *) *(argv + 1), "ip")) conf->authcachetype |= 1;
if(strstr((char *) *(argv + 1), "user")) conf.authcachetype |= 2; if(strstr((char *) *(argv + 1), "user")) conf->authcachetype |= 2;
if(strstr((char *) *(argv + 1), "pass")) conf.authcachetype |= 4; if(strstr((char *) *(argv + 1), "pass")) conf->authcachetype |= 4;
if(strstr((char *) *(argv + 1), "limit")) conf.authcachetype |= 8; if(strstr((char *) *(argv + 1), "limit")) conf->authcachetype |= 8;
if(strstr((char *) *(argv + 1), "acl")) conf.authcachetype |= 16; if(strstr((char *) *(argv + 1), "acl")) conf->authcachetype |= 16;
if(strstr((char *) *(argv + 1), "ext")) conf.authcachetype |= 32; if(strstr((char *) *(argv + 1), "ext")) conf->authcachetype |= 32;
if(strstr((char *) *(argv + 1), "dstaddr")) conf.authcachetype |= 64; if(strstr((char *) *(argv + 1), "dstaddr")) conf->authcachetype |= 64;
if(strstr((char *) *(argv + 1), "dstport")) conf.authcachetype |= 128; if(strstr((char *) *(argv + 1), "dstport")) conf->authcachetype |= 128;
if(strstr((char *) *(argv + 1), "dsthost")) conf.authcachetype |= 256; if(strstr((char *) *(argv + 1), "dsthost")) conf->authcachetype |= 256;
if(strstr((char *) *(argv + 1), "dstoper")) conf.authcachetype |= 512; if(strstr((char *) *(argv + 1), "dstoper")) conf->authcachetype |= 512;
if(strstr((char *) *(argv + 1), "srvaddr")) conf.authcachetype |= 1024; if(strstr((char *) *(argv + 1), "srvaddr")) conf->authcachetype |= 1024;
if(strstr((char *) *(argv + 1), "srvport")) conf.authcachetype |= 2048; if(strstr((char *) *(argv + 1), "srvport")) conf->authcachetype |= 2048;
if(argc > 2) conf.authcachetime = (unsigned) atoi((char *) *(argv + 2)); if(argc > 2) conf->authcachetime = (unsigned) atoi((char *) *(argv + 2));
if(argc > 3) authcachesize = (unsigned) atoi((char *) *(argv + 3)); if(argc > 3) authcachesize = (unsigned) atoi((char *) *(argv + 3));
if(!conf.authcachetype) conf.authcachetype = 6; if(!conf->authcachetype) conf->authcachetype = 6;
if(!conf.authcachetime) conf.authcachetime = 600; if(!conf->authcachetime) conf->authcachetime = 600;
if(!authcachesize) authcachesize = 65536*4; if(!authcachesize) authcachesize = 65536*4;
if(auth_table.growlimit != authcachesize && inithashtable(&auth_table, authcachesize < 1024? authcachesize:1024, authcachesize < 1024? authcachesize:1024, authcachesize)){ if(auth_table.growlimit != authcachesize && inithashtable(&auth_table, authcachesize < 1024? authcachesize:1024, authcachesize < 1024? authcachesize:1024, authcachesize)){
fprintf(stderr, "Failed to initialize auth cache\n"); fprintf(stderr, "Failed to initialize auth cache\n");
@ -2448,7 +2448,7 @@ void freeconf(struct extparam *confp){
confp->maxchild = DEFAULT_MAXCHILD; confp->maxchild = DEFAULT_MAXCHILD;
confp->backlog = 0; confp->backlog = 0;
resolvfunc = NULL; resolvfunc = NULL;
conf.numservers = 0; conf->numservers = 0;
acl = confp->acl; acl = confp->acl;
confp->acl = NULL; confp->acl = NULL;
@ -2500,16 +2500,16 @@ int reload (void){
#ifdef WITH_TRANSPARENT #ifdef WITH_TRANSPARENT
transparent_install(); transparent_install();
#endif #endif
conf.paused++; conf->paused++;
freeconf(&conf); freeconf(conf);
conf.paused++; conf->paused++;
fp = confopen(); fp = confopen();
if(fp){ if(fp){
error = readconfig(fp); error = readconfig(fp);
conf.version++; conf->version++;
if(error) { if(error) {
freeconf(&conf); freeconf(conf);
} }
fclose(fp); fclose(fp);
} }

74
src/confinit.h Normal file
View File

@ -0,0 +1,74 @@
/* The configuration as it is before any command: included where both the
template for a new configuration and the first one are defined. */
.timeouts = {
1, /* SINGLEBYTE_S */
5, /* SINGLEBYTE_L */
30, /* STRING_S */
60, /* STRING_L */
180, /* CONNECTION_S */
1800, /* CONNECTION_L */
15, /* DNS_TO */
60, /* CHAIN_TO */
15, /* CONNECT_TO */
5, /* CONNBACK_TO */
5, /* LINGER_TO */
0
},
.acl = NULL,
.conffile = NULL,
.bandlimiter = NULL,
.bandlimiterout = NULL,
.connlimiter = NULL,
.trafcounter = NULL,
.services = NULL,
.stacksize = 0,
.poolmax = -1,
.pooltimeout = 60,
.counterd = -1,
.rotate = 0,
.paused = 0,
.archiverc = 0,
.demon = 0,
.maxchild = DEFAULT_MAXCHILD,
.backlog = 0,
.version = 0,
.noforce = 0,
.bandlimver = 0,
.parentretries = 2,
.authcachetype = 6,
.authcachetime = 600,
.filtermaxsize = 1048576,
.gracetraf = 0,
.gracenum = 0,
.gracedelay = 0,
.maxseg = 0,
.logname = NULL,
.archiver = NULL,
.logtype = NONE,
.countertype = NONE,
.counterfile = NULL,
#ifndef NOIPV6
.intsa = {AF_INET},
.extsa6 = {AF_INET6},
.extsa = {AF_INET},
#else
.intsa = {AF_INET},
.extsa = {AF_INET},
#endif
.pwl = NULL,
.authenticate = NULL,
.authfunc = doconnect,
.logfunc = lognone,
.bandlimfunc = NULL,
.trafcountfunc = NULL,
.logtarget = NULL,
.logformat = NULL,
.fmon = NULL,
.filters = NULL,
.authfuncs = NULL,
.stdlog = NULL,
.stringtable = NULL,
.logtime = (time_t)0,
.logdumpsrv = 0,
.logdumpcli = 0,
.delimchar = '@',

View File

@ -514,7 +514,7 @@ static void * ef_server_next(struct node * node){
static void * ef_server_type(struct node * node){ static void * ef_server_type(struct node * node){
int service = ((struct srvparam *)node->value) -> service; int service = ((struct srvparam *)node->value) -> service;
return (service>=0 && service < MAX_SERVICE)? (void *)conf.stringtable[SERVICES + service] : (void *)"unknown"; return (service>=0 && service < MAX_SERVICE)? (void *)conf->stringtable[SERVICES + service] : (void *)"unknown";
} }
static void * ef_server_child(struct node * node){ static void * ef_server_child(struct node * node){
@ -543,7 +543,7 @@ static void * ef_pool_limit(struct node * node){
} }
static void * ef_pool_timeout(struct node * node){ static void * ef_pool_timeout(struct node * node){
return &conf.pooltimeout; return &conf->pooltimeout;
} }
static void * ef_pool_created(struct node * node){ static void * ef_pool_created(struct node * node){
@ -693,7 +693,7 @@ static void * ef_client_next(struct node * node){
static void * ef_client_type(struct node * node){ static void * ef_client_type(struct node * node){
int service = ((struct clientparam *)node->value) -> service; int service = ((struct clientparam *)node->value) -> service;
return (service>=0 && service < MAX_SERVICE)? (void *)conf.stringtable[SERVICES + service] : (void *)"unknown"; return (service>=0 && service < MAX_SERVICE)? (void *)conf->stringtable[SERVICES + service] : (void *)"unknown";
} }
static void * ef_client_operation(struct node * node){ static void * ef_client_operation(struct node * node){

View File

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

View File

@ -16,7 +16,7 @@ int startconnlims (struct clientparam *param){
param->connlim = 1; param->connlim = 1;
_3proxy_mutex_lock(&connlim_mutex); _3proxy_mutex_lock(&connlim_mutex);
for(ce = conf.connlimiter; ce; ce = ce->next) { for(ce = conf->connlimiter; ce; ce = ce->next) {
if(ACLmatches(ce->ace, param)){ if(ACLmatches(ce->ace, param)){
if(ce->ace->action == NOCONNLIM)break; if(ce->ace->action == NOCONNLIM)break;
if(!ce->period){ if(!ce->period){
@ -44,7 +44,7 @@ int startconnlims (struct clientparam *param){
} }
if(ret) { if(ret) {
struct connlim * cee; struct connlim * cee;
for(cee = conf.connlimiter; cee != ce; cee = cee->next) { for(cee = conf->connlimiter; cee != ce; cee = cee->next) {
if(ACLmatches(cee->ace, param) && !cee->period && cee->rating) { if(ACLmatches(cee->ace, param) && !cee->period && cee->rating) {
cee->rating--; cee->rating--;
} }
@ -59,7 +59,7 @@ void stopconnlims (struct clientparam *param){
struct connlim * ce; struct connlim * ce;
_3proxy_mutex_lock(&connlim_mutex); _3proxy_mutex_lock(&connlim_mutex);
for(ce = conf.connlimiter; ce; ce = ce->next) { for(ce = conf->connlimiter; ce; ce = ce->next) {
if(ACLmatches(ce->ace, param)){ if(ACLmatches(ce->ace, param)){
if(ce->ace->action == NOCONNLIM)break; if(ce->ace->action == NOCONNLIM)break;
if(!ce->period && ce->rating){ if(!ce->period && ce->rating){
@ -78,28 +78,28 @@ void initbandlims (struct clientparam *param){
param->bandlimfunc = NULL; param->bandlimfunc = NULL;
param->bandlims[0] = NULL; param->bandlims[0] = NULL;
param->bandlimsout[0] = NULL; param->bandlimsout[0] = NULL;
if(!conf.bandlimfunc || (!conf.bandlimiter && !conf.bandlimiterout)) return; if(!conf->bandlimfunc || (!conf->bandlimiter && !conf->bandlimiterout)) return;
for(i=0, be = conf.bandlimiter; be && i<MAXBANDLIMS; be = be->next) { for(i=0, be = conf->bandlimiter; be && i<MAXBANDLIMS; be = be->next) {
if(ACLmatches(be->ace, param)){ if(ACLmatches(be->ace, param)){
if(be->ace->action == NOBANDLIM) { if(be->ace->action == NOBANDLIM) {
break; break;
} }
param->bandlims[i++] = be; param->bandlims[i++] = be;
param->bandlimfunc = conf.bandlimfunc; param->bandlimfunc = conf->bandlimfunc;
} }
} }
if(i<MAXBANDLIMS)param->bandlims[i] = NULL; if(i<MAXBANDLIMS)param->bandlims[i] = NULL;
for(i=0, be = conf.bandlimiterout; be && i<MAXBANDLIMS; be = be->next) { for(i=0, be = conf->bandlimiterout; be && i<MAXBANDLIMS; be = be->next) {
if(ACLmatches(be->ace, param)){ if(ACLmatches(be->ace, param)){
if(be->ace->action == NOBANDLIM) { if(be->ace->action == NOBANDLIM) {
break; break;
} }
param->bandlimsout[i++] = be; param->bandlimsout[i++] = be;
param->bandlimfunc = conf.bandlimfunc; param->bandlimfunc = conf->bandlimfunc;
} }
} }
if(i<MAXBANDLIMS)param->bandlimsout[i] = NULL; if(i<MAXBANDLIMS)param->bandlimsout[i] = NULL;
param->bandlimver = conf.bandlimver; param->bandlimver = conf->bandlimver;
} }
unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout){ unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nbytesout){
@ -125,9 +125,9 @@ unsigned bandlimitfunc(struct clientparam *param, unsigned nbytesin, unsigned nb
if(!nbytesin && !nbytesout) return 0; if(!nbytesin && !nbytesout) return 0;
_3proxy_mutex_lock(&bandlim_mutex); _3proxy_mutex_lock(&bandlim_mutex);
if(param->bandlimver != conf.bandlimver){ if(param->bandlimver != conf->bandlimver){
initbandlims(param); initbandlims(param);
param->bandlimver = conf.bandlimver; param->bandlimver = conf->bandlimver;
} }
for(i=0; nbytesin&& i<MAXBANDLIMS && param->bandlims[i]; i++){ for(i=0; nbytesin&& i<MAXBANDLIMS && param->bandlims[i]; i++){
if( !param->bandlims[i]->basetime || if( !param->bandlims[i]->basetime ||
@ -172,7 +172,7 @@ void trafcountfunc(struct clientparam *param){
int countout = 0; int countout = 0;
_3proxy_mutex_lock(&tc_mutex); _3proxy_mutex_lock(&tc_mutex);
for(tc = conf.trafcounter; tc; tc = tc->next) { for(tc = conf->trafcounter; tc; tc = tc->next) {
if(ACLmatches(tc->ace, param)){ if(ACLmatches(tc->ace, param)){
if(tc->ace->action == NOCOUNTIN) { if(tc->ace->action == NOCOUNTIN) {
@ -188,7 +188,7 @@ void trafcountfunc(struct clientparam *param){
tc->v->updated = curtime; tc->v->updated = curtime;
} }
} }
if(countout) for(tc = conf.trafcounter; tc; tc = tc->next) { if(countout) for(tc = conf->trafcounter; tc; tc = tc->next) {
if(ACLmatches(tc->ace, param)){ if(ACLmatches(tc->ace, param)){
if(tc->ace->action == NOCOUNTOUT || tc->ace->action == NOCOUNTALL) break; if(tc->ace->action == NOCOUNTOUT || tc->ace->action == NOCOUNTALL) break;
if(tc->ace->action != COUNTOUT && tc->ace->action != COUNTALL ) { if(tc->ace->action != COUNTOUT && tc->ace->action != COUNTALL ) {

View File

@ -189,9 +189,9 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
case 'N': case 'N':
if(param->service <= MAX_SERVICE) { if(param->service <= MAX_SERVICE) {
len = (conf.stringtable)? (int)strlen((char *)conf.stringtable[SERVICES + param->service]) : 0; len = (conf->stringtable)? (int)strlen((char *)conf->stringtable[SERVICES + param->service]) : 0;
if(len > 20) len = 20; if(len > 20) len = 20;
memcpy(buf+i, (len)?conf.stringtable[SERVICES + param->service]:(unsigned char*)"-", (len)?len:1); memcpy(buf+i, (len)?conf->stringtable[SERVICES + param->service]:(unsigned char*)"-", (len)?len:1);
i += (len)?len:1; i += (len)?len:1;
} }
break; break;
@ -345,11 +345,11 @@ void logstdout(struct clientparam * param, const unsigned char *s) {
/* with no connection, an error from the main thread */ /* with no connection, an error from the main thread */
tmpbuf = param? param->tmpbuf : logparam.tmpbuf; tmpbuf = param? param->tmpbuf : logparam.tmpbuf;
dobuf(param, tmpbuf, s, NULL); dobuf(param, tmpbuf, s, NULL);
log = (param && param->srv && param->srv->stdlog)?param->srv->stdlog:conf.stdlog?conf.stdlog:stdout; log = (param && param->srv && param->srv->stdlog)?param->srv->stdlog:conf->stdlog?conf->stdlog:stdout;
if(!param || !param->nolog)if(fprintf(log, "%s\n", tmpbuf) < 0) { if(!param || !param->nolog)if(fprintf(log, "%s\n", tmpbuf) < 0) {
perror("printf()"); perror("printf()");
}; };
if(log != conf.stdlog)fflush(log); if(log != conf->stdlog)fflush(log);
} }
#ifndef _WIN32 #ifndef _WIN32
void logsyslog(struct clientparam * param, const unsigned char *s) { void logsyslog(struct clientparam * param, const unsigned char *s) {

View File

@ -25,7 +25,7 @@ extern int linenum;
extern char *conffile; extern char *conffile;
struct symbol symbols[] = { struct symbol symbols[] = {
{symbols+1, "conf", (void *) &conf}, {symbols+1, "conf", (void *) &confboot},
{symbols+2, "socksend", (void *) socksend}, {symbols+2, "socksend", (void *) socksend},
{symbols+3, "socksendto", (void *) socksendto}, {symbols+3, "socksendto", (void *) socksendto},
{symbols+4, "sockrecvfrom", (void *) sockrecvfrom}, {symbols+4, "sockrecvfrom", (void *) sockrecvfrom},
@ -45,7 +45,7 @@ struct symbol symbols[] = {
{symbols+18, "ipauth", (void *) ipauth}, {symbols+18, "ipauth", (void *) ipauth},
{symbols+19, "strongauth", (void *) strongauth}, {symbols+19, "strongauth", (void *) strongauth},
{symbols+20, "checkACL", (void *) checkACL}, {symbols+20, "checkACL", (void *) checkACL},
{symbols+21, "nservers", (void *) conf.nservers}, {symbols+21, "nservers", (void *) confboot.nservers},
{symbols+22, "udpresolve", (void *) udpresolve}, {symbols+22, "udpresolve", (void *) udpresolve},
{symbols+23, "bandlim_mutex", (void *) &bandlim_mutex}, {symbols+23, "bandlim_mutex", (void *) &bandlim_mutex},
{symbols+24, "tc_mutex", (void *) &tc_mutex}, {symbols+24, "tc_mutex", (void *) &tc_mutex},
@ -86,8 +86,8 @@ static void * findbyname(const char *name){
struct pluginlink pluginlink = { struct pluginlink pluginlink = {
{symbols, "", NULL}, {symbols, "", NULL},
&conf, &confboot,
conf.nservers, confboot.nservers,
&linenum, &linenum,
authfuncs, authfuncs,
commandhandlers, commandhandlers,

View File

@ -1048,7 +1048,7 @@ for(;;){
hlen += sprintf((char*)buf + hlen, "Via: 1.1 "); hlen += sprintf((char*)buf + hlen, "Via: 1.1 ");
gethostname((char *)(buf + hlen), 256); gethostname((char *)(buf + hlen), 256);
hlen += (int)strlen((char *)(buf + hlen)); hlen += (int)strlen((char *)(buf + hlen));
hlen += sprintf((char*)buf + hlen, ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(*SAPORT(&param->srv->intsa)), conf.stringtable?conf.stringtable[2]:(unsigned char *)"", conf.stringtable?conf.stringtable[3]:(unsigned char *)""); hlen += sprintf((char*)buf + hlen, ":%d (%s %s)\r\nX-Forwarded-For: ", (int)ntohs(*SAPORT(&param->srv->intsa)), conf->stringtable?conf->stringtable[2]:(unsigned char *)"", conf->stringtable?conf->stringtable[3]:(unsigned char *)"");
if(anonymous != 2)hlen += myinet_ntop(*SAFAMILY(&param->sincr), SAADDR(&param->sincr), (char *)buf + hlen, 128); if(anonymous != 2)hlen += myinet_ntop(*SAFAMILY(&param->sincr), SAADDR(&param->sincr), (char *)buf + hlen, 128);
else { else {
uint32_t tmp = myrand(); uint32_t tmp = myrand();

View File

@ -225,9 +225,10 @@ extern time_t basetime;
extern int timetoexit, needreload; extern int timetoexit, needreload;
extern time_t curtime; /* the clock, kept by the main thread */ extern time_t curtime; /* the clock, kept by the main thread */
extern struct extparam conf; extern struct extparam *conf;
extern const struct extparam confdefaults;
extern struct extparam confboot;
extern int timeouts[12];
/* directions sockmap() passes with splice(): -s1, -s2, -s3; with /* directions sockmap() passes with splice(): -s1, -s2, -s3; with
SPLICE_AUTO (-s alone, -s5 to -s7) only when it pays */ SPLICE_AUTO (-s alone, -s5 to -s7) only when it pays */

View File

@ -148,7 +148,7 @@ static void freeworker(struct clientparam *param){
static unsigned poollimit(void){ static unsigned poollimit(void){
unsigned limit; unsigned limit;
if(conf.poolmax >= 0) limit = (unsigned)conf.poolmax; if(conf->poolmax >= 0) limit = (unsigned)conf->poolmax;
else { else {
limit = 32 * tpool.services; limit = 32 * tpool.services;
if(limit > tpool.maxchild) limit = tpool.maxchild; if(limit > tpool.maxchild) limit = tpool.maxchild;
@ -173,7 +173,7 @@ static int poolpark(struct clientparam *param){
tpool.idle = param; tpool.idle = param;
tpool.nidle++; tpool.nidle++;
param->pooled = 1; param->pooled = 1;
timeout = conf.pooltimeout; timeout = conf->pooltimeout;
_3proxy_mutex_unlock(&tpool.mutex); _3proxy_mutex_unlock(&tpool.mutex);
if(timeout <= 0) _3proxy_sem_lock(param->wake); if(timeout <= 0) _3proxy_sem_lock(param->wake);
@ -400,7 +400,7 @@ static void srvdiscard(struct srvstart *s){
static void srvunlink(struct srvparam *srv){ static void srvunlink(struct srvparam *srv){
if(srv->next)srv->next->prev = srv->prev; if(srv->next)srv->next->prev = srv->prev;
if(srv->prev)srv->prev->next = srv->next; if(srv->prev)srv->prev->next = srv->next;
else conf.services = srv->next; else conf->services = srv->next;
srv->next = srv->prev = NULL; srv->next = srv->prev = NULL;
} }
#endif #endif
@ -519,19 +519,19 @@ static int srvprepare(struct srvstart *s, int argc, char **argv){
/* http lines accumulate until a service claims them, so each httpsrv takes /* http lines accumulate until a service claims them, so each httpsrv takes
the rules written above it and the next one starts empty. */ the rules written above it and the next one starts empty. */
if(srv->service == S_HTTPSRV){ if(srv->service == S_HTTPSRV){
srv->httprules = conf.httprules; srv->httprules = conf->httprules;
conf.httprules = NULL; conf->httprules = NULL;
} }
#endif #endif
#ifndef STDMAIN #ifndef STDMAIN
if(conf.acl){ if(conf->acl){
srv->acl = copyacl(conf.acl); srv->acl = copyacl(conf->acl);
if(!srv->acl) return 2; if(!srv->acl) return 2;
} }
if(conf.authfuncs){ if(conf->authfuncs){
srv->authfuncs = copyauth(conf.authfuncs); srv->authfuncs = copyauth(conf->authfuncs);
if(!srv->authfuncs) return 2; if(!srv->authfuncs) return 2;
} }
#else #else
@ -543,8 +543,8 @@ static int srvprepare(struct srvstart *s, int argc, char **argv){
if(*argv[i]=='-') { if(*argv[i]=='-') {
switch(argv[i][1]) { switch(argv[i][1]) {
case 'd': case 'd':
if(!conf.demon)daemonize(); if(!conf->demon)daemonize();
conf.demon = 1; conf->demon = 1;
break; break;
#if defined SO_BINDTODEVICE || defined IP_BOUND_IF #if defined SO_BINDTODEVICE || defined IP_BOUND_IF
case 'D': case 'D':
@ -767,7 +767,7 @@ static int srvprepare(struct srvstart *s, int argc, char **argv){
"\tExample: %s -i127.0.0.1\n\n" "\tExample: %s -i127.0.0.1\n\n"
"%s", "%s",
argv[0], argv[0],
conf.stringtable?(char *)conf.stringtable[3]: VERSION " (" BUILDDATE ")", conf->stringtable?(char *)conf->stringtable[3]: VERSION " (" BUILDDATE ")",
argv[0], loghelp, printopts("\n\t"), childdef.helpmessage, argv[0], argv[0], loghelp, printopts("\n\t"), childdef.helpmessage, argv[0],
#ifdef STDMAIN #ifdef STDMAIN
copyright copyright
@ -795,7 +795,7 @@ static int srvprepare(struct srvstart *s, int argc, char **argv){
"\tExample: %s -d -i127.0.0.1 6666 serv.somehost.ru 6666\n\n" "\tExample: %s -d -i127.0.0.1 6666 serv.somehost.ru 6666\n\n"
"%s", "%s",
argv[0], argv[0],
conf.stringtable?(char *)conf.stringtable[3]: VERSION " (" BUILDDATE ")", conf->stringtable?(char *)conf->stringtable[3]: VERSION " (" BUILDDATE ")",
argv[0], loghelp, printopts("\n\t"), childdef.helpmessage, argv[0], argv[0], loghelp, printopts("\n\t"), childdef.helpmessage, argv[0],
#ifdef STDMAIN #ifdef STDMAIN
copyright copyright
@ -841,7 +841,7 @@ static int srvprepare(struct srvstart *s, int argc, char **argv){
#endif #endif
#ifndef STDMAIN #ifndef STDMAIN
if((error = copyfilter(conf.filters, srv))) return error; if((error = copyfilter(conf->filters, srv))) return error;
#endif #endif
return 0; return 0;
} }
@ -1282,7 +1282,7 @@ static int srvrun(struct srvstart *s){
/* A connection is only taken with a slot of maxchild in hand, which /* A connection is only taken with a slot of maxchild in hand, which
goes to its child; a slot not handed on is kept for the next one. goes to its child; a slot not handed on is kept for the next one.
The wait is timed to notice a reload. */ The wait is timed to notice a reload. */
while(!haveslot && conf.paused == srv->paused){ while(!haveslot && conf->paused == srv->paused){
if(!_3proxy_sem_timedlock(srv->childslots, 1000)){ if(!_3proxy_sem_timedlock(srv->childslots, 1000)){
haveslot = 1; haveslot = 1;
nfull = 0; nfull = 0;
@ -1294,7 +1294,7 @@ static int srvrun(struct srvstart *s){
} }
} }
if (connectback) break; if (connectback) break;
if (conf.paused != srv->paused) break; if (conf->paused != srv->paused) break;
error = srv->so._poll(srv->so.state, &srv->fds, 1, 1000); error = srv->so._poll(srv->so.state, &srv->fds, 1, 1000);
if (error >= 1) break; if (error >= 1) break;
if (error == 0) continue; if (error == 0) continue;
@ -1304,7 +1304,7 @@ static int srvrun(struct srvstart *s){
break; break;
} }
} }
if((conf.paused != srv->paused) || (error < 0)) break; if((conf->paused != srv->paused) || (error < 0)) break;
error = 0; error = 0;
#if defined NOTCPMAIN #if defined NOTCPMAIN
next = udpnext(s); next = udpnext(s);
@ -1431,12 +1431,12 @@ int mainprepare(int argc, char** argv, void **service){
} }
/* listed only once it is sure to run: the thread reading the /* listed only once it is sure to run: the thread reading the
configuration links and unlinks it here, the service unlinks itself */ configuration links and unlinks it here, the service unlinks itself */
if(!conf.services){ if(!conf->services){
conf.services = &s->srv; conf->services = &s->srv;
} }
else { else {
s->srv.next = conf.services; s->srv.next = conf->services;
conf.services = conf.services->prev = &s->srv; conf->services = conf->services->prev = &s->srv;
} }
*service = s; *service = s;
return 0; return 0;
@ -1468,27 +1468,27 @@ _3proxy_sem_t udpinit;
void srvinit(struct srvparam * srv, struct clientparam *param){ void srvinit(struct srvparam * srv, struct clientparam *param){
memset(srv, 0, sizeof(struct srvparam)); memset(srv, 0, sizeof(struct srvparam));
srv->version = conf.version + 1; srv->version = conf->version + 1;
srv->paused = conf.paused; srv->paused = conf->paused;
srv->logfunc = havelog?conf.logfunc:lognone; srv->logfunc = havelog?conf->logfunc:lognone;
srv->noforce = conf.noforce; srv->noforce = conf->noforce;
srv->logformat = conf.logformat? (unsigned char *)strdup((char *)conf.logformat) : NULL; srv->logformat = conf->logformat? (unsigned char *)strdup((char *)conf->logformat) : NULL;
srv->authfunc = conf.authfunc; srv->authfunc = conf->authfunc;
srv->maxchild = conf.maxchild; srv->maxchild = conf->maxchild;
srv->backlog = conf.backlog; srv->backlog = conf->backlog;
srv->stacksize = conf.stacksize; srv->stacksize = conf->stacksize;
memcpy(srv->timeouts, conf.timeouts, sizeof(srv->timeouts)); memcpy(srv->timeouts, conf->timeouts, sizeof(srv->timeouts));
srv->filtermaxsize = conf.filtermaxsize; srv->filtermaxsize = conf->filtermaxsize;
srv->parentretries = conf.parentretries; srv->parentretries = conf->parentretries;
srv->maxseg = conf.maxseg; srv->maxseg = conf->maxseg;
srv->delimchar = conf.delimchar; srv->delimchar = conf->delimchar;
srv->time_start = time(NULL); srv->time_start = time(NULL);
if(havelog && conf.logtarget){ if(havelog && conf->logtarget){
srv->logtarget = (unsigned char *)strdup((char *)conf.logtarget); srv->logtarget = (unsigned char *)strdup((char *)conf->logtarget);
} }
srv->srvsock = INVALID_SOCKET; srv->srvsock = INVALID_SOCKET;
srv->logdumpsrv = conf.logdumpsrv; srv->logdumpsrv = conf->logdumpsrv;
srv->logdumpcli = conf.logdumpcli; srv->logdumpcli = conf->logdumpcli;
srv->cbsock = INVALID_SOCKET; srv->cbsock = INVALID_SOCKET;
srv->needuser = 1; srv->needuser = 1;
#ifdef __linux__ #ifdef __linux__
@ -1516,14 +1516,14 @@ void srvinit(struct srvparam * srv, struct clientparam *param){
} }
udpinited = 1; udpinited = 1;
#endif #endif
srv->intsa = conf.intsa; srv->intsa = conf->intsa;
srv->extsa = conf.extsa; srv->extsa = conf->extsa;
#ifndef NOIPV6 #ifndef NOIPV6
srv->extsa6 = conf.extsa6; srv->extsa6 = conf->extsa6;
#endif #endif
srv->so = so; srv->so = so;
srv->authcachetime = conf.authcachetime; srv->authcachetime = conf->authcachetime;
srv->authcachetype = conf.authcachetype; srv->authcachetype = conf->authcachetype;
} }
void srvinit2(struct srvparam * srv, struct clientparam *param){ void srvinit2(struct srvparam * srv, struct clientparam *param){

View File

@ -26,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))) { if((af == AF_INET6) && (retval = hashresolv(&dns6_table, name, value, retttl))) {
return retval; return retval;
} }
n = (makeauth && !SAISNULL(&conf.authnserver.addr))? 1 : conf.numservers; n = (makeauth && !SAISNULL(&conf->authnserver.addr))? 1 : conf->numservers;
for(i=0; i<n; i++){ for(i=0; i<n; i++){
unsigned short nq, na; unsigned short nq, na;
unsigned char b[4098], *buf, *s1, *s2; unsigned char b[4098], *buf, *s1, *s2;
@ -49,13 +49,13 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_
memset(sinsr, 0, sizeof(addr)); memset(sinsr, 0, sizeof(addr));
if(makeauth && !SAISNULL(&conf.authnserver.addr)){ if(makeauth && !SAISNULL(&conf->authnserver.addr)){
usetcp = conf.authnserver.usetcp; usetcp = conf->authnserver.usetcp;
*SAFAMILY(sinsl) = *SAFAMILY(&conf.authnserver.addr); *SAFAMILY(sinsl) = *SAFAMILY(&conf->authnserver.addr);
} }
else { else {
usetcp = conf.nservers[i].usetcp; usetcp = conf->nservers[i].usetcp;
*SAFAMILY(sinsl) = *SAFAMILY(&conf.nservers[i].addr); *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((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))){ if(so._bind(so.state, sock,(struct sockaddr *)sinsl,SASIZE(sinsl))){
@ -63,14 +63,14 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_
so._closesocket(so.state, sock); so._closesocket(so.state, sock);
break; break;
} }
if(makeauth && !SAISNULL(&conf.authnserver.addr)){ if(makeauth && !SAISNULL(&conf->authnserver.addr)){
*sinsr = conf.authnserver.addr; *sinsr = conf->authnserver.addr;
} }
else { else {
*sinsr = conf.nservers[i].addr; *sinsr = conf->nservers[i].addr;
} }
if(usetcp){ if(usetcp){
if(connectwithpoll(NULL, sock,(struct sockaddr *)sinsr,SASIZE(sinsr),conf.timeouts[CONNECT_TO])) { if(connectwithpoll(NULL, sock,(struct sockaddr *)sinsr,SASIZE(sinsr),conf->timeouts[CONNECT_TO])) {
so._shutdown(so.state, sock, SHUT_RDWR); so._shutdown(so.state, sock, SHUT_RDWR);
so._closesocket(so.state, sock); so._closesocket(so.state, sock);
break; break;
@ -115,13 +115,13 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_
len+=2; len+=2;
} }
if(socksendto(NULL, sock, (struct sockaddr *)sinsr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000) != len){ if(socksendto(NULL, sock, (struct sockaddr *)sinsr, buf, len, conf->timeouts[SINGLEBYTE_L]*1000) != len){
so._shutdown(so.state, sock, SHUT_RDWR); so._shutdown(so.state, sock, SHUT_RDWR);
so._closesocket(so.state, sock); so._closesocket(so.state, sock);
continue; continue;
} }
if(param) param->statscli64 += len; if(param) param->statscli64 += len;
len = sockrecvfrom(NULL, sock, (struct sockaddr *)&from, buf, 4096, conf.timeouts[DNS_TO]*1000); len = sockrecvfrom(NULL, sock, (struct sockaddr *)&from, buf, 4096, conf->timeouts[DNS_TO]*1000);
if(len > 13 && usetcp){ if(len > 13 && usetcp){
unsigned short us; unsigned short us;
us = ntohs(*(unsigned short*)buf); us = ntohs(*(unsigned short*)buf);
@ -129,7 +129,7 @@ uint32_t udpresolve(int af, unsigned char * name, unsigned char * value, uint32_
buf+=2; buf+=2;
if(us > 4096 || us < len) len = 0; if(us > 4096 || us < len) len = 0;
else if(us > len){ else if(us > len){
if(sockrecvfrom(NULL, sock, (struct sockaddr *)&from, buf+len, us-len, conf.timeouts[DNS_TO]*1000) != us-len) len = 0; if(sockrecvfrom(NULL, sock, (struct sockaddr *)&from, buf+len, us-len, conf->timeouts[DNS_TO]*1000) != us-len) len = 0;
else len = us; else len = us;
} }
} }

View File

@ -252,10 +252,10 @@ log(logbuf);
(param->srv->logdumpcli && (param->statscli64 > param->srv->logdumpcli))) (param->srv->logdumpcli && (param->statscli64 > param->srv->logdumpcli)))
dolog(param, NULL); dolog(param, NULL);
if(param->version < conf.version){ if(param->version < conf->version){
if(!param->srv->noforce && (res = (*param->srv->authfunc)(param)) && res != 2) {RETURN(res);} if(!param->srv->noforce && (res = (*param->srv->authfunc)(param)) && res != 2) {RETURN(res);}
param->paused = conf.paused; param->paused = conf->paused;
param->version = conf.version; param->version = conf->version;
} }
if((param->maxtrafin64 && param->statssrv64 >= param->maxtrafin64) || (param->maxtrafout64 && param->statscli64 >= param->maxtrafout64)){ if((param->maxtrafin64 && param->statssrv64 >= param->maxtrafin64) || (param->maxtrafout64 && param->statscli64 >= param->maxtrafout64)){

View File

@ -94,9 +94,9 @@ int init_sql(char * s){
} }
void sqlerr (char *buf){ void sqlerr (char *buf){
if(conf.stdlog){ if(conf->stdlog){
fprintf(conf.stdlog, "%s\n", buf); fprintf(conf->stdlog, "%s\n", buf);
fflush(conf.stdlog); fflush(conf->stdlog);
} }
_3proxy_mutex_unlock(&log_mutex); _3proxy_mutex_unlock(&log_mutex);
} }

View File

@ -859,7 +859,7 @@ struct filemon {
struct extparam { struct extparam {
int *timeouts; int timeouts[12];
struct ace * acl; struct ace * acl;
#ifdef WITH_HTTPSRV #ifdef WITH_HTTPSRV
struct httprule *httprules; struct httprule *httprules;

View File

@ -353,9 +353,9 @@ static char * admin_open(struct printparam *pp, struct clientparam *param)
buf = malloc(LINESIZE); buf = malloc(LINESIZE);
if(!buf) return NULL; if(!buf) return NULL;
sprintf(buf, ok, conf.stringtable?(char *)conf.stringtable[2]:"3proxy", sprintf(buf, ok, conf->stringtable?(char *)conf->stringtable[2]:"3proxy",
conf.stringtable?(char *)conf.stringtable[2]:"3[APA3A] tiny proxy", conf->stringtable?(char *)conf->stringtable[2]:"3[APA3A] tiny proxy",
conf.stringtable?(char *)conf.stringtable[3]:""); conf->stringtable?(char *)conf->stringtable[3]:"");
printstr(pp, buf); printstr(pp, buf);
return buf; return buf;
} }
@ -374,7 +374,7 @@ int op_admin(struct httpreq *r, const unsigned char *params)
buf = admin_open(&pp, r->param); buf = admin_open(&pp, r->param);
if(!buf) return 1; if(!buf) return 1;
printstr(&pp, (char *)conf.stringtable[WEBBANNERS]); printstr(&pp, (char *)conf->stringtable[WEBBANNERS]);
admin_close(&pp, buf); admin_close(&pp, buf);
return 0; return 0;
} }
@ -398,7 +398,7 @@ int op_admin_counters(struct httpreq *r, const unsigned char *params)
{ {
struct trafcount *cp; struct trafcount *cp;
int num = 0; int num = 0;
for(cp = conf.trafcounter; cp; cp = cp->next, num++){ for(cp = conf->trafcounter; cp; cp = cp->next, num++){
int inbuf = 0; int inbuf = 0;
if(cp->ace && (limited || param->redirected)){ if(cp->ace && (limited || param->redirected)){
@ -489,7 +489,7 @@ int op_admin_reload(struct httpreq *r, const unsigned char *params)
buf = admin_open(&pp, r->param); buf = admin_open(&pp, r->param);
if(!buf) return 1; if(!buf) return 1;
if(r->param->srv->s_option) printstr(&pp, (char *)conf.stringtable[WEBBANNERS]); if(r->param->srv->s_option) printstr(&pp, (char *)conf->stringtable[WEBBANNERS]);
else { else {
needreload = 1; needreload = 1;
printstr(&pp, "<h3>Reload scheduled</h3>"); printstr(&pp, "<h3>Reload scheduled</h3>");
@ -520,7 +520,7 @@ int op_admin_services(struct httpreq *r, const unsigned char *params)
printstr(&pp, "<threadpool>"); printstr(&pp, "<threadpool>");
printval(&tpool, TYPE_THREADPOOL, 0, &pp); printval(&tpool, TYPE_THREADPOOL, 0, &pp);
printstr(&pp, "</threadpool>\r\n"); printstr(&pp, "</threadpool>\r\n");
printval(conf.services, TYPE_SERVER, 0, &pp); printval(conf->services, TYPE_SERVER, 0, &pp);
printstr(&pp, postxml); printstr(&pp, postxml);
} }