3proxy/src/countersutil.c

146 lines
3.6 KiB
C
Raw Normal View History

2014-04-08 17:03:21 +08:00
/*
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;
}