原文链接: http://www.9mblog.com/5.html
首先进入main函数
int main(int argc, char **argv)
{
SCInstance suri;
SCInstanceInit(&suri);
/*SCInstance类型的suri变量用来保存程序当前的一些状态、标志等上下文环境,通常是用来作为参数
传递给各个模块的子函数,因此为了更好的封装性而放到一个结构体变量中,而不是使用零散的长串参数
或一堆全局变量。SCInstanceInit函数,顾名思义,即是对suri中各个字段进行初始化。
注意,这里对所有字段都进行了显示初始化,因为虽然一个memset清零已经基本达到目的了,但显示地将
各个成员设成0/NULL/FALSE对于可读性来说还是有好处的,可以明确地说明各个字段的初始值,且对扩展
性也会有好处,例如若后续初始化需要设置一些非0值(如用-1表示无效值),直接更改就好了*/
suri.progname = argv[0];
//将progname指向argv[0], 就是可执行程序的名字。
sc_set_caps = FALSE;
/*初始化sc_set_caps为FALSE –> 标识是否对主线程进行特权去除(drop privilege),
主要是出于安全性考虑。*/
SC_ATOMIC_INIT(engine_stage);
/*初始化原子变量engine_stage –> 记录程序当前的运行阶段:SURICATA_INIT、
SURICATA_RUNTIME、SURICATA_FINALIZE*/
/* initialize the logging subsys */
SCLogInitLogModule(NULL);
//初始化日志模块,因为后续的执行流程中将使用日志输出,所以需要最先初始化该模块。
void SCLogInitLogModule(SCLogInitData *sc_lid)
{
/* 清除之前的logModule*/
SCLogDeInitLogModule();
/* 为SCLogConfig类型申请内存空间,sc_log_config 是全局变量 */
if ( (sc_log_config = SCMalloc(sizeof(SCLogConfig))) == NULL) {
SCLogError(SC_ERR_FATAL, "Fatal error encountered in SCLogInitLogModule. Exiting...");
exit(EXIT_FAILURE);
}
memset(sc_log_config, 0, sizeof(SCLogConfig));
/* 初始化一些重要指标,现在sc_lid为NULL,所以全部为默认值 */
SCLogSetLogLevel(sc_lid, sc_log_config);
SCLogSetLogFormat(sc_lid, sc_log_config);
SCLogSetOPIface(sc_lid, sc_log_config);
SCLogSetOPFilter(sc_lid, sc_log_config);
sc_log_module_initialized = 1;
sc_log_module_cleaned = 0;
//SCOutputPrint(sc_did->startup_message);
return;
}
if (SCSetThreadName("Suricata-Main") < 0) {
SCLogWarning(SC_ERR_THREAD_INIT, "Unable to set thread name");
}
//设置主程序名为“Suricata-Main”,SCSetThreadName是预定义的宏。
ParseSizeInit();
/*初始化ParserSize模块 –> 使用正则表达式来解析类似“10Mb”这种大小参数,
其中正则引擎用的是pcre,因此初始化时就是调用pcre_compile、pcre_study对已经写好的
正则表达式进行编译和预处理。*/