68
pthread_mutex_t exit_mutex;
71
pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
70
73
time_t reloaded_time = 0;
71
pthread_mutex_t reload_mutex;
74
pthread_mutex_t reload_mutex = PTHREAD_MUTEX_INITIALIZER;
73
76
static struct cl_stat *dbstat = NULL;
239
while((retval = cl_load(dbdir, &engine, &sigs, dboptions)) == CL_ELOCKDB) {
240
logg("!reload db failed: %s (attempt %u/3)\n", cl_strerror(retval), attempt);
237
/* release old structure */
240
if(!(pua_cats = strdup(engine->pua_cats)))
241
logg("^Can't make a copy of pua_cats\n");
248
if((retval = cli_initengine(&engine, dboptions))) {
249
logg("!cli_initengine() failed: %s\n", cl_strerror(retval));
254
engine->pua_cats = pua_cats;
257
if((retval = cl_load(dbdir, &engine, &sigs, dboptions))) {
258
logg("!reload db failed: %s\n", cl_strerror(retval));
306
323
if((fd = fopen(cpt->strarg, "w")) == NULL) {
307
324
logg("!Can't save PID in file %s\n", cpt->strarg);
309
fprintf(fd, "%u", (unsigned int) mainpid);
326
if (fprintf(fd, "%u", (unsigned int) mainpid)<0) {
327
logg("!Can't save PID in file %s\n", cpt->strarg);
312
331
umask(old_umask);
330
349
logg("^Limits: File size limit protection disabled.\n");
353
if(getrlimit(RLIMIT_FSIZE, &rlim) == 0) {
354
if((rlim.rlim_max < limits.maxfilesize) || (rlim.rlim_max < limits.maxscansize))
355
logg("^System limit for file size is lower than maxfilesize or maxscansize\n");
357
logg("^Cannot obtain resource limits for file size\n");
333
361
if((limits.maxreclevel = cfgopt(copt, "MaxRecursion")->numarg)) {
334
362
logg("Limits: Recursion level limit set to %u.\n", limits.maxreclevel);
400
428
options |= CL_SCAN_MAILURL;
431
if(cfgopt(copt, "ScanPartialMessages")->enabled) {
432
logg("Mail: RFC1341 handling enabled.\n");
433
options |= CL_SCAN_PARTIAL_MESSAGE;
404
437
logg("Mail files support disabled.\n");
474
if(cfgopt(copt,"HeuristicScanPrecedence")->enabled) {
475
options |= CL_SCAN_HEURISTIC_PRECEDENCE;
476
logg("Heuristic: precedence enabled\n");
479
if(cfgopt(copt, "StructuredDataDetection")->enabled) {
480
options |= CL_SCAN_STRUCTURED;
482
limits.min_cc_count = cfgopt(copt, "StructuredMinCreditCardCount")->numarg;
483
logg("Structured: Minimum Credit Card Number Count set to %u\n", limits.min_cc_count);
485
limits.min_ssn_count = cfgopt(copt, "StructuredMinSSNCount")->numarg;
486
logg("Structured: Minimum Social Security Number Count set to %u\n", limits.min_ssn_count);
488
if(cfgopt(copt, "StructuredSSNFormatNormal")->enabled)
489
options |= CL_SCAN_STRUCTURED_SSN_NORMAL;
491
if(cfgopt(copt, "StructuredSSNFormatStripped")->enabled)
492
options |= CL_SCAN_STRUCTURED_SSN_STRIPPED;
441
495
selfchk = cfgopt(copt, "SelfCheck")->numarg;
443
497
logg("Self checking disabled.\n");
448
502
if(cfgopt(copt, "ClamukoScanOnAccess")->enabled)
451
pthread_attr_init(&clamuko_attr);
452
pthread_attr_setdetachstate(&clamuko_attr, PTHREAD_CREATE_JOINABLE);
454
tharg = (struct thrarg *) malloc(sizeof(struct thrarg));
456
tharg->engine = engine;
457
tharg->limits = &limits;
458
tharg->options = options;
460
pthread_create(&clamuko_pid, &clamuko_attr, clamukoth, tharg);
506
if(!pthread_attr_init(&clamuko_attr)) break;
507
pthread_attr_setdetachstate(&clamuko_attr, PTHREAD_CREATE_JOINABLE);
508
if(!(tharg = (struct thrarg *) malloc(sizeof(struct thrarg)))) break;
510
tharg->engine = engine;
511
tharg->limits = &limits;
512
tharg->options = options;
513
if(pthread_create(&clamuko_pid, &clamuko_attr, clamukoth, tharg)) break;
517
if (!tharg) logg("!Unable to start Clamuko\n");
463
520
logg("Clamuko is not available.\n");
497
554
sigaction(SIGUSR2, &sigact, NULL);
500
pthread_mutex_init(&exit_mutex, NULL);
501
pthread_mutex_init(&reload_mutex, NULL);
503
557
idletimeout = cfgopt(copt, "IdleTimeout")->numarg;
505
559
if((thr_pool=thrmgr_new(max_threads, idletimeout, scanner_thread)) == NULL) {
565
619
if (!progexit && new_sd >= 0) {
566
620
client_conn = (client_conn_t *) malloc(sizeof(struct client_conn_tag));
567
client_conn->sd = new_sd;
568
client_conn->options = options;
569
client_conn->copt = copt;
570
client_conn->engine = cl_dup(engine);
571
client_conn->engine_timestamp = reloaded_time;
572
client_conn->limits = &limits;
573
client_conn->socketds = socketds;
574
client_conn->nsockets = nsockets;
575
if (!thrmgr_dispatch(thr_pool, client_conn)) {
576
close(client_conn->sd);
578
logg("!thread dispatch failed\n");
622
client_conn->sd = new_sd;
623
client_conn->options = options;
624
client_conn->copt = copt;
625
client_conn->engine = cl_dup(engine);
626
client_conn->engine_timestamp = reloaded_time;
627
client_conn->limits = &limits;
628
client_conn->socketds = socketds;
629
client_conn->nsockets = nsockets;
630
if(!thrmgr_dispatch(thr_pool, client_conn)) {
631
closesocket(client_conn->sd);
633
logg("!thread dispatch failed\n");
636
logg("!Can't allocate memory for client_conn\n");
638
if(cfgopt(copt, "ExitOnOOM")->enabled) {
639
pthread_mutex_lock(&exit_mutex);
641
pthread_mutex_unlock(&exit_mutex);
582
646
pthread_mutex_lock(&exit_mutex);
587
654
pthread_mutex_unlock(&exit_mutex);
607
674
engine = reload_db(engine, dboptions, copt, FALSE, &ret);
609
676
logg("Terminating because of a fatal error.\n");
614
686
pthread_mutex_lock(&reload_mutex);
616
688
time(&reloaded_time);
617
689
pthread_mutex_unlock(&reload_mutex);
619
if(cfgopt(copt, "ClamukoScanOnAccess")->enabled) {
691
if(cfgopt(copt, "ClamukoScanOnAccess")->enabled && tharg) {
620
692
logg("Stopping and restarting Clamuko.\n");
621
693
pthread_kill(clamuko_pid, SIGUSR1);
622
694
pthread_join(clamuko_pid, NULL);