diff options
-rw-r--r-- | lib/libalpm/db.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 760a2fde..47cdec8c 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -105,7 +105,7 @@ int db_update(char *root, char *dbpath, char *treename, char *archive) /* remove the old dir */ /* ORE - do we want to include alpm.h and use the log mechanism from db.c? _alpm_log(PM_LOG_FLOW2, "removing %s (if it exists)\n", ldir);*/ - /* ORE + /* ORE We should only rmrf the database content, and not the top directory, in case a (DIR *) structure is associated with it (i.e a call to db_open). */ _alpm_rmrf(ldir); @@ -141,6 +141,8 @@ void db_rewind(pmdb_t *db) pmpkg_t *db_scan(pmdb_t *db, char *target, unsigned int inforeq) { struct dirent *ent = NULL; + struct stat sbuf; + char path[PATH_MAX]; char name[256]; char *ptr = NULL; int ret, found = 0; @@ -158,6 +160,11 @@ pmpkg_t *db_scan(pmdb_t *db, char *target, unsigned int inforeq) continue; } strncpy(name, ent->d_name, 255); + /* stat the entry, make sure it's a directory */ + snprintf(path, PATH_MAX, "%s/%s", db->path, name); + if(stat(path, &sbuf) || !S_ISDIR(sbuf.st_mode)) { + continue; + } /* truncate the string at the second-to-last hyphen, */ /* which will give us the package name */ if((ptr = rindex(name, '-'))) { @@ -175,20 +182,20 @@ pmpkg_t *db_scan(pmdb_t *db, char *target, unsigned int inforeq) } } else { /* normal iteration */ - ent = readdir(db->dir); - if(ent == NULL) { - return(NULL); - } - if(!strcmp(ent->d_name, ".")) { + int isdir = 0; + while(!isdir) { ent = readdir(db->dir); if(ent == NULL) { return(NULL); } - } - if(!strcmp(ent->d_name, "..")) { - ent = readdir(db->dir); - if(ent == NULL) { - return(NULL); + /* 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; + } + if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { + isdir = 0; + continue; } } } @@ -669,7 +676,7 @@ PMList *db_find_conflicts(pmdb_t *db, PMList *targets, char *root) } if(!ok) { MALLOC(str, 512); - snprintf(str, 512, "%s: exists in filesystem", path); + snprintf(str, 512, "%s: %s: exists in filesystem", p->name, path); conflicts = pm_list_add(conflicts, str); } } |