When cleaning DBs, only look at directories
FS#9609 brought up an interesting issue where a user was prompted to remove db.lck when running a -Sc operation concurrently with an -Syu operation during a long download. Although there are other problems here, this fixes the issue where files other than directories could be considered to be databases. Fix this. Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
5676dbae4d
commit
fc9d12bef0
1 changed files with 11 additions and 3 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include <alpm.h>
|
#include <alpm.h>
|
||||||
#include <alpm_list.h>
|
#include <alpm_list.h>
|
||||||
|
@ -57,6 +58,7 @@ static int sync_cleandb(const char *dbpath, int keep_used) {
|
||||||
/* step through the directory one file at a time */
|
/* step through the directory one file at a time */
|
||||||
while((ent = readdir(dir)) != NULL) {
|
while((ent = readdir(dir)) != NULL) {
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
|
struct stat buf;
|
||||||
alpm_list_t *syncdbs = NULL, *i;
|
alpm_list_t *syncdbs = NULL, *i;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
char *dname = ent->d_name;
|
char *dname = ent->d_name;
|
||||||
|
@ -68,6 +70,15 @@ static int sync_cleandb(const char *dbpath, int keep_used) {
|
||||||
if(!strcmp(dname, "sync") || !strcmp(dname, "local")) {
|
if(!strcmp(dname, "sync") || !strcmp(dname, "local")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* build the full path */
|
||||||
|
snprintf(path, PATH_MAX, "%s%s", dbpath, ent->d_name);
|
||||||
|
/* skip entries that are not dirs (lock file, etc.) */
|
||||||
|
stat(path, &buf);
|
||||||
|
if(!S_ISDIR(buf.st_mode)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(keep_used) {
|
if(keep_used) {
|
||||||
syncdbs = alpm_option_get_syncdbs();
|
syncdbs = alpm_option_get_syncdbs();
|
||||||
for(i = syncdbs; i && !found; i = alpm_list_next(i)) {
|
for(i = syncdbs; i && !found; i = alpm_list_next(i)) {
|
||||||
|
@ -78,9 +89,6 @@ static int sync_cleandb(const char *dbpath, int keep_used) {
|
||||||
/* We have a directory that doesn't match any syncdb.
|
/* We have a directory that doesn't match any syncdb.
|
||||||
* Ask the user if he wants to remove it. */
|
* Ask the user if he wants to remove it. */
|
||||||
if(!found) {
|
if(!found) {
|
||||||
/* build the full path */
|
|
||||||
snprintf(path, PATH_MAX, "%s%s", dbpath, ent->d_name);
|
|
||||||
|
|
||||||
if(!yesno(_("Do you want to remove %s? [Y/n] "), path)) {
|
if(!yesno(_("Do you want to remove %s? [Y/n] "), path)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue