Distinguish between database that failed to verify and that are missing.

Signed-off-by: Allan McRae <[email protected]>
---
 lib/libalpm/alpm.h    |  1 +
 lib/libalpm/be_sync.c | 14 ++++++++++++--
 lib/libalpm/db.h      |  1 +
 lib/libalpm/error.c   |  2 ++
 src/pacman/conf.c     |  2 +-
 5 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 28608bd..b8aab76 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -1246,6 +1246,7 @@ typedef enum _alpm_errno_t {
        ALPM_ERR_DB_NOT_FOUND,
        ALPM_ERR_DB_INVALID,
        ALPM_ERR_DB_INVALID_SIG,
+       ALPM_ERR_DB_MISSING_SIG,
        ALPM_ERR_DB_VERSION,
        ALPM_ERR_DB_WRITE,
        ALPM_ERR_DB_REMOVE,
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 65d2331..72589ef 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -76,8 +76,13 @@ static int sync_db_validate(alpm_db_t *db)
        if(db->status & DB_STATUS_VALID || db->status & DB_STATUS_MISSING) {
                return 0;
        }
+
        if(db->status & DB_STATUS_INVALID) {
-               db->handle->pm_errno = ALPM_ERR_DB_INVALID_SIG;
+               if(db->status & DB_STATUS_MISSING_SIG) {
+                       db->handle->pm_errno = ALPM_ERR_DB_MISSING_SIG;
+               } else {
+                       db->handle->pm_errno = ALPM_ERR_DB_INVALID_SIG;
+               }
                return -1;
        }
 
@@ -121,7 +126,12 @@ static int sync_db_validate(alpm_db_t *db)
                if(ret) {
                        db->status &= ~DB_STATUS_VALID;
                        db->status |= DB_STATUS_INVALID;
-                       db->handle->pm_errno = ALPM_ERR_DB_INVALID_SIG;
+                       if(db->handle->pm_errno == ALPM_ERR_SIG_MISSING) {
+                               db->status |= DB_STATUS_MISSING_SIG;
+                               db->handle->pm_errno = ALPM_ERR_DB_MISSING_SIG;
+                       } else {
+                               db->handle->pm_errno = ALPM_ERR_DB_INVALID_SIG;
+                       }
                        return 1;
                }
        }
diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h
index e4d9f71..909c66f 100644
--- a/lib/libalpm/db.h
+++ b/lib/libalpm/db.h
@@ -48,6 +48,7 @@ enum _alpm_dbstatus_t {
        DB_STATUS_INVALID = (1 << 1),
        DB_STATUS_EXISTS = (1 << 2),
        DB_STATUS_MISSING = (1 << 3),
+       DB_STATUS_MISSING_SIG = (1 << 4),
 
        DB_STATUS_LOCAL = (1 << 10),
        DB_STATUS_PKGCACHE = (1 << 11),
diff --git a/lib/libalpm/error.c b/lib/libalpm/error.c
index 8622180..bf085e4 100644
--- a/lib/libalpm/error.c
+++ b/lib/libalpm/error.c
@@ -72,6 +72,8 @@ const char SYMEXPORT *alpm_strerror(alpm_errno_t err)
                        return _("invalid or corrupted database");
                case ALPM_ERR_DB_INVALID_SIG:
                        return _("invalid or corrupted database (PGP 
signature)");
+               case ALPM_ERR_DB_MISSING_SIG:
+                       return _("database missing required signature");
                case ALPM_ERR_DB_VERSION:
                        return _("database is incorrect version");
                case ALPM_ERR_DB_WRITE:
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index aa27559..42b59bd 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -774,7 +774,7 @@ static int finish_section(struct section_t *section, int 
parse_options)
        }
 
        /* if we are not looking at options sections only, register a db */
-       db = alpm_register_syncdb(config->handle, section->name, 
section->siglevel, config->op_s_upgrade);
+       db = alpm_register_syncdb(config->handle, section->name, 
section->siglevel, config->op_s_sync);
        if(db == NULL) {
                pm_printf(ALPM_LOG_ERROR, _("could not register '%s' database 
(%s)\n"),
                                section->name, 
alpm_strerror(alpm_errno(config->handle)));
-- 
1.8.3.3


Reply via email to