summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2013-11-30 20:45:02 -0500
committerAllan McRae <allan@archlinux.org>2013-12-15 20:09:37 +1000
commit841c60f2b396c3b59c7d673dc39dacc3ccbf5658 (patch)
tree77bbf8b0903be74995146533a2d6e0a288c6cc6d
parent76a05e94c19922ee27a9c3b751ec3836c13a1bab (diff)
db.c: require unique database names
Allowing multiple databases with the same name causes conflicts as they both point to the same database file but may use different servers, usages, or siglevels. Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r--doc/pacman.conf.5.txt9
-rw-r--r--lib/libalpm/db.c13
2 files changed, 18 insertions, 4 deletions
diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index 8cd2d0ea..9c3dffe3 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -202,10 +202,11 @@ Repository Sections
-------------------
Each repository section defines a section name and at least one location where
the packages can be found. The section name is defined by the string within
-square brackets (the two above are 'current' and 'custom'). Locations are
-defined with the 'Server' directive and follow a URL naming structure. If you
-want to use a local directory, you can specify the full path with a ``file://''
-prefix, as shown above.
+square brackets (the two above are 'core' and 'custom'). Repository names
+must be unique and the name 'local' is reserved for the database of installed
+packages. Locations are defined with the 'Server' directive and follow a URL
+naming structure. If you want to use a local directory, you can specify the
+full path with a ``file://'' prefix, as shown above.
A common way to define DB locations utilizes the 'Include' directive. For each
repository defined in the configuration file, a single 'Include' directive can
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index 528b04bb..2069a7b5 100644
--- a/lib/libalpm/db.c
+++ b/lib/libalpm/db.c
@@ -46,6 +46,8 @@
alpm_db_t SYMEXPORT *alpm_register_syncdb(alpm_handle_t *handle,
const char *treename, alpm_siglevel_t level)
{
+ alpm_list_t *i;
+
/* Sanity checks */
CHECK_HANDLE(handle, return NULL);
ASSERT(treename != NULL && strlen(treename) != 0,
@@ -53,6 +55,17 @@ alpm_db_t SYMEXPORT *alpm_register_syncdb(alpm_handle_t *handle,
/* Do not register a database if a transaction is on-going */
ASSERT(handle->trans == NULL, RET_ERR(handle, ALPM_ERR_TRANS_NOT_NULL, NULL));
+ /* ensure database name is unique */
+ if(strcmp(treename, "local") == 0) {
+ RET_ERR(handle, ALPM_ERR_DB_NOT_NULL, NULL);
+ }
+ for(i = handle->dbs_sync; i; i = i->next) {
+ alpm_db_t *d = i->data;
+ if(strcmp(treename, d->treename) == 0) {
+ RET_ERR(handle, ALPM_ERR_DB_NOT_NULL, NULL);
+ }
+ }
+
return _alpm_db_register_sync(handle, treename, level);
}