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: 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 file 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;
 
-- 
cgit v1.2.3-70-g09d2