1*8d01a27eSchristos /* $NetBSD: dldb.c,v 1.2 2013/11/22 15:52:05 christos Exp $ */
2dbd550edSchristos #include "config.h"
3dbd550edSchristos
4dbd550edSchristos #include <dlfcn.h>
5dbd550edSchristos
6dbd550edSchristos #include "common.h"
7dbd550edSchristos #include "pathnames.h"
8dbd550edSchristos
9dbd550edSchristos static void relocate __P(());
10dbd550edSchristos
11dbd550edSchristos #define RELOC(func,returntype,args,proto,types) \
12dbd550edSchristos static returntype reloc_##func __P(proto); \
13dbd550edSchristos returntype (*nvi_##func) __P(proto) = reloc_##func; \
14dbd550edSchristos static returntype reloc_##func args \
15dbd550edSchristos types \
16dbd550edSchristos { \
17dbd550edSchristos relocate(); \
18dbd550edSchristos return nvi_##func args; \
19dbd550edSchristos }
20dbd550edSchristos
21dbd550edSchristos RELOC(db_create,int,(a,b,c),(DB **, DB_ENV *, u_int32_t),
22dbd550edSchristos DB**a;DB_ENV*b;u_int32_t c;)
23dbd550edSchristos RELOC(db_env_create,int,(a,b),(DB_ENV **, u_int32_t),DB_ENV ** a;u_int32_t b;);
24dbd550edSchristos RELOC(db_strerror,char *,(a),(int),int a;)
25dbd550edSchristos
26dbd550edSchristos #define LOADSYM(func) \
27dbd550edSchristos if ((nvi_##func = dlsym(handle, #func)) == NULL) \
28dbd550edSchristos goto error;
29dbd550edSchristos
30dbd550edSchristos static void
relocate()31dbd550edSchristos relocate()
32dbd550edSchristos {
33dbd550edSchristos void *handle = dlopen(_PATH_DB3, RTLD_LAZY);
34dbd550edSchristos
35dbd550edSchristos if (!handle)
36dbd550edSchristos goto error;
37dbd550edSchristos
38dbd550edSchristos LOADSYM(db_create)
39dbd550edSchristos LOADSYM(db_env_create)
40dbd550edSchristos LOADSYM(db_strerror)
41dbd550edSchristos
42dbd550edSchristos return;
43dbd550edSchristos error:
44dbd550edSchristos fprintf(stderr, "Relocation error: %s\n", dlerror());
45dbd550edSchristos abort();
46dbd550edSchristos }
47