dlfcn-util: add dlsym_many_and_warn() helper
When we dlopen() some library we most likely will resolve more than a few symbols, hence add a helper that makes it easy.
This commit is contained in:
parent
2e3e2750bb
commit
046c91314a
|
@ -0,0 +1,40 @@
|
|||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include "dlfcn-util.h"
|
||||
|
||||
int dlsym_many_and_warn(void *dl, int level, ...) {
|
||||
va_list ap;
|
||||
int r;
|
||||
|
||||
/* Tries to resolve a bunch of function symbols, and logs errors about the ones it cannot
|
||||
* resolve. Note that this function possibly modifies the supplied function pointers if the whole
|
||||
* operation fails */
|
||||
|
||||
va_start(ap, level);
|
||||
|
||||
for (;;) {
|
||||
void (**fn)(void);
|
||||
void (*tfn)(void);
|
||||
const char *symbol;
|
||||
|
||||
fn = va_arg(ap, typeof(fn));
|
||||
if (!fn)
|
||||
break;
|
||||
|
||||
symbol = va_arg(ap, typeof(symbol));
|
||||
|
||||
tfn = (typeof(tfn)) dlsym(dl, symbol);
|
||||
if (!tfn) {
|
||||
r = log_full_errno(level,
|
||||
SYNTHETIC_ERRNO(ELIBBAD),
|
||||
"Can't find symbol %s: %s", symbol, dlerror());
|
||||
va_end(ap);
|
||||
return r;
|
||||
}
|
||||
|
||||
*fn = tfn;
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
return 0;
|
||||
}
|
|
@ -6,3 +6,5 @@
|
|||
#include "macro.h"
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(void*, dlclose);
|
||||
|
||||
int dlsym_many_and_warn(void *dl, int level, ...);
|
||||
|
|
|
@ -39,6 +39,7 @@ basic_sources = files('''
|
|||
device-nodes.h
|
||||
dirent-util.c
|
||||
dirent-util.h
|
||||
dlfcn-util.c
|
||||
dlfcn-util.h
|
||||
efivars.c
|
||||
efivars.h
|
||||
|
|
Loading…
Reference in New Issue