diff options
Diffstat (limited to 'main/apk-tools/0003-db-command-line-repositories-take-preference.patch')
-rw-r--r-- | main/apk-tools/0003-db-command-line-repositories-take-preference.patch | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/main/apk-tools/0003-db-command-line-repositories-take-preference.patch b/main/apk-tools/0003-db-command-line-repositories-take-preference.patch new file mode 100644 index 0000000000..1f1786c35a --- /dev/null +++ b/main/apk-tools/0003-db-command-line-repositories-take-preference.patch @@ -0,0 +1,194 @@ +From 6f1de8cd530f598f3f79414390d98fd8e683f2af Mon Sep 17 00:00:00 2001 +From: Timo Teras <timo.teras@iki.fi> +Date: Thu, 6 Aug 2009 10:17:28 +0300 +Subject: [PATCH 3/7] db: command line repositories take preference + +over the ones in config file. also remove the apk_root == NULL +check as this cannot happen anymore. a valid root is always +required. +--- + src/database.c | 145 +++++++++++++++++++++++++++----------------------------- + 1 files changed, 70 insertions(+), 75 deletions(-) + +diff --git a/src/database.c b/src/database.c +index 30e0431..834383b 100644 +--- a/src/database.c ++++ b/src/database.c +@@ -895,59 +895,56 @@ int apk_db_open(struct apk_database *db, const char *root, unsigned int flags) + db->cache_dir = apk_static_cache_dir; + db->permanent = 1; + +- if (root != NULL) { +- db->root = strdup(root); +- db->root_fd = openat(AT_FDCWD, db->root, O_RDONLY); +- if (db->root_fd < 0 && (flags & APK_OPENF_CREATE)) { +- mkdirat(AT_FDCWD, db->root, 0755); +- db->root_fd = openat(AT_FDCWD, root, O_RDONLY); +- } +- if (db->root_fd < 0) { +- msg = "Unable to open root"; +- goto ret_errno; +- } +- if (fstat64(db->root_fd, &st) != 0 || major(st.st_dev) == 0) +- db->permanent = 0; +- +- if (fstatat64(db->root_fd, apk_linked_cache_dir, &st, 0) == 0 && +- S_ISDIR(st.st_mode)) +- db->cache_dir = apk_linked_cache_dir; +- +- if (flags & APK_OPENF_WRITE) { ++ db->root = strdup(root); ++ db->root_fd = openat(AT_FDCWD, db->root, O_RDONLY); ++ if (db->root_fd < 0 && (flags & APK_OPENF_CREATE)) { ++ mkdirat(AT_FDCWD, db->root, 0755); ++ db->root_fd = openat(AT_FDCWD, root, O_RDONLY); ++ } ++ if (db->root_fd < 0) { ++ msg = "Unable to open root"; ++ goto ret_errno; ++ } ++ if (fstat64(db->root_fd, &st) != 0 || major(st.st_dev) == 0) ++ db->permanent = 0; ++ ++ if (fstatat64(db->root_fd, apk_linked_cache_dir, &st, 0) == 0 && ++ S_ISDIR(st.st_mode)) ++ db->cache_dir = apk_linked_cache_dir; ++ ++ if (flags & APK_OPENF_WRITE) { ++ db->lock_fd = openat(db->root_fd, "var/lib/apk/lock", ++ O_CREAT | O_RDWR, 0400); ++ if (db->lock_fd < 0 && errno == ENOENT && ++ (flags & APK_OPENF_CREATE)) { ++ r = apk_db_create(db); ++ if (r != 0) { ++ msg = "Unable to create database"; ++ goto ret_r; ++ } + db->lock_fd = openat(db->root_fd, "var/lib/apk/lock", + O_CREAT | O_RDWR, 0400); +- if (db->lock_fd < 0 && errno == ENOENT && +- (flags & APK_OPENF_CREATE)) { +- r = apk_db_create(db); +- if (r != 0) { +- msg = "Unable to create database"; +- goto ret_r; +- } +- db->lock_fd = openat(db->root_fd, +- "var/lib/apk/lock", +- O_CREAT | O_RDWR, 0400); +- } +- if (db->lock_fd < 0 || +- flock(db->lock_fd, LOCK_EX | LOCK_NB) < 0) { +- msg = "Unable to lock database"; +- if (apk_wait) { +- struct sigaction sa, old_sa; +- +- apk_message("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(apk_wait); +- if (flock(db->lock_fd, LOCK_EX) < 0) +- goto ret_errno; +- +- alarm(0); +- sigaction(SIGALRM, &old_sa, NULL); +- } else ++ } ++ if (db->lock_fd < 0 || ++ flock(db->lock_fd, LOCK_EX | LOCK_NB) < 0) { ++ msg = "Unable to lock database"; ++ if (apk_wait) { ++ struct sigaction sa, old_sa; ++ ++ apk_message("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(apk_wait); ++ if (flock(db->lock_fd, LOCK_EX) < 0) + goto ret_errno; +- } ++ ++ alarm(0); ++ sigaction(SIGALRM, &old_sa, NULL); ++ } else ++ goto ret_errno; + } + } + +@@ -959,33 +956,18 @@ int apk_db_open(struct apk_database *db, const char *root, unsigned int flags) + db->cachetmp_fd = openat(db->cache_fd, "tmp", O_RDONLY); + db->keys_fd = openat(db->root_fd, "etc/apk/keys", O_RDONLY); + +- if (root != NULL) { +- r = apk_db_read_state(db, flags); +- if (r == -ENOENT && (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, flags); +- } ++ r = apk_db_read_state(db, flags); ++ if (r == -ENOENT && (flags & APK_OPENF_CREATE)) { ++ r = apk_db_create(db); + if (r != 0) { +- msg = "Unable to read database state"; ++ msg = "Unable to create database"; + goto ret_r; + } +- +- if (!(flags & APK_OPENF_NO_REPOS)) { +- if (apk_repos == NULL) +- apk_repos = "etc/apk/repositories"; +- blob = apk_blob_from_file(db->root_fd, apk_repos); +- if (!APK_BLOB_IS_NULL(blob)) { +- r = apk_blob_for_each_segment( +- blob, "\n", +- apk_db_add_repository, db); +- rr = r ?: rr; +- free(blob.ptr); +- } +- } ++ r = apk_db_read_state(db, flags); ++ } ++ if (r != 0) { ++ msg = "Unable to read database state"; ++ goto ret_r; + } + + if (!(flags & APK_OPENF_NO_REPOS)) { +@@ -993,10 +975,23 @@ int apk_db_open(struct apk_database *db, const char *root, unsigned int flags) + r = apk_db_add_repository(db, APK_BLOB_STR(repo->url)); + rr = r ?: rr; + } +- ++ if (apk_repos == NULL) ++ apk_repos = "etc/apk/repositories"; ++ blob = apk_blob_from_file(db->root_fd, apk_repos); ++ if (!APK_BLOB_IS_NULL(blob)) { ++ r = apk_blob_for_each_segment( ++ blob, "\n", ++ apk_db_add_repository, db); ++ rr = r ?: rr; ++ free(blob.ptr); ++ } + if (apk_flags & APK_UPDATE_CACHE) + apk_db_index_write_nr_cache(db); + } ++ if (rr != 0) { ++ r = rr; ++ goto ret_r; ++ } + + return rr; + +-- +1.6.4 + |