[pacman-dev] [PATCH] Separate local db dircetory creation and db write
Dan McGee
dpmcgee at gmail.com
Fri Jan 2 22:30:36 EST 2009
On Fri, Jan 2, 2009 at 3:12 AM, Allan McRae <allan at archlinux.org> wrote:
> Changelogs and install files were getting extracted into the local
> db folder before it was manually created. This created issues for
> uses with 0077 umasks and was highlighted with the new sudo handling
> of umasks (FS#12263).
>
> This moves the local db creation to its own function which is called
> before the start of package archive extraction. Also, added a check
> that the folder is actually created.
>
> Signed-off-by: Allan McRae <allan at archlinux.org>
> ---
> lib/libalpm/add.c | 10 ++++++++++
> lib/libalpm/be_files.c | 24 +++++++++++++++++++++---
> 2 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
> index eef7aab..c200c3c 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_mkdir(db, newpkg)) {
> + alpm_logaction("error: could not create database directory %s-%s\n",
> + alpm_pkg_get_name(newpkg), alpm_pkg_get_version(newpkg));
> + pm_errno = PM_ERR_DB_WRITE;
> + ret = -1;
> + goto cleanup;
> + }
If we have a failure between here and when we actually write out the
DB entry, what happens? I was hoping we would take the "extract the
changelog/install file at later time" route, but that is definitely a
bit more of a hassle...
Calling a function _alpm_db_mkdir() ties us awfully tight to the
existing be_files implementation, although I'm sure most of this code
will need a lot of work if we decide to change things up.
> 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 b9ff646..7d04ade 100644
> --- a/lib/libalpm/be_files.c
> +++ b/lib/libalpm/be_files.c
> @@ -652,6 +652,26 @@ error:
> return(-1);
> }
>
> +int _alpm_db_mkdir(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;
> --
> 1.6.1
More information about the pacman-dev
mailing list