diff --git a/src/3proxy.c b/src/3proxy.c index cef14f7..70ee103 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -271,51 +271,6 @@ void cyclestep(void){ } if(conf.logname) { if(timechanged(conf.logtime, conf.time, conf.logtype)) { - if(conf.stdlog) conf.stdlog = freopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, conf.time), "a", conf.stdlog); - else conf.stdlog = fopen((char *)dologname (tmpbuf, conf.logname, NULL, conf.logtype, conf.time), "a"); - conf.logtime = conf.time; - if(conf.logtype != NONE && conf.rotate) { - int t; - t = 1; - switch(conf.logtype){ - case ANNUALLY: - t = t * 12; - case MONTHLY: - t = t * 4; - case WEEKLY: - t = t * 7; - case DAILY: - t = t * 24; - case HOURLY: - t = t * 60; - case MINUTELY: - t = t * 60; - default: - break; - } - dologname (tmpbuf, conf.logname, (conf.archiver)?conf.archiver[1]:NULL, conf.logtype, (conf.logtime - t * conf.rotate)); - remove ((char *) tmpbuf); - if(conf.archiver) { - int i; - *tmpbuf = 0; - for(i = 2; i < conf.archiverc && strlen((char *)tmpbuf) < 512; i++){ - strcat((char *)tmpbuf, " "); - if(!strcmp((char *)conf.archiver[i], "%A")){ - strcat((char *)tmpbuf, "\""); - dologname (tmpbuf + strlen((char *)tmpbuf), conf.logname, conf.archiver[1], conf.logtype, (conf.logtime - t)); - strcat((char *)tmpbuf, "\""); - } - else if(!strcmp((char *)conf.archiver[i], "%F")){ - strcat((char *)tmpbuf, "\""); - dologname (tmpbuf+strlen((char *)tmpbuf), conf.logname, NULL, conf.logtype, (conf.logtime-t)); - strcat((char *)tmpbuf, "\""); - } - else - strcat((char *)tmpbuf, (char *)conf.archiver[i]); - } - system((char *)tmpbuf+1); - } - } } } if(conf.counterd >= 0 && conf.trafcounter) { @@ -512,11 +467,10 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int pthread_mutex_init(&hash_mutex, NULL); pthread_mutex_init(&tc_mutex, NULL); pthread_mutex_init(&pwl_mutex, NULL); - pthread_mutex_init(&log_mutex, NULL); #ifndef NORADIUS pthread_mutex_init(&rad_mutex, NULL); #endif - + initlog(); freeconf(&conf); res = readconfig(fp); conf.version++; diff --git a/src/Makefile.inc b/src/Makefile.inc index a22f49a..d7ee013 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -26,50 +26,52 @@ ftp$(OBJSUFFICS): ftp.c proxy.h structures.h sockgetchar$(OBJSUFFICS): sockgetchar.c proxy.h structures.h $(CC) $(CFLAGS) sockgetchar.c -proxy$(OBJSUFFICS): proxy.c proxy.h structures.h proxymain.c +proxy$(OBJSUFFICS): proxy.c proxy.h structures.h proxymain.c log.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP $(DEFINEOPTION)ANONYMOUS proxy.c -pop3p$(OBJSUFFICS): pop3p.c proxy.h structures.h proxymain.c +pop3p$(OBJSUFFICS): pop3p.c proxy.h structures.h proxymain.c log.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP pop3p.c -smtpp$(OBJSUFFICS): smtpp.c proxy.h structures.h proxymain.c +smtpp$(OBJSUFFICS): smtpp.c proxy.h structures.h proxymain.c log.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP smtpp.c -ftppr$(OBJSUFFICS): ftppr.c proxy.h structures.h proxymain.c +ftppr$(OBJSUFFICS): ftppr.c proxy.h structures.h proxymain.c log.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP ftppr.c -tcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h proxymain.c +tcppm$(OBJSUFFICS): tcppm.c proxy.h structures.h proxymain.c log.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP tcppm.c -socks$(OBJSUFFICS): socks.c proxy.h structures.h proxymain.c +socks$(OBJSUFFICS): socks.c proxy.h structures.h proxymain.c log.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)NOPORTMAP socks.c -udppm$(OBJSUFFICS): udppm.c proxy.h structures.h proxymain.c +udppm$(OBJSUFFICS): udppm.c proxy.h structures.h proxymain.c log.c $(CC) $(CFLAGS) $(DEFINEOPTION)WITHMAIN $(DEFINEOPTION)PORTMAP udppm.c + + 3proxy$(OBJSUFFICS): 3proxy.c proxy.h structures.h $(CC) $(CFLAGS) 3proxy.c -$(BUILDDIR)proxy$(EXESUFFICS): sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)proxy$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) +$(BUILDDIR)proxy$(EXESUFFICS): sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) + $(LN) $(LNOUT)$(BUILDDIR)proxy$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) -$(BUILDDIR)pop3p$(EXESUFFICS): sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)pop3p$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) +$(BUILDDIR)pop3p$(EXESUFFICS): sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) + $(LN) $(LNOUT)$(BUILDDIR)pop3p$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) -$(BUILDDIR)smtpp$(EXESUFFICS): sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) base64$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)smtpp$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) base64$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) +$(BUILDDIR)smtpp$(EXESUFFICS): sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) $(COMPATLIBS) + $(LN) $(LNOUT)$(BUILDDIR)smtpp$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) base64$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) -$(BUILDDIR)ftppr$(EXESUFFICS): sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) ftp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)ftppr$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) +$(BUILDDIR)ftppr$(EXESUFFICS): sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) ftp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) + $(LN) $(LNOUT)$(BUILDDIR)ftppr$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) -$(BUILDDIR)socks$(EXESUFFICS): sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) - $(LN) $(LNOUT)$(BUILDDIR)socks$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) +$(BUILDDIR)socks$(EXESUFFICS): sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) + $(LN) $(LNOUT)$(BUILDDIR)socks$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) -$(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) - $(LN) $(LNOUT)$(BUILDDIR)tcppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) +$(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) common$(OBJSUFFICS) + $(LN) $(LNOUT)$(BUILDDIR)tcppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) -$(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) - $(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) log$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) +$(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) common$(OBJSUFFICS) + $(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS) mainfunc$(OBJSUFFICS): proxy.h structures.h proxymain.c $(CC) $(COUT)mainfunc$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)MODULEMAINFUNC=mainfunc proxymain.c diff --git a/src/auth.c b/src/auth.c index b7b3851..24e0474 100644 --- a/src/auth.c +++ b/src/auth.c @@ -1341,155 +1341,3 @@ unsigned long fakeresolver (int af, unsigned char *name, unsigned char * value){ } return 1; } - -#ifndef NOODBC - -SQLHENV henv = NULL; -SQLHSTMT hstmt = NULL; -SQLHDBC hdbc = NULL; -char * sqlstring = NULL; - - -void close_sql(){ - if(hstmt) { - SQLFreeHandle(SQL_HANDLE_STMT, hstmt); - hstmt = NULL; - } - if(hdbc){ - SQLDisconnect(hdbc); - SQLFreeHandle(SQL_HANDLE_DBC, hdbc); - hdbc = NULL; - } - if(henv) { - SQLFreeHandle(SQL_HANDLE_ENV, henv); - henv = NULL; - } -} - -int attempt = 0; -time_t attempt_time = 0; - -int init_sql(char * s){ - SQLRETURN retcode; - char * datasource; - char * username; - char * password; - char * string; - - if(!s) return 0; - if(!sqlstring || strcmp(sqlstring, s)){ - string = sqlstring; - sqlstring=mystrdup(s); - if(string)myfree(string); - } - - if(hstmt || hdbc || henv) close_sql(); - attempt++; - attempt_time = time(0); - if(!henv){ - retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); - if (!henv || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)){ - henv = NULL; - return 0; - } - retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); - - if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) { - return 0; - } - } - if(!hdbc){ - retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); - if (!hdbc || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)) { - hdbc = NULL; - SQLFreeHandle(SQL_HANDLE_ENV, henv); - henv = NULL; - return 0; - } - SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)15, 0); - } - string = mystrdup(sqlstring); - if(!string) return 0; - datasource = strtok(string, ","); - username = strtok(NULL, ","); - password = strtok(NULL, ","); - - - /* Connect to data source */ - retcode = SQLConnect(hdbc, (SQLCHAR*) datasource, (SQLSMALLINT)strlen(datasource), - (SQLCHAR*) username, (SQLSMALLINT)((username)?strlen(username):0), - (SQLCHAR*) password, (SQLSMALLINT)((password)?strlen(password):0)); - - myfree(string); - if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ - SQLFreeHandle(SQL_HANDLE_DBC, hdbc); - hdbc = NULL; - SQLFreeHandle(SQL_HANDLE_ENV, henv); - henv = NULL; - return 0; - } - retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); - if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ - close_sql(); - return 0; - } - return 1; -} - -void sqlerr (char *buf){ - if(conf.stdlog){ - fprintf(conf.stdlog, "%s\n", buf); - fflush(conf.stdlog); - } - pthread_mutex_unlock(&log_mutex); -} - -unsigned char statbuf[8192]; - -void logsql(struct clientparam * param, const unsigned char *s) { - SQLRETURN ret; - int len; - - - if(param->nolog) return; - pthread_mutex_lock(&log_mutex); - len = dobuf(param, statbuf, s, (unsigned char *)"\'"); - - if(attempt > 5){ - time_t t; - - t = time(0); - if (t - attempt_time < 180){ - sqlerr((char *)statbuf); - return; - } - } - if(!hstmt){ - if(!init_sql(sqlstring)) { - sqlerr((char *)statbuf); - return; - } - } - if(hstmt){ - ret = SQLExecDirect(hstmt, (SQLCHAR *)statbuf, (SQLINTEGER)len); - if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){ - close_sql(); - if(!init_sql(sqlstring)){ - sqlerr((char *)statbuf); - return; - } - if(hstmt) { - ret = SQLExecDirect(hstmt, (SQLCHAR *)statbuf, (SQLINTEGER)len); - if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){ - sqlerr((char *)statbuf); - return; - } - attempt = 0; - } - } - attempt = 0; - } - pthread_mutex_unlock(&log_mutex); -} - -#endif diff --git a/src/authradius.c b/src/authradius.c index 652a317..58f872e 100644 --- a/src/authradius.c +++ b/src/authradius.c @@ -293,13 +293,14 @@ typedef struct radius_packet_t { uint8_t id; uint16_t length; uint8_t vector[AUTH_VECTOR_LEN]; - uint8_t data[4096]; + uint8_t data[2048]; } radius_packet_t; #define RETURN(xxx) { res = xxx; goto CLEANRET; } -int radsend(struct clientparam * param, int auth, int stop){ +#define packet (*(radius_packet_t *buf)) +int radbuf(struct clientparam * param, unsigned char * buf, int auth, int stop){ int loop; int id; int res = 4; @@ -308,15 +309,7 @@ int radsend(struct clientparam * param, int auth, int stop){ int total_length; int len; int op; -#ifdef NOIPV6 - struct sockaddr_in saremote; -#else - struct sockaddr_in6 saremote; -#endif - struct pollfd fds[1]; char vector[AUTH_VECTOR_LEN]; - radius_packet_t packet, rpacket; - SASIZETYPE salen; int data_len; uint8_t *vendor_len; int count=0; @@ -325,9 +318,8 @@ int radsend(struct clientparam * param, int auth, int stop){ int vendorlen=0; char buf[64]; - if(!radiussecret || !nradservers) { - return 4; + return 0; } memset(&packet, 0, sizeof(packet)); @@ -526,6 +518,38 @@ int radsend(struct clientparam * param, int auth, int stop){ md5_calc(packet.vector, (u_char *)&packet, total_length + len); } memcpy(vector, packet.vector, AUTH_VECTOR_LEN); + return total_length; + +} + + +int radsend(const char *buf, int total_length, int auth){ + + int loop; + int id; + int res = 4; + SOCKET sockfd = -1; + unsigned char *ptr; + int len; + int op; +#ifdef NOIPV6 + struct sockaddr_in saremote; +#else + struct sockaddr_in6 saremote; +#endif + struct pollfd fds[1]; + char vector[AUTH_VECTOR_LEN]; + radius_packet_t packet, rpacket; + SASIZETYPE salen; + int data_len; + uint8_t *vendor_len; + int count=0; + uint8_t *attr; + long vendor=0; + int vendorlen=0; + char buf[64]; + + for (loop = 0; loop < nradservers && loop < MAXRADIUS; loop++) { SOCKET remsock; @@ -656,14 +680,20 @@ CLEANRET: } int radauth(struct clientparam * param){ + radius_packet_t packet; + int len; /*radsend(param, 0, 0);*/ - return radsend(param, 1, 0); + len = radbuf(param, buf, 1, 0); + return len?radsend(buf, len, 1):4; } -void logradius(struct clientparam * param, const unsigned char *s) { - radsend(param, 0, 1); - if(param->trafcountfunc)(*param->trafcountfunc)(param); - clearstat(param); + +int raddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){ + return radbuf(param, buf, 0, 1); +} + +void logradius(const unsigned char *buf, int len, LOGGER *logger){ + if(len)radsend(buf, len, 0); } diff --git a/src/common.c b/src/common.c index 1bdf5d4..c42774f 100644 --- a/src/common.c +++ b/src/common.c @@ -116,7 +116,6 @@ struct extparam conf = { NULL, NULL, doconnect, - lognone, NULL, NULL, NULL, NULL, diff --git a/src/conf.c b/src/conf.c index 01b5664..eff390c 100644 --- a/src/conf.c +++ b/src/conf.c @@ -295,7 +295,7 @@ static int h_log(int argc, unsigned char ** argv){ } if(argc > 1) { if(!strcmp((char *) argv[1], "/dev/null")) { - conf.logfunc = lognone; + conf.logfunc = NULL; return 0; } if(!notchanged) conf.logtarget = (unsigned char *)mystrdup((char *)argv[1]); @@ -1780,7 +1780,7 @@ void freeconf(struct extparam *confp){ logname = confp->logname; confp->logname = NULL; */ - confp->logfunc = lognone; + confp->logfunc = NULL; logformat = confp->logformat; confp->logformat = NULL; confp->rotate = 0; diff --git a/src/datatypes.c b/src/datatypes.c index 6613299..a384d70 100644 --- a/src/datatypes.c +++ b/src/datatypes.c @@ -523,7 +523,7 @@ static void * ef_server_childcount(struct node * node){ } static void * ef_server_log(struct node * node){ - if(((struct srvparam *)node->value) -> logfunc == lognone) return "none"; + if(((struct srvparam *)node->value) -> logfunc == NULL) return "none"; #ifndef NORADIUS else if(((struct srvparam *)node->value) -> logfunc == logradius) return "radius"; #endif diff --git a/src/ftppr.c b/src/ftppr.c index 71eb8cc..d2f4ab4 100644 --- a/src/ftppr.c +++ b/src/ftppr.c @@ -333,4 +333,5 @@ struct proxydef childdef = { " -hdefault_host[:port] - use this host and port as default if no host specified\n" }; #include "proxymain.c" +#include "log.c" #endif diff --git a/src/log.c b/src/log.c index 7572565..68ed97d 100644 --- a/src/log.c +++ b/src/log.c @@ -6,9 +6,6 @@ */ - - - #include "proxy.h" pthread_mutex_t log_mutex; int havelog = 0; @@ -17,19 +14,95 @@ int havelog = 0; struct clientparam logparam; struct srvparam logsrv; +struct LOGGER; +void(*prelog)(struct clientparam * param) = NULL; + +#ifdef WITHMAIN +#define HAVERADIUS 0 +#define HAVESQL 0 +#else +int raddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s); +void logradius(const char * buf, int len, struct LOGGER *logger); +#define HAVERADIUS 1 + +#ifndef NOODBC +#undef HAVESQL +#define HAVESQL 1 +static int sqlinit(const char * selector, int logtype, struct LOGGER *logger); +static void sqllog(const char * buf, int len, struct LOGGER *logger); +static void sqlrotate(struct LOGGER *logger); +static void sqlclose(struct LOGGER *logger); +#endif +#endif + +#ifdef _WIN32 +#define HAVESYSLOG 0 +#else +#define HAVESYSLOG 1 +static int sysloginit(const char * selector, int logtype, struct LOGGER *logger); +static void logsyslog(const char * buf, int len, struct LOGGER *logger); +static void syslogrotate(struct LOGGER *logger); +static void syslogclose(struct LOGGER *logger); +#endif + +static int stdloginit(const char * selector, int logtype, struct LOGGER *logger); +static void stdlog(const char * buf, int len, struct LOGGER *logger); +static void stdlogrotate(struct LOGGER *logger); +static void stdlogclose(struct LOGGER *logger); + + + +struct LOGFUNC logfuncs = { +#if HAVESYSLOG > 0 + {logfuncs+1+HAVESYSLOG, sysloginit, stddobuf, logsyslog, syslogrotate, syslogclose, "@"}, +#endif +#if HAVERADIUS > 0 + {logfuncs+1+HAVESYSLOG+HAVERADIUS, NULL, raddobuf, logradius, NULL, NULL, "radius"}, +#endif +#if HAVESQL > 0 + {logfuncs+1+HAVESYSLOG+HAVERADIUS+HAVESQL, sqlinit, sqldobuf, sqllog, sqlrotate, sqlclose, "&"}, +#endif + {NULL, stdloginit, stddobuf, stdlog, stdlogrotate, stdlogclose, ""} + }; + + + +struct LOGGER *loggers = NULL; + +struct stdlogdata{ + FILE *fp; +} errld= {stderr}; + +struct LOGGER { + char * selector; + void * data; + struct LOGFUNC *logfunc; + int rotate; + time_t rotated; + int registered; +} errlogger = {"errlogger", &errld, logfuncs+1+HAVESYSLOG+HAVERADIUS+HAVESQL, 0, 0, 1}; + + +void initlog(void){ + srvinit(&logsrv, &logparam); + pthread_mutex_init(&log_mutex, NULL); +} void dolog(struct clientparam * param, const unsigned char *s){ static int init = 0; - if(param)param->srv->logfunc(param, s); - else { - if(!init){ - srvinit(&logsrv, &logparam); - init = 1; - } - logstdout(&logparam, s); +/* TODO: dobuf */ +/* TODO: spooling */ + if(!param){ + stdlog(s, strlen(s), &stdlogger); } + else if(!param->nolog && param->srv->logtarget){ + if(prelog)prelog(param); + param->srv->logfunc(param, s); + } + if(param->trafcountfunc)(*param->trafcountfunc)(param); + clearstat(param); } @@ -318,37 +391,285 @@ int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char * time(&t); if(!param) return 0; - if(param->trafcountfunc)(*param->trafcountfunc)(param); format = param->srv->logformat?(char *)param->srv->logformat : DEFLOGFORMAT; tm = (*format == 'G' || *format == 'g')? gmtime(&t) : localtime(&t); i = dobuf2(param, buf, s, doublec, tm, format + 1); - clearstat(param); return i; } -void lognone(struct clientparam * param, const unsigned char *s) { - if(param->trafcountfunc)(*param->trafcountfunc)(param); - clearstat(param); + +static int stdloginit(const char * selector, int logtype, struct LOGGER *logger){ + char tmpuf[1024]; + struct stdlogdata *lp; + lp = myalloc(sizeof(struct stdlogdata)); + if(!lp) return 1; + logger->data = lp; + if(!selector || !*selector){ + logger-rotate = NONE; + lp->fp = stdout; + } + else { + logger->rotate = logtype; + lp->fp = fopen((char *)dologname (tmpbuf, conf.logname, NULL, logtype, time(NULL)), "a"); + if(!lp->fp){ + myfree(lp); + return(2); + } + } + return 0; } -void logstdout(struct clientparam * param, const unsigned char *s) { - FILE *log; - unsigned char tmpbuf[8192]; - - dobuf(param, tmpbuf, s, NULL); - log = param->srv->stdlog?param->srv->stdlog:conf.stdlog?conf.stdlog:stdout; - if(!param->nolog)if(fprintf(log, "%s\n", tmpbuf) < 0) { - perror("printf()"); - }; - if(log != conf.stdlog)fflush(log); +int stddobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){ + return dobuf(param, buf, s, NULL); } -#ifndef _WIN32 -void logsyslog(struct clientparam * param, const unsigned char *s) { - unsigned char tmpbuf[8192]; - dobuf(param, tmpbuf, s, NULL); - if(!param->nolog)syslog(LOG_INFO, "%s", tmpbuf); +void stdlog(struct clientparam * param, const unsigned char *s, struct LOGGER *logger) { + FILE *log = (struct stdlogdata *)logger->data; + + fprintf(log, "%s\n", buf); + if(log == stdout || log == stderr)fflush(log); } + +static void stdlogrotate(struct LOGGER *logger){ + char tmpuf[1024]; + struct stdlogdata *lp = (struct stdlogdata)logger->data; + if(lp->fp) lp->fp = freopen((char *)dologname (tmpbuf, logger->selector, NULL, logger->rotate, conf.time), "a", lp->fp); + else lp->fp = fopen((char *)dologname (tmpbuf, logger->selector, NULL, logger->rotate, conf.time), "a"); + conf.logtime = conf.time; + if(logger->rotate) { + int t; + t = 1; + switch(logger->rotate){ + case ANNUALLY: + t = t * 12; + case MONTHLY: + t = t * 4; + case WEEKLY: + t = t * 7; + case DAILY: + t = t * 24; + case HOURLY: + t = t * 60; + case MINUTELY: + t = t * 60; + default: + break; + } + dologname (tmpbuf, logger->selector, (conf.archiver)?conf.archiver[1]:NULL, logger->rotate, (conf.logtime - t * conf.rotate)); + remove ((char *) tmpbuf); + if(conf.archiver) { + int i; + *tmpbuf = 0; + for(i = 2; i < conf.archiverc && strlen((char *)tmpbuf) < 512; i++){ + strcat((char *)tmpbuf, " "); + if(!strcmp((char *)conf.archiver[i], "%A")){ + strcat((char *)tmpbuf, "\""); + dologname (tmpbuf + strlen((char *)tmpbuf), logger->selector, conf.archiver[1], logger->rotate, (conf.logtime - t)); + strcat((char *)tmpbuf, "\""); + } + else if(!strcmp((char *)conf.archiver[i], "%F")){ + strcat((char *)tmpbuf, "\""); + dologname (tmpbuf+strlen((char *)tmpbuf), logger->selector, NULL, logger->rotate, (conf.logtime-t)); + strcat((char *)tmpbuf, "\""); + } + else + strcat((char *)tmpbuf, (char *)conf.archiver[i]); + } + system((char *)tmpbuf+1); + } + } +} + +static void stdlogclose(struct LOGGER *logger){ + fclose(((struct stdlogdata *)logger->data)->fp); + myfree(((struct stdlogdata *)logger->data)->fp); +} + +#if HAVESYSLOG > 0 + +static int sysloginit(const char * selector, int logtype, struct LOGGER *logger){ + openlog(selector+1, LOG_PID, LOG_DAEMON); + logger->rotate = logtype; + logger->data = NULL; +} + +static void logsyslog(const char * buf, int len, struct LOGGER *logger) { + + syslog((param->res >= 90 && param->res<=99)?LOG_NOTICE:(param->res?LOG_WARNING:LOG_INFO), "%s", buf); +} + +static void syslogrotate(struct LOGGER *logger){ + closelog(); + openlog(logger->selector+1, LOG_PID, LOG_DAEMON); +} + +static void syslogclose(struct LOGGER *logger){ + closelog(); +} + + #endif +#if HAVESQL > 0 + +struct sqldata { + SQLHENV henv; + SQLHSTMT hstmt; + SQLHDBC hdbc; + int attempt; + time_t attempt_time; +}; + + + +static int sqlinit(const char * selector, int logtype, struct LOGGER *logger); +static void sqllog(struct clientparam * param, const unsigned char *s, LOGGER *logger); +static void sqlrotate(struct LOGGER *logger); + + +int sqlinit2(struct sqldata * sd, char * source){ + SQLRETURN retcode; + char * datasource; + char * username; + char * password; + char * string; + int ret = 0; + + retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sd->henv); + if (!henv || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)){ + return 1; + } + retcode = SQLSetEnvAttr(sd->henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) { + ret = 2; + goto CLOSEENV: + } + retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &sd->hdbc); + if (!sd->hdbc || (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)) { + ret = 3; + goto CLOSEENV: + } + SQLSetConnectAttr(sd->hdbc, SQL_LOGIN_TIMEOUT, (void*)15, 0); + + string = mystrdup(source); + if(!string) goto CLOSEHDBC; + datasource = strtok(string, ","); + username = strtok(NULL, ","); + password = strtok(NULL, ","); + + + /* Connect to data source */ + retcode = SQLConnect(sd->hdbc, (SQLCHAR*) datasource, (SQLSMALLINT)strlen(datasource), + (SQLCHAR*) username, (SQLSMALLINT)((username)?strlen(username):0), + (SQLCHAR*) password, (SQLSMALLINT)((password)?strlen(password):0)); + + myfree(string); + + + + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ + ret = 4; + goto CLOSEHDBC; + } + + retcode = SQLAllocHandle(SQL_HANDLE_STMT, sd->hdbc, &sd->hstmt); + if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO){ + sd->hstmt = 0; + ret = 5; + goto CLOSEHDBC; + } + + return 0; + +CLOSEHDBC: + SQLFreeHandle(SQL_HANDLE_DBC, hdbc); + sd->hdbc = 0; +CLOSEENV: + SQLFreeHandle(SQL_HANDLE_ENV, henv); + sd->henv = 0; + return ret; +} + +static int sqlinit(const char * selector, int logtype, struct LOGGER *logger){ + struct sqldata *sd; + int res + + logger->rotate = logtype; + sd = (struct sqldata *)myalloc(sizeof(struct sqldata)); + memset(sd, 0, sizeof(struct sqldata)); + loger->data = sd; + if(!(res = sqlinit2(sd, selector+1))) { + myfree(sd); + return res; + } +} + +int sqldobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s){ + return dobuf(param, buf, s, (unsigned char *)"\'"); +} + + +static void sqllog(const char * buf, int len, struct LOGGER *logger){ + SQLRETURN ret; + struct sqldata *sd = (struct sqldata *)logger->data; + + + if(sd->attempt > 5){ + if (conf.time - sd->attempt_time < 180){ + return; + } + } + if(sd->attempt){ + sd->attempt++; + sqlrotate(logger); + + if(!sd->hstmt){ + sd->attempt_time=conf.time; + return; + } + } + ret = SQLExecDirect(sd->hstmt, (SQLCHAR *)buf, (SQLINTEGER)len); + if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){ + sqlrotate(logger); + if(sd->hstmt) { + ret = SQLExecDirect(hstmt, (SQLCHAR *)buf, (SQLINTEGER)len); + if(ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO){ + sd->attempt++; + sd->attempt_time=conf.time; + return; + } + } + } + sd->attempt=0; +} + +static void sqlrotate(struct LOGGER *logger){ + struct sqldata * sd; + sqlclose(logger); + sd = (struct sqldata *)myalloc(sizeof(struct sqldata)); + memset(sd, 0, sizeof(struct sqldata)); + loger->data = sd; + sqlinit2(sd, logger->selector+1) +} + +static void sqlclose(struct LOGGER *logger){ + struct sqldata *sd = (struct sqldata *)loger->data; + if(sd->hstmt) { + SQLFreeHandle(SQL_HANDLE_STMT, sd->hstmt); + sd->hstmt = NULL; + } + if(sd->hdbc){ + SQLDisconnect(sd->hdbc); + SQLFreeHandle(SQL_HANDLE_DBC, sd->hdbc); + sd->hdbc = NULL; + } + if(sd->henv) { + SQLFreeHandle(SQL_HANDLE_ENV, sd->henv); + sd->henv = NULL; + } + myfree(sd); +} + + +#endif \ No newline at end of file diff --git a/src/plugins.c b/src/plugins.c index a0681df..e9d8aa0 100644 --- a/src/plugins.c +++ b/src/plugins.c @@ -73,7 +73,10 @@ struct symbol symbols[] = { {symbols+46, "decodeurl", (void *) decodeurl}, {symbols+47, "parsestr", (void *) parsestr}, {symbols+48, "make_ace", (void *) make_ace}, - {symbols+49, "freeacl", (void *) freeacl}, + {symbols+49, "freeacl", (void *) freeacl} + {symbols+50, "dolog", (void *) dolog}, + {symbols+50, "logfuncs", (void *) logfuncs}, + {symbols+50, "prelog", (void *) prelog}, {NULL, "", NULL} }; diff --git a/src/plugins/LdapPlugin/ldapauth.c b/src/plugins/LdapPlugin/ldapauth.c index 1572b4d..14b912d 100644 --- a/src/plugins/LdapPlugin/ldapauth.c +++ b/src/plugins/LdapPlugin/ldapauth.c @@ -22,6 +22,9 @@ static struct commands ldap_trafgroup_handler; static struct commands ldap_attrsgroup_handler; static struct commands ldap_dircount_handler; +static void (*dolog)(struct clientparam * param, const unsigned char *s); + + static char *attrs[] = { NULL, NULL}; static char *ldap_group_attr; static char *ldap_access; @@ -109,7 +112,7 @@ static int ldapfunc(struct clientparam *param) ld = ldap_init( ldap_serv, 389 ); if ( ld == NULL ) { - param->srv->logfunc(param,"Error ldap_init: No init lib ldap"); + dolog(param,"Error ldap_init: No init lib ldap"); /*ldap_perror( ld, "Error ldap_init" ); */ return 7; } @@ -133,7 +136,7 @@ static int ldapfunc(struct clientparam *param) if ( rc != LDAP_SUCCESS ) { - param->srv->logfunc(param,"Error ldap_bind: No connect ldap catalog"); + dolog(param,"Error ldap_bind: No connect ldap catalog"); ldap_unbind_s(ld); return 7; } @@ -144,7 +147,7 @@ static int ldapfunc(struct clientparam *param) if ( ld == NULL ) { - param->srv->logfunc(param,"Error ldap_init: No init lib ldap"); + dolog(param,"Error ldap_init: No init lib ldap"); /*ldap_perror( ld, "Error ldap_init" ); */ return 7; } @@ -153,7 +156,7 @@ static int ldapfunc(struct clientparam *param) if ( rc != LDAP_SUCCESS ) { - param->srv->logfunc(param, "Error ldap_bind: Not authorize in ldap\ + dolog(param, "Error ldap_bind: Not authorize in ldap\ catalog, checked option \'ldapconnect\' "); ldap_unbind_s(ld); return 7; @@ -472,6 +475,9 @@ PLUGINAPI int PLUGINCALL start(struct pluginlink * pluginlink, return (0); } + + dolog=pluginlink->findbyname("dolog"); + already_loaded = 1; mypluginlink=pluginlink; diff --git a/src/plugins/SSLPlugin/ssl_plugin.c b/src/plugins/SSLPlugin/ssl_plugin.c index afd494e..fbee4d5 100644 --- a/src/plugins/SSLPlugin/ssl_plugin.c +++ b/src/plugins/SSLPlugin/ssl_plugin.c @@ -28,6 +28,7 @@ extern "C" { #endif PROXYFUNC tcppmfunc, proxyfunc, smtppfunc, ftpprfunc; +static void (*dolog)(struct clientparam * param, const unsigned char *s); static struct pluginlink * pl; @@ -238,25 +239,25 @@ int dossl(struct clientparam* param, SSL_CONN* ServerConnp, SSL_CONN* ClientConn ServerConn = ssl_handshake_to_server(param->remsock, (char *)param->hostname, &ServerCert, &errSSL); if ( ServerConn == NULL || ServerCert == NULL ) { param->res = 8011; - param->srv->logfunc(param, (unsigned char *)"SSL handshake to server failed"); - if(ServerConn == NULL) param->srv->logfunc(param, (unsigned char *)"ServerConn is NULL"); - if(ServerCert == NULL) param->srv->logfunc(param, (unsigned char *)"ServerCert is NULL"); - if(errSSL)param->srv->logfunc(param, (unsigned char *)errSSL); + dolog(param, (unsigned char *)"SSL handshake to server failed"); + if(ServerConn == NULL) dolog(param, (unsigned char *)"ServerConn is NULL"); + if(ServerCert == NULL) dolog(param, (unsigned char *)"ServerCert is NULL"); + if(errSSL)dolog(param, (unsigned char *)errSSL); return 1; } FakeCert = ssl_copy_cert(ServerCert); if ( FakeCert == NULL ) { param->res = 8012; _ssl_cert_free(ServerCert); - param->srv->logfunc(param, (unsigned char *)"Failed to create certificate copy"); + dolog(param, (unsigned char *)"Failed to create certificate copy"); ssl_conn_free(ServerConn); return 2; } ClientConn = ssl_handshake_to_client(param->clisock, FakeCert, &errSSL); if ( ClientConn == NULL ) { param->res = 8012; - param->srv->logfunc(param, (unsigned char *)"Handshake to client failed"); - if(errSSL)param->srv->logfunc(param, (unsigned char *)errSSL); + dolog(param, (unsigned char *)"Handshake to client failed"); + if(errSSL)dolog(param, (unsigned char *)errSSL); _ssl_cert_free(ServerCert); _ssl_cert_free(FakeCert); ssl_conn_free(ServerConn); @@ -382,6 +383,8 @@ PLUGINAPI int PLUGINCALL ssl_plugin (struct pluginlink * pluginlink, int argc, char** argv){ pl = pluginlink; + dolog=pluginlink->findbyname("dolog"); + if(!ssl_loaded){ ssl_loaded = 1; pthread_mutex_init(&ssl_mutex, NULL); diff --git a/src/plugins/TransparentPlugin/transparent_plugin.c b/src/plugins/TransparentPlugin/transparent_plugin.c index 0619bac..c1d28ef 100644 --- a/src/plugins/TransparentPlugin/transparent_plugin.c +++ b/src/plugins/TransparentPlugin/transparent_plugin.c @@ -54,7 +54,6 @@ static FILTER_ACTION transparent_filter_client(void *fo, struct clientparam * pa } #else #error No SO_ORIGINAL_DST defined - param->srv->logfunc(param, (unsigned char *)"transparent_plugin: No SO_ORIGINAL_DST defined"); return REJECT; #endif #else diff --git a/src/pop3p.c b/src/pop3p.c index b433998..4782ffb 100644 --- a/src/pop3p.c +++ b/src/pop3p.c @@ -69,4 +69,5 @@ struct proxydef childdef = { }; #include "proxymain.c" +#include "log.c" #endif diff --git a/src/proxy.c b/src/proxy.c index 0f530c2..9d935f2 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1141,4 +1141,5 @@ struct proxydef childdef = { "-a1 - anonymous proxy with random client IP spoofing\r\n" }; #include "proxymain.c" +#include "log.c" #endif diff --git a/src/proxy.h b/src/proxy.h index 2912962..faf022b 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -166,21 +166,10 @@ int sockgetlinebuf(struct clientparam * param, DIRECTION which, unsigned char * - +void initlog(void); void dolog(struct clientparam * param, const unsigned char *s); int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec); int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format); -extern FILE * stdlog; -void logstdout(struct clientparam * param, const unsigned char *s); -void logsyslog(struct clientparam * param, const unsigned char *s); -void lognone(struct clientparam * param, const unsigned char *s); -void logradius(struct clientparam * param, const unsigned char *s); - -#ifndef NOSQL -void logsql(struct clientparam * param, const unsigned char *s); -int init_sql(char * s); -void close_sql(); -#endif int doconnect(struct clientparam * param); int alwaysauth(struct clientparam * param); int ipauth(struct clientparam * param); @@ -203,7 +192,6 @@ int inithashtable(struct hashtable *hashtable, unsigned nhashsize); void freeparam(struct clientparam * param); void clearstat(struct clientparam * param); void dumpcounters(struct trafcount *tl, int counterd); - int startconnlims (struct clientparam *param); void stopconnlims (struct clientparam *param); diff --git a/src/proxymain.c b/src/proxymain.c index 9388955..efad58b 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -288,7 +288,7 @@ int MODULEMAINFUNC (int argc, char** argv){ } #else srv.needuser = 0; - pthread_mutex_init(&log_mutex, NULL); + initlog(); #endif #ifndef _WIN32 @@ -313,7 +313,6 @@ int MODULEMAINFUNC (int argc, char** argv){ break; #endif case 'l': - srv.logfunc = logstdout; if(srv.logtarget) myfree(srv.logtarget); srv.logtarget = (unsigned char *)mystrdup(argv[i] + 2); if(argv[i][2]) { @@ -867,7 +866,7 @@ void srvinit(struct srvparam * srv, struct clientparam *param){ memset(srv, 0, sizeof(struct srvparam)); srv->version = conf.version + 1; srv->paused = conf.paused; - srv->logfunc = havelog?conf.logfunc:lognone; + srv->logfunc = havelog?conf.logfunc:NULL; srv->noforce = conf.noforce; srv->logformat = conf.logformat? (unsigned char *)mystrdup((char *)conf.logformat) : NULL; srv->authfunc = conf.authfunc; @@ -963,6 +962,24 @@ void srvfree(struct srvparam * srv){ void freeparam(struct clientparam * param) { if(param->res == 2) return; + if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) { + so._shutdown(param->ctrlsocksrv, SHUT_RDWR); + so._closesocket(param->ctrlsocksrv); + } + if(param->ctrlsock != INVALID_SOCKET && param->ctrlsock != param->clisock) { + so._shutdown(param->ctrlsock, SHUT_RDWR); + so._closesocket(param->ctrlsock); + } + if(param->remsock != INVALID_SOCKET) { + so._shutdown(param->remsock, SHUT_RDWR); + so._closesocket(param->remsock); + } + if(param->clisock != INVALID_SOCKET) { + so._shutdown(param->clisock, SHUT_RDWR); + so._closesocket(param->clisock); + } + myfree(param->clibuf); + myfree(param->srvbuf); if(param->datfilterssrv) myfree(param->datfilterssrv); #ifndef STDMAIN if(param->reqfilters) myfree(param->reqfilters); @@ -979,8 +996,6 @@ void freeparam(struct clientparam * param) { } if(conf.connlimiter && (param->res != 95 || param->remsock != INVALID_SOCKET)) stopconnlims(param); #endif - if(param->clibuf) myfree(param->clibuf); - if(param->srvbuf) myfree(param->srvbuf); if(param->srv){ pthread_mutex_lock(¶m->srv->counter_mutex); if(param->prev){ @@ -999,22 +1014,6 @@ void freeparam(struct clientparam * param) { if(param->password) myfree(param->password); if(param->extusername) myfree(param->extusername); if(param->extpassword) myfree(param->extpassword); - if(param->ctrlsocksrv != INVALID_SOCKET && param->ctrlsocksrv != param->remsock) { - so._shutdown(param->ctrlsocksrv, SHUT_RDWR); - so._closesocket(param->ctrlsocksrv); - } - if(param->ctrlsock != INVALID_SOCKET && param->ctrlsock != param->clisock) { - so._shutdown(param->ctrlsock, SHUT_RDWR); - so._closesocket(param->ctrlsock); - } - if(param->remsock != INVALID_SOCKET) { - so._shutdown(param->remsock, SHUT_RDWR); - so._closesocket(param->remsock); - } - if(param->clisock != INVALID_SOCKET) { - so._shutdown(param->clisock, SHUT_RDWR); - so._closesocket(param->clisock); - } myfree(param); } diff --git a/src/smtpp.c b/src/smtpp.c index 01519ca..205f2c1 100644 --- a/src/smtpp.c +++ b/src/smtpp.c @@ -313,4 +313,5 @@ struct proxydef childdef = { }; #include "proxymain.c" +#include "log.c" #endif diff --git a/src/socks.c b/src/socks.c index 9b59a30..1ff6474 100644 --- a/src/socks.c +++ b/src/socks.c @@ -464,4 +464,5 @@ struct proxydef childdef = { "-N(EXTERNAL_IP) External NAT address to report to client for BIND\n" }; #include "proxymain.c" +#include "log.c" #endif diff --git a/src/structures.h b/src/structures.h index 6e41a03..a0d01de 100644 --- a/src/structures.h +++ b/src/structures.h @@ -188,8 +188,7 @@ struct node; struct symbol; struct pluginlink; struct srvparam; - -typedef void (*LOGFUNC)(struct clientparam * param, const unsigned char *); +struct LOGFUNC; typedef int (*AUTHFUNC)(struct clientparam * param); typedef void * (*REDIRECTFUNC)(struct clientparam * param); typedef unsigned long (*RESOLVFUNC)(int af, unsigned char *name, unsigned char *value); @@ -364,6 +363,24 @@ struct trafcount { time_t updated; }; +struct LOGFUNC { + struct LOGFUNC* next; + int (*init)(const char * selector, int logtype, struct LOGGER *logger); + int (*dobuf)(struct clientparam * param, unsigned char * buf, const unsigned char *s); + int (*log)(const char * buf, int len, struct LOGGER *logger); + int (*rotate)(struct LOGGER *logger); + int (*close)(struct LOGGER *logger); + char* prefix; +}; +struct LOGGER { + char * selector; + void * data; + struct LOGFUNC *logfunc; + int rotate; + time_t rotated; +}; +extern struct LOGFUNC logfuncs; +extern void(*prelog)(struct clientparam * param); struct nserver { #ifndef NOIPV6 struct sockaddr_in6 addr; @@ -418,7 +435,6 @@ struct srvparam { struct srvparam *prev; struct clientparam *child; PROXYSERVICE service; - LOGFUNC logfunc; AUTHFUNC authfunc; PROXYFUNC pf; SOCKET srvsock, cbsock; @@ -589,7 +605,6 @@ struct extparam { struct passwords *pwl; struct auth * authenticate; AUTHFUNC authfunc; - LOGFUNC logfunc; BANDLIMFUNC bandlimfunc; TRAFCOUNTFUNC trafcountfunc; unsigned char *logtarget, *logformat; diff --git a/src/tcppm.c b/src/tcppm.c index 043807a..f079b00 100644 --- a/src/tcppm.c +++ b/src/tcppm.c @@ -37,4 +37,5 @@ struct proxydef childdef = { "" }; #include "proxymain.c" +#include "log.c" #endif diff --git a/src/udppm.c b/src/udppm.c index d4057e2..01a66df 100644 --- a/src/udppm.c +++ b/src/udppm.c @@ -116,4 +116,5 @@ struct proxydef childdef = { " -s single packet UDP service for request/reply (DNS-like) services\n" }; #include "proxymain.c" +#include "log.c" #endif