mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-24 02:55:40 +08:00
146 lines
3.6 KiB
C
146 lines
3.6 KiB
C
![]() |
/*
|
||
|
3APA3A simpliest proxy server
|
||
|
(c) 2002-2008 by ZARAZA <3APA3A@security.nnov.ru>
|
||
|
|
||
|
please read License Agreement
|
||
|
|
||
|
$Id: common.c,v 1.81 2007/12/18 09:26:44 vlad Exp $
|
||
|
*/
|
||
|
|
||
|
#include "proxy.h"
|
||
|
|
||
|
struct counter_header {
|
||
|
unsigned char sig[4];
|
||
|
time_t updated;
|
||
|
} cheader = {"3CF", (time_t)0};
|
||
|
|
||
|
|
||
|
struct counter_record {
|
||
|
unsigned long traf;
|
||
|
unsigned long trafgb;
|
||
|
time_t cleared;
|
||
|
time_t updated;
|
||
|
} crecord;
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
struct counter_header_old {
|
||
|
unsigned char sig[4];
|
||
|
DWORD updated;
|
||
|
} cheader_old = {"3CF", (time_t)0};
|
||
|
|
||
|
|
||
|
struct counter_record_old {
|
||
|
unsigned long traf;
|
||
|
unsigned long trafgb;
|
||
|
DWORD cleared;
|
||
|
DWORD updated;
|
||
|
} crecord_old;
|
||
|
#endif
|
||
|
|
||
|
int main(int argc, char *argv[]){
|
||
|
FILE *txt;
|
||
|
int bin;
|
||
|
int i;
|
||
|
long unsigned lu1, lu2;
|
||
|
char buf[256];
|
||
|
if(argc!=4){
|
||
|
fprintf(stderr, "Usage: %s command binary_file text_file\n"
|
||
|
" commands are:\n"
|
||
|
"\texport - dump counterfile to text\n"
|
||
|
#ifdef _WIN32
|
||
|
"\toldexport - export counterfile from older 3proxy version\n"
|
||
|
#endif
|
||
|
"\timport- import counterfile from text\n"
|
||
|
"Examples:\n"
|
||
|
#ifdef _WIN32
|
||
|
" %s oldexport counterfile.3cf tmpfile\n"
|
||
|
#else
|
||
|
" %s export counterfilenew.3cf tmpfile\n"
|
||
|
#endif
|
||
|
" %s import counterfilenew.3cf tmpfile\n"
|
||
|
"text file record format:\n"
|
||
|
"%%d %%10lu %%10lu %%lu %%lu\n"
|
||
|
" 1 - counter number\n"
|
||
|
" 2 - traffic (Bytes)\n"
|
||
|
" 3 - traffic (GB)\n"
|
||
|
" 4 - time counter reset (time_t)\n"
|
||
|
" 5 - time counter updated (time_t)\n"
|
||
|
,argv[0] , argv[0], argv[0]);
|
||
|
return 1;
|
||
|
}
|
||
|
if(!strcmp(argv[1], "export")){
|
||
|
bin = open((char *)argv[2], O_BINARY|O_RDONLY, 0660);
|
||
|
if(bin < 0){
|
||
|
fprintf(stderr, "Failed to open %s\n", argv[2]);
|
||
|
return 2;
|
||
|
}
|
||
|
if(read(bin, &cheader, sizeof(cheader)) != sizeof(cheader) ||
|
||
|
memcmp(&cheader, "3CF", 4)){
|
||
|
fprintf(stderr, "Invalid counter file\n");
|
||
|
return 3;
|
||
|
}
|
||
|
txt = fopen(argv[3], "w");
|
||
|
if(!txt) txt = stdout;
|
||
|
for(i=1; read(bin, &crecord, sizeof(crecord))==sizeof(crecord); i++)
|
||
|
fprintf(txt,"%d %10lu %10lu %lu %lu\n", i,
|
||
|
crecord.trafgb,
|
||
|
crecord.traf,
|
||
|
(unsigned long) crecord.cleared,
|
||
|
(unsigned long) crecord.updated);
|
||
|
}
|
||
|
#ifdef _WIN32
|
||
|
else if(!strcmp(argv[1], "oldexport")){
|
||
|
bin = open((char *)argv[2], O_BINARY|O_RDONLY, 0660);
|
||
|
if(bin < 0){
|
||
|
fprintf(stderr, "Failed to open %s\n", argv[2]);
|
||
|
return 2;
|
||
|
}
|
||
|
if(read(bin, &cheader_old, sizeof(cheader_old)) != sizeof(cheader_old) ||
|
||
|
memcmp(&cheader, "3CF", 4)){
|
||
|
fprintf(stderr, "Invalid counter file\n");
|
||
|
return 3;
|
||
|
}
|
||
|
txt = fopen(argv[3], "w");
|
||
|
if(!txt) txt = stdout;
|
||
|
for(i=1; read(bin, &crecord_old, sizeof(crecord_old))==sizeof(crecord_old); i++)
|
||
|
fprintf(txt, "%d %10lu %10lu %lu %lu\n", i,
|
||
|
crecord_old.trafgb,
|
||
|
crecord_old.traf,
|
||
|
(unsigned long) crecord_old.cleared,
|
||
|
(unsigned long) crecord_old.updated);
|
||
|
}
|
||
|
#endif
|
||
|
else if(!strcmp(argv[1], "import")){
|
||
|
bin = open((char *)argv[2], O_BINARY|O_WRONLY|O_CREAT|O_EXCL, 0660);
|
||
|
if(bin < 0){
|
||
|
fprintf(stderr, "Failed to open %s\n", argv[2]);
|
||
|
return 2;
|
||
|
}
|
||
|
txt = fopen(argv[3], "r");
|
||
|
if(!txt) {
|
||
|
fprintf(stderr, "Failed to open %s\n", argv[3]);
|
||
|
return 3;
|
||
|
}
|
||
|
cheader.updated = time(0);
|
||
|
write(bin, &cheader, sizeof(cheader));
|
||
|
while(fgets(buf, 256, txt) &&
|
||
|
sscanf(buf, "%d %10lu %10lu %lu %lu\n",
|
||
|
&i, &crecord.trafgb, &crecord.traf,
|
||
|
&lu1, &lu2) == 5){
|
||
|
|
||
|
crecord.cleared = (time_t) lu1;
|
||
|
crecord.updated = (time_t) lu1;
|
||
|
lseek(bin,
|
||
|
sizeof(struct counter_header) + (i-1) * sizeof(crecord),
|
||
|
SEEK_SET);
|
||
|
write(bin, &crecord, sizeof(crecord));
|
||
|
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
fprintf(stderr, "Unknown command: %s\n", argv[1]);
|
||
|
return 5;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|