PKG_CHECK_MODULES([ARCHIVE], [libarchive >= 3.4.0])
PKG_CHECK_MODULES([CAP], [libcap])
PKG_CHECK_MODULES([CURL], [libcurl])
+PKG_CHECK_MODULES([ELF], [libelf])
PKG_CHECK_MODULES([GPGME], [gpgme >= 1.6.0])
PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}-embed],
[], [PKG_CHECK_MODULES([PYTHON_DEVEL], [python-${PYTHON_VERSION}])])
#include <archive_entry.h>
+#include <gelf.h>
+
#include <pakfire/constants.h>
#include <pakfire/digest.h>
#include <pakfire/file.h>
Classification
*/
+static int setup_libelf(struct pakfire* pakfire) {
+ // Initialize libelf
+ if (elf_version(EV_CURRENT) == EV_NONE) {
+ ERROR(pakfire, "Could not initialize libelf: %s\n", elf_errmsg(-1));
+
+ return 1;
+ }
+
+ return 0;
+}
+
static int pakfire_file_classify_mode(struct pakfire_file* file) {
// Check for regular files
if (S_ISREG(file->st.st_mode))
return 0;
}
+static int pakfire_file_classify_elf(struct pakfire_file* file) {
+ FILE* f = NULL;
+ Elf* elf = NULL;
+ int r;
+
+ // Don't run this if we already know that file is an ELF file
+ if (file->class & PAKFIRE_FILE_ELF)
+ return 0;
+
+ // Setup libelf
+ r = setup_libelf(file->pakfire);
+ if (r)
+ return r;
+
+ // Open the file
+ f = fopen(file->abspath, "r");
+ if (!f) {
+ ERROR(file->pakfire, "Could not open %s: %m\n", file->path);
+ return 1;
+ }
+
+ // Try to open the ELF file
+ elf = elf_begin(fileno(f), ELF_C_READ, NULL);
+ if (!elf) {
+ // We fail silently here, because this file might be in a different format
+ goto ERROR;
+ }
+
+ switch (elf_kind(elf)) {
+ // Mark this file as an ELF file
+ case ELF_K_ELF:
+ file->class |= PAKFIRE_FILE_ELF;
+ break;
+
+ // Ignore everything else
+ default:
+ break;
+ }
+
+ERROR:
+ if (elf)
+ elf_end(elf);
+ if (f)
+ fclose(f);
+
+ return 0;
+}
+
int pakfire_file_classify(struct pakfire_file* file) {
int r;
r = pakfire_file_classify_magic(file);
if (r)
goto ERROR;
+
+ // Check if the file is an ELF file
+ r = pakfire_file_classify_elf(file);
+ if (r)
+ goto ERROR;
}
}
PAKFIRE_FILE_SOCKET = (1 << 6),
// The rest
- PAKFIRE_FILE_EXECUTABLE = (1 << 7),
- PAKFIRE_FILE_PKGCONFIG = (1 << 8),
- PAKFIRE_FILE_PERL = (1 << 9),
- PAKFIRE_FILE_STATIC_LIBRARY = (1 << 10),
- PAKFIRE_FILE_LIBTOOL_ARCHIVE = (1 << 11),
+ PAKFIRE_FILE_ELF = (1 << 7),
+ PAKFIRE_FILE_EXECUTABLE = (1 << 8),
+ PAKFIRE_FILE_PKGCONFIG = (1 << 9),
+ PAKFIRE_FILE_PERL = (1 << 10),
+ PAKFIRE_FILE_STATIC_LIBRARY = (1 << 11),
+ PAKFIRE_FILE_LIBTOOL_ARCHIVE = (1 << 12),
};
int pakfire_file_create_from_path(struct pakfire_file** file,