zoukankan      html  css  js  c++  java
  • ClamAV学习【6】—— cli_load函数浏览

    (老爸回家,就放开心和他到处走,累……趁其和老妈聊天之际,再继续看代码)

    参数选项,加载病毒都浏览得七七八八了,这里就贴个简单的函数注释吧。哈哈。

    代码注释如下:

    int cli_load(const char *filename, struct cl_engine **engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio)
    {
    	FILE *fs = NULL;
    	int ret = CL_SUCCESS;
    	uint8_t skipped = 0;
    	const char *dbname;
    
    	//打开病毒库文件
        if(!dbio && (fs = fopen(filename, "rb")) == NULL) {
    	cli_errmsg("cli_load(): Can't open file %s
    ", filename);
    	return CL_EOPEN;
        }
    
    	//不清楚下面宏定义为啥被忽略了
    	//路径分隔符windows的应该不是/的
    /*
    #ifdef C_WINDOWS
        if((dbname = strrchr(filename, '\')))
    #else
    */
    	//将dbname定位到文件名位置
        if((dbname = strrchr(filename, '/')))
    /*#endif */
    	dbname++;
        else
    	dbname = filename;
    
    	//判断拓展名
    	//不同类型病毒库(临时生成)调用不同方法
        if(cli_strbcasestr(dbname, ".db")) {
    	ret = cli_loaddb(fs, engine, signo, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".cvd")) {
    	    int warn = 0;
    
    	//判断是否为daily.cvd文件
    	if(!strcmp(dbname, "daily.cvd"))
    	    warn = 1;
    
    	//调用cvdload加载病毒库
    	ret = cli_cvdload(fs, engine, signo, warn, options, 0);
    
        } else if(cli_strbcasestr(dbname, ".cld")) {
    	    int warn = 0;
    
    	if(!strcmp(dbname, "daily.cld"))
    	    warn = 1;
    
    	ret = cli_cvdload(fs, engine, signo, warn, options | CL_DB_CVDNOTMP, 1);
    
        } else if(cli_strbcasestr(dbname, ".hdb")) {
    	ret = cli_loadmd5(fs, engine, signo, MD5_HDB, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".hdu")) {
    	if(options & CL_DB_PUA)
    	    ret = cli_loadmd5(fs, engine, signo, MD5_HDB, options, dbio, dbname);
    	else
    	    skipped = 1;
    
        } else if(cli_strbcasestr(dbname, ".fp")) {
    	ret = cli_loadmd5(fs, engine, signo, MD5_FP, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".mdb")) {
    	ret = cli_loadmd5(fs, engine, signo, MD5_MDB, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".mdu")) {
    	if(options & CL_DB_PUA)
    	    ret = cli_loadmd5(fs, engine, signo, MD5_MDB, options, dbio, dbname);
    	else
    	    skipped = 1;
    
        } else if(cli_strbcasestr(dbname, ".ndb")) {
    	ret = cli_loadndb(fs, engine, signo, 0, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".ndu")) {
    	if(!(options & CL_DB_PUA))
    	    skipped = 1;
    	else
    	    ret = cli_loadndb(fs, engine, signo, 0, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".sdb")) {
    	ret = cli_loadndb(fs, engine, signo, 1, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".zmd")) {
    	ret = cli_loadmd(fs, engine, signo, 1, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".rmd")) {
    	ret = cli_loadmd(fs, engine, signo, 2, options, dbio, dbname);
    
        } else if(cli_strbcasestr(dbname, ".cfg")) {
    	ret = cli_dconf_load(fs, engine, options, dbio);
    
        } else if(cli_strbcasestr(dbname, ".wdb")) {
    	if(options & CL_DB_PHISHING_URLS) {
    	    ret = cli_loadwdb(fs, engine, options, dbio);
    	} else
    	    skipped = 1;
        } else if(cli_strbcasestr(dbname, ".pdb")) {
    	if(options & CL_DB_PHISHING_URLS) {
    	    ret = cli_loadpdb(fs, engine, options, dbio);
    	} else
    	    skipped = 1;
        } else if(cli_strbcasestr(dbname, ".ftm")) {
    	ret = cli_loadftm(fs, engine, options, 0, dbio);
    
        } else if(cli_strbcasestr(dbname, ".ign")) {
    	ret = cli_loadign(fs, engine, options, dbio);
    
        } else {
    	cli_dbgmsg("cli_load: unknown extension - assuming old database format
    ");
    	ret = cli_loaddb(fs, engine, signo, options, dbio, dbname);
        }
    
    	//判断病毒库加载是否成功
        if(ret) {
    	cli_errmsg("Can't load %s: %s
    ", filename, cl_strerror(ret));
        } else  {
    	if(skipped)
    	    cli_dbgmsg("%s skipped
    ", filename);
    	else
    	    cli_dbgmsg("%s loaded
    ", filename);
        }
    
        if(fs)
    	fclose(fs);
    
        return ret;
    }
    

    原文:http://blog.csdn.net/betabin/article/details/7435170

  • 相关阅读:
    服务器IIS禁止通过IP访问
    如何自定义Kubernetes资源
    敏捷 | 无处不在的敏捷思想应用
    敏捷 | 如何做好服务型Scrum Master?
    敏捷 | 如何填好推进的坑?
    敏捷 | 如何正确推进敏捷?
    敏捷 | 如何正确理解敏捷?
    管理 |《技术管理案例课》学习总结(下)
    管理 |《技术管理案例课》学习总结(上)
    《ArcGIS 从基础到实战》书正式出版
  • 原文地址:https://www.cnblogs.com/sunylat/p/6393433.html
Copyright © 2011-2022 走看看