comparison src/sysdll.c @ 265:8efd647ea9ca r20-5b31

Import from CVS: tag r20-5b31
author cvs
date Mon, 13 Aug 2007 10:25:37 +0200
parents
children 966663fcf606
comparison
equal deleted inserted replaced
264:682d2a9d41a5 265:8efd647ea9ca
1 /* sysdll.c --- system dependent support for dynamic linked libraries
2 Copyright (C) 1998 Free Software Foundation, Inc.
3 Author: William Perry <wmperry@aventail.com>
4
5 This file is part of XEmacs.
6
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
10 later version.
11
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdlib.h>
27 #include <assert.h>
28 #include <string.h>
29 #include <stdio.h>
30 #include "sysdll.h"
31
32 /* This whole file is conditional upon HAVE_DLL */
33 #ifdef HAVE_SHLIB
34
35 /* Thankfully, most systems follow the ELFish dlopen() method.
36 ** HAVE__DLOPEN is lame, but SCO has their dl* functions as _dl*, and
37 ** unless you include dlfcn.h you don't get the macros to mask them, and
38 ** autoconf fails to find them.
39 **
40 ** Anybody who wants to use this on SCO needs to have their configure.in
41 ** look for _dlopen() as well as dlopen()
42 */
43 #if defined(HAVE_DLOPEN) || defined(HAVE__DLOPEN)
44 #include <dlfcn.h>
45
46 #ifndef RTLD_LAZY
47 #define RTLD_LAZY 1
48 #endif /* RTLD_LAZY isn't defined under FreeBSD - ick */
49
50 #ifndef RTLD_GLOBAL
51 #define RTLD_GLOBAL 0
52 #endif
53
54 int dll_init(CONST char *arg) {
55 return(0);
56 }
57
58 dll_handle dll_open(CONST char *fname) {
59 return((dll_handle)dlopen(fname,RTLD_LAZY|RTLD_GLOBAL));
60 }
61
62 int dll_close(dll_handle h) {
63 return(dlclose((void *)h));
64 }
65
66 dll_func dll_function(dll_handle h,CONST char *n) {
67 #ifdef DLSYM_NEEDS_UNDERSCORE
68 char buf[1024];
69 *buf = '_';
70 (void)strcpy(buf + 1, n);
71 n = buf;
72 #endif
73 return((dll_func)dlsym((void *)h,n));
74 }
75
76 dll_var dll_variable(dll_handle h,CONST char *n) {
77 return((dll_var)dlsym((void *)h,n));
78 }
79
80 CONST char *dll_error(dll_handle h) {
81 #ifdef HAVE_DLERROR
82 return((CONST char *)dl_error());
83 #else
84 return("Shared library error");
85 #endif
86 }
87
88 #elif defined(HAVE_SHL_LOAD)
89 /* This is the HP/UX version */
90 #include <dl.h>
91 int dll_init(CONST char *arg) {
92 return(0);
93 }
94
95 dll_handle dll_open(CONST char *fname) {
96 return((dll_handle)shl_load(fname,BIND_DEFERRED,0L));
97 }
98
99 int dll_close(dll_handle h) {
100 return (shl_unload((shl_t)h));
101 }
102
103 dll_func dll_function(dll_handle h,CONST char *n) {
104 long handle = 0L;
105
106 if (shl_findsym(&(shl_t)h,n,TYPE_PROCEDURE,&handle))
107 return(NULL);
108
109 return((dll_func)handle);
110 }
111
112 dll_var dll_variable(dll_handle h,CONST char *n) {
113 long handle = 0L;
114
115 if (shl_findsym(&(shl_t)h,n,TYPE_DATA,&handle))
116 return(NULL);
117
118 return((dll_var)handle);
119 }
120
121 CONST char *dll_error(dll_handle h) {
122 return("Generic shared library error");
123 }
124
125 #elif defined(HAVE_INIT_DLD)
126 #include <dld.h>
127 int dll_init(CONST char *arg) {
128 char *real_exe = dld_find_executable(arg);
129 int rc;
130
131 rc = dld_init(real_exe);
132 if (rc) {
133 dld_perror (exe);
134 return(-1);
135 }
136 return(0);
137 }
138
139 dll_handle dll_open(CONST char *fname) {
140 rc = dld_link(fname);
141 if (rc) {
142 return (NULL);
143 }
144 return((dll_handle)1);
145 }
146
147 int dll_close(dll_handle h) {
148 /* *sigh* DLD is pretty lame and doesn't return a handle that you can use
149 ** later on to free the file - you have to remember the filename and
150 ** use that as the unlinker. We should eventually keep a linked list
151 ** of loaded modules and then use the node pointer as the unique id
152 ** for the shared library. Wheeee. But not now.
153 */
154 return(1);
155 }
156
157 DLL_FUNC dll_function(dll_handle h,CONST char *n) {
158 return (dld_get_func(n));
159 }
160
161 DLL_FUNC dll_variable(dll_handle h,CONST char *n) {
162 return (dld_get_symbol(n));
163 }
164 #elif defined(_WINDOWS) || defined(WIN32)
165 int dll_init(CONST char *arg) {
166 return(0);
167 }
168
169 dll_handle dll_open(CONST char *fname) {
170 return((dll_handle)LoadLibrary(fname));
171 }
172
173 int dll_close(dll_handle h) {
174 return(FreeLibrary(h));
175 }
176
177 dll_func dll_function(dll_handle h,CONST char *n) {
178 return((dll_func)GetProcAddress(h,n));
179 }
180
181 dll_func dll_variable(dll_handle h,CONST char *n) {
182 return((dll_func)GetProcAddress(h,n));
183 }
184
185 CONST char *dll_error(dll_handle h) {
186 return("Windows DLL Error");
187 }
188 #else
189 /* Catchall if we don't know about this systems method of dynamic loading */
190 int dll_init(CONST char *arg) {
191 return(-1);
192 }
193
194 dll_handle dll_open(CONST char *fname) {
195 return(NULL);
196 }
197
198 int dll_close(dll_handle h) {
199 return(0);
200 }
201
202 dll_func dll_function(dll_handle h,CONST char *n) {
203 return(NULL);
204 }
205
206 dll_func dll_variable(dll_handle h,CONST char *n) {
207 return(NULL);
208 }
209
210 CONST char *dll_error(dll_handle h) {
211 return("Shared libraries not implemented on this system.");
212 }
213 #endif /* System conditionals */
214
215 #endif /* HAVE_SHLIB */