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,36 +129,100 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db) return 0; } -/** Set the serverlist of a database. */ -int SYMEXPORT alpm_db_setserver(pmdb_t *db, const char *url) +/** Get the serverlist of a database. */ +alpm_list_t SYMEXPORT *alpm_db_get_servers(const pmdb_t *db) { - char *newurl; - size_t len = 0; + 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_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(url) { - len = strlen(url); + 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'; } - 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->treename, newurl); - } else { - FREELIST(db->servers); - _alpm_log(PM_LOG_DEBUG, "serverlist flushed for '%s'\n", db->treename); + 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; + + 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_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); + free(vdata); + return 0; + } + + return 1; +} /** Set the verify gpg signature option for a database. * @param db database pointer * @param verify enum pgp_verify_t 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());