]> git.ipfire.org Git - pakfire.git/commitdiff
linter: Store a reference to the broken files
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 26 Oct 2024 10:08:12 +0000 (10:08 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 26 Oct 2024 10:08:12 +0000 (10:08 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/cli/lib/lint.c
src/libpakfire/include/pakfire/linter-file.h
src/libpakfire/include/pakfire/linter.h
src/libpakfire/linter-file.c
src/libpakfire/linter.c

index a89c16e0582ee511b22aa98c36ecfefa549ed2d1..bfa614bdce5f9a58b9704d64b83b3f3382ed3303 100644 (file)
@@ -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) {
index 976f2356a403444cb6f5acef1778fea9f355ce9d..ef9fcfef670a1a7dc655ddabcb9322fd98413c6b 100644 (file)
@@ -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 */
index cbb706dde4362d669c70e6d0d18939345efb320c..010d2fc3d55abc1dcf37b0f1fe68c4c6bac27b0b 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <pakfire/archive.h>
 #include <pakfire/ctx.h>
+#include <pakfire/file.h>
 #include <pakfire/package.h>
 
 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 */
index 64fa588ed09dec77f3117357c8f29c5705691ac0..cbd908153af299e1046cea7a2cc3b363d6640676 100644 (file)
@@ -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) {
index c260addc3dd37ab7b7271fb15a5d71958447cb1f..d1dbc78ba18b1960cfe866ba44b8103567908ea8 100644 (file)
@@ -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;