Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/lib/libalpm/be_local.c
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-07-29 17:03:07 -0500
committerDan McGee <dan@archlinux.org>2011-08-08 16:56:48 -0500
commitef4757afa5d31ff6a6c09e3410c889f152826f4f (patch)
treea801e8b6d7bfc07a3d769993464a19d428c87f9b /lib/libalpm/be_local.c
parentd9f9b87d3ff6621577aa15bf3304f73219f6d5f1 (diff)
Store a package info level flag if we fail to load data
If we are missing a local database file, we get repeated messages over and over telling us the same thing, rather than being sane and erroring only once. This package adds an INFRQ_ERROR level that is added to the mask if we encounter any errors on a local_db_read() operation, and short circuits future calls if found in the value. This fixes FS#25313. Note that this does not make any behavior changes other than suppressing error messages and repeated code calls to failure cases; we still have more to do in the "local database is hosed" department. Also make a small update to the wrong but unused flags set in be_package; using INFRQ_ALL there was not totally correct. Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/be_local.c')
-rw-r--r--lib/libalpm/be_local.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
index 49661e24..5d136c9e 100644
--- a/lib/libalpm/be_local.c
+++ b/lib/libalpm/be_local.c
@@ -533,6 +533,13 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
/* already loaded all of this info, do nothing */
return 0;
}
+
+ if(info->infolevel & INFRQ_ERROR) {
+ /* We've encountered an error loading this package before. Don't attempt
+ * repeated reloads, just give up. */
+ return -1;
+ }
+
_alpm_log(db->handle, ALPM_LOG_FUNCTION, "loading package data for %s : level=0x%x\n",
info->name, inforeq);
@@ -619,6 +626,7 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
}
fclose(fp);
fp = NULL;
+ info->infolevel |= INFRQ_DESC;
}
/* FILES */
@@ -673,6 +681,7 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
}
fclose(fp);
fp = NULL;
+ info->infolevel |= INFRQ_FILES;
}
/* INSTALL */
@@ -681,15 +690,14 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
if(access(path, F_OK) == 0) {
info->scriptlet = 1;
}
+ info->infolevel |= INFRQ_SCRIPTLET;
}
- /* internal */
- info->infolevel |= inforeq;
-
free(pkgpath);
return 0;
error:
+ info->infolevel |= INFRQ_ERROR;
free(pkgpath);
if(fp) {
fclose(fp);