利用getopt_long返回的分析结果,ParseCmdLine逐个设置pv的变量(pv在后面会有解释),当遇到非法命令getopt_long返回‘?’。注意:snort是利用optopt来区分‘?’,当getopt_long返回的是非法字符时,会把非法字符赋给optopt,此时optopt为非零,就说明返回的?代表非法。
下面给出部分pv的解释:
以上是目前用到的pv变量的解释,也可以参考《snort用户手册》,根据命令来判断,后面如果遇到其他的直接在代码中解释。
ParseCmdLine剩下的几条语句:
Umask是linux中设置权限的函数,可以暂时跳过
if (umaskchange)
{
umask(077); /* set default to be sane */
}
else
{
umask(defumask);
}
/* if we're reading in BPF filters from a file */
if(read_bpf)
{
/* suck 'em in */
//snort允许bpf包中以‘#’开始的注释,所以在开始前要处理一下
pv.pcap_cmd = read_infile(bpf_file);//设置bpf
}
else
{
/* set the BPF rules string (thanks Mike!) */
/*一般返回0,
当有非选项时,把所有非选项组合成一字符串命令
*/
pv.pcap_cmd = copy_argv(&argv[optind]);//
}
DEBUG_WRAP(DebugMessage(DEBUG_INIT, "pcap_cmd is %s/n",
pv.pcap_cmd !=NULL ? pv.pcap_cmd : "NULL"););
非选项好像是用于pcap软件的命令,在getopt_long处理命令行时,遇到非选项就用exchang函数把非选项往后移,而且exchang函数效率很高,详细见:http://blog.csdn.net/fm5821/archive/2011/05/02/6384563.aspx
现在就这可以理解前面getopt_long中那段让人晕乎的代码了。
copy_argv()是把剩下的所有非选项连接成一条命令。
以上就把parsecmdline函数分析完了。