From: Michael Tremer Date: Sat, 26 Oct 2024 10:08:12 +0000 (+0000) Subject: linter: Store a reference to the broken files X-Git-Tag: 0.9.30~862 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=425f282c689a135d6a09ac74c90c7f6fa5cadbd4;p=pakfire.git linter: Store a reference to the broken files Signed-off-by: Michael Tremer --- diff --git a/src/cli/lib/lint.c b/src/cli/lib/lint.c index a89c16e05..bfa614bdc 100644 --- a/src/cli/lib/lint.c +++ b/src/cli/lib/lint.c @@ -61,7 +61,8 @@ static error_t parse(int key, char* arg, struct argp_state* state, void* data) { } static int cli_linter_result(struct pakfire_ctx* ctx, struct pakfire_archive* archive, - struct pakfire_package* package, int priority, const char* result, void* data) { + struct pakfire_package* package, struct pakfire_file* file, int priority, + const char* result, void* data) { const char* nevra = pakfire_package_get_string(package, PAKFIRE_PKG_NEVRA); switch (priority) { diff --git a/src/libpakfire/include/pakfire/linter-file.h b/src/libpakfire/include/pakfire/linter-file.h index 976f2356a..ef9fcfef6 100644 --- a/src/libpakfire/include/pakfire/linter-file.h +++ b/src/libpakfire/include/pakfire/linter-file.h @@ -37,5 +37,12 @@ struct pakfire_linter_file* pakfire_linter_file_unref(struct pakfire_linter_file int pakfire_linter_file_lint(struct pakfire_linter_file* lfile); +#define pakfire_linter_file_info(linter, file, format, ...) \ + pakfire_linter_result(linter, file, PAKFIRE_LINTER_INFO, format, ## __VA_ARGS__) +#define pakfire_linter_file_warning(linter, file, format, ...) \ + pakfire_linter_result(linter, file, PAKFIRE_LINTER_WARNING, format, ## __VA_ARGS__) +#define pakfire_linter_file_error(linter, file, format, ...) \ + pakfire_linter_result(linter, file, PAKFIRE_LINTER_ERROR, format, ## __VA_ARGS__) + #endif /* PAKFIRE_PRIVATE */ #endif /* PAKFIRE_LINTER_FILE_H */ diff --git a/src/libpakfire/include/pakfire/linter.h b/src/libpakfire/include/pakfire/linter.h index cbb706dde..010d2fc3d 100644 --- a/src/libpakfire/include/pakfire/linter.h +++ b/src/libpakfire/include/pakfire/linter.h @@ -23,6 +23,7 @@ #include #include +#include #include enum pakfire_linter_priority { @@ -33,7 +34,7 @@ enum pakfire_linter_priority { typedef int (*pakfire_linter_result_callback)(struct pakfire_ctx* ctx, struct pakfire_archive* archive, struct pakfire_package* package, - int priority, const char* message, void* data); + struct pakfire_file* file, int priority, const char* message, void* data); #ifdef PAKFIRE_PRIVATE @@ -50,15 +51,15 @@ void pakfire_linter_set_result_callback(struct pakfire_linter* linter, int pakfire_linter_lint(struct pakfire_linter* linter); -int pakfire_linter_result(struct pakfire_linter* linter, int priority, - const char* format, ...) __attribute__((format(printf, 3, 4))); +int pakfire_linter_result(struct pakfire_linter* linter, struct pakfire_file* file, + int priority, const char* format, ...) __attribute__((format(printf, 4, 5))); #define pakfire_linter_info(linter, format, ...) \ - pakfire_linter_result(linter, PAKFIRE_LINTER_INFO, format, ## __VA_ARGS__) + pakfire_linter_result(linter, NULL, PAKFIRE_LINTER_INFO, format, ## __VA_ARGS__) #define pakfire_linter_warning(linter, format, ...) \ - pakfire_linter_result(linter, PAKFIRE_LINTER_WARNING, format, ## __VA_ARGS__) + pakfire_linter_result(linter, NULL, PAKFIRE_LINTER_WARNING, format, ## __VA_ARGS__) #define pakfire_linter_error(linter, format, ...) \ - pakfire_linter_result(linter, PAKFIRE_LINTER_ERROR, format, ## __VA_ARGS__) + pakfire_linter_result(linter, NULL, PAKFIRE_LINTER_ERROR, format, ## __VA_ARGS__) #endif /* PAKFIRE_PRIVATE */ #endif /* PAKFIRE_LINTER_H */ diff --git a/src/libpakfire/linter-file.c b/src/libpakfire/linter-file.c index 64fa588ed..cbd908153 100644 --- a/src/libpakfire/linter-file.c +++ b/src/libpakfire/linter-file.c @@ -286,7 +286,7 @@ static int pakfire_linter_file_check_pie(struct pakfire_linter_file* lfile) { break; } - return pakfire_linter_error(lfile->linter, "%s is not PIE", lfile->path); + return pakfire_linter_file_error(lfile->linter, lfile->file, "Missing PIE"); } static int __pakfire_linter_file_check_ssp( @@ -337,8 +337,8 @@ static int __pakfire_linter_file_check_ssp( } // The file does not seem to have SSP enabled - return pakfire_linter_error(lfile->linter, - "%s does not have Stack Smashing Protection", lfile->path); + return pakfire_linter_file_error( + lfile->linter, lfile->file, "Missing Stack Smashing Protection"); } static int pakfire_linter_file_check_ssp(struct pakfire_linter_file* lfile) { diff --git a/src/libpakfire/linter.c b/src/libpakfire/linter.c index c260addc3..d1dbc78ba 100644 --- a/src/libpakfire/linter.c +++ b/src/libpakfire/linter.c @@ -41,6 +41,9 @@ struct pakfire_linter_result { TAILQ_ENTRY(pakfire_linter_result) nodes; + // File + struct pakfire_file* file; + // Priority int priority; @@ -71,7 +74,7 @@ struct pakfire_linter { static int pakfire_linter_default_result_callback(struct pakfire_ctx* ctx, struct pakfire_archive* archive, struct pakfire_package* package, - int priority, const char* result, void* data) { + struct pakfire_file* file, int priority, const char* result, void* data) { const char* nevra = pakfire_package_get_string(package, PAKFIRE_PKG_NEVRA); switch (priority) { @@ -95,13 +98,15 @@ static int pakfire_linter_default_result_callback(struct pakfire_ctx* ctx, } static void pakfire_linter_result_free(struct pakfire_linter_result* result) { + if (result->file) + pakfire_file_unref(result->file); if (result->comment) free(result->comment); free(result); } -int pakfire_linter_result(struct pakfire_linter* linter, int priority, - const char* format, ...) { +int pakfire_linter_result(struct pakfire_linter* linter, struct pakfire_file* file, + int priority, const char* format, ...) { struct pakfire_linter_result* result = NULL; va_list args; int r; @@ -115,6 +120,10 @@ int pakfire_linter_result(struct pakfire_linter* linter, int priority, if (!result) return -errno; + // Store file + if (file) + result->file = pakfire_file_ref(file); + // Store priority result->priority = priority; @@ -135,7 +144,7 @@ int pakfire_linter_result(struct pakfire_linter* linter, int priority, // Call the callback if (linter->result_callback) { r = linter->result_callback(linter->ctx, linter->archive, linter->pkg, - priority, result->comment, linter->result_data); + result->file, priority, result->comment, linter->result_data); if (r < 0) { ERROR(linter->ctx, "Linter result callback failed: %s\n", strerror(-r)); return r;