吃饱饭继续浏览Manager.c的scanmanager函数,这个函数的功能吧,暂时理解如下。
接收一个命令行参数(经过处理的optstruct结构指针)。
然后根据选项判断文件类型种类,还有一些扫描选项。看到了AC-Only选项,可是没有BM-Only选项,不解。然后就进行了病毒库的加载和引擎的初始化,接着进行了一些扫描限制(扫描文件大小、数量、递归深度等)设定,还有扫描的文件类型(貌似上面的是用来构建引擎,现在的是用来设置扫描)。然后就是重点,针对文件名进行处理,判断是否是目录还是单个文件,调用不同的扫描函数。
代码注释如下:(应该不是完全正确的)
int scanmanager(const struct optstruct *opt)
{
mode_t fmode;
int ret = 0, extunpacker = 0, fmodeint, i, x;
unsigned int options = 0, dboptions = 0;
struct cl_engine *engine = NULL;
struct cl_limits limits;
struct passwd *user = NULL;
struct stat sb;
char *fullpath = NULL, cwd[1024];
//扫描文件类型判断
if(opt_check(opt, "unzip") || opt_check(opt, "unrar") || opt_check(opt, "arj") ||
opt_check(opt, "unzoo") || opt_check(opt, "jar") || opt_check(opt, "lha") ||
opt_check(opt, "tar") || opt_check(opt, "tgz") || opt_check(opt, "deb"))
extunpacker = 1;
//获取CLAMAVUSER的用户信息,识别码和根目录
//参考passwd结构
/* njh@bandsman.co.uk: BeOS */
#if !defined(C_CYGWIN) && !defined(C_OS2) && !defined(C_BEOS) && !defined(C_WINDOWS)
if(extunpacker && !geteuid()) {
if((user = getpwnam(CLAMAVUSER)) == NULL) {
logg("!Can't get information about user "CLAMAVUSER" (required to run external unpackers)\n");
exit(60); /* this is critical problem, so we just exit here */
}
}
#endif
//添加扫描选项
if(!opt_check(opt, "no-phishing-sigs"))
dboptions |= C