Explorar o código

Move logging to log.c

z3APA3A %!s(int64=5) %!d(string=hai) anos
pai
achega
3dd1969657
Modificáronse 4 ficheiros con 353 adicións e 337 borrados
  1. 19 16
      src/Makefile.inc
  2. 0 319
      src/common.c
  3. 334 0
      src/log.c
  4. 0 2
      src/proxymain.c

+ 19 - 16
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)

+ 0 - 319
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(&param->req), SAADDR(&param->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(&param->sinsl), SAADDR(&param->sinsl), (char *)buf + i, 64);
-				 break;
-				case 'i':
-				 i += myinet_ntop(*SAFAMILY(&param->sincl), SAADDR(&param->sincl), (char *)buf + i, 64);
-				 break;
-				case 'C':
-				 i += myinet_ntop(*SAFAMILY(&param->sincr), SAADDR(&param->sincr), (char *)buf + i, 64);
-				 break;
-				case 'R':
-				 i += myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->sinsr), (char *)buf + i, 64);
-				 break;
-				case 'Q':
-				 i += myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->req), (char *)buf + i, 64);
-				 break;
-				case 'p':
-				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->srv->intsa)));
-				 i += (int)strlen((char *)buf+i);
-				 break;
-				case 'c':
-				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->sincr)));
-				 i += (int)strlen((char *)buf+i);
-				 break;
-				case 'r':
-				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->sinsr)));
-				 i += (int)strlen((char *)buf+i);
-				 break;
-				case 'q':
-				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->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];

+ 334 - 0
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(&param->req), SAADDR(&param->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(&param->sinsl), SAADDR(&param->sinsl), (char *)buf + i, 64);
+				 break;
+				case 'i':
+				 i += myinet_ntop(*SAFAMILY(&param->sincl), SAADDR(&param->sincl), (char *)buf + i, 64);
+				 break;
+				case 'C':
+				 i += myinet_ntop(*SAFAMILY(&param->sincr), SAADDR(&param->sincr), (char *)buf + i, 64);
+				 break;
+				case 'R':
+				 i += myinet_ntop(*SAFAMILY(&param->sinsr), SAADDR(&param->sinsr), (char *)buf + i, 64);
+				 break;
+				case 'Q':
+				 i += myinet_ntop(*SAFAMILY(&param->req), SAADDR(&param->req), (char *)buf + i, 64);
+				 break;
+				case 'p':
+				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->srv->intsa)));
+				 i += (int)strlen((char *)buf+i);
+				 break;
+				case 'c':
+				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->sincr)));
+				 i += (int)strlen((char *)buf+i);
+				 break;
+				case 'r':
+				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->sinsr)));
+				 i += (int)strlen((char *)buf+i);
+				 break;
+				case 'q':
+				 sprintf((char *)buf+i, "%hu", ntohs(*SAPORT(&param->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
+

+ 0 - 2
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) {