Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=36e46fc5c5f7245acb4b9fb71c09ebe925d22952
commit 36e46fc5c5f7245acb4b9fb71c09ebe925d22952 Author: Michel Hermier <herm...@frugalware.org> Date: Sat Nov 9 23:09:48 2013 +0100 libpacman: Split out _pacman_db_readpkg of _pacman_db_scan. diff --git a/lib/libpacman/be_files.c b/lib/libpacman/be_files.c index bc78a84..dfcb8ac 100644 --- a/lib/libpacman/be_files.c +++ b/lib/libpacman/be_files.c @@ -60,6 +60,69 @@ static inline int islocal(pmdb_t *db) return strcmp(db->treename, "local") == 0; } +pmpkg_t *_pacman_db_readpkg(pmdb_t *db, unsigned int inforeq) +{ + struct dirent *ent = NULL; + struct stat sbuf; + char path[PATH_MAX]; + pmpkg_t *pkg; + struct archive_entry *entry = NULL; + int isdir = 0; + + ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL)); + + while(!isdir) { + if (islocal(db)) { + ent = readdir(db->handle); + if(ent == NULL) { + return(NULL); + } + if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { + isdir = 0; + continue; + } + /* stat the entry, make sure it's a directory */ + snprintf(path, PATH_MAX, "%s/%s", db->path, ent->d_name); + if(!stat(path, &sbuf) && S_ISDIR(sbuf.st_mode)) { + isdir = 1; + } + } else { + if (!db->handle) + _pacman_db_rewind(db); + if (!db->handle || archive_read_next_header(db->handle, &entry) != ARCHIVE_OK) { + return NULL; + } + // make sure it's a directory + const char *pathname = archive_entry_pathname(entry); + if (pathname[strlen(pathname)-1] == '/') + isdir = 1; + } + } + + pkg = _pacman_pkg_new(NULL, NULL); + if(pkg == NULL) { + return(NULL); + } + char *dname; + if (islocal(db)) { + dname = strdup(ent->d_name); + } else { + dname = strdup(archive_entry_pathname(entry)); + dname[strlen(dname)-1] = '\0'; // drop trailing slash + } + if(_pacman_pkg_splitname(dname, pkg->name, pkg->version, 0) == -1) { + _pacman_log(PM_LOG_ERROR, _("invalid name for dabatase entry '%s'"), dname); + FREE(dname); + return(NULL); + } + FREE(dname); + if(_pacman_db_read(db, inforeq, pkg) == -1) { + FREEPKG(pkg); + } + + return(pkg); +} + pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, unsigned int inforeq) { struct dirent *ent = NULL; @@ -69,14 +132,9 @@ pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, unsigned int inforeq) char *ptr = NULL; int found = 0; pmpkg_t *pkg; - - char dbpath[PATH_MAX]; - snprintf(dbpath, PATH_MAX, "%s" PM_EXT_DB, db->path); struct archive_entry *entry = NULL; - if(db == NULL) { - RET_ERR(PM_ERR_DB_NULL, NULL); - } + ASSERT(db != NULL, RET_ERR(PM_ERR_DB_NULL, NULL)); if(target != NULL) { // Search from start @@ -130,35 +188,7 @@ pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, unsigned int inforeq) return(NULL); } } else { - /* normal iteration */ - int isdir = 0; - while(!isdir) { - if (islocal(db)) { - ent = readdir(db->handle); - if(ent == NULL) { - return(NULL); - } - if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { - isdir = 0; - continue; - } - /* stat the entry, make sure it's a directory */ - snprintf(path, PATH_MAX, "%s/%s", db->path, ent->d_name); - if(!stat(path, &sbuf) && S_ISDIR(sbuf.st_mode)) { - isdir = 1; - } - } else { - if (!db->handle) - _pacman_db_rewind(db); - if (!db->handle || archive_read_next_header(db->handle, &entry) != ARCHIVE_OK) { - return NULL; - } - // make sure it's a directory - const char *pathname = archive_entry_pathname(entry); - if (pathname[strlen(pathname)-1] == '/') - isdir = 1; - } - } + return _pacman_db_readpkg(db, inforeq); } pkg = _pacman_pkg_new(NULL, NULL); diff --git a/lib/libpacman/cache.c b/lib/libpacman/cache.c index cb192c6..5f4ff65 100644 --- a/lib/libpacman/cache.c +++ b/lib/libpacman/cache.c @@ -64,7 +64,7 @@ int _pacman_db_load_pkgcache(pmdb_t *db) inforeq, db->treename); _pacman_db_rewind(db); - while((info = _pacman_db_scan(db, NULL, inforeq)) != NULL) { + while((info = _pacman_db_readpkg(db, inforeq)) != NULL) { info->origin = PKG_FROM_CACHE; info->data = db; /* add to the collective */ diff --git a/lib/libpacman/db.h b/lib/libpacman/db.h index 36fb991..57b10d3 100644 --- a/lib/libpacman/db.h +++ b/lib/libpacman/db.h @@ -74,6 +74,7 @@ pmlist_t *_pacman_db_test(pmdb_t *db); int _pacman_db_open(pmdb_t *db); int _pacman_db_close(pmdb_t *db); int _pacman_db_rewind(pmdb_t *db); +pmpkg_t *_pacman_db_readpkg(pmdb_t *db, unsigned int inforeq); pmpkg_t *_pacman_db_scan(pmdb_t *db, const char *target, unsigned int inforeq); int _pacman_db_read(pmdb_t *db, unsigned int inforeq, pmpkg_t *info); int _pacman_db_write(pmdb_t *db, pmpkg_t *info, unsigned int inforeq); _______________________________________________ Frugalware-git mailing list Frugalware-git@frugalware.org http://frugalware.org/mailman/listinfo/frugalware-git