[pacman-dev] [PATCH 2/7] Be smarter about running ldconfig during removal transactions

Dan McGee dan at archlinux.org
Mon Sep 19 16:13:12 EDT 2011


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 at archlinux.org>
---
 lib/libalpm/remove.c |   14 ++++++++------
 lib/libalpm/remove.h |    2 +-
 lib/libalpm/sync.c   |    2 +-
 lib/libalpm/trans.c  |    2 +-
 4 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index c6a3efc..e998763 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 5da645b..251e454 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 717ba7c..c6a79fa 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 47b9c98..a4716b8 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;
 		}
-- 
1.7.6.1



More information about the pacman-dev mailing list