aboutsummaryrefslogtreecommitdiffstats
path: root/src/database.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/database.c')
-rw-r--r--src/database.c258
1 files changed, 129 insertions, 129 deletions
diff --git a/src/database.c b/src/database.c
index 946155d..f31e840 100644
--- a/src/database.c
+++ b/src/database.c
@@ -47,10 +47,7 @@ enum {
APK_DIR_REMOVE
};
-int apk_verbosity = 1;
-
-static apk_blob_t tmpprefix = { .len=8, .ptr = ".apknew." };
-
+static apk_blob_t tmpprefix = APK_BLOB_STRLIT(".apknew.");
static const char * const apkindex_tar_gz = "APKINDEX.tar.gz";
static const char * const apk_static_cache_dir = "var/cache/apk";
static const char * const apk_world_file = "etc/apk/world";
@@ -242,7 +239,7 @@ static void apk_db_dir_prepare(struct apk_database *db, struct apk_db_dir *dir,
(st.st_mode & 07777) == (dir->mode & 07777) &&
st.st_uid == dir->uid && st.st_gid == dir->gid;
} else if (newmode) {
- if (!(db->flags & APK_SIMULATE))
+ if (!(db->ctx->flags & APK_SIMULATE))
mkdirat(db->root_fd, dir->name, newmode);
dir->created = 1;
dir->update_permissions = 1;
@@ -257,7 +254,7 @@ void apk_db_dir_unref(struct apk_database *db, struct apk_db_dir *dir, int rmdir
if (dir->namelen != 0) {
if (rmdir_mode == APK_DIR_REMOVE) {
dir->modified = 1;
- if (!(db->flags & APK_SIMULATE) &&
+ if (!(db->ctx->flags & APK_SIMULATE) &&
unlinkat(db->root_fd, dir->name, AT_REMOVEDIR) != 0)
;
}
@@ -609,6 +606,7 @@ int apk_cache_download(struct apk_database *db, struct apk_repository *repo,
struct apk_package *pkg, int verify, int autoupdate,
apk_progress_cb cb, void *cb_ctx)
{
+ struct apk_out *out = &db->ctx->out;
struct stat st = {0};
struct apk_url_print urlp;
struct apk_istream *is;
@@ -629,18 +627,18 @@ int apk_cache_download(struct apk_database *db, struct apk_repository *repo,
r = apk_repo_format_real_url(db->arch, repo, pkg, url, sizeof(url), &urlp);
if (r < 0) return r;
- if (autoupdate && !(db->force & APK_FORCE_REFRESH)) {
+ if (autoupdate && !(db->ctx->force & APK_FORCE_REFRESH)) {
if (fstatat(db->cache_fd, cacheitem, &st, 0) == 0 &&
- now - st.st_mtime <= db->cache_max_age)
+ now - st.st_mtime <= db->ctx->cache_max_age)
return -EALREADY;
}
- apk_message("fetch " URL_FMT, URL_PRINTF(urlp));
+ apk_msg(out, "fetch " URL_FMT, URL_PRINTF(urlp));
- if (db->flags & APK_SIMULATE) return 0;
+ if (db->ctx->flags & APK_SIMULATE) return 0;
if (cb) cb(cb_ctx, 0);
if (verify != APK_SIGN_NONE) {
- apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY, NULL, db->keys_fd, db->flags & APK_ALLOW_UNTRUSTED);
+ apk_sign_ctx_init(&sctx, APK_SIGN_VERIFY, NULL, db->keys_fd, db->ctx->flags & APK_ALLOW_UNTRUSTED);
is = apk_istream_from_url(url, apk_db_url_since(db, st.st_mtime));
is = apk_istream_tee(is, db->cache_fd, tmpcacheitem, !autoupdate, cb, cb_ctx);
is = apk_istream_gunzip_mpart(is, apk_sign_ctx_mpart_cb, &sctx);
@@ -747,6 +745,7 @@ err:
int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo)
{
+ struct apk_out *out = &db->ctx->out;
struct apk_package *pkg = NULL;
struct apk_installed_package *ipkg = NULL;
struct apk_db_dir_instance *diri = NULL;
@@ -782,7 +781,7 @@ int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo)
}
if (apk_db_pkg_add(db, pkg) == NULL) {
- apk_error("Installed database load failed");
+ apk_err(out, "Installed database load failed");
return -1;
}
pkg = NULL;
@@ -870,13 +869,13 @@ int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo)
case 's': ipkg->broken_script = 1; break;
case 'x': ipkg->broken_xattr = 1; break;
default:
- if (!(db->force & APK_FORCE_OLD_APK))
+ if (!(db->ctx->force & APK_FORCE_OLD_APK))
goto old_apk_tools;
}
}
break;
default:
- if (r != 0 && !(db->force & APK_FORCE_OLD_APK))
+ if (r != 0 && !(db->ctx->force & APK_FORCE_OLD_APK))
goto old_apk_tools;
/* Installed. So mark the package as installable. */
pkg->filename = NULL;
@@ -888,10 +887,10 @@ int apk_db_index_read(struct apk_database *db, struct apk_istream *is, int repo)
return 0;
old_apk_tools:
/* Installed db should not have unsupported fields */
- apk_error("This apk-tools is too old to handle installed packages");
+ apk_err(out, "This apk-tools is too old to handle installed packages");
goto err;
bad_entry:
- apk_error("FDB format error (line %d, entry '%c')", lineno, field);
+ apk_err(out, "FDB format error (line %d, entry '%c')", lineno, field);
err:
apk_istream_close(is);
return -1;
@@ -928,8 +927,9 @@ static int apk_db_write_fdb(struct apk_database *db, struct apk_ostream *os)
list_for_each_entry(ipkg, &db->installed.packages, installed_pkgs_list) {
pkg = ipkg->pkg;
r = apk_pkg_write_index_entry(pkg, os);
- if (r < 0)
+ if (r < 0) {
return r;
+ }
if (ipkg->replaces->num) {
apk_blob_push_blob(&bbuf, APK_BLOB_STR("r:"));
@@ -1192,7 +1192,7 @@ static int write_index_entry(apk_hash_item item, void *ctx)
return r;
if (apk_ostream_write(iwctx->os, "\n", 1) != 1)
- return -EIO;
+ return apk_ostream_cancel(iwctx->os, -EIO);
iwctx->count++;
return 0;
@@ -1390,6 +1390,7 @@ static void mark_in_cache(struct apk_database *db, int dirfd, const char *name,
static int add_repos_from_file(void *ctx, int dirfd, const char *file)
{
struct apk_database *db = (struct apk_database *) ctx;
+ struct apk_out *out = &db->ctx->out;
apk_blob_t blob;
if (dirfd != AT_FDCWD && dirfd != db->root_fd) {
@@ -1401,8 +1402,8 @@ static int add_repos_from_file(void *ctx, int dirfd, const char *file)
blob = apk_blob_from_file(dirfd, file);
if (APK_BLOB_IS_NULL(blob)) {
if (dirfd != AT_FDCWD) return 0;
- apk_error("failed to read repositories: %s", file);
- apk_message("NOTE: --repositories-file is relative to the startup directory since apk 2.12.0_rc2");
+ apk_err(out, "failed to read repositories: %s", file);
+ apk_msg(out, "NOTE: --repositories-file is relative to the startup directory since apk 2.12.0_rc2");
return -ENOENT;
}
@@ -1507,8 +1508,9 @@ void apk_db_init(struct apk_database *db)
db->root_fd = -1;
}
-int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
+int apk_db_open(struct apk_database *db, struct apk_ctx *ac)
{
+ struct apk_out *out = &ac->out;
const char *msg = NULL;
struct statfs stfs;
apk_blob_t blob;
@@ -1517,31 +1519,31 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
apk_default_acl_dir = apk_db_acl_atomize(db, 0755, 0, 0, NULL);
apk_default_acl_file = apk_db_acl_atomize(db, 0644, 0, 0, NULL);
- if (dbopts->flags & APK_SIMULATE) {
- dbopts->open_flags &= ~(APK_OPENF_CREATE | APK_OPENF_WRITE);
- dbopts->open_flags |= APK_OPENF_READ;
- }
- if (dbopts->open_flags == 0) {
+ db->ctx = ac;
+ if (ac->open_flags == 0) {
msg = "Invalid open flags (internal error)";
r = -1;
goto ret_r;
}
- db->flags = dbopts->flags;
- db->force = dbopts->force;
- if ((dbopts->open_flags & APK_OPENF_WRITE) &&
- !(dbopts->open_flags & APK_OPENF_NO_AUTOUPDATE) &&
- !(dbopts->flags & APK_NO_NETWORK))
+ if (ac->flags & APK_SIMULATE) {
+ ac->open_flags &= ~(APK_OPENF_CREATE | APK_OPENF_WRITE);
+ ac->open_flags |= APK_OPENF_READ;
+ }
+ if ((ac->open_flags & APK_OPENF_WRITE) &&
+ !(ac->open_flags & APK_OPENF_NO_AUTOUPDATE) &&
+ !(ac->flags & APK_NO_NETWORK))
db->autoupdate = 1;
- if (!dbopts->cache_dir) dbopts->cache_dir = "etc/apk/cache";
+ 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 */
- apk_db_setup_repositories(db, dbopts->cache_dir);
+ apk_db_setup_repositories(db, ac->cache_dir);
- db->cache_max_age = dbopts->cache_max_age ?: 4*60*60; /* 4 hours default */
- db->root = strdup(dbopts->root ?: "/");
- db->root_fd = openat(AT_FDCWD, db->root, O_RDONLY | O_CLOEXEC);
- if (db->root_fd < 0 && (dbopts->open_flags & APK_OPENF_CREATE)) {
- mkdirat(AT_FDCWD, db->root, 0755);
- db->root_fd = openat(AT_FDCWD, db->root, O_RDONLY | O_CLOEXEC);
+ db->root_fd = openat(AT_FDCWD, db->ctx->root, O_RDONLY | O_CLOEXEC);
+ if (db->root_fd < 0 && (ac->open_flags & APK_OPENF_CREATE)) {
+ mkdirat(AT_FDCWD, db->ctx->root, 0755);
+ db->root_fd = openat(AT_FDCWD, db->ctx->root, O_RDONLY | O_CLOEXEC);
}
if (db->root_fd < 0) {
msg = "Unable to open root";
@@ -1551,8 +1553,8 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
stfs.f_type == TMPFS_MAGIC)
db->permanent = 0;
- if (dbopts->root && dbopts->arch) {
- db->arch = apk_atomize(&db->atoms, APK_BLOB_STR(dbopts->arch));
+ if (ac->root && ac->arch) {
+ db->arch = apk_atomize(&db->atoms, APK_BLOB_STR(ac->arch));
write_arch = TRUE;
} else {
apk_blob_t arch;
@@ -1568,11 +1570,11 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
apk_id_cache_init(&db->id_cache, db->root_fd);
- if (dbopts->open_flags & APK_OPENF_WRITE) {
+ if (ac->open_flags & APK_OPENF_WRITE) {
db->lock_fd = openat(db->root_fd, apk_lock_file,
O_CREAT | O_RDWR | O_CLOEXEC, 0600);
if (db->lock_fd < 0 && errno == ENOENT &&
- (dbopts->open_flags & APK_OPENF_CREATE)) {
+ (ac->open_flags & APK_OPENF_CREATE)) {
r = apk_db_create(db);
if (r != 0) {
msg = "Unable to create database";
@@ -1584,16 +1586,16 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
if (db->lock_fd < 0 ||
flock(db->lock_fd, LOCK_EX | LOCK_NB) < 0) {
msg = "Unable to lock database";
- if (dbopts->lock_wait) {
+ if (ac->lock_wait) {
struct sigaction sa, old_sa;
- apk_message("Waiting for repository lock");
+ apk_msg(out, "Waiting for repository lock");
memset(&sa, 0, sizeof sa);
sa.sa_handler = handle_alarm;
sa.sa_flags = SA_ONESHOT;
sigaction(SIGALRM, &sa, &old_sa);
- alarm(dbopts->lock_wait);
+ alarm(ac->lock_wait);
if (flock(db->lock_fd, LOCK_EX) < 0)
goto ret_errno;
@@ -1606,7 +1608,7 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
apk_blob_to_file(db->root_fd, apk_arch_file, *db->arch, APK_BTF_ADD_EOL);
/* mount /proc */
- if (asprintf(&db->root_proc_dir, "%s/proc", db->root) == -1)
+ if (asprintf(&db->root_proc_dir, "%s/proc", db->ctx->root) == -1)
goto ret_errno;
if (statfs(db->root_proc_dir, &stfs) != 0) {
if (errno == ENOENT) mkdir(db->root_proc_dir, 0555);
@@ -1628,21 +1630,21 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
add_protected_paths_from_file, db);
/* figure out where to have the cache */
- fd = openat(db->root_fd, dbopts->cache_dir, O_RDONLY | O_CLOEXEC);
+ fd = openat(db->root_fd, ac->cache_dir, O_RDONLY | O_CLOEXEC);
if (fd >= 0 && fstatfs(fd, &stfs) == 0) {
- db->cache_dir = dbopts->cache_dir;
+ db->cache_dir = ac->cache_dir;
db->cache_fd = fd;
db->cache_remount_flags = map_statfs_flags(stfs.f_flags);
- if ((dbopts->open_flags & (APK_OPENF_WRITE | APK_OPENF_CACHE_WRITE)) &&
+ if ((ac->open_flags & (APK_OPENF_WRITE | APK_OPENF_CACHE_WRITE)) &&
(db->cache_remount_flags & MS_RDONLY) != 0) {
/* remount cache read/write */
db->cache_remount_dir = find_mountpoint(db->root_fd, db->cache_dir);
if (db->cache_remount_dir == NULL) {
- apk_warning("Unable to find cache directory mount point");
+ apk_warn(out, "Unable to find cache directory mount point");
} else if (mount(0, db->cache_remount_dir, 0, MS_REMOUNT | (db->cache_remount_flags & ~MS_RDONLY), 0) != 0) {
free(db->cache_remount_dir);
db->cache_remount_dir = NULL;
- apk_error("Unable to remount cache read/write");
+ apk_err(out, "Unable to remount cache read/write");
r = EROFS;
goto ret_r;
}
@@ -1659,53 +1661,51 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
}
}
- db->keys_fd = openat(db->root_fd,
- dbopts->keys_dir ?: "etc/apk/keys",
- O_RDONLY | O_CLOEXEC);
+ db->keys_fd = openat(db->root_fd, ac->keys_dir, O_RDONLY | O_CLOEXEC);
- r = adb_trust_init(&db->trust, dup(db->keys_fd), dbopts->private_keys);
+ r = adb_trust_init(&db->trust, dup(db->keys_fd), ac->private_keys);
if (r) {
msg = "Unable to read trusted keys";
goto ret_r;
}
- if (db->flags & APK_OVERLAY_FROM_STDIN) {
- db->flags &= ~APK_OVERLAY_FROM_STDIN;
+ if (db->ctx->flags & APK_OVERLAY_FROM_STDIN) {
+ db->ctx->flags &= ~APK_OVERLAY_FROM_STDIN;
apk_db_read_overlay(db, apk_istream_from_fd(STDIN_FILENO));
}
- r = apk_db_read_state(db, dbopts->open_flags);
- if (r == -ENOENT && (dbopts->open_flags & APK_OPENF_CREATE)) {
+ r = apk_db_read_state(db, ac->open_flags);
+ if (r == -ENOENT && (ac->open_flags & APK_OPENF_CREATE)) {
r = apk_db_create(db);
if (r != 0) {
msg = "Unable to create database";
goto ret_r;
}
- r = apk_db_read_state(db, dbopts->open_flags);
+ r = apk_db_read_state(db, ac->open_flags);
}
if (r != 0) {
msg = "Unable to read database state";
goto ret_r;
}
- if (!(dbopts->open_flags & APK_OPENF_NO_INSTALLED_REPO)) {
+ if (!(ac->open_flags & APK_OPENF_NO_INSTALLED_REPO)) {
if (apk_db_cache_active(db)) {
apk_db_index_read(db, apk_istream_from_file(db->cache_fd, "installed"), -2);
}
}
- if (!(dbopts->open_flags & APK_OPENF_NO_SYS_REPOS)) {
+ if (!(ac->open_flags & APK_OPENF_NO_SYS_REPOS)) {
char **repo;
- foreach_array_item(repo, dbopts->repository_list)
+ foreach_array_item(repo, ac->repository_list)
apk_db_add_repository(db, APK_BLOB_STR(*repo));
- if (dbopts->repositories_file == NULL) {
+ if (ac->repositories_file == NULL) {
add_repos_from_file(db, db->root_fd, "etc/apk/repositories");
apk_dir_foreach_file(openat(db->root_fd, "etc/apk/repositories.d", O_RDONLY | O_CLOEXEC),
add_repos_from_file, db);
} else {
- add_repos_from_file(db, AT_FDCWD, dbopts->repositories_file);
+ add_repos_from_file(db, AT_FDCWD, ac->repositories_file);
}
if (db->repo_update_counter)
@@ -1714,16 +1714,15 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
apk_hash_foreach(&db->available.names, apk_db_name_rdepends, db);
}
- if (apk_db_cache_active(db) && (dbopts->open_flags & (APK_OPENF_NO_REPOS|APK_OPENF_NO_INSTALLED)) == 0)
+ if (apk_db_cache_active(db) && (ac->open_flags & (APK_OPENF_NO_REPOS|APK_OPENF_NO_INSTALLED)) == 0)
apk_db_cache_foreach_item(db, mark_in_cache);
db->open_complete = 1;
if (db->compat_newfeatures) {
- apk_warning("This apk-tools is OLD! Some packages %s.",
- db->compat_notinstallable ?
- "are not installable" :
- "might not function properly");
+ apk_warn(out,
+ "This apk-tools is OLD! Some packages %s.",
+ db->compat_notinstallable ? "are not installable" : "might not function properly");
}
return 0;
@@ -1732,7 +1731,7 @@ ret_errno:
r = -errno;
ret_r:
if (msg != NULL)
- apk_error("%s: %s", msg, strerror(-r));
+ apk_err(out, "%s: %s", msg, strerror(-r));
apk_db_close(db);
return r;
@@ -1745,14 +1744,15 @@ struct write_ctx {
int apk_db_write_config(struct apk_database *db)
{
+ struct apk_out *out = &db->ctx->out;
struct apk_ostream *os;
int r;
- if ((db->flags & APK_SIMULATE) || db->root == NULL)
+ if ((db->ctx->flags & APK_SIMULATE) || db->ctx->root == NULL)
return 0;
if (db->lock_fd == 0) {
- apk_error("Refusing to write db without write lock!");
+ apk_err(out, "Refusing to write db without write lock!");
return -1;
}
@@ -1837,16 +1837,10 @@ void apk_db_close(struct apk_database *db)
adb_trust_free(&db->trust);
- if (db->keys_fd)
- close(db->keys_fd);
- if (db->cache_fd)
- close(db->cache_fd);
- if (db->root_fd)
- close(db->root_fd);
- if (db->lock_fd)
- close(db->lock_fd);
- if (db->root != NULL)
- free(db->root);
+ if (db->keys_fd) close(db->keys_fd);
+ if (db->cache_fd) close(db->cache_fd);
+ if (db->root_fd) close(db->root_fd);
+ if (db->lock_fd) close(db->lock_fd);
}
int apk_db_get_tag_id(struct apk_database *db, apk_blob_t tag)
@@ -1927,6 +1921,7 @@ int apk_db_fire_triggers(struct apk_database *db)
int apk_db_run_script(struct apk_database *db, char *fn, char **argv)
{
+ struct apk_out *out = &db->ctx->out;
int status;
pid_t pid;
static char * const environment[] = {
@@ -1936,7 +1931,7 @@ int apk_db_run_script(struct apk_database *db, char *fn, char **argv)
pid = fork();
if (pid == -1) {
- apk_error("%s: fork: %s", basename(fn), strerror(errno));
+ apk_err(out, "%s: fork: %s", basename(fn), strerror(errno));
return -2;
}
if (pid == 0) {
@@ -1947,7 +1942,7 @@ int apk_db_run_script(struct apk_database *db, char *fn, char **argv)
}
waitpid(pid, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
- apk_error("%s: script exited with error %d", basename(fn), WEXITSTATUS(status));
+ apk_err(out, "%s: script exited with error %d", basename(fn), WEXITSTATUS(status));
return -1;
}
return 0;
@@ -1998,7 +1993,7 @@ void apk_db_update_directory_permissions(struct apk_database *db)
int apk_db_cache_active(struct apk_database *db)
{
- return db->cache_dir != apk_static_cache_dir;
+ return db->ctx->cache_dir != apk_static_cache_dir;
}
struct foreach_cache_item_ctx {
@@ -2052,10 +2047,11 @@ int apk_db_permanent(struct apk_database *db)
int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *world)
{
+ struct apk_out *out = &db->ctx->out;
struct apk_dependency *dep;
int bad = 0, tag;
- if (db->force & APK_FORCE_BROKEN_WORLD)
+ if (db->ctx->force & APK_FORCE_BROKEN_WORLD)
return 0;
foreach_array_item(dep, world) {
@@ -2064,8 +2060,8 @@ int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *wor
continue;
if (tag < 0)
tag = 0;
- apk_warning("The repository tag for world dependency '%s" BLOB_FMT "' does not exist",
- dep->name->name, BLOB_PRINTF(db->repo_tags[tag].tag));
+ apk_warn(out, "The repository tag for world dependency '%s" BLOB_FMT "' does not exist",
+ dep->name->name, BLOB_PRINTF(db->repo_tags[tag].tag));
bad++;
}
@@ -2138,14 +2134,15 @@ struct apk_repository *apk_db_select_repo(struct apk_database *db,
static int apk_repository_update(struct apk_database *db, struct apk_repository *repo)
{
+ struct apk_out *out = &db->ctx->out;
struct apk_url_print urlp;
- int r, verify = (db->flags & APK_ALLOW_UNTRUSTED) ? APK_SIGN_NONE : APK_SIGN_VERIFY;
+ int r, verify = (db->ctx->flags & APK_ALLOW_UNTRUSTED) ? APK_SIGN_NONE : APK_SIGN_VERIFY;
r = apk_cache_download(db, repo, NULL, verify, 1, NULL, NULL);
if (r == -EALREADY) return 0;
if (r != 0) {
apk_url_parse(&urlp, repo->url);
- apk_error(URL_FMT ": %s", URL_PRINTF(urlp), apk_error_str(r));
+ apk_err(out, URL_FMT ": %s", URL_PRINTF(urlp), apk_error_str(r));
db->repo_update_errors++;
} else {
db->repo_update_counter++;
@@ -2196,7 +2193,7 @@ static int load_index(struct apk_database *db, struct apk_istream *is,
ctx.db = db;
ctx.repo = repo;
ctx.found = 0;
- apk_sign_ctx_init(&ctx.sctx, APK_SIGN_VERIFY, NULL, db->keys_fd, db->flags & APK_ALLOW_UNTRUSTED);
+ apk_sign_ctx_init(&ctx.sctx, APK_SIGN_VERIFY, NULL, db->keys_fd, db->ctx->flags & APK_ALLOW_UNTRUSTED);
r = apk_tar_parse(apk_istream_gunzip_mpart(is, apk_sign_ctx_mpart_cb, &ctx.sctx), load_apkindex, &ctx, &db->id_cache);
apk_sign_ctx_free(&ctx.sctx);
@@ -2221,6 +2218,7 @@ int apk_db_index_read_file(struct apk_database *db, const char *file, int repo)
int apk_db_add_repository(apk_database_t _db, apk_blob_t _repository)
{
struct apk_database *db = _db.db;
+ struct apk_out *out = &db->ctx->out;
struct apk_repository *repo;
struct apk_url_print urlp;
apk_blob_t brepo, btag;
@@ -2262,11 +2260,11 @@ int apk_db_add_repository(apk_database_t _db, apk_blob_t _repository)
apk_blob_checksum(brepo, apk_checksum_default(), &repo->csum);
if (apk_url_local_file(repo->url) == NULL) {
- if (!(db->flags & APK_NO_NETWORK))
+ if (!(db->ctx->flags & APK_NO_NETWORK))
db->available_repos |= BIT(repo_num);
- if (db->flags & APK_NO_CACHE) {
+ if (db->ctx->flags & APK_NO_CACHE) {
r = apk_repo_format_real_url(db->arch, repo, NULL, buf, sizeof(buf), &urlp);
- if (r == 0) apk_message("fetch " URL_FMT, URL_PRINTF(urlp));
+ if (r == 0) apk_msg(out, "fetch " URL_FMT, URL_PRINTF(urlp));
} else {
if (db->autoupdate) apk_repository_update(db, repo);
r = apk_repo_format_cache_index(APK_BLOB_BUF(buf), repo);
@@ -2282,7 +2280,7 @@ int apk_db_add_repository(apk_database_t _db, apk_blob_t _repository)
if (r != 0) {
apk_url_parse(&urlp, repo->url);
- apk_warning("Ignoring " URL_FMT ": %s", URL_PRINTF(urlp), apk_error_str(r));
+ apk_warn(out, "Ignoring " URL_FMT ": %s", URL_PRINTF(urlp), apk_error_str(r));
db->available_repos &= ~BIT(repo_num);
r = 0;
} else {
@@ -2394,6 +2392,7 @@ static int apk_db_install_archive_entry(void *_ctx,
static const char dot1[] = "/./", dot2[] = "/../";
struct install_ctx *ctx = (struct install_ctx *) _ctx;
struct apk_database *db = ctx->db;
+ struct apk_out *out = &db->ctx->out;
struct apk_package *pkg = ctx->pkg, *opkg;
struct apk_dependency *dep;
struct apk_installed_package *ipkg = pkg->ipkg;
@@ -2437,8 +2436,8 @@ static int apk_db_install_archive_entry(void *_ctx,
strncmp(ae->name, &dot1[1], 2) == 0 ||
strncmp(ae->name, &dot2[1], 3) == 0 ||
strstr(ae->name, dot1) || strstr(ae->name, dot2)) {
- apk_warning(PKG_VER_FMT": ignoring malicious file %s",
- PKG_VER_PRINTF(pkg), ae->name);
+ apk_warn(out, PKG_VER_FMT": ignoring malicious file %s",
+ PKG_VER_PRINTF(pkg), ae->name);
ipkg->broken_files = 1;
return 0;
}
@@ -2458,8 +2457,8 @@ static int apk_db_install_archive_entry(void *_ctx,
diri = ctx->diri = find_diri(ipkg, bdir, diri, &ctx->file_diri_node);
if (diri == NULL) {
if (!APK_BLOB_IS_NULL(bdir)) {
- apk_error(PKG_VER_FMT": "BLOB_FMT": no dirent in archive",
- PKG_VER_PRINTF(pkg), BLOB_PRINTF(name));
+ apk_err(out, PKG_VER_FMT": "BLOB_FMT": no dirent in archive",
+ PKG_VER_PRINTF(pkg), BLOB_PRINTF(name));
ipkg->broken_files = 1;
return 0;
}
@@ -2493,8 +2492,8 @@ static int apk_db_install_archive_entry(void *_ctx,
} while (0);
if (!link_target_file) {
- apk_error(PKG_VER_FMT": "BLOB_FMT": no hard link target (%s) in archive",
- PKG_VER_PRINTF(pkg), BLOB_PRINTF(name), ae->link_target);
+ apk_err(out, PKG_VER_FMT": "BLOB_FMT": no hard link target (%s) in archive",
+ PKG_VER_PRINTF(pkg), BLOB_PRINTF(name), ae->link_target);
ipkg->broken_files = 1;
return 0;
}
@@ -2539,14 +2538,14 @@ static int apk_db_install_archive_entry(void *_ctx,
if (pkg_prio >= 0)
break;
- if (!(db->force & APK_FORCE_OVERWRITE)) {
- apk_error(PKG_VER_FMT": trying to overwrite %s owned by "PKG_VER_FMT".",
- PKG_VER_PRINTF(pkg), ae->name, PKG_VER_PRINTF(opkg));
+ if (!(db->ctx->force & APK_FORCE_OVERWRITE)) {
+ apk_err(out, PKG_VER_FMT": trying to overwrite %s owned by "PKG_VER_FMT".",
+ PKG_VER_PRINTF(pkg), ae->name, PKG_VER_PRINTF(opkg));
ipkg->broken_files = 1;
return 0;
}
- apk_warning(PKG_VER_FMT": overwriting %s owned by "PKG_VER_FMT".",
- PKG_VER_PRINTF(pkg), ae->name, PKG_VER_PRINTF(opkg));
+ apk_warn(out, PKG_VER_FMT": overwriting %s owned by "PKG_VER_FMT".",
+ PKG_VER_PRINTF(pkg), ae->name, PKG_VER_PRINTF(opkg));
} while (0);
}
@@ -2555,8 +2554,7 @@ static int apk_db_install_archive_entry(void *_ctx,
file = apk_db_file_new(diri, bfile, &ctx->file_diri_node);
}
- if (apk_verbosity >= 3)
- apk_message("%s", ae->name);
+ apk_dbg2(out, "%s", ae->name);
/* Extract the file with temporary name */
file->acl = apk_db_acl_atomize(db, ae->mode, ae->uid, ae->gid, &ae->xattr_csum);
@@ -2564,7 +2562,7 @@ static int apk_db_install_archive_entry(void *_ctx,
db->root_fd, ae,
format_tmpname(pkg, file, tmpname_file),
format_tmpname(pkg, link_target_file, tmpname_link_target),
- is, extract_cb, ctx, db->extract_flags);
+ is, extract_cb, ctx, db->extract_flags, out);
switch (r) {
case 0:
@@ -2575,9 +2573,10 @@ static int apk_db_install_archive_entry(void *_ctx,
memcpy(&file->csum, &ae->csum, sizeof file->csum);
/* only warn once per package */
if (file->csum.type == APK_CHECKSUM_NONE && !ctx->missing_checksum) {
- apk_warning(PKG_VER_FMT": support for packages without embedded "
- "checksums will be dropped in apk-tools 3.",
- PKG_VER_PRINTF(pkg));
+ apk_warn(out,
+ PKG_VER_FMT": support for packages without embedded "
+ "checksums will be dropped in apk-tools 3.",
+ PKG_VER_PRINTF(pkg));
ipkg->broken_files = 1;
ctx->missing_checksum = 1;
}
@@ -2592,8 +2591,7 @@ static int apk_db_install_archive_entry(void *_ctx,
break;
}
} else {
- if (apk_verbosity >= 3)
- apk_message("%s (dir)", ae->name);
+ apk_dbg2(out, "%s (dir)", ae->name);
if (name.ptr[name.len-1] == '/')
name.len--;
@@ -2614,6 +2612,7 @@ static void apk_db_purge_pkg(struct apk_database *db,
struct apk_installed_package *ipkg,
int is_installed)
{
+ struct apk_out *out = &db->ctx->out;
struct apk_db_dir_instance *diri;
struct apk_db_file *file;
struct apk_db_file_hash_key key;
@@ -2637,13 +2636,12 @@ static void apk_db_purge_pkg(struct apk_database *db,
};
hash = apk_blob_hash_seed(key.filename, diri->dir->hash);
if ((diri->dir->protect_mode == APK_PROTECT_NONE) ||
- (db->flags & APK_PURGE) ||
+ (db->ctx->flags & APK_PURGE) ||
(file->csum.type != APK_CHECKSUM_NONE &&
apk_fileinfo_get(db->root_fd, name, APK_FI_NOFOLLOW | file->csum.type, &fi, &db->atoms) == 0 &&
apk_checksum_compare(&file->csum, &fi.csum) == 0))
unlinkat(db->root_fd, name, 0);
- if (apk_verbosity >= 3)
- apk_message("%s", name);
+ apk_dbg2(out, "%s", name);
__hlist_del(fc, &diri->owned_files.first);
if (is_installed) {
apk_hash_delete_hashed(&db->installed.files, APK_BLOB_BUF(&key), hash);
@@ -2659,6 +2657,7 @@ static void apk_db_purge_pkg(struct apk_database *db,
static void apk_db_migrate_files(struct apk_database *db,
struct apk_installed_package *ipkg)
{
+ struct apk_out *out = &db->ctx->out;
struct apk_db_dir_instance *diri;
struct apk_db_dir *dir;
struct apk_db_file *file, *ofile;
@@ -2715,7 +2714,7 @@ static void apk_db_migrate_files(struct apk_database *db,
apk_fileinfo_get(db->root_fd, name,
APK_FI_NOFOLLOW | file->csum.type,
&fi, &db->atoms);
- if ((db->flags & APK_CLEAN_PROTECTED) ||
+ if ((db->ctx->flags & APK_CLEAN_PROTECTED) ||
(file->csum.type != APK_CHECKSUM_NONE &&
apk_checksum_compare(&file->csum, &fi.csum) == 0)) {
unlinkat(db->root_fd, tmpname, 0);
@@ -2725,9 +2724,9 @@ static void apk_db_migrate_files(struct apk_database *db,
DIR_FILE_PRINTF(diri->dir, file));
if (renameat(db->root_fd, tmpname,
db->root_fd, name) != 0) {
- apk_error(PKG_VER_FMT": failed to rename %s to %s.",
- PKG_VER_PRINTF(ipkg->pkg),
- tmpname, name);
+ apk_err(out, PKG_VER_FMT": failed to rename %s to %s.",
+ PKG_VER_PRINTF(ipkg->pkg),
+ tmpname, name);
ipkg->broken_files = 1;
}
}
@@ -2736,8 +2735,8 @@ static void apk_db_migrate_files(struct apk_database *db,
/* Overwrite the old file */
if (renameat(db->root_fd, tmpname,
db->root_fd, name) != 0) {
- apk_error(PKG_VER_FMT": failed to rename %s to %s.",
- PKG_VER_PRINTF(ipkg->pkg), tmpname, name);
+ apk_err(out, PKG_VER_FMT": failed to rename %s to %s.",
+ PKG_VER_PRINTF(ipkg->pkg), tmpname, name);
ipkg->broken_files = 1;
}
}
@@ -2763,6 +2762,7 @@ static int apk_db_unpack_pkg(struct apk_database *db,
int upgrade, apk_progress_cb cb, void *cb_ctx,
char **script_args)
{
+ struct apk_out *out = &db->ctx->out;
struct install_ctx ctx;
struct apk_istream *is = NULL, *cache_is;
struct apk_repository *repo;
@@ -2807,8 +2807,8 @@ static int apk_db_unpack_pkg(struct apk_database *db,
if (!IS_ERR_OR_NULL(cache_is))
is = cache_is;
else
- apk_warning(PKG_VER_FMT": unable to cache: %s",
- PKG_VER_PRINTF(pkg), apk_error_str(errno));
+ apk_warn(out, PKG_VER_FMT": unable to cache: %s",
+ PKG_VER_PRINTF(pkg), apk_error_str(errno));
}
ctx = (struct install_ctx) {
@@ -2821,7 +2821,7 @@ static int apk_db_unpack_pkg(struct apk_database *db,
.cb = cb,
.cb_ctx = cb_ctx,
};
- apk_sign_ctx_init(&ctx.sctx, APK_SIGN_VERIFY_IDENTITY, &pkg->csum, db->keys_fd, db->flags & APK_ALLOW_UNTRUSTED);
+ apk_sign_ctx_init(&ctx.sctx, APK_SIGN_VERIFY_IDENTITY, &pkg->csum, db->keys_fd, db->ctx->flags & APK_ALLOW_UNTRUSTED);
r = apk_tar_parse(apk_istream_gunzip_mpart(is, apk_sign_ctx_mpart_cb, &ctx.sctx), apk_db_install_archive_entry, &ctx, &db->id_cache);
apk_sign_ctx_free(&ctx.sctx);
@@ -2839,7 +2839,7 @@ static int apk_db_unpack_pkg(struct apk_database *db,
apk_db_run_pending_script(&ctx);
return 0;
err_msg:
- apk_error(PKG_VER_FMT": %s", PKG_VER_PRINTF(pkg), apk_error_str(r));
+ apk_err(out, PKG_VER_FMT": %s", PKG_VER_PRINTF(pkg), apk_error_str(r));
return r;
}