Hi all, This is my first time submitting a patch to any open source project, so I hope I've done it it right. Apologies in advance for anything I have done wrong! Below is a small patch adding an additional command-line flag to pacman, which prevents ld-config from being run by libalpm. I was having problems installing packages to a loop-mounted ARM image and I think preventing ldconfig from running is the best solution. Kind Regards, Alex Chamberlain Add the --no-ldconfig flag to the command line to prevent ldconfig from being run. It is useful for installing packages onto a loop- mounted image. Signed-off-by: Alex Chamberlain <alex@alexchamberlain.co.uk> --- lib/libalpm/alpm.h | 3 +++ lib/libalpm/handle.c | 14 ++++++++++++++ lib/libalpm/handle.h | 1 + lib/libalpm/util.c | 23 ++++++++++++----------- src/pacman/conf.c | 4 ++++ src/pacman/conf.h | 5 ++++- src/pacman/pacman.c | 5 +++++ 7 files changed, 43 insertions(+), 12 deletions(-) diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index bb792cf..a8fdd11 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -547,6 +547,9 @@ int alpm_option_set_deltaratio(alpm_handle_t *handle, double ratio); int alpm_option_get_checkspace(alpm_handle_t *handle); int alpm_option_set_checkspace(alpm_handle_t *handle, int checkspace); +int alpm_option_get_ldconfig(alpm_handle_t *handle); +int alpm_option_set_ldconfig(alpm_handle_t *handle, int ldconfig); + alpm_siglevel_t alpm_option_get_default_siglevel(alpm_handle_t *handle); int alpm_option_set_default_siglevel(alpm_handle_t *handle, alpm_siglevel_t level); diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c index 816162b..e126421 100644 --- a/lib/libalpm/handle.c +++ b/lib/libalpm/handle.c @@ -44,6 +44,7 @@ alpm_handle_t *_alpm_handle_new(void) CALLOC(handle, 1, sizeof(alpm_handle_t), return NULL); handle->deltaratio = 0.0; + handle->ldconfig = 1; return handle; } @@ -265,6 +266,12 @@ int SYMEXPORT alpm_option_get_checkspace(alpm_handle_t *handle) return handle->checkspace; } +int SYMEXPORT alpm_option_get_ldconfig(alpm_handle_t *handle) +{ + CHECK_HANDLE(handle, return -1); + return handle->ldconfig; +} + int SYMEXPORT alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb) { CHECK_HANDLE(handle, return -1); @@ -600,6 +607,13 @@ int SYMEXPORT alpm_option_set_checkspace(alpm_handle_t *handle, int checkspace) return 0; } +int SYMEXPORT alpm_option_set_ldconfig(alpm_handle_t *handle, int ldconfig) +{ + CHECK_HANDLE(handle, return -1); + handle->ldconfig = ldconfig; + return 0; +} + int SYMEXPORT alpm_option_set_default_siglevel(alpm_handle_t *handle, alpm_siglevel_t level) { diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h index c0ad668..cccdf12 100644 --- a/lib/libalpm/handle.h +++ b/lib/libalpm/handle.h @@ -91,6 +91,7 @@ struct __alpm_handle_t { double deltaratio; /* Download deltas if possible; a ratio value */ int usesyslog; /* Use syslog instead of logfile? */ /* TODO move to frontend */ int checkspace; /* Check disk space before installing */ + int ldconfig; /* Should we run ldconfig? Default: 1 */ alpm_siglevel_t siglevel; /* Default signature verification level */ /* error code */ diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index c2b5d44..3b1ee6e 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -616,17 +616,18 @@ cleanup: int _alpm_ldconfig(alpm_handle_t *handle) { char line[PATH_MAX]; - - _alpm_log(handle, ALPM_LOG_DEBUG, "running ldconfig\n"); - - snprintf(line, PATH_MAX, "%setc/ld.so.conf", handle->root); - if(access(line, F_OK) == 0) { - snprintf(line, PATH_MAX, "%ssbin/ldconfig", handle->root); - if(access(line, X_OK) == 0) { - char arg0[32]; - char *argv[] = { arg0, NULL }; - strcpy(arg0, "ldconfig"); - return _alpm_run_chroot(handle, "/sbin/ldconfig", argv); + if(handle->ldconfig) { + _alpm_log(handle, ALPM_LOG_DEBUG, "running ldconfig\n"); + + snprintf(line, PATH_MAX, "%setc/ld.so.conf", handle->root); + if(access(line, F_OK) == 0) { + snprintf(line, PATH_MAX, "%ssbin/ldconfig", handle->root); + if(access(line, X_OK) == 0) { + char arg0[32]; + char *argv[] = { arg0, NULL }; + strcpy(arg0, "ldconfig"); + return _alpm_run_chroot(handle, "/sbin/ldconfig", argv); + } } } diff --git a/src/pacman/conf.c b/src/pacman/conf.c index 4aaacb5..094c141 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -58,6 +58,8 @@ config_t *config_new(void) ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL; } + newconfig->ldconfig = 1; + return newconfig; } @@ -622,6 +624,8 @@ static int setup_libalpm(void) alpm_option_set_noupgrades(handle, config->noupgrade); alpm_option_set_noextracts(handle, config->noextract); + alpm_option_set_ldconfig(handle, config->ldconfig); + return 0; } diff --git a/src/pacman/conf.h b/src/pacman/conf.h index 69c955e..389cfa3 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -95,6 +95,8 @@ typedef struct __config_t { alpm_list_t *explicit_adds; alpm_list_t *explicit_removes; + + int ldconfig; /* Should ldconfig be called? Default: 1 */ } config_t; /* Operations */ @@ -127,7 +129,8 @@ enum { OP_PRINTFORMAT, OP_GPGDIR, OP_DBONLY, - OP_FORCE + OP_FORCE, + OP_NO_LDCONFIG }; /* clean method */ diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 73d5be9..23af6bc 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -201,6 +201,7 @@ static void usage(int op, const char * const myname) addlist(_(" --gpgdir <path> set an alternate home directory for GnuPG\n")); addlist(_(" --logfile <path> set an alternate log file\n")); addlist(_(" --noconfirm do not ask for any confirmation\n")); + addlist(_(" --no-ldconfig do not run ldconfig\n")); } list = alpm_list_msort(list, alpm_list_count(list), options_cmp); for(i = list; i; i = alpm_list_next(i)) { @@ -436,6 +437,9 @@ static int parsearg_global(int opt) break; case 'r': check_optarg(); config->rootdir = strdup(optarg); break; case 'v': (config->verbose)++; break; + case OP_NO_LDCONFIG: + config->ldconfig = 0; + break; default: return 1; } return 0; @@ -628,6 +632,7 @@ static int parseargs(int argc, char *argv[]) {"print-format", required_argument, 0, OP_PRINTFORMAT}, {"gpgdir", required_argument, 0, OP_GPGDIR}, {"dbonly", no_argument, 0, OP_DBONLY}, + {"no-ldconfig", no_argument, 0, OP_NO_LDCONFIG}, {0, 0, 0, 0} }; -- 1.7.11.1