diff options
| author | Riley Beckett <rbeckettvt@gmail.com> | 2026-10-20 18:45:41 -0400 |
|---|---|---|
| committer | Riley Beckett <rbeckettvt@gmail.com> | 2026-10-20 18:45:41 -0400 |
| commit | a2ad28429b7eeb08b87c0ea191f31e09ae03ef28 (patch) | |
| tree | dec601aa9dbd93f8bb4f18bdf545f5d326d6ee63 /snag | |
| parent | 65cfd95021b585fa92b455e89f2e0a645e48bb45 (diff) | |
Diffstat (limited to 'snag')
| -rw-r--r-- | snag/src/build_db.c | 44 | ||||
| -rw-r--r-- | snag/src/build_db.h | 5 | ||||
| -rw-r--r-- | snag/src/main.c | 3 |
3 files changed, 35 insertions, 17 deletions
diff --git a/snag/src/build_db.c b/snag/src/build_db.c index 6b22bcc..b5256f7 100644 --- a/snag/src/build_db.c +++ b/snag/src/build_db.c @@ -4,9 +4,6 @@ #include "util.h" #include "source_db.h" -#define _XOPEN_SOURCE 500 -#include <ftw.h> - #include <poll.h> #include <stdint.h> #include <stdio.h> @@ -328,7 +325,7 @@ void build_run(const package_build_t* build) { if (WEXITSTATUS(wstatus) != 0) die("the child failed to execute install script"); } -int do_dir_traversal(char* path, const char* absolute_path, const char** flist) { +int do_dir_traversal(char* path, const char* absolute_path, char** flist) { size_t path_len = strlen(path); if (path_len >= PATH_MAX) { return -1; @@ -411,14 +408,14 @@ int do_dir_traversal(char* path, const char* absolute_path, const char** flist) return 0; } -void list_fakeroot(const package_build_t* build, const char** flist) { +void list_fakeroot(const package_build_t* build, char** flist) { char path[PATH_MAX] = {0}; strcpy(path, build->fakeroot); const char* absolute_path = slash; do_dir_traversal(path, absolute_path, flist); } -void read_flist(const package_info_t* info, const char*** flist) { +void read_flist(const package_info_t* info, char*** flist) { char* flist_file = vastrcat(cfg.install_db, "/", info->attrs.id, "/flist"); if (!flist_file) { die("flist path allocation failed: %s", strerror(errno)); @@ -426,30 +423,49 @@ void read_flist(const package_info_t* info, const char*** flist) { FILE* f = fopen(flist_file, "r"); if (!f) { print("There is no flist file for: %s\n", info->attrs.id); - free(flist_file); - *flist = NULL; - return; + goto error; + } + if (fseek(f, 0, SEEK_END) < 0) { + print("failed to find end of flist: %s\n", info->attrs.id); + goto error; } - fseek(f, 0, SEEK_END); long file_size = ftell(f); - fseek(f, 0, SEEK_SET); + if (fseek(f, 0, SEEK_SET) < 0) { + print("failed to find begining of flist: %s\n", info->attrs.id); + goto error; + } + if (file_size == 0) { + print("flist is empty for: %s\n", info->attrs.id); + goto error; + } char* flist_buffer = emalloc(file_size + 1, "flist buffer"); if (fread(flist_buffer, 1, file_size, f) < file_size) { die("Failed to read entire flist"); } flist_buffer[file_size] = 0; size_t lines = 0; - for (int i = 0; i < file_size; i++) { + for (size_t i = 0; i < file_size; i++) { if (flist_buffer[i] == '\n') lines++; } if (flist_buffer[file_size - 1] != '\n') lines++; - const char** flist_array = emalloc((lines + 1) * sizeof(char*), "flist array"); + char** flist_array = emalloc((lines + 1) * sizeof(char*), "flist array"); flist_array[0] = strtok(flist_buffer, "\n"); - for (int i = 1; i < lines; i++) { + for (size_t i = 1; i < lines; i++) { flist_array[i] = strtok(NULL, "\n"); } flist_array[lines] = NULL; *flist = flist_array; fclose(f); free(flist_file); + return; + error: + free(flist_file); + *flist = NULL; +} + +void free_flist(char*** flist) { + if (!*flist) return; + free(**flist); + free(*flist); + *flist = NULL; } diff --git a/snag/src/build_db.h b/snag/src/build_db.h index 413295f..1b0b907 100644 --- a/snag/src/build_db.h +++ b/snag/src/build_db.h @@ -12,7 +12,8 @@ typedef struct { bool package_setup_build(const package_info_t* info, package_build_t* build); void build_run(const package_build_t* info); -void list_fakeroot(const package_build_t* info, const char** flist); -void read_flist(const package_info_t* info, const char*** flist); +void list_fakeroot(const package_build_t* info, char** flist); +void read_flist(const package_info_t* info, char*** flist); +void free_flist(char*** flist); #endif diff --git a/snag/src/main.c b/snag/src/main.c index 37feb58..f73359d 100644 --- a/snag/src/main.c +++ b/snag/src/main.c @@ -62,9 +62,10 @@ int cmd_install(char* cmd_name, ArgParser* parser) { package_build_t build; package_setup_build(&info, &build); build_run(&build); - const char** flist = NULL; + char** flist = NULL; read_flist(&info, &flist); list_fakeroot(&build, flist); + free_flist(&flist); } } |
