summaryrefslogtreecommitdiff
path: root/src/context.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/context.c')
-rw-r--r--src/context.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/context.c b/src/context.c
index f7b745c..6f953b0 100644
--- a/src/context.c
+++ b/src/context.c
@@ -7,6 +7,9 @@
* SPDX-License-Identifier: GPL-2.0-only
*/
+#include <errno.h>
+#include <unistd.h>
+#include <sys/stat.h>
#include "apk_context.h"
void apk_ctx_init(struct apk_ctx *ac)
@@ -22,6 +25,54 @@ void apk_ctx_init(struct apk_ctx *ac)
void apk_ctx_free(struct apk_ctx *ac)
{
+ apk_id_cache_free(&ac->id_cache);
+ adb_trust_free(&ac->trust);
apk_string_array_free(&ac->repository_list);
apk_string_array_free(&ac->private_keys);
}
+
+int apk_ctx_prepare(struct apk_ctx *ac)
+{
+ if (ac->flags & APK_SIMULATE &&
+ ac->open_flags & (APK_OPENF_CREATE | APK_OPENF_WRITE)) {
+ ac->open_flags &= ~(APK_OPENF_CREATE | APK_OPENF_WRITE);
+ ac->open_flags |= APK_OPENF_READ;
+ }
+ if (!ac->cache_dir) ac->cache_dir = "etc/apk/cache";
+ if (!ac->keys_dir) ac->keys_dir = "etc/apk/keys";
+ if (!ac->root) ac->root = "/";
+ if (!ac->cache_max_age) ac->cache_max_age = 4*60*60; /* 4 hours default */
+
+ ac->root_fd = openat(AT_FDCWD, ac->root, O_RDONLY | O_CLOEXEC);
+ if (ac->root_fd < 0 && (ac->open_flags & APK_OPENF_CREATE)) {
+ mkdirat(AT_FDCWD, ac->root, 0755);
+ ac->root_fd = openat(AT_FDCWD, ac->root, O_RDONLY | O_CLOEXEC);
+ }
+ if (ac->root_fd < 0) {
+ apk_err(&ac->out, "Unable to open root: %s", apk_error_str(errno));
+ return -errno;
+ }
+ return 0;
+}
+
+int apk_ctx_fd_keys(struct apk_ctx *ac)
+{
+ if (ac->keys_fd <= 0) ac->keys_fd = openat(ac->root_fd, ac->keys_dir, O_RDONLY | O_CLOEXEC);
+ return ac->keys_fd;
+}
+
+struct adb_trust *apk_ctx_get_trust(struct apk_ctx *ac)
+{
+ if (!ac->trust.mdctx) {
+ int r = adb_trust_init(&ac->trust, dup(apk_ctx_fd_keys(ac)), ac->private_keys);
+ if (r) return ERR_PTR(r);
+ }
+ return &ac->trust;
+}
+
+struct apk_id_cache *apk_ctx_get_id_cache(struct apk_ctx *ac)
+{
+ if (!ac->id_cache.root_fd)
+ apk_id_cache_init(&ac->id_cache, apk_ctx_fd_root(ac));
+ return &ac->id_cache;
+}