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

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

代码注释如下:

  1. int cli_load(const char *filename, struct cl_engine **engine, unsigned int *signo, unsigned int options, struct cli_dbio *dbio)
  2. {
  3. FILE *fs = NULL;
  4. int ret = CL_SUCCESS;
  5. uint8_t skipped = 0;
  6. const char *dbname;
  7.  
  8. //打开病毒库文件
  9. if(!dbio && (fs = fopen(filename, "rb")) == NULL) {
  10. cli_errmsg("cli_load(): Can't open file %s\n", filename);
  11. return CL_EOPEN;
  12. }
  13.  
  14. //不清楚下面宏定义为啥被忽略了
  15. //路径分隔符windows的应该不是/的
  16. /*
  17. #ifdef C_WINDOWS
  18. if((dbname = strrchr(filename, '\\')))
  19. #else
  20. */
  21. //将dbname定位到文件名位置
  22. if((dbname = strrchr(filename, '/')))
  23. /*#endif */
  24. dbname++;
  25. else
  26. dbname = filename;
  27.  
  28. //判断拓展名
  29. //不同类型病毒库(临时生成)调用不同方法
  30. if(cli_strbcasestr(dbname, ".db")) {
  31. ret = cli_loaddb(fs, engine, signo, options, dbio, dbname);
  32.  
  33. } else if(cli_strbcasestr(dbname, ".cvd")) {
  34. int warn = 0;
  35.  
  36. //判断是否为daily.cvd文件
  37. if(!strcmp(dbname, "daily.cvd"))
  38. warn = 1;
  39.  
  40. //调用cvdload加载病毒库
  41. ret = cli_cvdload(fs, engine, signo, warn, options, 0);
  42.  
  43. } else if(cli_strbcasestr(dbname, ".cld")) {
  44. int warn = 0;
  45.  
  46. if(!strcmp(dbname, "daily.cld"))
  47. warn = 1;
  48.  
  49. ret = cli_cvdload(fs, engine, signo, warn, options | CL_DB_CVDNOTMP, 1);
  50.  
  51. } else if(cli_strbcasestr(dbname, ".hdb")) {
  52. ret = cli_loadmd5(fs, engine, signo, MD5_HDB, options, dbio, dbname);
  53.  
  54. } else if(cli_strbcasestr(dbname, ".hdu")) {
  55. if(options & CL_DB_PUA)
  56. ret = cli_loadmd5(fs, engine, signo, MD5_HDB, options, dbio, dbname);
  57. else
  58. skipped = 1;
  59.  
  60. } else if(cli_strbcasestr(dbname, ".fp")) {
  61. ret = cli_loadmd5(fs, engine, signo, MD5_FP, options, dbio, dbname);
  62.  
  63. } else if(cli_strbcasestr(dbname, ".mdb")) {
  64. ret = cli_loadmd5(fs, engine, signo, MD5_MDB, options, dbio, dbname);
  65.  
  66. } else if(cli_strbcasestr(dbname, ".mdu")) {
  67. if(options & CL_DB_PUA)
  68. ret = cli_loadmd5(fs, engine, signo, MD5_MDB, options, dbio, dbname);
  69. else
  70. skipped = 1;
  71.  
  72. } else if(cli_strbcasestr(dbname, ".ndb")) {
  73. ret = cli_loadndb(fs, engine, signo, 0, options, dbio, dbname);
  74.  
  75. } else if(cli_strbcasestr(dbname, ".ndu")) {
  76. if(!(options & CL_DB_PUA))
  77. skipped = 1;
  78. else
  79. ret = cli_loadndb(fs, engine, signo, 0, options, dbio, dbname);
  80.  
  81. } else if(cli_strbcasestr(dbname, ".sdb")) {
  82. ret = cli_loadndb(fs, engine, signo, 1, options, dbio, dbname);
  83.  
  84. } else if(cli_strbcasestr(dbname, ".zmd")) {
  85. ret = cli_loadmd(fs, engine, signo, 1, options, dbio, dbname);
  86.  
  87. } else if(cli_strbcasestr(dbname, ".rmd")) {
  88. ret = cli_loadmd(fs, engine, signo, 2, options, dbio, dbname);
  89.  
  90. } else if(cli_strbcasestr(dbname, ".cfg")) {
  91. ret = cli_dconf_load(fs, engine, options, dbio);
  92.  
  93. } else if(cli_strbcasestr(dbname, ".wdb")) {
  94. if(options & CL_DB_PHISHING_URLS) {
  95. ret = cli_loadwdb(fs, engine, options, dbio);
  96. } else
  97. skipped = 1;
  98. } else if(cli_strbcasestr(dbname, ".pdb")) {
  99. if(options & CL_DB_PHISHING_URLS) {
  100. ret = cli_loadpdb(fs, engine, options, dbio);
  101. } else
  102. skipped = 1;
  103. } else if(cli_strbcasestr(dbname, ".ftm")) {
  104. ret = cli_loadftm(fs, engine, options, 0, dbio);
  105.  
  106. } else if(cli_strbcasestr(dbname, ".ign")) {
  107. ret = cli_loadign(fs, engine, options, dbio);
  108.  
  109. } else {
  110. cli_dbgmsg("cli_load: unknown extension - assuming old database format\n");
  111. ret = cli_loaddb(fs, engine, signo, options, dbio, dbname);
  112. }
  113.  
  114. //判断病毒库加载是否成功
  115. if(ret) {
  116. cli_errmsg("Can't load %s: %s\n", filename, cl_strerror(ret));
  117. } else {
  118. if(skipped)
  119. cli_dbgmsg("%s skipped\n", filename);
  120. else
  121. cli_dbgmsg("%s loaded\n", filename);
  122. }
  123.  
  124. if(fs)
  125. fclose(fs);
  126.  
  127. return ret;
  128. }

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

ClamAV学习【6】—— cli_load函数浏览的更多相关文章

  1. 学习js回调函数

    <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <title> ...

  2. JavaScript学习03 JS函数

    JavaScript学习03 JS函数 函数就是包裹在花括号中的代码块,前面使用了关键词function: function functionName() { 这里是要执行的代码 } 函数参数 函数的 ...

  3. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  4. iOS学习09C语言函数指针

    本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...

  5. iOS学习05C语言函数

    本次主要是学习和理解函数,函数树状图如下: 1.函数的声明和定义 函数定义的四要素分别为: 返回值类型 :函数的结果值类型,函数不能返回数组. 指定返回类型是void类型说明函数没有返回值. 函数名 ...

  6. matlab学习笔记 bsxfun函数

    matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...

  7. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

  8. Haskell学习-高阶函数

    原文地址:Haskell学习-高阶函数 高阶函数(higher-order function)就是指可以操作函数的函数,即函数可以作为参数,也可以作为返回结果.有了这两个特性,haskell可以实现许 ...

  9. python入门学习:7.函数

    python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数   使用关键字def ...

随机推荐

  1. 安装wget

    今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装. 可以通 ...

  2. linux rz sz 的安装

    先wget获取包wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz然后解压tar zxvf  rzsz-3.48.tar.gz进入目录c ...

  3. etcd 命令行

    比较重要的配置 -name 节点名称,默认是UUID-data-dir 保存日志和快照的目录,默认为当前工作目录-addr 公布的ip地址和端口. 默认为127.0.0.1:2379-bind-add ...

  4. 126. Word Ladder II( Queue; BFS)

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  5. SQL server2008零基础学习

    SQL 基础 数据库简介: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管 ...

  6. mysql 求2个坐标之间的距离

    CREATE DEFINER=`root`@`%` FUNCTION `f_GetDistance`(lng1 DOUBLE,lat1 DOUBLE,lng2 DOUBLE,lat2 DOUBLE) ...

  7. swagger框架

    1.1   介绍 Swagger是一个简单又强大的能为你的Restful风格的Api生成文档工具.在项目中集成这个工具,根据我们自己的配置信息能够自动为我们生成一个api文档展示页,可以在浏览器中直接 ...

  8. linux下mysql开启远程访问权限及防火墙开放3306端口(mysql开放host访问权限)

    开启mysql的远程访问权限默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限.主流的有两种方法,改表法和授权法.相对而言,改表法 ...

  9. Java 设计模式系列(八)装饰者模式

    Java 设计模式系列(八)装饰者模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.Decorator 或 Wrapper 一.装饰模 ...

  10. Python中解码decode()与编码encode()与错误处理UnicodeDecodeError: 'gbk' codec can't decode byte 0xab

    编码方法encoding() 描述 encode() 方法以指定的编码格式编码字符串,默认编码为 'utf-8'.将字符串由string类型变成bytes类型. 对应的解码方法:bytes decod ...