summaryrefslogtreecommitdiff
path: root/src/analysis/scan/scanner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/scanner.c')
-rw-r--r--src/analysis/scan/scanner.c58
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);