From 4e6a03c4f6d413aa9f1c98d255c370c442ce55eb Mon Sep 17 00:00:00 2001 From: Chantry Xavier Date: Fri, 5 Oct 2007 18:09:49 +0200 Subject: libalpm/trans.c : remove the DBPath <-> RootDir dependence in runscriptlet. This code assumed that DBPath was under RootDir, while this is not necessarily the case : pacman doesn't enforce anymore than DBPath is under RootDir. So now, all scriptlets will be put somewhere in RootDir/tmp/, so that when it chroots in RootDir, the scriptlets are still available inside the chroot. This also removes the need of normalizing both dbpath and rootdir, in order to do computation on the paths. Signed-off-by: Chantry Xavier --- lib/libalpm/trans.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 22780899..68203fca 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -559,26 +559,32 @@ int _alpm_runscriptlet(const char *root, const char *installfn, return(0); } + /* creates a directory in $root/tmp/ for copying/extracting the scriptlet */ + snprintf(tmpdir, PATH_MAX, "%stmp/", root); + if(stat(tmpdir, &buf)) { + _alpm_makepath(tmpdir); + } + snprintf(tmpdir, PATH_MAX, "%stmp/alpm_XXXXXX", root); + if(mkdtemp(tmpdir) == NULL) { + _alpm_log(PM_LOG_ERROR, _("could not create temp directory\n")); + return(1); + } + + /* either extract or copy the scriptlet */ + snprintf(scriptfn, PATH_MAX, "%s/.INSTALL", tmpdir); if(!strcmp(script, "pre_upgrade") || !strcmp(script, "pre_install")) { - snprintf(tmpdir, PATH_MAX, "%stmp/", root); - if(stat(tmpdir, &buf)) { - _alpm_makepath(tmpdir); - } - snprintf(tmpdir, PATH_MAX, "%stmp/alpm_XXXXXX", root); - if(mkdtemp(tmpdir) == NULL) { - _alpm_log(PM_LOG_ERROR, _("could not create temp directory\n")); - return(1); - } _alpm_unpack(installfn, tmpdir, ".INSTALL"); - snprintf(scriptfn, PATH_MAX, "%s/.INSTALL", tmpdir); - /* chop off the root so we can find the tmpdir in the chroot */ - scriptpath = scriptfn + strlen(root) - 1; } else { - strncpy(scriptfn, installfn, PATH_MAX); - /* chop off the root so we can find the tmpdir in the chroot */ - scriptpath = scriptfn + strlen(root) - 1; + if(_alpm_copyfile(installfn, scriptfn)) { + _alpm_log(PM_LOG_ERROR, _("could not copy tempfile to %s (%s)\n"), scriptfn, strerror(errno)); + retval = 1; + goto cleanup; + } } + /* chop off the root so we can find the tmpdir in the chroot */ + scriptpath = scriptfn + strlen(root) - 1; + if(!grep(scriptfn, script)) { /* script not found in scriptlet file */ goto cleanup; -- cgit v1.2.3-24-g4f1b