}
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) {
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 */
#include <pakfire/archive.h>
#include <pakfire/ctx.h>
+#include <pakfire/file.h>
#include <pakfire/package.h>
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
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 */
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(
}
// 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) {
struct pakfire_linter_result {
TAILQ_ENTRY(pakfire_linter_result) nodes;
+ // File
+ struct pakfire_file* file;
+
// Priority
int priority;
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) {
}
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;
if (!result)
return -errno;
+ // Store file
+ if (file)
+ result->file = pakfire_file_ref(file);
+
// Store priority
result->priority = 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;