summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2010-10-18 16:39:04 -0500
committerDan McGee <dan@archlinux.org>2011-05-05 12:31:09 -0500
commit42ab639bf715cbacb3598b6c42388ba4bbb2d3d4 (patch)
treefc3d55133ca0733ff9c3adf83a50265d90a5ab43
parent3045f09ef49d775fec5e772f5f8b894e31388fbf (diff)
downloadpacman-42ab639bf715cbacb3598b6c42388ba4bbb2d3d4.tar.xz
Improve database server API
Currently we have one call that has all sorts of crazy behavior and doesn't make a whole lot of sense. Go from one method to the normal four methods we have for all of our other lists we use in the library to make it a lot easier for a frontend to manipulate server lists. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/alpm.h15
-rw-r--r--lib/libalpm/db.c96
-rw-r--r--src/pacman/conf.c2
3 files changed, 89 insertions, 24 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index c4f6cc0f..5af843c4 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -174,7 +174,7 @@ const char *alpm_option_get_dbpath(void);
/** Sets the path to the database directory. */
int alpm_option_set_dbpath(const char *dbpath);
-/** @name Accessors to the list of package cache directories
+/** @name Accessors to the list of package cache directories.
* @{
*/
alpm_list_t *alpm_option_get_cachedirs(void);
@@ -317,13 +317,14 @@ const char *alpm_db_get_name(const pmdb_t *db);
*/
const char *alpm_db_get_url(const pmdb_t *db);
-/** Add a new server for a database.
- * An empty string or NULL can be passed to empty the current server list.
- * @param db database pointer
- * @param url url of the server
- * @return 0 on success, -1 on error (pm_errno is set accordingly)
+/** @name Accessors to the list of servers for a database.
+ * @{
*/
-int alpm_db_setserver(pmdb_t *db, const char *url);
+alpm_list_t *alpm_db_get_servers(const pmdb_t *db);
+int alpm_db_set_servers(pmdb_t *db, alpm_list_t *servers);
+int alpm_db_add_server(pmdb_t *db, const char *url);
+int alpm_db_remove_server(pmdb_t *db, const char *url);
+/** @} */
int alpm_db_update(int level, pmdb_t *db);
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index 3d593b36..31336144 100644
--- a/lib/libalpm/db.c
+++ b/lib/libalpm/db.c
@@ -129,35 +129,99 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db)
return 0;
}
+/** Get the serverlist of a database. */
+alpm_list_t SYMEXPORT *alpm_db_get_servers(const pmdb_t *db)
+{
+ ALPM_LOG_FUNC;
+
+ /* Sanity checks */
+ ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL));
+
+ return(db->servers);
+}
+
/** Set the serverlist of a database. */
-int SYMEXPORT alpm_db_setserver(pmdb_t *db, const char *url)
+int SYMEXPORT alpm_db_set_servers(pmdb_t *db, alpm_list_t *servers)
+{
+ ALPM_LOG_FUNC;
+
+ /* Sanity checks */
+ ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
+
+ if(db->servers) FREELIST(db->servers);
+ db->servers = servers;
+ return 0;
+}
+
+static char *sanitize_url(const char *url)
+{
+ char *newurl;
+ size_t len = strlen(url);
+
+ STRDUP(newurl, url, RET_ERR(PM_ERR_MEMORY, NULL));
+ /* strip the trailing slash if one exists */
+ if(newurl[len - 1] == '/') {
+ newurl[len - 1] = '\0';
+ }
+ return newurl;
+}
+
+/** Add a download server to a database.
+ * @param db database pointer
+ * @param url url of the server
+ * @return 0 on success, -1 on error (pm_errno is set accordingly)
+ */
+int SYMEXPORT alpm_db_add_server(pmdb_t *db, const char *url)
{
char *newurl;
- size_t len = 0;
ALPM_LOG_FUNC;
/* Sanity checks */
ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
+ ASSERT(url != NULL && strlen(url) != 0, RET_ERR(PM_ERR_WRONG_ARGS, -1));
- if(url) {
- len = strlen(url);
+ newurl = sanitize_url(url);
+ if(!newurl) {
+ return -1;
}
- if(len) {
- newurl = strdup(url);
- /* strip the trailing slash if one exists */
- if(newurl[len - 1] == '/') {
- newurl[len - 1] = '\0';
- }
- db->servers = alpm_list_add(db->servers, newurl);
- _alpm_log(PM_LOG_DEBUG, "adding new server URL to database '%s': %s\n",
+ db->servers = alpm_list_add(db->servers, newurl);
+ _alpm_log(PM_LOG_DEBUG, "adding new server URL to database '%s': %s\n",
+ db->treename, newurl);
+
+ return 0;
+}
+
+/** Remove a download server from a database.
+ * @param db database pointer
+ * @param url url of the server
+ * @return 0 on success, 1 on server not present,
+ * -1 on error (pm_errno is set accordingly)
+ */
+int SYMEXPORT alpm_db_remove_server(pmdb_t *db, const char *url)
+{
+ char *newurl, *vdata = NULL;
+
+ ALPM_LOG_FUNC;
+
+ /* Sanity checks */
+ ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1));
+ ASSERT(url != NULL && strlen(url) != 0, RET_ERR(PM_ERR_WRONG_ARGS, -1));
+
+ newurl = sanitize_url(url);
+ if(!newurl) {
+ return -1;
+ }
+ db->servers = alpm_list_remove_str(db->servers, newurl, &vdata);
+ free(newurl);
+ if(vdata) {
+ _alpm_log(PM_LOG_DEBUG, "removed server URL from database '%s': %s\n",
db->treename, newurl);
- } else {
- FREELIST(db->servers);
- _alpm_log(PM_LOG_DEBUG, "serverlist flushed for '%s'\n", db->treename);
+ free(vdata);
+ return 0;
}
- return 0;
+ return 1;
}
/** Set the verify gpg signature option for a database.
* @param db database pointer
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 2ce73b64..4302ad95 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -387,7 +387,7 @@ static int _add_mirror(pmdb_t *db, char *value)
server = temp;
}
- if(alpm_db_setserver(db, server) != 0) {
+ if(alpm_db_add_server(db, server) != 0) {
/* pm_errno is set by alpm_db_setserver */
pm_printf(PM_LOG_ERROR, _("could not add server URL to database '%s': %s (%s)\n"),
dbname, server, alpm_strerrorlast());