diff options
Diffstat (limited to 'src/analysis/scan/scanner.c')
-rw-r--r-- | src/analysis/scan/scanner.c | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/src/analysis/scan/scanner.c b/src/analysis/scan/scanner.c index 41fa0de..7b553e6 100644 --- a/src/analysis/scan/scanner.c +++ b/src/analysis/scan/scanner.c @@ -364,7 +364,7 @@ bool g_content_scanner_include_resource(GContentScanner *scanner, const char *pa if (!result) { - inc_name = g_scan_rule_get_name(included->rules[i], (fnv64_t []) { 0 }); + inc_name = g_scan_rule_get_name(included->rules[i], NULL); log_variadic_message(LMT_ERROR, "Can not import from '%s': rule '%s' already exists!", path, inc_name); @@ -459,7 +459,7 @@ bool g_content_scanner_add_rule(GContentScanner *scanner, GScanRule *rule) if (!result) { - inc_name = g_scan_rule_get_name(rule, (fnv64_t []) { 0 }); + inc_name = g_scan_rule_get_name(rule, NULL); log_variadic_message(LMT_ERROR, "Can not add rule: '%s' already exists!", inc_name); @@ -489,6 +489,11 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions * GScanContext *result; /* Bilan global à retourner */ bool status; /* Bilan d'opération locale */ size_t i; /* Boucle de parcours */ + bool global; /* Bilan des règles globales */ + GScanRule *rule; /* Règle à consulter */ + const char *name; /* Désignation de la règle */ + + /* Préparations... */ result = g_scan_context_new(options); @@ -510,6 +515,8 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions * } + /* Phase d'analyse */ + g_scan_context_set_content(result, content); g_engine_backend_run_scan(scanner->data_backend, result); @@ -519,6 +526,25 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions * for (i = 0; i < scanner->rule_count; i++) g_scan_rule_check(scanner->rules[i], scanner->data_backend, result); + /* Etablissement d'un bilan global */ + + global = true; + + for (i = 0; i < scanner->rule_count; i++) + { + rule = scanner->rules[i]; + + if ((g_scan_rule_get_flags(rule) & SRF_GLOBAL) == 0) + continue; + + name = g_scan_rule_get_name(rule, NULL); + + global = g_scan_context_has_match_for_rule(result, name); + + } + + g_scan_context_set_global_match(result, global); + exit: return result; @@ -645,29 +671,45 @@ char *g_content_scanner_convert_to_text(const GContentScanner *scanner, GScanCon void g_content_scanner_output_to_json(const GContentScanner *scanner, GScanContext *context, const sized_string_t *padding, unsigned int level, int fd) { - size_t i; /* Boucle de parcours */ - bool trailing; /* Virgule finale */ + size_t k; /* Boucle de parcours #1 */ + size_t i; /* Boucle de parcours #2 */ + size_t last_displayed; /* Dernier indice affiché */ + bool tail; /* Saut de la virgule finale ? */ /* Introduction */ - for (i = 0; i < level; i++) + for (k = 0; k < level; k++) write(fd, padding->data, padding->len); write(fd, "[\n", 2); /* Sous-traitance aux règles */ + for (i = scanner->rule_count; i > 0; i--) + if ((g_scan_rule_get_flags(scanner->rules[i - 1]) & SRF_PRIVATE) == 0) + break; + + if (i == 0) + goto nothing_to_display; + else + last_displayed = i - 1; + for (i = 0; i < scanner->rule_count; i++) { - trailing = ((i + 1) < scanner->rule_count); + if ((g_scan_rule_get_flags(scanner->rules[i]) & SRF_PRIVATE) == SRF_PRIVATE) + continue; - g_scan_rule_output_to_json(scanner->rules[i], context, padding, level + 1, fd, trailing); + tail = (i == last_displayed); + + g_scan_rule_output_to_json(scanner->rules[i], context, padding, level + 1, fd, tail); } /* Conclusion */ - for (i = 0; i < level; i++) + nothing_to_display: + + for (k = 0; k < level; k++) write(fd, padding->data, padding->len); write(fd, "]\n", 2); |