/* * pkg - Package management utility for rawnix.org * https://rawnix.org * * Copyright (c) 2025 zorz@gmx.com * SPDX-License-Identifier: BSD-2-Clause */ #ifndef PKG_H #define PKG_H #define _POSIX_C_SOURCE 200809L #include #include #include #include #include #define PKG_VERSION "1.4.0" /* Maximum line length for reading files */ #define MAX_LINE 4096 /* Default hash table bucket count (shared by all hash tables) */ #define HASH_BUCKETS 256 /* String array - dynamic array of strings */ typedef struct { char **data; size_t size; size_t capacity; } strarray_t; /* String list - linked list for temporary string storage */ typedef struct strlist { char *data; struct strlist *next; } strlist_t; /* Package information from MAKEPKG */ typedef struct { char *name; char *path; /* port directory path */ char *version; char *release; char *description; char *url; char *maintainer; strarray_t *depends; /* runtime dependencies */ strarray_t *makedeps; /* build-time dependencies */ strarray_t *provides; /* virtual packages this provides */ strarray_t *variant; /* variant description (words) */ bool loaded; /* lazy loading flag */ } package_t; /* Allocators (abort on failure) */ char *xstrdup(const char *str); void *xmalloc(size_t size); void *xrealloc(void *ptr, size_t size); /* String array */ void strarray_init(strarray_t *arr); void strarray_free(strarray_t *arr); int strarray_add(strarray_t *arr, const char *str); bool strarray_contains(strarray_t *arr, const char *str); /* String utilities */ char *str_trim(char *str); /* String list */ strlist_t *strlist_new(const char *data); void strlist_free(strlist_t *list); int strlist_add(strlist_t **list, const char *data); /* Filesystem helpers */ int mkdirp(const char *path); void ensure_parent_dir(const char *path); /* Path construction: joins root + relative with separator */ char *build_root_path(const char *root, const char *relative); /* Version string builder: writes "version-release" into buf */ void version_build(char *buf, size_t len, const char *version, const char *release); /* Safe file close: fflush + ferror check before fclose */ int file_close_checked(FILE *fp); /* Process execution: fork + exec with optional chdir */ int run_cmd(const char *cmd, char *const argv[], const char *dir); /* Package functions */ package_t *package_new(const char *name, const char *path); void package_free(package_t *pkg); /* MAKEPKG parser */ int makepkg_parse(const char *path, package_t *pkg); /* Hash function (shared by all hash tables) */ unsigned long hash_djb2(const char *str); #endif /* PKG_H */