Browse Source

Merge remote-tracking branch 'refs/remotes/origin/devel'

# Conflicts:
#	src/version.h
z3APA3A 10 years ago
parent
commit
4202cee566

+ 1 - 1
Makefile.msvc

@@ -11,7 +11,7 @@ CC = cl
 CFLAGS = /nologo /MT /W3 /Ox /GS /EHs- /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /Fp"proxy.pch" /FD /c
 CFLAGS = /nologo /MT /W3 /Ox /GS /EHs- /GA /GF /D "MSVC" /D "WITH_STD_MALLOC" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WIN32" /Fp"proxy.pch" /FD /c
 COUT = /Fo
 COUT = /Fo
 LN = link
 LN = link
-LDFLAGS = /nologo /subsystem:console /incremental:no /machine:I386
+LDFLAGS =  /nologo /subsystem:console /incremental:no /machine:I386
 DLFLAGS = /DLL
 DLFLAGS = /DLL
 DLSUFFICS = .dll
 DLSUFFICS = .dll
 LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib libeay32MT.lib ssleay32MT.lib
 LIBS = ws2_32.lib advapi32.lib odbc32.lib user32.lib kernel32.lib Gdi32.lib libeay32MT.lib ssleay32MT.lib

+ 28 - 0
doc/html/plugins/TransparentPlugin.html

@@ -0,0 +1,28 @@
+<h3>3proxy TransparentPlugin plugin (Linux only)</h3>
+
+Plugin can turn 3proxy into transparent proxy for virtually any TCP-based protocol
+and use all 3proxy features - redirections, parent proxies, ACLs, traffic limitations,
+etc. TransparentPlugin plugin takes destination IP:port from Linux and uses this
+information as a target IP in proxy. An example of usage:
+
+<pre>
+plugin /path/to/TransparentPlugin.ld.so transparent_plugin
+log /path/to/log
+auth iponly
+allow * * * 80
+parent 1000 http 0.0.0.0 0
+allow *
+parent 1000 socks5 SOCKS5_IP SOCKS5_PORT USER PASSWORD
+tcppm -iLOCAL_IP 12345 127.0.0.1 11111
+</pre>
+Now, any TCP traffic transparently redirected to port 12345 will be routed via
+parent SOCKSv5 proxy and logged, all URLs for web requests are visible in logs.
+Paremeters '127.0.0.1 11111' in this case are not used and are overwritten by
+destination IP:port for each transparent connection.
+
+<h4>Download:</h4>
+<ul>
+ <li>Plugin included into 3proxy 0.8
+</ul>
+
+&copy; Vladimir Dubrovin, License: BSD style

+ 30 - 0
doc/html/plugins/TransparentPlugin.ru.html

@@ -0,0 +1,30 @@
+<h3>Плагин TransparentPlugin 3proxy (только для Linux)</h3>
+
+Плагин превращает 3proxy в транспарентный прокси для практически любых TCP-соединений
+и позволяет прозрачно для клиентов использовать весь фунционал прокси - редиректоры,
+родительские прокси, ACLи, ограничения трафика. TransparentPlugin получает IP:port
+назначения от Linux  и использует эту информацию в качестве конечного адреса назначения.
+<br>
+Пример использования:
+
+<pre>
+plugin /path/to/TransparentPlugin.ld.so transparent_plugin
+log /path/to/log
+auth iponly
+allow * * * 80
+parent 1000 http 0.0.0.0 0
+allow *
+parent 1000 socks5 SOCKS5_IP SOCKS5_PORT USER PASSWORD
+tcppm -iLOCAL_IP 12345 127.0.0.1 11111
+</pre>
+Теперь любые TCP-соединения транспарентно перенаправленные в локальный порт 12345 
+будут прологгированы и перенаправлены в родительский SOCKSv5 proxy, при этом для
+HTTP-запросов по порту TCP/80 будут видны параметры HTTP-запроса.
+Параметры '127.0.0.1 11111' в данном случае не оказывают влияния, т.к.
+будут перезаписываться IP и портом назначения для каждого TCP-соединения соответственно.
+<h4>Загрузить:</h4>
+<ul>
+ <li>Плагин включен в дистрибутив 3proxy 0.8
+</ul>
+
+&copy; Vladimir Dubrovin, License: BSD style

+ 11 - 16
src/Makefile.inc

@@ -2,12 +2,7 @@
 # 3 proxy common Makefile
 # 3 proxy common Makefile
 #
 #
 
 
-all:	pre $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)dighosts$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) allplugins
-
-
-pre:
-	-cd .. && $(TYPECOMMAND) copying
-	$(PREMAKE)
+all:	$(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)mycrypt$(EXESUFFICS) $(BUILDDIR)dighosts$(EXESUFFICS) $(BUILDDIR)pop3p$(EXESUFFICS) $(BUILDDIR)smtpp$(EXESUFFICS) $(BUILDDIR)ftppr$(EXESUFFICS) $(BUILDDIR)tcppm$(EXESUFFICS) $(BUILDDIR)icqpr$(EXESUFFICS) $(BUILDDIR)udppm$(EXESUFFICS) $(BUILDDIR)socks$(EXESUFFICS) $(BUILDDIR)proxy$(EXESUFFICS) allplugins
 
 
 
 
 sockmap$(OBJSUFFICS): sockmap.c proxy.h structures.h
 sockmap$(OBJSUFFICS): sockmap.c proxy.h structures.h
@@ -62,28 +57,28 @@ udppm$(OBJSUFFICS): udppm.c proxy.h structures.h proxymain.c
 	$(CC) $(CFLAGS) 3proxy.c
 	$(CC) $(CFLAGS) 3proxy.c
 
 
 $(BUILDDIR)proxy$(EXESUFFICS): sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS)
 $(BUILDDIR)proxy$(EXESUFFICS): sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS)
-	$(LN) $(LNOUT)$(BUILDDIR)proxy$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)proxy$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) proxy$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
 
 
 $(BUILDDIR)pop3p$(EXESUFFICS): sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS)
 $(BUILDDIR)pop3p$(EXESUFFICS): sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS)
-	$(LN) $(LNOUT)$(BUILDDIR)pop3p$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)pop3p$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) pop3p$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
 
 
 $(BUILDDIR)smtpp$(EXESUFFICS): sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) $(COMPATLIBS)
 $(BUILDDIR)smtpp$(EXESUFFICS): sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) base64$(OBJSUFFICS) $(COMPATLIBS)
-	$(LN) $(LNOUT)$(BUILDDIR)smtpp$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) base64$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)smtpp$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) smtpp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) base64$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
 
 
 $(BUILDDIR)ftppr$(EXESUFFICS): sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) ftp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS)
 $(BUILDDIR)ftppr$(EXESUFFICS): sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) ftp$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS)
-	$(LN) $(LNOUT)$(BUILDDIR)ftppr$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)ftppr$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) ftppr$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) ftp$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
 
 
 $(BUILDDIR)socks$(EXESUFFICS): sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 $(BUILDDIR)socks$(EXESUFFICS): sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
-	$(LN) $(LNOUT)$(BUILDDIR)socks$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS)  myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)socks$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) socks$(OBJSUFFICS) sockgetchar$(OBJSUFFICS)  myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 
 
 $(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 $(BUILDDIR)tcppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
-	$(LN) $(LNOUT)$(BUILDDIR)tcppm$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)tcppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) tcppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 
 
 $(BUILDDIR)icqpr$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 $(BUILDDIR)icqpr$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
-	$(LN) $(LNOUT)$(BUILDDIR)icqpr$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)icqpr$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) icqpr$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 
 
 $(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
 $(BUILDDIR)udppm$(EXESUFFICS): sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)
-	$(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) $(VERFILE) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)udppm$(EXESUFFICS) $(LDFLAGS) sockmap$(OBJSUFFICS) sockgetchar$(OBJSUFFICS) udppm$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(LIBS)
 
 
 mainfunc$(OBJSUFFICS): proxy.h structures.h proxymain.c
 mainfunc$(OBJSUFFICS): proxy.h structures.h proxymain.c
 	$(CC) $(COUT)mainfunc$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)MODULEMAINFUNC=mainfunc proxymain.c
 	$(CC) $(COUT)mainfunc$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)MODULEMAINFUNC=mainfunc proxymain.c
@@ -136,13 +131,13 @@ dighosts$(OBJSUFFICS): dighosts.c
 	$(CC) $(COUT)dighosts$(OBJSUFFICS) $(CFLAGS) dighosts.c
 	$(CC) $(COUT)dighosts$(OBJSUFFICS) $(CFLAGS) dighosts.c
 
 
 $(BUILDDIR)dighosts$(EXESUFFICS): dighosts$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)  $(COMPATLIBS)
 $(BUILDDIR)dighosts$(EXESUFFICS): dighosts$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS)  $(COMPATLIBS)
-	$(LN) $(LNOUT)$(BUILDDIR)dighosts$(EXESUFFICS) $(LDFLAGS) $(VERFILE) dighosts$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
+	$(LN) $(LNOUT)$(BUILDDIR)dighosts$(EXESUFFICS) $(LDFLAGS) dighosts$(OBJSUFFICS) myalloc$(OBJSUFFICS) common$(OBJSUFFICS) $(COMPATLIBS) $(LIBS)
 
 
 mycryptmain$(OBJSUFFICS): mycrypt.c
 mycryptmain$(OBJSUFFICS): mycrypt.c
 	$(CC) $(COUT)mycryptmain$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)WITHMAIN mycrypt.c
 	$(CC) $(COUT)mycryptmain$(OBJSUFFICS) $(CFLAGS) $(DEFINEOPTION)WITHMAIN mycrypt.c
 
 
 $(BUILDDIR)mycrypt$(EXESUFFICS): md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycryptmain$(OBJSUFFICS) base64$(OBJSUFFICS)
 $(BUILDDIR)mycrypt$(EXESUFFICS): md4$(OBJSUFFICS) md5$(OBJSUFFICS) mycryptmain$(OBJSUFFICS) base64$(OBJSUFFICS)
-	$(LN) $(LNOUT)$(BUILDDIR)mycrypt$(EXESUFFICS) $(VERFILE) $(LDFLAGS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) base64$(OBJSUFFICS) mycryptmain$(OBJSUFFICS)
+	$(LN) $(LNOUT)$(BUILDDIR)mycrypt$(EXESUFFICS) $(LDFLAGS) md4$(OBJSUFFICS) md5$(OBJSUFFICS) base64$(OBJSUFFICS) mycryptmain$(OBJSUFFICS)
 
 
 
 
 md4$(OBJSUFFICS):  libs/md4.h libs/md4.c
 md4$(OBJSUFFICS):  libs/md4.h libs/md4.c

+ 1 - 1
src/proxy.h

@@ -6,7 +6,7 @@
 
 
 */
 */
 
 
-#define COPYRIGHT "(c)2000-2009 3APA3A, Vladimir Dubrovin & 3proxy.ru\n"\
+#define COPYRIGHT "(c)3APA3A, Vladimir Dubrovin & 3proxy.ru\n"\
 		 "Documentation and sources: http://3proxy.ru/\n"\
 		 "Documentation and sources: http://3proxy.ru/\n"\
 		 "Please read license agreement in \'copying\' file.\n"\
 		 "Please read license agreement in \'copying\' file.\n"\
 		 "You may not use this program without accepting license agreement"
 		 "You may not use this program without accepting license agreement"

+ 44 - 4
src/proxymain.c

@@ -499,9 +499,9 @@ int MODULEMAINFUNC (int argc, char** argv){
 	for(;;){
 	for(;;){
 		while((conf.paused == srv.version && srv.childcount >= srv.maxchild)){
 		while((conf.paused == srv.version && srv.childcount >= srv.maxchild)){
 			nlog++;			
 			nlog++;			
-			if(nlog > 5000) {
+			if(!srv.silent && nlog > 5000) {
 				sprintf((char *)buf, "Warning: too many connected clients (%d/%d)", srv.childcount, srv.maxchild);
 				sprintf((char *)buf, "Warning: too many connected clients (%d/%d)", srv.childcount, srv.maxchild);
-				if(!srv.silent)(*srv.logfunc)(&defparam, buf);
+				(*srv.logfunc)(&defparam, buf);
 				nlog = 0;
 				nlog = 0;
 			}
 			}
 			usleep(SLEEPTIME);
 			usleep(SLEEPTIME);
@@ -524,6 +524,7 @@ int MODULEMAINFUNC (int argc, char** argv){
 		}
 		}
 	}
 	}
 	if((conf.paused != srv.version) || (error < 0)) break;
 	if((conf.paused != srv.version) || (error < 0)) break;
+	error = 0;
 	if(!isudp){
 	if(!isudp){
 		size = sizeof(defparam.sincr);
 		size = sizeof(defparam.sincr);
 		if(iscbc){
 		if(iscbc){
@@ -551,8 +552,47 @@ int MODULEMAINFUNC (int argc, char** argv){
 		else {
 		else {
 			new_sock = so._accept(sock, (struct sockaddr*)&defparam.sincr, &size);
 			new_sock = so._accept(sock, (struct sockaddr*)&defparam.sincr, &size);
 			if(new_sock == INVALID_SOCKET){
 			if(new_sock == INVALID_SOCKET){
-				sprintf((char *)buf, "accept(): %s", strerror(errno));
-				if(!srv.silent)(*srv.logfunc)(&defparam, buf);
+#ifdef _WIN32
+				switch(WSAGetLastError()){
+				case WSAEMFILE:
+				case WSAENOBUFS:
+				case WSAENETDOWN:
+					usleep(SLEEPTIME * 10);
+					break;
+				case WSAEINTR:
+					error = 1;
+					break;
+				default:
+					break;
+				}
+
+#else
+				switch (errno){
+#ifdef EMFILE
+				case EMFILE:
+#endif
+#ifdef ENFILE
+				case ENFILE:
+#endif
+#ifdef ENOBUFS
+				case ENOBUFS:
+#endif
+#ifdef ENOMEM
+				case ENOMEM:
+#endif
+					usleep(SLEEPTIME * 10);
+					break;
+
+				default:
+					break;
+				}
+#endif
+				nlog++;			
+				if(!srv.silent && (error || nlog > 5000)) {
+					sprintf((char *)buf, "accept(): %s", strerror(errno));
+					(*srv.logfunc)(&defparam, buf);
+					nlog = 0;
+				}
 				continue;
 				continue;
 			}
 			}
 		}
 		}

+ 1 - 1
src/webadmin.c

@@ -473,7 +473,7 @@ void * adminchild(struct clientparam* param) {
 					"<td>MB%s</td>"
 					"<td>MB%s</td>"
 					"<td>%"PRINTF_INT64_MODIFIER"u</td>"
 					"<td>%"PRINTF_INT64_MODIFIER"u</td>"
 					"<td>%s</td>",
 					"<td>%s</td>",
-				 cp->traflim64,
+				 cp->traflim64 / (1024 * 1024),
 				 rotations[cp->type],
 				 rotations[cp->type],
 				 cp->traf64,
 				 cp->traf64,
 				 cp->cleared?ctime(&cp->cleared):"never"
 				 cp->cleared?ctime(&cp->cleared):"never"