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\n", 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\n");
- ret = cli_loaddb(fs, engine, signo, options, dbio, dbname);
- }
- //判断病毒库加载是否成功
- if(ret) {
- cli_errmsg("Can't load %s: %s\n", filename, cl_strerror(ret));
- } else {
- if(skipped)
- cli_dbgmsg("%s skipped\n", filename);
- else
- cli_dbgmsg("%s loaded\n", filename);
- }
- if(fs)
- fclose(fs);
- return ret;
- }
原文:http://blog.csdn.net/betabin/article/details/7435170
ClamAV学习【6】—— cli_load函数浏览的更多相关文章
- 学习js回调函数
<!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <title> ...
- JavaScript学习03 JS函数
JavaScript学习03 JS函数 函数就是包裹在花括号中的代码块,前面使用了关键词function: function functionName() { 这里是要执行的代码 } 函数参数 函数的 ...
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
- iOS学习09C语言函数指针
本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...
- iOS学习05C语言函数
本次主要是学习和理解函数,函数树状图如下: 1.函数的声明和定义 函数定义的四要素分别为: 返回值类型 :函数的结果值类型,函数不能返回数组. 指定返回类型是void类型说明函数没有返回值. 函数名 ...
- matlab学习笔记 bsxfun函数
matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...
- haskell学习笔记_函数
一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...
- Haskell学习-高阶函数
原文地址:Haskell学习-高阶函数 高阶函数(higher-order function)就是指可以操作函数的函数,即函数可以作为参数,也可以作为返回结果.有了这两个特性,haskell可以实现许 ...
- python入门学习:7.函数
python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数 使用关键字def ...
随机推荐
- 安装wget
今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装. 可以通 ...
- linux rz sz 的安装
先wget获取包wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz然后解压tar zxvf rzsz-3.48.tar.gz进入目录c ...
- etcd 命令行
比较重要的配置 -name 节点名称,默认是UUID-data-dir 保存日志和快照的目录,默认为当前工作目录-addr 公布的ip地址和端口. 默认为127.0.0.1:2379-bind-add ...
- 126. Word Ladder II( Queue; BFS)
Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...
- SQL server2008零基础学习
SQL 基础 数据库简介: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管 ...
- mysql 求2个坐标之间的距离
CREATE DEFINER=`root`@`%` FUNCTION `f_GetDistance`(lng1 DOUBLE,lat1 DOUBLE,lng2 DOUBLE,lat2 DOUBLE) ...
- swagger框架
1.1 介绍 Swagger是一个简单又强大的能为你的Restful风格的Api生成文档工具.在项目中集成这个工具,根据我们自己的配置信息能够自动为我们生成一个api文档展示页,可以在浏览器中直接 ...
- linux下mysql开启远程访问权限及防火墙开放3306端口(mysql开放host访问权限)
开启mysql的远程访问权限默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限.主流的有两种方法,改表法和授权法.相对而言,改表法 ...
- Java 设计模式系列(八)装饰者模式
Java 设计模式系列(八)装饰者模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.Decorator 或 Wrapper 一.装饰模 ...
- Python中解码decode()与编码encode()与错误处理UnicodeDecodeError: 'gbk' codec can't decode byte 0xab
编码方法encoding() 描述 encode() 方法以指定的编码格式编码字符串,默认编码为 'utf-8'.将字符串由string类型变成bytes类型. 对应的解码方法:bytes decod ...