diff --git a/src/Makefile.inc b/src/Makefile.inc index 0dbe8e2..a22f49a 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -50,26 +50,26 @@ udppm$(OBJSUFFICS): udppm.c proxy.h structures.h proxymain.c 3proxy$(OBJSUFFICS): 3proxy.c proxy.h structures.h $(CC) $(CFLAGS) 3proxy.c -$(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)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)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)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)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)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)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)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)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)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)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)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)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) +$(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) mainfunc$(OBJSUFFICS): proxy.h structures.h proxymain.c $(CC) $(COUT)mainfunc$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)MODULEMAINFUNC=mainfunc proxymain.c @@ -112,6 +112,9 @@ authradius$(OBJSUFFICS): authradius.c proxy.h structures.h conf$(OBJSUFFICS): conf.c proxy.h structures.h $(CC) $(COUT)conf$(OBJSUFFICS) $(CFLAGS) conf.c +log$(OBJSUFFICS): log.c proxy.h structures.h + $(CC) $(COUT)log$(OBJSUFFICS) $(CFLAGS) log.c + datatypes$(OBJSUFFICS): datatypes.c proxy.h structures.h $(CC) $(COUT)datatypes$(OBJSUFFICS) $(CFLAGS) datatypes.c @@ -140,8 +143,8 @@ ntlm$(OBJSUFFICS): ntlm.c stringtable$(OBJSUFFICS): stringtable.c $(CC) $(COUT)stringtable$(OBJSUFFICS) $(CFLAGS) stringtable.c -$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) - $(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) +$(BUILDDIR)3proxy$(EXESUFFICS): 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) log$(OBJSUFFICS) datatypes$(OBJSUFFICS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycrypt$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) + $(LN) $(LNOUT)$(BUILDDIR)3proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) 3proxy$(OBJSUFFICS) mainfunc$(OBJSUFFICS) auth$(OBJSUFFICS) authradius$(OBJSUFFICS) conf$(OBJSUFFICS) datatypes$(OBJSUFFICS) srvproxy$(OBJSUFFICS) srvpop3p$(OBJSUFFICS) srvsmtpp$(OBJSUFFICS) srvftppr$(OBJSUFFICS) srvsocks$(OBJSUFFICS) srvtcppm$(OBJSUFFICS) srvudppm$(OBJSUFFICS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) common$(OBJSUFFICS) log$(OBJSUFFICS) mycrypt$(OBJSUFFICS) md5$(OBJSUFFICS) md4$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) smbdes$(OBJSUFFICS) ntlm$(OBJSUFFICS) stringtable$(OBJSUFFICS) srvwebadmin$(OBJSUFFICS) srvdnspr$(OBJSUFFICS) plugins$(OBJSUFFICS) $(COMPATLIBS) $(LIBS) clean: @$(REMOVECOMMAND) *$(OBJSUFFICS) $(COMPFILES) diff --git a/src/common.c b/src/common.c index f7b6856..abf3081 100644 --- a/src/common.c +++ b/src/common.c @@ -15,7 +15,6 @@ char * copyright = COPYRIGHT; int randomizer = 1; -int havelog = 0; #ifndef _WIN32 @@ -363,324 +362,6 @@ int parseconnusername(char *username, struct clientparam *param, int extpasswd, return 0; } -void clearstat(struct clientparam * param) { - -#ifdef _WIN32 - struct timeb tb; - - ftime(&tb); - param->time_start = (time_t)tb.time; - param->msec_start = (unsigned)tb.millitm; - -#else - struct timeval tv; - struct timezone tz; - gettimeofday(&tv, &tz); - - param->time_start = (time_t)tv.tv_sec; - param->msec_start = (tv.tv_usec / 1000); -#endif - param->statscli64 = param->statssrv64 = param->nreads = param->nwrites = - param->nconnects = 0; -} - - -char months[12][4] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - - -int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format){ - int i, j; - int len; - time_t sec; - unsigned msec; - - long timezone; - unsigned delay; - - - -#ifdef _WIN32 - struct timeb tb; - - ftime(&tb); - sec = (time_t)tb.time; - msec = (unsigned)tb.millitm; - timezone = tm->tm_isdst*60 - tb.timezone; - -#else - struct timeval tv; - struct timezone tz; - gettimeofday(&tv, &tz); - - sec = (time_t)tv.tv_sec; - msec = tv.tv_usec / 1000; -#ifdef _SOLARIS - timezone = -altzone / 60; -#else - timezone = tm->tm_gmtoff / 60; -#endif -#endif - - delay = param->time_start?((unsigned) ((sec - param->time_start))*1000 + msec) - param->msec_start : 0; - *buf = 0; - for(i=0, j=0; format[j] && i < 4040; j++){ - if(format[j] == '%' && format[j+1]){ - j++; - switch(format[j]){ - case '%': - buf[i++] = '%'; - break; - case 'y': - sprintf((char *)buf+i, "%.2d", tm->tm_year%100); - i+=2; - break; - case 'Y': - sprintf((char *)buf+i, "%.4d", tm->tm_year+1900); - i+=4; - break; - case 'm': - sprintf((char *)buf+i, "%.2d", tm->tm_mon+1); - i+=2; - break; - case 'o': - sprintf((char *)buf+i, "%s", months[tm->tm_mon]); - i+=3; - break; - case 'd': - sprintf((char *)buf+i, "%.2d", tm->tm_mday); - i+=2; - break; - case 'H': - sprintf((char *)buf+i, "%.2d", tm->tm_hour); - i+=2; - break; - case 'M': - sprintf((char *)buf+i, "%.2d", tm->tm_min); - i+=2; - break; - case 'S': - sprintf((char *)buf+i, "%.2d", tm->tm_sec); - i+=2; - break; - case 't': - sprintf((char *)buf+i, "%.10u", (unsigned)sec); - i+=10; - break; - case 'b': - i+=sprintf((char *)buf+i, "%u", delay?(unsigned)(param->statscli64 * 1000./delay):0); - break; - case 'B': - i+=sprintf((char *)buf+i, "%u", delay?(unsigned)(param->statssrv64 * 1000./delay):0); - break; - case 'D': - i+=sprintf((char *)buf+i, "%u", delay); - break; - case '.': - sprintf((char *)buf+i, "%.3u", msec); - i+=3; - break; - case 'z': - sprintf((char *)buf+i, "%+.2ld%.2u", timezone / 60, (unsigned)(timezone%60)); - i+=5; - break; - case 'U': - if(param->username && *param->username){ - for(len = 0; i< 4000 && param->username[len]; len++){ - buf[i] = param->username[len]; - if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; - if(doublec && strchr((char *)doublec, buf[i])) { - buf[i+1] = buf[i]; - i++; - } - i++; - } - } - else { - buf[i++] = '-'; - } - break; - case 'n': - len = param->hostname? (int)strlen((char *)param->hostname) : 0; - if (len > 0 && !strchr((char *)param->hostname, ':')) for(len = 0; param->hostname[len] && i < 256; len++, i++){ - buf[i] = param->hostname[len]; - if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; - if(doublec && strchr((char *)doublec, buf[i])) { - buf[i+1] = buf[i]; - i++; - } - } - else { - buf[i++] = '['; - i += myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + i, 64); - buf[i++] = ']'; - } - break; - - case 'N': - if(param->service < 15) { - len = (conf.stringtable)? (int)strlen((char *)conf.stringtable[SERVICES + param->service]) : 0; - if(len > 20) len = 20; - memcpy(buf+i, (len)?conf.stringtable[SERVICES + param->service]:(unsigned char*)"-", (len)?len:1); - i += (len)?len:1; - } - break; - case 'E': - sprintf((char *)buf+i, "%.05d", param->res); - i += 5; - break; - case 'T': - if(s){ - for(len = 0; i<4000 && s[len]; len++){ - buf[i] = s[len]; - if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; - if(doublec && strchr((char *)doublec, buf[i])) { - buf[i+1] = buf[i]; - i++; - } - i++; - } - } - break; - case 'e': - i += myinet_ntop(*SAFAMILY(¶m->sinsl), SAADDR(¶m->sinsl), (char *)buf + i, 64); - break; - case 'i': - i += myinet_ntop(*SAFAMILY(¶m->sincl), SAADDR(¶m->sincl), (char *)buf + i, 64); - break; - case 'C': - i += myinet_ntop(*SAFAMILY(¶m->sincr), SAADDR(¶m->sincr), (char *)buf + i, 64); - break; - case 'R': - i += myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), (char *)buf + i, 64); - break; - case 'Q': - i += myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + i, 64); - break; - case 'p': - sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->srv->intsa))); - i += (int)strlen((char *)buf+i); - break; - case 'c': - sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->sincr))); - i += (int)strlen((char *)buf+i); - break; - case 'r': - sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->sinsr))); - i += (int)strlen((char *)buf+i); - break; - case 'q': - sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->req))); - i += (int)strlen((char *)buf+i); - break; - case 'L': - sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->cycles); - i += (int)strlen((char *)buf+i); - break; - case 'I': - sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->statssrv64); - i += (int)strlen((char *)buf+i); - break; - case 'O': - sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->statscli64); - i += (int)strlen((char *)buf+i); - break; - case 'h': - sprintf((char *)buf+i, "%d", param->redirected); - i += (int)strlen((char *)buf+i); - break; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - int k, pmin=0, pmax=0; - for (k = j; isnumber(format[k]); k++); - if(format[k] == '-' && isnumber(format[k+1])){ - pmin = atoi(format + j) - 1; - k++; - pmax = atoi(format + k) -1; - for (; isnumber(format[k]); k++); - j = k; - } - if(!s || format[k]!='T') break; - for(k = 0, len = 0; s[len] && i < 4000; len++){ - if(isspace(s[len])){ - k++; - while(isspace(s[len+1]))len++; - if(k == pmin) continue; - } - if(k>=pmin && k<=pmax) { - buf[i] = s[len]; - if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; - if(doublec && strchr((char *)doublec, buf[i])) { - buf[i+1] = buf[i]; - i++; - } - i++; - } - } - break; - - } - default: - buf[i++] = format[j]; - } - } - else buf[i++] = format[j]; - } - buf[i] = 0; - return i; -} - -int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec){ - struct tm* tm; - int i; - char * format; - time_t t; - - 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); -} - -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); -} -#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); -} -#endif int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size, int to){ struct pollfd fds[1]; diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..1f765d5 --- /dev/null +++ b/src/log.c @@ -0,0 +1,334 @@ +/* + 3APA3A simpliest proxy server + (c) 2002-2016 by Vladimir Dubrovin <3proxy@3proxy.ru> + + please read License Agreement + +*/ + + +pthread_mutex_t log_mutex; + + +#include "proxy.h" +int havelog = 0; + +void clearstat(struct clientparam * param) { + +#ifdef _WIN32 + struct timeb tb; + + ftime(&tb); + param->time_start = (time_t)tb.time; + param->msec_start = (unsigned)tb.millitm; + +#else + struct timeval tv; + struct timezone tz; + gettimeofday(&tv, &tz); + + param->time_start = (time_t)tv.tv_sec; + param->msec_start = (tv.tv_usec / 1000); +#endif + param->statscli64 = param->statssrv64 = param->nreads = param->nwrites = + param->nconnects = 0; +} + + +char months[12][4] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + + +int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec, struct tm* tm, char * format){ + int i, j; + int len; + time_t sec; + unsigned msec; + + long timezone; + unsigned delay; + + + +#ifdef _WIN32 + struct timeb tb; + + ftime(&tb); + sec = (time_t)tb.time; + msec = (unsigned)tb.millitm; + timezone = tm->tm_isdst*60 - tb.timezone; + +#else + struct timeval tv; + struct timezone tz; + gettimeofday(&tv, &tz); + + sec = (time_t)tv.tv_sec; + msec = tv.tv_usec / 1000; +#ifdef _SOLARIS + timezone = -altzone / 60; +#else + timezone = tm->tm_gmtoff / 60; +#endif +#endif + + delay = param->time_start?((unsigned) ((sec - param->time_start))*1000 + msec) - param->msec_start : 0; + *buf = 0; + for(i=0, j=0; format[j] && i < 4040; j++){ + if(format[j] == '%' && format[j+1]){ + j++; + switch(format[j]){ + case '%': + buf[i++] = '%'; + break; + case 'y': + sprintf((char *)buf+i, "%.2d", tm->tm_year%100); + i+=2; + break; + case 'Y': + sprintf((char *)buf+i, "%.4d", tm->tm_year+1900); + i+=4; + break; + case 'm': + sprintf((char *)buf+i, "%.2d", tm->tm_mon+1); + i+=2; + break; + case 'o': + sprintf((char *)buf+i, "%s", months[tm->tm_mon]); + i+=3; + break; + case 'd': + sprintf((char *)buf+i, "%.2d", tm->tm_mday); + i+=2; + break; + case 'H': + sprintf((char *)buf+i, "%.2d", tm->tm_hour); + i+=2; + break; + case 'M': + sprintf((char *)buf+i, "%.2d", tm->tm_min); + i+=2; + break; + case 'S': + sprintf((char *)buf+i, "%.2d", tm->tm_sec); + i+=2; + break; + case 't': + sprintf((char *)buf+i, "%.10u", (unsigned)sec); + i+=10; + break; + case 'b': + i+=sprintf((char *)buf+i, "%u", delay?(unsigned)(param->statscli64 * 1000./delay):0); + break; + case 'B': + i+=sprintf((char *)buf+i, "%u", delay?(unsigned)(param->statssrv64 * 1000./delay):0); + break; + case 'D': + i+=sprintf((char *)buf+i, "%u", delay); + break; + case '.': + sprintf((char *)buf+i, "%.3u", msec); + i+=3; + break; + case 'z': + sprintf((char *)buf+i, "%+.2ld%.2u", timezone / 60, (unsigned)(timezone%60)); + i+=5; + break; + case 'U': + if(param->username && *param->username){ + for(len = 0; i< 4000 && param->username[len]; len++){ + buf[i] = param->username[len]; + if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; + if(doublec && strchr((char *)doublec, buf[i])) { + buf[i+1] = buf[i]; + i++; + } + i++; + } + } + else { + buf[i++] = '-'; + } + break; + case 'n': + len = param->hostname? (int)strlen((char *)param->hostname) : 0; + if (len > 0 && !strchr((char *)param->hostname, ':')) for(len = 0; param->hostname[len] && i < 256; len++, i++){ + buf[i] = param->hostname[len]; + if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; + if(doublec && strchr((char *)doublec, buf[i])) { + buf[i+1] = buf[i]; + i++; + } + } + else { + buf[i++] = '['; + i += myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + i, 64); + buf[i++] = ']'; + } + break; + + case 'N': + if(param->service < 15) { + len = (conf.stringtable)? (int)strlen((char *)conf.stringtable[SERVICES + param->service]) : 0; + if(len > 20) len = 20; + memcpy(buf+i, (len)?conf.stringtable[SERVICES + param->service]:(unsigned char*)"-", (len)?len:1); + i += (len)?len:1; + } + break; + case 'E': + sprintf((char *)buf+i, "%.05d", param->res); + i += 5; + break; + case 'T': + if(s){ + for(len = 0; i<4000 && s[len]; len++){ + buf[i] = s[len]; + if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; + if(doublec && strchr((char *)doublec, buf[i])) { + buf[i+1] = buf[i]; + i++; + } + i++; + } + } + break; + case 'e': + i += myinet_ntop(*SAFAMILY(¶m->sinsl), SAADDR(¶m->sinsl), (char *)buf + i, 64); + break; + case 'i': + i += myinet_ntop(*SAFAMILY(¶m->sincl), SAADDR(¶m->sincl), (char *)buf + i, 64); + break; + case 'C': + i += myinet_ntop(*SAFAMILY(¶m->sincr), SAADDR(¶m->sincr), (char *)buf + i, 64); + break; + case 'R': + i += myinet_ntop(*SAFAMILY(¶m->sinsr), SAADDR(¶m->sinsr), (char *)buf + i, 64); + break; + case 'Q': + i += myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)buf + i, 64); + break; + case 'p': + sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->srv->intsa))); + i += (int)strlen((char *)buf+i); + break; + case 'c': + sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->sincr))); + i += (int)strlen((char *)buf+i); + break; + case 'r': + sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->sinsr))); + i += (int)strlen((char *)buf+i); + break; + case 'q': + sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(¶m->req))); + i += (int)strlen((char *)buf+i); + break; + case 'L': + sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->cycles); + i += (int)strlen((char *)buf+i); + break; + case 'I': + sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->statssrv64); + i += (int)strlen((char *)buf+i); + break; + case 'O': + sprintf((char *)buf+i, "%"PRINTF_INT64_MODIFIER"u", param->statscli64); + i += (int)strlen((char *)buf+i); + break; + case 'h': + sprintf((char *)buf+i, "%d", param->redirected); + i += (int)strlen((char *)buf+i); + break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + int k, pmin=0, pmax=0; + for (k = j; isnumber(format[k]); k++); + if(format[k] == '-' && isnumber(format[k+1])){ + pmin = atoi(format + j) - 1; + k++; + pmax = atoi(format + k) -1; + for (; isnumber(format[k]); k++); + j = k; + } + if(!s || format[k]!='T') break; + for(k = 0, len = 0; s[len] && i < 4000; len++){ + if(isspace(s[len])){ + k++; + while(isspace(s[len+1]))len++; + if(k == pmin) continue; + } + if(k>=pmin && k<=pmax) { + buf[i] = s[len]; + if(param->srv->nonprintable && (buf[i] < 0x20 || strchr((char *)param->srv->nonprintable, buf[i]))) buf[i] = param->srv->replace; + if(doublec && strchr((char *)doublec, buf[i])) { + buf[i+1] = buf[i]; + i++; + } + i++; + } + } + break; + + } + default: + buf[i++] = format[j]; + } + } + else buf[i++] = format[j]; + } + buf[i] = 0; + return i; +} + +int dobuf(struct clientparam * param, unsigned char * buf, const unsigned char *s, const unsigned char * doublec){ + struct tm* tm; + int i; + char * format; + time_t t; + + 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); +} + +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); +} +#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); +} +#endif + diff --git a/src/proxymain.c b/src/proxymain.c index ea434f9..deeb2c8 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -8,8 +8,6 @@ #include "proxy.h" -pthread_mutex_t log_mutex; - #define param ((struct clientparam *) p) #ifdef _WIN32 DWORD WINAPI threadfunc(LPVOID p) {