[PATCH 10/20] fwts_log_scan: move fwts_log_check

Marcello Sylvester Bauer info at marcellobauer.com
Wed Jun 20 12:14:36 UTC 2018


Signed-off-by: Marcello Sylvester Bauer <info at marcellobauer.com>
---
 src/lib/include/fwts_log_scan.h |   1 +
 src/lib/src/fwts_klog.c         | 108 +-----------------------------------
 src/lib/src/fwts_log_scan.c     | 119 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 121 insertions(+), 107 deletions(-)

diff --git a/src/lib/include/fwts_log_scan.h b/src/lib/include/fwts_log_scan.h
index 849a9d1b..b2364791 100644
--- a/src/lib/include/fwts_log_scan.h
+++ b/src/lib/include/fwts_log_scan.h
@@ -51,5 +51,6 @@ char *fwts_log_unique_label(const char *str, const char *label);
 void       fwts_log_scan_patterns(fwts_framework *fw, char *line, int repeated, char *prevline, void *private, int *errors, const char *name, const char *advice);
 fwts_compare_mode fwts_log_compare_mode_str_to_val(const char *str);
 const char *fwts_json_str(fwts_framework *fw, const char *table, int index, json_object *obj, const char *key, bool log_error);
+int         fwts_log_check(fwts_framework *fw, const char *table, fwts_log_scan_func fwts_log_scan_patterns, fwts_log_progress_func progress, fwts_list *log, int *errors, const char *json_data_path, const char *label, bool remove_timestamp);
 
 #endif
diff --git a/src/lib/src/fwts_klog.c b/src/lib/src/fwts_klog.c
index a0d3b561..ea8d4ed7 100644
--- a/src/lib/src/fwts_klog.c
+++ b/src/lib/src/fwts_klog.c
@@ -135,13 +135,6 @@ static int fwts_klog_check(fwts_framework *fw,
 	fwts_list *klog,
 	int *errors)
 {
-	int ret = FWTS_ERROR;
-	int n;
-	int i;
-	int fd;
-	json_object *klog_objs;
-	json_object *klog_table;
-	fwts_log_pattern *patterns;
 	char json_data_path[PATH_MAX];
 
 	if (fw->json_data_file) {
@@ -150,106 +143,7 @@ static int fwts_klog_check(fwts_framework *fw,
 	else { /* use the hard coded KLOG JSON as default */
 		snprintf(json_data_path, sizeof(json_data_path), "%s/%s", fw->json_data_path, KLOG_DATA_JSON_FILE);
 	}
-
-	/*
-	 * json_object_from_file() can fail when files aren't readable
-	 * so check if we can open for read before calling json_object_from_file()
-	 */
-	if ((fd = open(json_data_path, O_RDONLY)) < 0) {
-		fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path);
-		return FWTS_ERROR;
-	}
-	(void)close(fd);
-
-	klog_objs = json_object_from_file(json_data_path);
-	if (FWTS_JSON_ERROR(klog_objs)) {
-		fwts_log_error(fw, "Cannot load klog data from %s.", json_data_path);
-		return FWTS_ERROR;
-	}
-
-#if JSON_HAS_GET_EX
-	if (!json_object_object_get_ex(klog_objs, table, &klog_table)) {
-		fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path);
-		goto fail_put;
-	}
-#else
-	klog_table = json_object_object_get(klog_objs, table);
-	if (FWTS_JSON_ERROR(klog_table)) {
-		fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path);
-		goto fail_put;
-	}
-#endif
-
-	n = json_object_array_length(klog_table);
-
-	/* Last entry is null to indicate end, so alloc n+1 items */
-	if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) {
-		fwts_log_error(fw, "Cannot allocate pattern table.");
-		goto fail_put;
-	}
-
-	/* Now fetch json objects and compile regex */
-	for (i = 0; i < n; i++) {
-		const char *str;
-		json_object *obj;
-
-		obj = json_object_array_get_idx(klog_table, i);
-		if (FWTS_JSON_ERROR(obj)) {
-			fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table);
-			goto fail;
-		}
-		if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL)
-			goto fail;
-		patterns[i].compare_mode = fwts_klog_compare_mode_str_to_val(str);
-
-		if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL)
-			goto fail;
-		patterns[i].level   = fwts_log_str_to_level(str);
-
-		if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL)
-			goto fail;
-
-		if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL)
-			goto fail;
-
-		/* Labels appear in fwts 0.26.0, so are optional with older versions */
-		str = fwts_json_str(fw, table, i, obj, "label", false);
-		if (str) {
-			patterns[i].label = strdup(str);
-		} else {
-			/* if not specified, auto-magically generate */
-			patterns[i].label = strdup(fwts_klog_unique_label(patterns[i].pattern));
-		}
-		if (patterns[i].label == NULL)
-			goto fail;
-
-		if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) {
-			int rc;
-
-			rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED);
-			if (rc) {
-				fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc);
-				patterns[i].compiled_ok = false;
-			} else {
-				patterns[i].compiled_ok = true;
-			}
-		}
-	}
-	/* We've now collected up the scan patterns, lets scan the log for errors */
-	ret = fwts_klog_scan(fw, klog, fwts_klog_scan_patterns, progress, patterns, errors);
-
-fail:
-	for (i = 0; i < n; i++) {
-		if (patterns[i].compiled_ok)
-			regfree(&patterns[i].compiled);
-		if (patterns[i].label)
-			free(patterns[i].label);
-	}
-	free(patterns);
-fail_put:
-	json_object_put(klog_objs);
-
-	return ret;
+	return fwts_log_check(fw, table, fwts_klog_scan_patterns, progress, klog, errors, json_data_path, UNIQUE_KLOG_LABEL, true);
 }
 
 int fwts_klog_firmware_check(fwts_framework *fw, fwts_klog_progress_func progress,
diff --git a/src/lib/src/fwts_log_scan.c b/src/lib/src/fwts_log_scan.c
index f9ed7b35..79979ff1 100644
--- a/src/lib/src/fwts_log_scan.c
+++ b/src/lib/src/fwts_log_scan.c
@@ -345,3 +345,122 @@ nullobj:
 			key, index, table);
 	return NULL;
 }
+
+int fwts_log_check(fwts_framework *fw,
+        const char *table,
+        fwts_log_scan_func fwts_log_scan_patterns,
+        fwts_log_progress_func progress,
+        fwts_list *log,
+        int *errors,
+        const char *json_data_path,
+        const char *label,
+        bool remove_timestamp)
+{
+        int ret = FWTS_ERROR;
+        int n;
+        int i;
+        int fd;
+        json_object *log_objs;
+        json_object *log_table;
+        fwts_log_pattern *patterns;
+
+        /*
+         * json_object_from_file() can fail when files aren't readable
+         * so check if we can open for read before calling json_object_from_file()
+         */
+        if ((fd = open(json_data_path, O_RDONLY)) < 0) {
+                fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path);
+                return FWTS_ERROR;
+        }
+        (void)close(fd);
+
+        log_objs = json_object_from_file(json_data_path);
+        if (FWTS_JSON_ERROR(log_objs)) {
+                fwts_log_error(fw, "Cannot load log data from %s.", json_data_path);
+                return FWTS_ERROR;
+        }
+
+#if JSON_HAS_GET_EX
+        if (!json_object_object_get_ex(log_objs, table, &log_table)) {
+                fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path);
+                goto fail_put;
+        }
+#else
+        log_table = json_object_object_get(log_objs, table);
+        if (FWTS_JSON_ERROR(log_table)) {
+                fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path);
+                goto fail_put;
+        }
+#endif
+
+        n = json_object_array_length(log_table);
+
+        /* Last entry is null to indicate end, so alloc n+1 items */
+        if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) {
+                fwts_log_error(fw, "Cannot allocate pattern table.");
+                goto fail_put;
+        }
+
+        /* Now fetch json objects and compile regex */
+        for (i = 0; i < n; i++) {
+                const char *str;
+                json_object *obj;
+
+                obj = json_object_array_get_idx(log_table, i);
+                if (FWTS_JSON_ERROR(obj)) {
+                        fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table);
+                        goto fail;
+                }
+                if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL)
+                        goto fail;
+                patterns[i].compare_mode = fwts_log_compare_mode_str_to_val(str);
+
+                if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL)
+                        goto fail;
+                patterns[i].level   = fwts_log_str_to_level(str);
+
+                if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL)
+                        goto fail;
+
+                if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL)
+                        goto fail;
+
+                /* Labels appear in fwts 0.26.0, so are optional with older versions */
+                str = fwts_json_str(fw, table, i, obj, "label", false);
+                if (str) {
+                        patterns[i].label = strdup(str);
+                } else {
+                        /* if not specified, auto-magically generate */
+                        patterns[i].label = strdup(fwts_log_unique_label(patterns[i].pattern, label));
+                }
+                if (patterns[i].label == NULL)
+                        goto fail;
+
+                if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) {
+                        int rc;
+
+                        rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED);
+                        if (rc) {
+                                fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc);
+                                patterns[i].compiled_ok = false;
+                        } else {
+                                patterns[i].compiled_ok = true;
+                        }
+                }
+        }
+        /* We've now collected up the scan patterns, lets scan the log for errors */
+        ret = fwts_log_scan(fw, log, fwts_log_scan_patterns, progress, patterns, errors, remove_timestamp);
+
+fail:
+        for (i = 0; i < n; i++) {
+                if (patterns[i].compiled_ok)
+                        regfree(&patterns[i].compiled);
+                if (patterns[i].label)
+                        free(patterns[i].label);
+        }
+        free(patterns);
+fail_put:
+        json_object_put(log_objs);
+
+        return ret;
+}
-- 
2.16.4




More information about the fwts-devel mailing list