diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libalpm/add.c | 10 | ||||
| -rw-r--r-- | lib/libalpm/be_files.c | 24 | ||||
| -rw-r--r-- | lib/libalpm/db.h | 1 | 
3 files changed, 32 insertions, 3 deletions
| diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index eef7aab1..1e8ec9f2 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -696,6 +696,16 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		}  	} +	/* prepare directory for database entries so permission are correct after +	   changelog/install script installation (FS#12263) */ +	if(_alpm_db_prepare(db, newpkg)) { +		alpm_logaction("error: could not create database entry %s-%s\n", +				alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg)); +		pm_errno = PM_ERR_DB_WRITE; +		ret = -1; +		goto cleanup; +	} +  	if(!(trans->flags & PM_TRANS_FLAG_DBONLY)) {  		struct archive *archive;  		struct archive_entry *entry; diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index b9ff6464..31b23172 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -652,6 +652,26 @@ error:  	return(-1);  } +int _alpm_db_prepare(pmdb_t *db, pmpkg_t *info) +{ +	mode_t oldmask; +	int retval = 0; +	char *pkgpath = NULL; + +	oldmask = umask(0000); + +	pkgpath = get_pkgpath(db, info); + +	if((retval = mkdir(pkgpath, 0755)) != 0) { +		_alpm_log(PM_LOG_ERROR, _("could not create directory %s: %s\n"), pkgpath, strerror(errno)); +	} + +	free(pkgpath); +	umask(oldmask); + +	return(retval); +} +  int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  {  	FILE *fp = NULL; @@ -670,10 +690,8 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  	pkgpath = get_pkgpath(db, info); -	oldmask = umask(0000); -	mkdir(pkgpath, 0755);  	/* make sure we have a sane umask */ -	umask(0022); +	oldmask = umask(0022);  	if(strcmp(db->treename, "local") == 0) {  		local = 1; diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h index 96fac0dd..25b90b5f 100644 --- a/lib/libalpm/db.h +++ b/lib/libalpm/db.h @@ -60,6 +60,7 @@ int _alpm_db_open(pmdb_t *db);  void _alpm_db_close(pmdb_t *db);  int _alpm_db_populate(pmdb_t *db);  int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq); +int _alpm_db_prepare(pmdb_t *db, pmpkg_t *info);  int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq);  int _alpm_db_remove(pmdb_t *db, pmpkg_t *info); | 
