summaryrefslogtreecommitdiffstats
path: root/lib/libalpm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalpm')
-rw-r--r--lib/libalpm/add.c48
-rw-r--r--lib/libalpm/remove.c4
-rw-r--r--lib/libalpm/trans.c53
-rw-r--r--lib/libalpm/trans.h4
4 files changed, 58 insertions, 51 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index 170d09e5..33b85c0b 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -452,17 +452,13 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
size_t pkg_current, size_t pkg_count)
{
int i, ret = 0, errors = 0;
- char scriptlet[PATH_MAX];
- int is_upgrade = 0;
+ int is_upgrade;
alpm_pkg_t *oldpkg = NULL;
alpm_db_t *db = handle->db_local;
alpm_trans_t *trans = handle->trans;
ASSERT(trans != NULL, return -1);
- snprintf(scriptlet, PATH_MAX, "%s%s-%s/install",
- _alpm_db_path(db), newpkg->name, newpkg->version);
-
/* see if this is an upgrade. if so, remove the old package first */
alpm_pkg_t *local = _alpm_db_get_pkgfromcache(db, newpkg->name);
if(local) {
@@ -474,30 +470,23 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
goto cleanup;
}
- EVENT(handle, ALPM_EVENT_UPGRADE_START, newpkg, local);
- _alpm_log(handle, ALPM_LOG_DEBUG, "upgrading package %s-%s\n",
- newpkg->name, newpkg->version);
-
/* copy over the install reason */
newpkg->reason = alpm_pkg_get_reason(local);
- /* pre_upgrade scriptlet */
- if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
- _alpm_runscriptlet(handle, newpkg->origin_data.file,
- "pre_upgrade", newpkg->version, local->version);
- }
+ EVENT(handle, ALPM_EVENT_UPGRADE_START, newpkg, local);
} else {
is_upgrade = 0;
-
EVENT(handle, ALPM_EVENT_ADD_START, newpkg, NULL);
- _alpm_log(handle, ALPM_LOG_DEBUG, "adding package %s-%s\n",
- newpkg->name, newpkg->version);
+ }
- /* pre_install scriptlet */
- if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
- _alpm_runscriptlet(handle, newpkg->origin_data.file,
- "pre_install", newpkg->version, NULL);
- }
+ _alpm_log(handle, ALPM_LOG_DEBUG, "%s package %s-%s\n",
+ is_upgrade ? "upgrading" : "adding", newpkg->name, newpkg->version);
+ /* pre_install/pre_upgrade scriptlet */
+ if(alpm_pkg_has_scriptlet(newpkg) &&
+ !(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
+ const char *scriptlet_name = is_upgrade ? "pre_upgrade" : "pre_install";
+ _alpm_runscriptlet(handle, newpkg->origin_data.file,
+ scriptlet_name, newpkg->version, NULL, 1);
}
/* we override any pre-set reason if we have alldeps or allexplicit set */
@@ -661,13 +650,14 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
/* run the post-install script if it exists */
if(alpm_pkg_has_scriptlet(newpkg)
&& !(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
- if(is_upgrade) {
- _alpm_runscriptlet(handle, scriptlet, "post_upgrade",
- newpkg->version, oldpkg ? oldpkg->version : NULL);
- } else {
- _alpm_runscriptlet(handle, scriptlet, "post_install",
- newpkg->version, NULL);
- }
+ char scriptlet[PATH_MAX];
+ const char *scriptlet_name;
+ snprintf(scriptlet, PATH_MAX, "%s%s-%s/install",
+ _alpm_db_path(db), newpkg->name, newpkg->version);
+ scriptlet_name = is_upgrade ? "post_upgrade" : "post_install";
+
+ _alpm_runscriptlet(handle, scriptlet, scriptlet_name,
+ newpkg->version, oldpkg ? oldpkg->version : NULL, 0);
}
if(is_upgrade) {
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index a3aa4a53..7f917faa 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -376,7 +376,7 @@ int _alpm_remove_single_package(alpm_handle_t *handle,
/* run the pre-remove scriptlet if it exists */
if(alpm_pkg_has_scriptlet(oldpkg) &&
!(handle->trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
- _alpm_runscriptlet(handle, scriptlet, "pre_remove", pkgver, NULL);
+ _alpm_runscriptlet(handle, scriptlet, "pre_remove", pkgver, NULL, 0);
}
}
@@ -453,7 +453,7 @@ int _alpm_remove_single_package(alpm_handle_t *handle,
/* run the post-remove script if it exists */
if(alpm_pkg_has_scriptlet(oldpkg) &&
!(handle->trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) {
- _alpm_runscriptlet(handle, scriptlet, "post_remove", pkgver, NULL);
+ _alpm_runscriptlet(handle, scriptlet, "post_remove", pkgver, NULL, 0);
}
}
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index fbc5feec..cb97a4aa 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -275,40 +275,50 @@ static int grep(const char *fn, const char *needle)
return 0;
}
-int _alpm_runscriptlet(alpm_handle_t *handle, const char *installfn,
- const char *script, const char *ver, const char *oldver)
+int _alpm_runscriptlet(alpm_handle_t *handle, const char *filepath,
+ const char *script, const char *ver, const char *oldver, int is_archive)
{
- char scriptfn[PATH_MAX];
char cmdline[PATH_MAX];
- char tmpdir[PATH_MAX];
char *argv[] = { "sh", "-c", cmdline, NULL };
- char *scriptpath;
+ char *tmpdir, *scriptfn = NULL, *scriptpath;
int retval = 0;
+ size_t len;
- if(_alpm_access(handle, NULL, installfn, R_OK) != 0) {
- _alpm_log(handle, ALPM_LOG_DEBUG, "scriptlet '%s' not found\n", installfn);
+ if(_alpm_access(handle, NULL, filepath, R_OK) != 0) {
+ _alpm_log(handle, ALPM_LOG_DEBUG, "scriptlet '%s' not found\n", filepath);
return 0;
}
- /* creates a directory in $root/tmp/ for copying/extracting the scriptlet */
- snprintf(tmpdir, PATH_MAX, "%stmp/", handle->root);
+ if(!is_archive && !grep(filepath, script)) {
+ /* script not found in scriptlet file; we can only short-circuit this early
+ * if it is an actual scriptlet file and not an archive. */
+ return 0;
+ }
+
+ /* create a directory in $root/tmp/ for copying/extracting the scriptlet */
+ len = strlen(handle->root) + strlen("tmp/alpm_XXXXXX") + 1;
+ MALLOC(tmpdir, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
+ snprintf(tmpdir, len, "%stmp/", handle->root);
if(access(tmpdir, F_OK) != 0) {
_alpm_makepath_mode(tmpdir, 01777);
}
- snprintf(tmpdir, PATH_MAX, "%stmp/alpm_XXXXXX", handle->root);
+ snprintf(tmpdir, len, "%stmp/alpm_XXXXXX", handle->root);
if(mkdtemp(tmpdir) == NULL) {
_alpm_log(handle, ALPM_LOG_ERROR, _("could not create temp directory\n"));
+ free(tmpdir);
return 1;
}
/* either extract or copy the scriptlet */
- snprintf(scriptfn, PATH_MAX, "%s/.INSTALL", tmpdir);
- if(strcmp(script, "pre_upgrade") == 0 || strcmp(script, "pre_install") == 0) {
- if(_alpm_unpack_single(handle, installfn, tmpdir, ".INSTALL")) {
+ len += strlen("/.INSTALL");
+ MALLOC(scriptfn, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
+ snprintf(scriptfn, len, "%s/.INSTALL", tmpdir);
+ if(is_archive) {
+ if(_alpm_unpack_single(handle, filepath, tmpdir, ".INSTALL")) {
retval = 1;
}
} else {
- if(_alpm_copyfile(installfn, scriptfn)) {
+ if(_alpm_copyfile(filepath, scriptfn)) {
_alpm_log(handle, ALPM_LOG_ERROR, _("could not copy tempfile to %s (%s)\n"), scriptfn, strerror(errno));
retval = 1;
}
@@ -317,8 +327,8 @@ int _alpm_runscriptlet(alpm_handle_t *handle, const char *installfn,
goto cleanup;
}
- if(!grep(scriptfn, script)) {
- /* script not found in scriptlet file */
+ if(is_archive && !grep(scriptfn, script)) {
+ /* script not found in extracted scriptlet file */
goto cleanup;
}
@@ -338,10 +348,17 @@ int _alpm_runscriptlet(alpm_handle_t *handle, const char *installfn,
retval = _alpm_run_chroot(handle, "/bin/sh", argv);
cleanup:
- if(_alpm_rmrf(tmpdir)) {
- _alpm_log(handle, ALPM_LOG_WARNING, _("could not remove tmpdir %s\n"), tmpdir);
+ if(scriptfn && unlink(scriptfn)) {
+ _alpm_log(handle, ALPM_LOG_WARNING,
+ _("could not remove %s\n"), scriptfn);
+ }
+ if(rmdir(tmpdir)) {
+ _alpm_log(handle, ALPM_LOG_WARNING,
+ _("could not remove tmpdir %s\n"), tmpdir);
}
+ free(scriptfn);
+ free(tmpdir);
return retval;
}
diff --git a/lib/libalpm/trans.h b/lib/libalpm/trans.h
index 38f45ff7..ff944b09 100644
--- a/lib/libalpm/trans.h
+++ b/lib/libalpm/trans.h
@@ -47,8 +47,8 @@ struct __alpm_trans_t {
void _alpm_trans_free(alpm_trans_t *trans);
int _alpm_trans_init(alpm_trans_t *trans, alpm_transflag_t flags);
-int _alpm_runscriptlet(alpm_handle_t *handle, const char *installfn,
- const char *script, const char *ver, const char *oldver);
+int _alpm_runscriptlet(alpm_handle_t *handle, const char *filepath,
+ const char *script, const char *ver, const char *oldver, int is_archive);
#endif /* _ALPM_TRANS_H */