summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChantry Xavier <shiningxc@gmail.com>2007-10-05 18:09:49 +0200
committerDan McGee <dan@archlinux.org>2007-10-15 01:46:43 +0200
commit4e6a03c4f6d413aa9f1c98d255c370c442ce55eb (patch)
treea445b61cc223f4a6019b31dfc6b2c83e11f30036
parent5d30c5c0b76e76b336abd2486ac6d24dd972fcc3 (diff)
downloadpacman-4e6a03c4f6d413aa9f1c98d255c370c442ce55eb.tar.gz
pacman-4e6a03c4f6d413aa9f1c98d255c370c442ce55eb.tar.xz
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 <shiningxc@gmail.com>
-rw-r--r--lib/libalpm/trans.c36
1 files changed, 21 insertions, 15 deletions
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;