summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-09-19 13:18:42 -0500
committerDan McGee <dan@archlinux.org>2011-09-19 13:18:42 -0500
commite1899cbc64c6b634107f09c3a3e8152c63078636 (patch)
treede6bd009664fc863f3f997cf4a78f2d75a9c2e5b
parenta94ad2974031138dbb4d42a939dfc0cd15a75ce7 (diff)
downloadpacman-e1899cbc64c6b634107f09c3a3e8152c63078636.tar.xz
Be smarter about running ldconfig during removal transactions
1. Don't run it if something failed in package removal- this mirrors what we already do in sync transactions. 2. Don't run it if we are invoking it for the replaces removal bit of a sync transaction- it doesn't make sense to run ldconfig halfway through a sync install; we should only run it once at the end. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/remove.c14
-rw-r--r--lib/libalpm/remove.h2
-rw-r--r--lib/libalpm/sync.c2
-rw-r--r--lib/libalpm/trans.c2
4 files changed, 11 insertions, 9 deletions
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index c6a3efcb..e998763f 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -475,7 +475,7 @@ db:
return 0;
}
-int _alpm_remove_packages(alpm_handle_t *handle)
+int _alpm_remove_packages(alpm_handle_t *handle, int run_ldconfig)
{
alpm_list_t *targ;
size_t pkg_count, targ_count;
@@ -489,23 +489,25 @@ int _alpm_remove_packages(alpm_handle_t *handle)
alpm_pkg_t *pkg = targ->data;
if(trans->state == STATE_INTERRUPTED) {
- return 0;
+ return ret;
}
if(_alpm_remove_single_package(handle, pkg, NULL,
targ_count, pkg_count) == -1) {
handle->pm_errno = ALPM_ERR_TRANS_ABORT;
+ /* running ldconfig at this point could possibly screw system */
+ run_ldconfig = 0;
ret = -1;
- goto cleanup;
}
targ_count++;
}
- /* run ldconfig if it exists */
- _alpm_ldconfig(handle);
+ if(run_ldconfig) {
+ /* run ldconfig if it exists */
+ _alpm_ldconfig(handle);
+ }
-cleanup:
return ret;
}
diff --git a/lib/libalpm/remove.h b/lib/libalpm/remove.h
index 5da645b0..251e4548 100644
--- a/lib/libalpm/remove.h
+++ b/lib/libalpm/remove.h
@@ -25,7 +25,7 @@
#include "trans.h"
int _alpm_remove_prepare(alpm_handle_t *handle, alpm_list_t **data);
-int _alpm_remove_packages(alpm_handle_t *handle);
+int _alpm_remove_packages(alpm_handle_t *handle, int run_ldconfig);
int _alpm_remove_single_package(alpm_handle_t *handle,
alpm_pkg_t *oldpkg, alpm_pkg_t *newpkg,
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 717ba7ce..c6a79fa0 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -1042,7 +1042,7 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
if(replaces) {
_alpm_log(handle, ALPM_LOG_DEBUG, "removing conflicting and to-be-replaced packages\n");
/* we want the frontend to be aware of commit details */
- if(_alpm_remove_packages(handle) == -1) {
+ if(_alpm_remove_packages(handle, 0) == -1) {
_alpm_log(handle, ALPM_LOG_ERROR, _("could not commit removal transaction\n"));
return -1;
}
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index 47b9c98d..a4716b8a 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -164,7 +164,7 @@ int SYMEXPORT alpm_trans_commit(alpm_handle_t *handle, alpm_list_t **data)
trans->state = STATE_COMMITING;
if(trans->add == NULL) {
- if(_alpm_remove_packages(handle) == -1) {
+ if(_alpm_remove_packages(handle, 1) == -1) {
/* pm_errno is set by _alpm_remove_commit() */
return -1;
}