On 22/09/14 23:29, Andrew Gregory wrote:
> On 09/22/14 at 10:44pm, Allan McRae wrote:
>> This means that a missing local database becomes an error (as it
>> should be immediately created).  Note this only creates the "local"
>> directory and not its parent, which is checked for during locking.
>>
>> Signed-off-by: Allan McRae <[email protected]>
>> ---
>>  lib/libalpm/be_local.c | 40 ++++++++++++++++++++++++++--------------
>>  1 file changed, 26 insertions(+), 14 deletions(-)
>>
>> diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
>> index 9a9bdef..d18e9ad 100644
>> --- a/lib/libalpm/be_local.c
>> +++ b/lib/libalpm/be_local.c
>> @@ -366,6 +366,16 @@ static int is_dir(const char *path, struct dirent 
>> *entry)
>>      return 0;
>>  }
>>  
>> +static int local_db_create(alpm_db_t *db, const char *dbpath)
>> +{
>> +    if(mkdir(dbpath, 0755) != 0) {
>> +            _alpm_log(db->handle, ALPM_LOG_ERROR, _("could not create 
>> directory %s: %s\n"),
>> +                            dbpath, strerror(errno));
>> +            RET_ERR(db->handle, ALPM_ERR_DB_CREATE, -1);
>> +    }
>> +    return 0;
>> +}
>> +
>>  static int local_db_validate(alpm_db_t *db)
>>  {
>>      struct dirent *ent = NULL;
>> @@ -387,12 +397,19 @@ static int local_db_validate(alpm_db_t *db)
>>      dbdir = opendir(dbpath);
>>      if(dbdir == NULL) {
>>              if(errno == ENOENT) {
>> -                    /* database dir doesn't exist yet */
>> -                    db->status |= DB_STATUS_VALID;
>> -                    db->status &= ~DB_STATUS_INVALID;
>> -                    db->status &= ~DB_STATUS_EXISTS;
>> -                    db->status |= DB_STATUS_MISSING;
>> -                    return 0;
>> +                    /* local database dir doesn't exist yet - create it */
>> +                    if(local_db_create(db, dbpath) == 0) {
>> +                            db->status |= DB_STATUS_VALID;
>> +                            db->status &= ~DB_STATUS_INVALID;
>> +                            db->status &= ~DB_STATUS_EXISTS;
>> +                            db->status |= DB_STATUS_MISSING;
> 
> The EXISTS and MISSING operations need to be switched with the ones
> below.
> 

Moving the above to below is correct.   However, I think the above
should be:

        db->status |= DB_STATUS_EXISTS;
        db->status &= ~DB_STATUS_MISSING;

>> +                            return 0;
>> +                    } else {
>> +                            db->status &= DB_STATUS_EXISTS;
>> +                            db->status |= ~DB_STATUS_MISSING;
>> +                            /* pm_errno is set by local_db_create */
>> +                            return -1;
>> +                    }
>>              } else {
>>                      RET_ERR(db->handle, ALPM_ERR_DB_OPEN, -1);
>>              }
>> @@ -445,7 +462,9 @@ static int local_db_populate(alpm_db_t *db)
>>      if(db->status & DB_STATUS_INVALID) {
>>              RET_ERR(db->handle, ALPM_ERR_DB_INVALID, -1);
>>      }
>> -    /* note: DB_STATUS_MISSING is not fatal for local database */
>> +    if(db->status & DB_STATUS_MISSING) {
>> +            RET_ERR(db->handle, ALPM_ERR_DB_NOT_FOUND, -1);
>> +    }
>>  
>>      dbpath = _alpm_db_path(db);
>>      if(dbpath == NULL) {
>> @@ -455,13 +474,6 @@ static int local_db_populate(alpm_db_t *db)
>>  
>>      dbdir = opendir(dbpath);
>>      if(dbdir == NULL) {
>> -            if(errno == ENOENT) {
>> -                    /* no database existing yet is not an error */
>> -                    db->status &= ~DB_STATUS_EXISTS;
>> -                    db->status |= DB_STATUS_MISSING;
>> -                    db->pkgcache = _alpm_pkghash_create(0);
>> -                    return 0;
>> -            }
>>              RET_ERR(db->handle, ALPM_ERR_DB_OPEN, -1);
>>      }
>>      if(fstat(dirfd(dbdir), &buf) != 0) {
>> -- 
>> 2.1.0
> 
> 

Reply via email to