From cb2ade75140bbbc90253e6cc7310fde032d19e77 Mon Sep 17 00:00:00 2001 From: Dale Rahn Date: Sat, 17 Sep 2005 04:15:24 +0000 Subject: refactor this code, much more readable, no operational change. --- libexec/ld.so/library_subr.c | 123 +++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 69 deletions(-) diff --git a/libexec/ld.so/library_subr.c b/libexec/ld.so/library_subr.c index 1a4efb56eee..44227c75f8f 100644 --- a/libexec/ld.so/library_subr.c +++ b/libexec/ld.so/library_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: library_subr.c,v 1.7 2005/09/17 02:52:43 drahn Exp $ */ +/* $OpenBSD: library_subr.c,v 1.8 2005/09/17 04:15:23 drahn Exp $ */ /* * Copyright (c) 2002 Dale Rahn @@ -47,6 +47,9 @@ struct dlochld _dlopened_child_list; +/* local functions */ +elf_object_t * _dl_load_shlib_hint(struct sod *sod, struct sod *req_sod, + int type, int flags, int use_hints, const char *libpath); /* * _dl_match_file() @@ -226,6 +229,31 @@ nohints: return NULL; } +/* + * attempt to locate and load a library based on libpath, sod info and + * if it needs to respect hints, + * passing type and flags to perform open + */ +elf_object_t * +_dl_load_shlib_hint(struct sod *sod, struct sod *req_sod, int type, + int flags, int use_hints, const char *libpath) +{ + elf_object_t *object = NULL; + char *hint; + + hint = _dl_find_shlib(req_sod, libpath, use_hints); + if (hint != NULL) { + if (req_sod->sod_minor < sod->sod_minor) + _dl_printf("warning: lib%s.so.%d.%d: " + "minor version >= %d expected, " + "using it anyway\n", + sod->sod_name, sod->sod_major, + req_sod->sod_minor, sod->sod_minor); + object = _dl_tryload_shlib(hint, type, flags); + } + return object; +} + /* * Load a shared object. Search order is: * If the name contains a '/' use the name exactly as is. (only) @@ -243,13 +271,13 @@ nohints: * by ldconfig or default to '/usr/lib' */ + elf_object_t * _dl_load_shlib(const char *libname, elf_object_t *parent, int type, int flags) { int try_any_minor, ignore_hints; struct sod sod, req_sod; - elf_object_t *object; - char *hint; + elf_object_t *object = NULL; try_any_minor = 0; ignore_hints = 0; @@ -263,79 +291,35 @@ _dl_load_shlib(const char *libname, elf_object_t *parent, int type, int flags) req_sod = sod; again: - /* - * No '/' in name. Scan the known places, LD_LIBRARY_PATH first. - */ + /* No '/' in name. Scan the known places, LD_LIBRARY_PATH first. */ if (_dl_libpath != NULL) { - hint = _dl_find_shlib(&req_sod, _dl_libpath, ignore_hints); - if (hint != NULL) { - if (req_sod.sod_minor < sod.sod_minor) - _dl_printf("warning: lib%s.so.%d.%d: " - "minor version >= %d expected, " - "using it anyway\n", - sod.sod_name, sod.sod_major, - req_sod.sod_minor, sod.sod_minor); - object = _dl_tryload_shlib(hint, type, flags); - if (object != NULL) { - _dl_free((char *)sod.sod_name); - return (object); - } - } + object = _dl_load_shlib_hint(&sod, &req_sod, type, flags, + ignore_hints, _dl_libpath); + if (object != NULL) + goto done; } - /* - * Check DT_RPATH. - */ + /* Check DT_RPATH. */ if (parent->dyn.rpath != NULL) { - hint = _dl_find_shlib(&req_sod, parent->dyn.rpath, - ignore_hints); - if (hint != NULL) { - if (req_sod.sod_minor < sod.sod_minor) - _dl_printf("warning: lib%s.so.%d.%d: " - "minor version >= %d expected, " - "using it anyway\n", - sod.sod_name, sod.sod_major, - req_sod.sod_minor, sod.sod_minor); - object = _dl_tryload_shlib(hint, type, flags); - if (object != NULL) { - _dl_free((char *)sod.sod_name); - return (object); - } - } + object = _dl_load_shlib_hint(&sod, &req_sod, type, flags, + ignore_hints, parent->dyn.rpath); + if (object != NULL) + goto done; } + + /* Check main program's DT_RPATH, if parent != main program */ if (parent != _dl_objects && _dl_objects->dyn.rpath != NULL) { - hint = _dl_find_shlib(&req_sod, _dl_objects->dyn.rpath, - ignore_hints); - if (hint != NULL) { - if (req_sod.sod_minor < sod.sod_minor) - _dl_printf("warning: lib%s.so.%d.%d: " - "minor version >= %d expected, " - "using it anyway\n", - sod.sod_name, sod.sod_major, - req_sod.sod_minor, sod.sod_minor); - object = _dl_tryload_shlib(hint, type, flags); - if (object != NULL) { - _dl_free((char *)sod.sod_name); - return (object); - } - } + object = _dl_load_shlib_hint(&sod, &req_sod, type, flags, + ignore_hints, _dl_objects->dyn.rpath); + if (object != NULL) + goto done; } /* check 'standard' locations */ - hint = _dl_find_shlib(&req_sod, NULL, ignore_hints); - if (hint != NULL) { - if (req_sod.sod_minor < sod.sod_minor) - _dl_printf("warning: lib%s.so.%d.%d: " - "minor version >= %d expected, " - "using it anyway\n", - sod.sod_name, sod.sod_major, - req_sod.sod_minor, sod.sod_minor); - object = _dl_tryload_shlib(hint, type, flags); - if (object != NULL) { - _dl_free((char *)sod.sod_name); - return(object); - } - } + object = _dl_load_shlib_hint(&sod, &req_sod, type, flags, + ignore_hints, NULL); + if (object != NULL) + goto done; if (try_any_minor == 0) { try_any_minor = 1; @@ -343,9 +327,10 @@ again: req_sod.sod_minor = -1; goto again; } - _dl_free((char *)sod.sod_name); _dl_errno = DL_NOT_FOUND; - return(0); +done: + _dl_free((char *)sod.sod_name); + return(object); } -- cgit v1.2.3