diff mbox series

[10/20] fwts_log_scan: move fwts_log_check

Message ID 20180620121446.31470-11-info@marcellobauer.com
State Accepted
Headers show
Series coreboot test intergration | expand

Commit Message

Marcello Sylvester Bauer June 20, 2018, 12:14 p.m. UTC
Signed-off-by: Marcello Sylvester Bauer <info@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(-)

Comments

Colin Ian King June 21, 2018, 3:53 p.m. UTC | #1
On 20/06/18 13:14, Marcello Sylvester Bauer wrote:
> Signed-off-by: Marcello Sylvester Bauer <info@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;
> +}
> 
Acked-by: Colin Ian King <colin.king@canonical.com>
Alex Hung June 27, 2018, 10:51 p.m. UTC | #2
On 2018-06-20 05:14 AM, Marcello Sylvester Bauer wrote:
> Signed-off-by: Marcello Sylvester Bauer <info@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;
> +}
> 


Acked-by: Alex Hung <alex.hung@canonical.com>
diff mbox series

Patch

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;
+}