#define DEBUG_VARIABLE "SNORT_DEBUG"
在系统的环境变量里存在名为SNORT_DEBUG的变量。
紧接着是各个模块的debug_lever的宏定义
2#define DEBUG_INIT 0x00000001 /* 1 */
3#define DEBUG_CONFIGRULES 0x00000002 /* 2 */
4#define DEBUG_PLUGIN 0x00000004 /* 4 */
5#define DEBUG_DATALINK 0x00000008 /* 8 */
6#define DEBUG_IP 0x00000010 /* 16 */
7#define DEBUG_TCPUDP 0x00000020 /* 32 */
8#define DEBUG_DECODE 0x00000040 /* 64 */
9#define DEBUG_LOG 0x00000080 /* 128 */
10#define DEBUG_MSTRING 0x00000100 /* 256 */
11#define DEBUG_PARSER 0x00000200 /* 512 */
12#define DEBUG_PLUGBASE 0x00000400 /* 1024 */
13#define DEBUG_RULES 0x00000800 /* 2048 */
14#define DEBUG_FLOW 0x00001000 /* 4096 */
15#define DEBUG_STREAM 0x00002000 /* 8192 */
16#define DEBUG_PATTERN_MATCH 0x00004000 /* 16384 */
17#define DEBUG_DETECT 0x00008000 /* 32768 */
18#define DEBUG_CONVERSATION 0x00010000 /* 65536 */
19#define DEBUG_FRAG2 0x00020000 /* 131072 */
20#define DEBUG_HTTP_DECODE 0x00040000 /* 262144 */
21#define DEBUG_PORTSCAN2 0x00080000 /* 524288 / (+ conv2 ) 589824 */
22#define DEBUG_RPC 0x00100000 /* 1048576 */
23#define DEBUG_FLOWSYS 0x00200000 /* 2097152 */
24#define DEBUG_HTTPINSPECT 0x00400000 /* 4194304 */
25#define DEBUG_STREAM_STATE 0x00800000 /* 8388608 */
26#define DEBUG_ASN1 0x01000000 /* 16777216 */
int GetDebugLevel (void);的说明。
2{
3 static int debug_init = 0;
4 static int debug_level = 0;
5
6 if(debug_init) {
7 return debug_level;//如果被初始化过,直接返回debug_level
8 }
9 //没有被初始化,就从环境变量里取出debug_level
10 if (getenv(DEBUG_VARIABLE))
11 debug_level = atoi(getenv(DEBUG_VARIABLE));
12 else
13 debug_level = 0;//如果没有设置环境变量,则debug_lever=0
14 //设置完调试等级过后debug_init=1
15 debug_init = 1;
16 return debug_level;
17}
{
//判断系统是否需要调试本模块
//方法:就是用本模块的level与系统设置的DEBUG_VARIABLE
if (!(level & GetDebugLevel()))
{
return 0;
}
return 1;
}
#define DebugMessage DebugMessageFile = __FILE__; DebugMessageLine = __LINE__; DebugMessageFunc
void DebugMessageFunc(int , char *, ...);
以上联合使用的就是DebugMessage(int,char *,...);
{
va_list ap;
char buf[STD_BUF+1];
if (!(level & GetDebugLevel()))
{
return;
}
/* filename and line number information */
if (DebugMessageFile != NULL)
printf("%s:%d: ", DebugMessageFile, DebugMessageLine);
va_start(ap, fmt);
if(pv.daemon_flag)
{
vsnprintf(buf, STD_BUF, fmt, ap);
syslog(LOG_DAEMON | LOG_DEBUG, "%s", buf);
}
else
{
vprintf(fmt, ap);
}
va_end(ap);
}
这里引出了以前我对几个问题的不理解,查资料后总结如下:
关于va可变参数的几个宏,使用va必须include <stdarg.h>
va_list 是指向参数的指针
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type ); 返回可变的参数,type指定返回的类型
void va_end( va_list arg_ptr );
另外是一些输入输出的东东。。。。所有的输入是用scanf替换printf
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
描述 (DESCRIPTION)
printf 系列 函数 根据 下述的 format 参数 生成 输出内容. printf 和 vprintf 函数 把 输出内容 写到 stdout, 即 标准输出流; fprintf 和 vfprintf 函数 把 输出内容 写到 给定的 stream 流; sprintf, snprintf, vsprintf 和 vsnprintf 函数 把 输出内容 存放到 字符串 str 中.
这些 函数 由 格式字符串 format 参数 控制 输出内容, 它 指出 怎么样 把 后面的 参数 (或 通过 stdarg(3) 的 变长参数机制 访问的 参数) 转换成 输出内容. 这些 函数 返回 打印的 字符 数量 (不包括 字符串 结尾用的 `\0'). snprintf 和 vsnprintf 的 输出 不会 超过 size 字节 (包括了 结尾的 `\0'), 如果 因为 这个 限制 导致 输出内容 被截断, 则 函数 返回 -1.
格式字符串 (format 参数) 由 零到多个 指令 组成: 普通字符 (除 % 外), 它们 被 原封不动的 送到 输出流; 以及 格式转换说明 (conversion specification), 每个 格式转换说明 都会 从后面 提取 零到多个 参数. 格式转换说明 由 % 字符 引导开始. 参数 必须 正确的 对应到 格式转换符 (conversion specifier) 上.