📄 ctrlthread.c
字号:
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/netdevice.h> /* for dev_base */
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/file.h>
#include <linux/dnotify.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/time.h>
#include <linux/vmalloc.h>
#include <linux/syscalls.h>
#include <asm/semaphore.h>
#include <asm/unistd.h>
#include "createDir.h"
#include "DomainIPHash.h"
#include "list.h"
#include "Rule.h"
#include "RuleIp.h"
#include "protocol.h"
#include "function.h"
extern GVAR gVar;
void SmtpPop3Config(void);
void WebMailConfig(void);
void MsnConfig(void);
void ImLogConfig(void);
void HttpUrlConfig(void);
void FtpConfig(void);
void TelnetConfig(void);
void IcqConfig(void);
void YahooConfig(void);
void IcqConfig(void);
char*ReadWebMailConfig(void);
unsigned int GetProfileString( char* lpAppName, char* lpKeyName, char* lpDefault,
char* lpReturnedString, unsigned int nSize, char* lpFileName );
//TCP与UDP线程控制结构
#define SMTP_FILE_THREAD_NUM 1
#define SMTP_THREAD_NUM 2
#define TCP_PARSER_THREAD 24
#define UDP_PARSER_THREAD 12
THREAD_CONTROL CreateDir_thread;
THREAD_CONTROL tcp_thread[ TCP_PARSER_THREAD ];
THREAD_CONTROL udp_thread[ UDP_PARSER_THREAD ];
//协议还原线程
THREAD_CONTROL smtp_thread[ SMTP_THREAD_NUM ];
THREAD_CONTROL http_thread[ 4 ];
THREAD_CONTROL ftp_thread[ 4 ];
THREAD_CONTROL msn_thread[ 4 ];
THREAD_CONTROL telnet_thread[ 4 ];
THREAD_CONTROL yahoo_thread[ 4 ];
THREAD_CONTROL gtalk_thread[ 4 ];
THREAD_CONTROL pp_thread[ 4 ];
//数据存盘线程
THREAD_CONTROL smtp_save[ SMTP_FILE_THREAD_NUM ];
THREAD_CONTROL http_save[ 4 ];
THREAD_CONTROL ftp_save[ 4 ];
THREAD_CONTROL msn_save[ 4 ];
THREAD_CONTROL telnet_save[ 4 ];
THREAD_CONTROL yahoo_save[ 4 ];
THREAD_CONTROL gtalk_save[ 4 ];
THREAD_CONTROL pp_save[ 4 ];
THREAD_CONTROL Perambulate_thread;
int CtrlThread( void * arg )
{
int i;
PTHREAD_CONTROL pControl = (PTHREAD_CONTROL)arg;
//启动创建目录线程
init_completion( &CreateDir_thread.thread_exited );
CreateDir_thread.thread_pid = kernel_thread( CreateDir,
&CreateDir_thread, CLONE_KERNEL | SIGCHLD );
//启动存盘线程
for( i = 0; i < SMTP_FILE_THREAD_NUM; i ++ )
{
init_completion( &smtp_save[ i ].thread_exited );
smtp_save[ i ].thread_pid = kernel_thread( OutputFile,
&smtp_save[ i ], CLONE_KERNEL | SIGCHLD );
}
//启动smtp与pop3解析线程
for( i = 0; i < SMTP_THREAD_NUM; i ++ )
{
init_completion( &smtp_thread[ i ].thread_exited );
smtp_thread[ i ].thread_pid = kernel_thread( SmtpParser,
&smtp_thread[ i ], CLONE_KERNEL | SIGCHLD );
}
//启动TCP解析线程
for( i = 0; i < TCP_PARSER_THREAD; i ++ )
{
init_completion( &tcp_thread[ i ].thread_exited );
tcp_thread[ i ].thread_pid = kernel_thread( TCPAppParser,
&tcp_thread[ i ], CLONE_KERNEL | SIGCHLD );
}
init_completion( &Perambulate_thread.thread_exited );
Perambulate_thread.thread_pid = kernel_thread( Perambulate,
&Perambulate_thread, CLONE_KERNEL | SIGCHLD );
daemonize( "control" );
allow_signal( SIGTERM );
while( !signal_pending( current ) )
{
set_current_state( TASK_INTERRUPTIBLE );
schedule_timeout( 120000 );
}
//停止TCP线程
for( i = 0; i < TCP_PARSER_THREAD; i ++ )
{
kill_proc( tcp_thread[ i ].thread_pid, SIGTERM, 1 );
wait_for_completion( &tcp_thread[ i ].thread_exited );
}
//停止smtp与pop3解析线程
for( i = 0; i < SMTP_THREAD_NUM; i ++ )
{
kill_proc( smtp_thread[ i ].thread_pid, SIGTERM, 1 );
wait_for_completion( &smtp_thread[ i ].thread_exited );
}
//停止存盘线程
for( i = 0; i < SMTP_FILE_THREAD_NUM; i ++ )
{
kill_proc( smtp_save[ i ].thread_pid, SIGTERM, 1 );
wait_for_completion( &smtp_save[ i ].thread_exited );
}
kill_proc( Perambulate_thread.thread_pid, SIGTERM, 1 );
wait_for_completion( &Perambulate_thread.thread_exited );
//停止创建目录线程
kill_proc( CreateDir_thread.thread_pid, SIGTERM, 1 );
wait_for_completion( &CreateDir_thread.thread_exited );
complete_and_exit( &(pControl->thread_exited), 1 );
}
void DriverConfig( void )
{
SmtpPop3Config();
/* WebMailConfig();
MsnConfig();
ImLogConfig();
HttpUrlConfig();
FtpConfig();
TelnetConfig();
YahooConfig();
IcqConfig();*/
}
void SmtpPop3Config( void )
{
char szOutPath[ _MAX_DIR_LENGTH ];
char szCreateDirBuf[ _MAX_DIR_LENGTH ];
char keyword[ _MAX_DIR_LENGTH ];
int count;
int iOutPathSize;
int i, k, fg=0;
memset( szOutPath, 0, _MAX_DIR_LENGTH );
memset( szCreateDirBuf, 0, _MAX_DIR_LENGTH );
memset( keyword, 0, _MAX_DIR_LENGTH );
//先读配置参数
GetProfileString( "SmtpPop3Path", "count", "1", szOutPath, sizeof(szOutPath) - 1, CONFIGURE_FILE );
sscanf( szOutPath, "%d", &count );
if( count < 0 )
count = 0;
count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER : count;
//填充相关数据
gVar.Smtppop3PathNumber = count;
gVar.iSmtppop3Path = 0;
for( i = 0; i < count; i ++ )
{
sprintf( keyword, "outpath%d", i + 1 );
GetProfileString( "SmtpPop3Path", keyword, "/mnt/data/",
gVar.Smtppop3Path[ i ],_MAX_DIR_LENGTH, CONFIGURE_FILE );
}
//再创建相关目录
for( k = 0; k < count; k ++ )
{
fg = 0;
sprintf( szOutPath, "%s", gVar.Smtppop3Path[ k ] );
iOutPathSize = strlen( szOutPath );
if( szOutPath[ iOutPathSize - 1 ] != '/' )
{
szOutPath[ iOutPathSize ] = '/';
szOutPath[ iOutPathSize + 1 ] = '\0';
}
memset( szCreateDirBuf, 0, sizeof(szCreateDirBuf) );
for( i = 0; i < iOutPathSize; i ++ )
{
if( szOutPath[ i ] == '/' )
{
if( fg )
{
memcpy( szCreateDirBuf, szOutPath, i );
szCreateDirBuf[ i + 1 ] = '\0';
mkdir( szCreateDirBuf, 755 );
}
else
{
fg = 1;
}
}
}
}
return;
}
void WebMailConfig( void )
{
char szOutPath[_MAX_DIR_LENGTH];
char szCreateDirBuf[_MAX_DIR_LENGTH];
char configPath[_MAX_DIR_LENGTH];
char keyword[_MAX_DIR_LENGTH];
int k, count=0;
int iOutPathSize;
int i, fg=0;
memset( configPath, 0, _MAX_DIR_LENGTH);
memset( szOutPath, 0, sizeof(szOutPath) );
GetProfileString( "WebMailPath", "count", "1", szOutPath,
sizeof(szOutPath) - 1, CONFIGURE_FILE );
sscanf( szOutPath, "%d", &count );
if( count < 1 )
count = 1;
count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER : count;
gVar.WebMailPathNumber = count;
gVar.iWebMailPath = 0;
for( k = 0; k < count; k ++ )
{
sprintf( keyword, "outpath%d", k + 1 );
GetProfileString( "WebMailPath", keyword, "/mnt/data/webmail/", gVar.WebMailPath[ k ],
_MAX_DIR_LENGTH, CONFIGURE_FILE );
}
for( k = 0; k < count; k ++ )
{
fg = 0;
sprintf( szOutPath, "%s", gVar.WebMailPath[ k ] );
iOutPathSize = strlen( szOutPath );
if( szOutPath[ iOutPathSize - 1 ] != '/')
{
szOutPath[ iOutPathSize ] = '/';
szOutPath[ iOutPathSize + 1 ] = '\0';
iOutPathSize ++;
}
memset( szCreateDirBuf, 0, sizeof(szCreateDirBuf) );
for( i = 0; i < iOutPathSize; i ++ )
{
if( szOutPath[ i ] == '/' )
{
if( fg )
{
//webmail
memcpy( szCreateDirBuf, szOutPath, i );
szCreateDirBuf[ i + 1 ] = '\0';
mkdir( szCreateDirBuf, 755 );
//login
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_LOGIN );
mkdir( szCreateDirBuf, 755 );
//WEB_MAIL_SEND_CON
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_SEND_CON );
mkdir( szCreateDirBuf, 755 );
//WEB_MAIL_RECEIVE_CON
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_RECEIVE_CON );
mkdir( szCreateDirBuf, 755 );
//WEB_MAIL_ATTACH
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "//%s", WEB_MAIL_ATTACH );
mkdir( szCreateDirBuf, 755 );
//WEB_ADD_LIST
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "/%s", WEB_MAIL_ADD_LIST );
mkdir( szCreateDirBuf, 755 );
//BBS_SEND
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "//%s", BBS_SEND );
mkdir( szCreateDirBuf, 755 );
//BBS_RECEIVE
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "//%s", BBS_RECEIVE );
mkdir( szCreateDirBuf, 755 );
//WEB_POST
memcpy( szCreateDirBuf, szOutPath, i );
sprintf( szCreateDirBuf + 1, "//%s", WEB_POST );
mkdir( szCreateDirBuf, 755 );
}
else
{
fg=1;
}
}
}
}
}
void MsnConfig()
{
char szOutPath[_MAX_DIR_LENGTH];
char szCreateDirBuf[_MAX_DIR_LENGTH];
char configPath[_MAX_DIR_LENGTH];
char keyword[_MAX_DIR_LENGTH];
int k,count=0;
int iOutPathSize;
int i,fg=0;
memset( configPath, 0, _MAX_DIR_LENGTH );
memset( szOutPath, 0, sizeof(szOutPath) );
sprintf( configPath, "%s", CONFIGURE_FILE );
GetProfileString( "MsnPath", "count", "1", szOutPath,
sizeof(szOutPath) - 1, configPath );
sscanf( szOutPath, "%d", &count );
if( count < 1 )
count = 1;
count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER: count;
gVar.MsnPathNumber = count;
gVar.iMsnPathNumber= 0;
for( k = 0; k < count; k ++ )
{
sprintf( keyword, "outpath%d", k + 1 );
GetProfileString( "MsnPath", keyword, "\\??\\d:\\msn\\", gVar.MsnPath[ k ],
_MAX_DIR_LENGTH, configPath );
}
for( k = 0; k < count; k ++ )
{
fg = 0;
sprintf( szOutPath, "%s", gVar.MsnPath[ k ] );
iOutPathSize = strlen( szOutPath );
if( szOutPath[ iOutPathSize - 1 ] != '/' )
{
szOutPath[ iOutPathSize ] = '/';
szOutPath[ iOutPathSize + 1 ] = '\0';
iOutPathSize ++;
}
memset( szCreateDirBuf, 0, sizeof(szCreateDirBuf) );
for( i = 4; i < iOutPathSize; i ++ )
{
if( szOutPath[ i ] == '/' )
{
if( fg )
{
//msn
memcpy( szCreateDirBuf, szOutPath, i );
mkdir( szCreateDirBuf, 755 );
}
else
{
fg = 1;
}
}
}
}
}
void ImLogConfig()
{
char szOutPath[_MAX_DIR_LENGTH];
char szCreateDirBuf[_MAX_DIR_LENGTH];
char configPath[_MAX_DIR_LENGTH];
char keyword[_MAX_DIR_LENGTH];
int k,count=0;
int iOutPathSize;
int i,fg=0;
memset( configPath, 0, _MAX_DIR_LENGTH);
memset( szOutPath, 0, sizeof(szOutPath) );
sprintf( configPath, "%s", CONFIGURE_FILE );
GetProfileString( "ImLogPath", "count", "1", szOutPath,
sizeof(szOutPath) - 1, configPath );
sscanf( szOutPath, "%d", &count );
if( count < 1 )
count = 1;
count = count > _FILEPATH_NUMBER ? _FILEPATH_NUMBER : count;
gVar.ImLogPathNumber = count;
gVar.iImLogPathNumber= 0;
for( k = 0; k < count; k ++ )
{
sprintf( keyword, "outpath%d", k + 1 );
GetProfileString( "ImLogPath", keyword, "\\??\\d:\\ImLog\\",
gVar.ImLogPath[ k ], _MAX_DIR_LENGTH, configPath );
}
for( k = 0; k < count; k ++ )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -