现在的位置: 首页 > 综合 > 正文

snort代码分析_ParseCmdLine(二)

2013年02月22日 ⁄ 综合 ⁄ 共 1915字 ⁄ 字号 评论关闭

利用getopt_long返回的分析结果,ParseCmdLine逐个设置pv的变量(pv在后面会有解释),当遇到非法命令getopt_long返回‘?’。注意:snort是利用optopt来区分‘?’,当getopt_long返回的是非法字符时,会把非法字符赋给optopt,此时optopt为非零,就说明返回的?代表非法。

 

下面给出部分pv的解释:

 

以上是目前用到的pv变量的解释,也可以参考《snort用户手册》,根据命令来判断,后面如果遇到其他的直接在代码中解释。

 

ParseCmdLine剩下的几条语句:

Umasklinux中设置权限的函数,可以暂时跳过

 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函数分析完了。

抱歉!评论已关闭.