static int clamav_load_database() { int ret = 0; /* return value */ int reload = 0; /* libclamav initialization */ if (CLAMAV_G(cl_initcalled) == 0){ if((ret = cl_init(CL_INIT_DEFAULT)) != CL_SUCCESS) { php_error(E_WARNING, "cl_init: failed : error code %i (%s)\n", ret, cl_strerror(ret)); return FAILURE; } else { CLAMAV_G(cl_initcalled) = 1; } } /* database reload */ if (CLAMAV_G(dbstat.dir) != NULL && cl_statchkdir(&CLAMAV_G(dbstat)) == 1) { reload = 1; cl_statfree(&CLAMAV_G(dbstat)); } /* load engine */ if (!(CLAMAV_G(dbengine) = cl_engine_new())){ php_error(E_WARNING, "Can’t create new engine\n"); return FAILURE; } if (CLAMAV_G(dbpath) == NULL) CLAMAV_G(dbpath) = (char *) cl_retdbdir(); /* database loading */ if ((ret = cl_load(CLAMAV_G(dbpath), CLAMAV_G(dbengine), &CLAMAV_G(sig_num), CL_DB_STDOPT)) != CL_SUCCESS) { php_error(E_WARNING, "cl_load: failed : error code %i (%s)\n", ret, cl_strerror(ret)); return FAILURE; } /* compile signature database */ if ((ret = cl_engine_compile(CLAMAV_G(dbengine))) != CL_SUCCESS) { php_error(E_WARNING, "cl_engine_compile : error code %i (%s\n", ret, cl_strerror(ret)); return FAILURE; } /* allocate cl_stat */ if (!reload) memset(&CLAMAV_G(dbstat), 0, sizeof(struct cl_stat)); /* database stats */ if ((ret = cl_statinidir(CLAMAV_G(dbpath), &CLAMAV_G(dbstat))) != CL_SUCCESS) { php_error(E_WARNING, "cl_statinidir : error code %i (%s\n", ret, cl_strerror(ret)); return FAILURE; } /* set engine parameters */ cl_engine_set_num(CLAMAV_G(dbengine), CL_ENGINE_MAX_FILES, CLAMAV_G(maxfiles)); cl_engine_set_num(CLAMAV_G(dbengine), CL_ENGINE_MAX_FILESIZE, CLAMAV_G(maxfilesize)); cl_engine_set_num(CLAMAV_G(dbengine), CL_ENGINE_MAX_SCANSIZE, CLAMAV_G(maxscansize)); cl_engine_set_num(CLAMAV_G(dbengine), CL_ENGINE_MAX_RECURSION, CLAMAV_G(maxreclevel)); cl_engine_set_num(CLAMAV_G(dbengine), CL_ENGINE_KEEPTMP, CLAMAV_G(keeptmp)); cl_engine_set_str(CLAMAV_G(dbengine), CL_ENGINE_TMPDIR, CLAMAV_G(tmpdir)); return ret; }
int statinidir_th(const char* dirname) { if (!dbstat.entries) { memset(&dbstat, 0, sizeof(dbstat)); } return cl_statinidir(dirname, &dbstat); }
static struct cl_engine *reload_db(struct cl_engine *engine, unsigned int dboptions, const struct optstruct *opts, int do_check, int *ret) { const char *dbdir; int retval; unsigned int sigs = 0; struct cl_settings *settings = NULL; *ret = 0; if(do_check) { if(!dbstat.entries) { logg("No stats for Database check - forcing reload\n"); return engine; } if(cl_statchkdir(&dbstat) == 1) { logg("SelfCheck: Database modification detected. Forcing reload.\n"); return engine; } else { logg("SelfCheck: Database status OK.\n"); return NULL; } } /* release old structure */ if(engine) { /* copy current settings */ settings = cl_engine_settings_copy(engine); if(!settings) logg("^Can't make a copy of the current engine settings\n"); thrmgr_setactiveengine(NULL); cl_engine_free(engine); } dbdir = optget(opts, "DatabaseDirectory")->strarg; logg("Reading databases from %s\n", dbdir); if(dbstat.entries) cl_statfree(&dbstat); memset(&dbstat, 0, sizeof(struct cl_stat)); if((retval = cl_statinidir(dbdir, &dbstat))) { logg("!cl_statinidir() failed: %s\n", cl_strerror(retval)); *ret = 1; if(settings) cl_engine_settings_free(settings); return NULL; } if(!(engine = cl_engine_new())) { logg("!Can't initialize antivirus engine\n"); *ret = 1; if(settings) cl_engine_settings_free(settings); return NULL; } if(settings) { retval = cl_engine_settings_apply(engine, settings); if(retval != CL_SUCCESS) { logg("^Can't apply previous engine settings: %s\n", cl_strerror(retval)); logg("^Using default engine settings\n"); } cl_engine_settings_free(settings); } if((retval = cl_load(dbdir, engine, &sigs, dboptions))) { logg("!reload db failed: %s\n", cl_strerror(retval)); cl_engine_free(engine); *ret = 1; return NULL; } if((retval = cl_engine_compile(engine)) != 0) { logg("!Database initialization error: can't compile engine: %s\n", cl_strerror(retval)); cl_engine_free(engine); *ret = 1; return NULL; } logg("Database correctly reloaded (%u signatures)\n", sigs); thrmgr_setactiveengine(engine); return engine; }
static struct cl_node *reload_db(struct cl_node *root, const struct cfgstruct *copt, int do_check) { const char *dbdir; int retval; unsigned int virnum = 0; struct cfgstruct *cpt; static struct cl_stat *dbstat=NULL; if(do_check) { if(dbstat == NULL) { logg("No stats for Database check - forcing reload\n"); return root; } if(cl_statchkdir(dbstat) == 1) { logg("SelfCheck: Database modification detected. Forcing reload.\n"); return root; } else { logg("SelfCheck: Database status OK.\n"); return NULL; } } /* release old structure */ if(root) { cl_free(root); root = NULL; } if((cpt = cfgopt(copt, "DatabaseDirectory")) || (cpt = cfgopt(copt, "DataDirectory"))) { dbdir = cpt->strarg; } else { dbdir = cl_retdbdir(); } logg("Reading databases from %s\n", dbdir); if(dbstat == NULL) { dbstat = (struct cl_stat *) mmalloc(sizeof(struct cl_stat)); } else { cl_statfree(dbstat); } memset(dbstat, 0, sizeof(struct cl_stat)); cl_statinidir(dbdir, dbstat); if((retval = cl_loaddbdir(dbdir, &root, &virnum))) { logg("!reload db failed: %s\n", cl_strerror(retval)); exit(-1); } if(!root) { logg("!load db failed: %s\n", cl_strerror(retval)); exit(-1); } if((retval = cl_build(root)) != 0) { logg("!Database initialization error: can't build engine: %s\n", cl_strerror(retval)); exit(-1); } logg("Database correctly reloaded (%d viruses)\n", virnum); return root; }