Annotation of embedaddon/sudo/compat/dlopen.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com>
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: #include <config.h>
18:
19: #include <sys/types.h>
20:
21: #include <stdio.h>
22: #ifdef STDC_HEADERS
23: # include <stdlib.h>
24: # include <stddef.h>
25: #else
26: # ifdef HAVE_STDLIB_H
27: # include <stdlib.h>
28: # endif
29: #endif /* STDC_HEADERS */
30: #ifdef HAVE_STRING_H
31: # include <string.h>
32: #endif /* HAVE_STRING_H */
33: #ifdef HAVE_STRINGS_H
34: # include <strings.h>
35: #endif /* HAVE_STRINGS_H */
36: #include <errno.h>
37:
38: #include "compat/dlfcn.h"
39: #include "missing.h"
40:
41: #ifdef HAVE_SHL_LOAD
42: /*
43: * Emulate dlopen() using shl_load().
44: */
45: #include <dl.h>
46:
47: #ifndef DYNAMIC_PATH
48: # define DYNAMIC_PATH 0
49: #endif
50:
51: void *
52: sudo_dlopen(const char *path, int mode)
53: {
54: int flags = DYNAMIC_PATH;
55:
56: if (mode == 0)
57: mode = RTLD_LAZY; /* default behavior */
58:
59: /* We don't support RTLD_GLOBAL or RTLD_LOCAL yet. */
60: if (ISSET(mode, RTLD_LAZY))
61: flags |= BIND_DEFERRED;
62: if (ISSET(mode, RTLD_NOW))
63: flags |= BIND_IMMEDIATE;
64:
65: return (void *)shl_load(path, flags, 0L);
66: }
67:
68: int
69: sudo_dlclose(void *handle)
70: {
71: return shl_unload((shl_t)handle);
72: }
73:
74: void *
75: sudo_dlsym(void *vhandle, const char *symbol)
76: {
77: shl_t handle = vhandle;
78: void *value = NULL;
79:
80: (void)shl_findsym(&handle, symbol, TYPE_UNDEFINED, &value);
81:
82: return value;
83: }
84:
85: char *
86: sudo_dlerror(void)
87: {
88: return strerror(errno);
89: }
90:
91: #else /* !HAVE_SHL_LOAD */
92:
93: /*
94: * Emulate dlopen() using a static list of symbols compiled into sudo.
95: */
96:
97: struct sudo_preload_table {
98: const char *name;
99: void *address;
100: };
101: extern struct sudo_preload_table sudo_preload_table[];
102:
103: void *
104: sudo_dlopen(const char *path, int mode)
105: {
106: return (void *)path;
107: }
108:
109: int
110: sudo_dlclose(void *handle)
111: {
112: return 0;
113: }
114:
115: void *
116: sudo_dlsym(void *handle, const char *symbol)
117: {
118: struct sudo_preload_table *sym;
119:
120: for (sym = sudo_preload_table; sym->name != NULL; sym++) {
121: if (strcmp(symbol, sym->name) == 0)
122: return sym->address;
123: }
124: return NULL;
125: }
126:
127: char *
128: sudo_dlerror(void)
129: {
130: return strerror(errno);
131: }
132:
133: #endif /* HAVE_SHL_LOAD */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>