diff options
-rw-r--r-- | lib/libalpm/alpm.h | 6 | ||||
-rw-r--r-- | lib/libalpm/db.c | 117 | ||||
-rw-r--r-- | lib/libalpm/db.h | 3 | ||||
-rw-r--r-- | src/pacman/pacman.c | 10 |
4 files changed, 90 insertions, 46 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 844d9bf2..a3772a05 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -31,6 +31,8 @@ extern "C" { #include <time.h> /* for time_t */ #include <stdarg.h> /* for va_list */ +#define DEPRECATED __attribute__((deprecated)) + /* * Arch Linux Package Management library */ @@ -143,7 +145,9 @@ alpm_list_t *alpm_option_get_syncdbs(); * Databases */ -pmdb_t *alpm_db_register(const char *treename); +/* Preferred interfaces db_register_local and db_register_sync */ +pmdb_t *alpm_db_register_local(void); +pmdb_t *alpm_db_register_sync(const char *treename); int alpm_db_unregister(pmdb_t *db); int alpm_db_unregister_all(void); diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index e79aad89..86165066 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -53,11 +53,11 @@ * @{ */ -/** Register a package database - * @param treename the name of the repository +/** Register a sync database of packages. + * @param treename the name of the sync repository * @return a pmdb_t* on success (the value), NULL on error */ -pmdb_t SYMEXPORT *alpm_db_register(const char *treename) +pmdb_t SYMEXPORT *alpm_db_register_sync(const char *treename) { ALPM_LOG_FUNC; @@ -67,7 +67,22 @@ pmdb_t SYMEXPORT *alpm_db_register(const char *treename) /* Do not register a database if a transaction is on-going */ ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, NULL)); - return(_alpm_db_register(treename)); + return(_alpm_db_register_sync(treename)); +} + +/** Register the local package database. + * @return a pmdb_t* representing the local database, or NULL on error + */ +pmdb_t SYMEXPORT *alpm_db_register_local(void) +{ + ALPM_LOG_FUNC; + + /* Sanity checks */ + ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, NULL)); + /* Do not register a database if a transaction is on-going */ + ASSERT(handle->trans == NULL, RET_ERR(PM_ERR_TRANS_NOT_NULL, NULL)); + + return(_alpm_db_register_local()); } /* Helper function for alpm_db_unregister{_all} */ @@ -161,6 +176,7 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db) */ int SYMEXPORT alpm_db_setserver(pmdb_t *db, const char *url) { + alpm_list_t *i; int found = 0; ALPM_LOG_FUNC; @@ -168,18 +184,11 @@ int SYMEXPORT alpm_db_setserver(pmdb_t *db, const char *url) /* Sanity checks */ ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, -1)); - if(strcmp(db->treename, "local") == 0) { - if(handle->db_local != NULL) { + for(i = handle->dbs_sync; i && !found; i = i->next) { + pmdb_t *sdb = i->data; + if(strcmp(db->treename, sdb->treename) == 0) { found = 1; } - } else { - alpm_list_t *i; - for(i = handle->dbs_sync; i && !found; i = i->next) { - pmdb_t *sdb = i->data; - if(strcmp(db->treename, sdb->treename) == 0) { - found = 1; - } - } } if(!found) { RET_ERR(PM_ERR_DB_NOT_FOUND, -1); @@ -690,7 +699,7 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles) return(ret); } -pmdb_t *_alpm_db_register(const char *treename) +pmdb_t *_alpm_db_register_local(void) { struct stat buf; pmdb_t *db; @@ -699,23 +708,63 @@ pmdb_t *_alpm_db_register(const char *treename) ALPM_LOG_FUNC; - if(strcmp(treename, "local") == 0) { - if(handle->db_local != NULL) { - _alpm_log(PM_LOG_WARNING, _("attempt to re-register the 'local' DB\n")); - RET_ERR(PM_ERR_DB_NOT_NULL, NULL); + if(handle->db_local != NULL) { + _alpm_log(PM_LOG_WARNING, _("attempt to re-register the 'local' DB\n")); + RET_ERR(PM_ERR_DB_NOT_NULL, NULL); + } + + _alpm_log(PM_LOG_DEBUG, "registering local database\n"); + + /* make sure the database directory exists */ + dbpath = alpm_option_get_dbpath(); + if(!dbpath) { + _alpm_log(PM_LOG_WARNING, _("database path is undefined\n")); + RET_ERR(PM_ERR_DB_OPEN, NULL); + } + snprintf(path, PATH_MAX, "%slocal", dbpath); + /* TODO this is rediculous, we try to do this even if we can't */ + if(stat(path, &buf) != 0 || !S_ISDIR(buf.st_mode)) { + _alpm_log(PM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n", + path); + if(_alpm_makepath(path) != 0) { + RET_ERR(PM_ERR_SYSTEM, NULL); } - } else { - alpm_list_t *i; - for(i = handle->dbs_sync; i; i = i->next) { - pmdb_t *sdb = i->data; - if(strcmp(treename, sdb->treename) == 0) { - _alpm_log(PM_LOG_DEBUG, "attempt to re-register the '%s' database, using existing\n", sdb->treename); - return sdb; - } + } + + db = _alpm_db_new(dbpath, "local"); + if(db == NULL) { + RET_ERR(PM_ERR_DB_CREATE, NULL); + } + + _alpm_log(PM_LOG_DEBUG, "opening database '%s'\n", db->treename); + if(_alpm_db_open(db) == -1) { + _alpm_db_free(db); + RET_ERR(PM_ERR_DB_OPEN, NULL); + } + + handle->db_local = db; + return(db); +} + +pmdb_t *_alpm_db_register_sync(const char *treename) +{ + struct stat buf; + pmdb_t *db; + const char *dbpath; + char path[PATH_MAX]; + alpm_list_t *i; + + ALPM_LOG_FUNC; + + for(i = handle->dbs_sync; i; i = i->next) { + pmdb_t *sdb = i->data; + if(strcmp(treename, sdb->treename) == 0) { + _alpm_log(PM_LOG_DEBUG, "attempt to re-register the '%s' database, using existing\n", sdb->treename); + return sdb; } } - - _alpm_log(PM_LOG_DEBUG, "registering database '%s'\n", treename); + + _alpm_log(PM_LOG_DEBUG, "registering sync database '%s'\n", treename); /* make sure the database directory exists */ dbpath = alpm_option_get_dbpath(); @@ -723,7 +772,8 @@ pmdb_t *_alpm_db_register(const char *treename) _alpm_log(PM_LOG_WARNING, _("database path is undefined\n")); RET_ERR(PM_ERR_DB_OPEN, NULL); } - snprintf(path, PATH_MAX, "%s%s", dbpath, treename); + /* all sync DBs now reside in the sync/ subdir of the dbpath */ + snprintf(path, PATH_MAX, "%ssync/%s", dbpath, treename); /* TODO this is rediculous, we try to do this even if we can't */ if(stat(path, &buf) != 0 || !S_ISDIR(buf.st_mode)) { _alpm_log(PM_LOG_DEBUG, "database dir '%s' does not exist, creating it\n", @@ -744,12 +794,7 @@ pmdb_t *_alpm_db_register(const char *treename) RET_ERR(PM_ERR_DB_OPEN, NULL); } - if(strcmp(treename, "local") == 0) { - handle->db_local = db; - } else { - handle->dbs_sync = alpm_list_add(handle->dbs_sync, db); - } - + handle->dbs_sync = alpm_list_add(handle->dbs_sync, db); return(db); } diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h index 2597c8c4..15cc4c4c 100644 --- a/lib/libalpm/db.h +++ b/lib/libalpm/db.h @@ -52,7 +52,8 @@ pmdb_t *_alpm_db_new(const char *dbpath, const char *treename); void _alpm_db_free(pmdb_t *db); int _alpm_db_cmp(const void *db1, const void *db2); alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles); -pmdb_t *_alpm_db_register(const char *treename); +pmdb_t *_alpm_db_register_local(void); +pmdb_t *_alpm_db_register_sync(const char *treename); /* be.c, backend specific calls */ int _alpm_db_install(pmdb_t *db, const char *dbfile); diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index fef6d38e..f62e588b 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -495,15 +495,9 @@ static int _parseconfig(const char *file, const char *givensection, file, linenum); return(1); } - /* a section/database named local is not allowed */ - if(!strcmp(section, "local")) { - pm_printf(PM_LOG_ERROR, _("config file %s, line %d: 'local' cannot be used as section name.\n"), - file, linenum); - return(1); - } /* if we are not looking at the options section, register a db */ if(strcmp(section, "options") != 0) { - db = alpm_db_register(section); + db = alpm_db_register_sync(section); } } else { /* directive */ @@ -815,7 +809,7 @@ int main(int argc, char *argv[]) } /* Opening local database */ - db_local = alpm_db_register("local"); + db_local = alpm_db_register_local(); if(db_local == NULL) { pm_printf(PM_LOG_ERROR, _("could not register 'local' database (%s)\n"), alpm_strerror(pm_errno)); |