module.c (509a48ff) module.c (8f88de38)
1/**************************************************************
1/**************************************************************
2 *
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
19 *
20 *************************************************************/
21
22
23
24#include <sal/types.h>
25#include <osl/diagnose.h>
26#include <osl/module.h>
27#include <osl/thread.h>

--- 10 unchanged lines hidden (view full) ---

38extern int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32);
39
40/*****************************************************************************/
41/* osl_loadModule */
42/*****************************************************************************/
43
44oslModule SAL_CALL osl_loadModule(rtl_uString *ustrModuleName, sal_Int32 nRtldMode)
45{
20 *************************************************************/
21
22
23
24#include <sal/types.h>
25#include <osl/diagnose.h>
26#include <osl/module.h>
27#include <osl/thread.h>

--- 10 unchanged lines hidden (view full) ---

38extern int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32);
39
40/*****************************************************************************/
41/* osl_loadModule */
42/*****************************************************************************/
43
44oslModule SAL_CALL osl_loadModule(rtl_uString *ustrModuleName, sal_Int32 nRtldMode)
45{
46 oslModule pModule=0;
47 rtl_uString* ustrTmp = NULL;
46 oslModule pModule=0;
47 rtl_uString* ustrTmp = NULL;
48
48
49 OSL_ENSURE(ustrModuleName,"osl_loadModule : string is not valid");
49 OSL_ENSURE(ustrModuleName,"osl_loadModule : string is not valid");
50
50
51 /* ensure ustrTmp hold valid string */
52 if (osl_File_E_None != osl_getSystemPathFromFileURL(ustrModuleName, &ustrTmp))
53 rtl_uString_assign(&ustrTmp, ustrModuleName);
51 /* ensure ustrTmp holds valid string */
52 if (osl_File_E_None != osl_getSystemPathFromFileURL(ustrModuleName, &ustrTmp))
53 rtl_uString_assign(&ustrTmp, ustrModuleName);
54
54
55 if (ustrTmp)
56 {
57 char buffer[PATH_MAX];
55 if (ustrTmp)
56 {
57 char buffer[PATH_MAX];
58
58
59 if (UnicodeToText(buffer, PATH_MAX, ustrTmp->buffer, ustrTmp->length))
60 pModule = osl_loadAsciiModule(buffer, nRtldMode);
61 rtl_uString_release(ustrTmp);
62 }
59 if (UnicodeToText(buffer, PATH_MAX, ustrTmp->buffer, ustrTmp->length))
60 pModule = osl_loadAsciiModule(buffer, nRtldMode);
61 rtl_uString_release(ustrTmp);
62 }
63
63
64 return pModule;
64 return pModule;
65}
66
67/*****************************************************************************/
68/* osl_loadAsciiModule */
69/*****************************************************************************/
70
71oslModule SAL_CALL osl_loadAsciiModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode)
72{
65}
66
67/*****************************************************************************/
68/* osl_loadAsciiModule */
69/*****************************************************************************/
70
71oslModule SAL_CALL osl_loadAsciiModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode)
72{
73 OSL_ASSERT(
74 (nRtldMode & SAL_LOADMODULE_LAZY) == 0 ||
75 (nRtldMode & SAL_LOADMODULE_NOW) == 0); /* only either LAZY or NOW */
73 OSL_ASSERT(
74 (nRtldMode & SAL_LOADMODULE_LAZY) == 0 ||
75 (nRtldMode & SAL_LOADMODULE_NOW) == 0); /* only either LAZY or NOW */
76 if (pszModuleName)
77 {
78#ifndef NO_DL_FUNCTIONS
76 if (pszModuleName)
77 {
78#ifndef NO_DL_FUNCTIONS
79 int rtld_mode =
80 ((nRtldMode & SAL_LOADMODULE_NOW) ? RTLD_NOW : RTLD_LAZY) |
81 ((nRtldMode & SAL_LOADMODULE_GLOBAL) ? RTLD_GLOBAL : RTLD_LOCAL);
79 int rtld_mode =
80 ((nRtldMode & SAL_LOADMODULE_NOW) ? RTLD_NOW : RTLD_LAZY) |
81 ((nRtldMode & SAL_LOADMODULE_GLOBAL) ? RTLD_GLOBAL : RTLD_LOCAL);
82 void* pLib = dlopen(pszModuleName, rtld_mode);
83
84#if OSL_DEBUG_LEVEL > 1
85 if (pLib == NULL)
86 OSL_TRACE("error: osl_loadModule failed with %s\n", dlerror());
87#endif /* OSL_DEBUG_LEVEL */
88
89 return ((oslModule)(pLib));
90
82 void* pLib = dlopen(pszModuleName, rtld_mode);
83
84#if OSL_DEBUG_LEVEL > 1
85 if (pLib == NULL)
86 OSL_TRACE("error: osl_loadModule failed with %s\n", dlerror());
87#endif /* OSL_DEBUG_LEVEL */
88
89 return ((oslModule)(pLib));
90
91#else /* NO_DL_FUNCTIONS */
91#else /* NO_DL_FUNCTIONS */
92 printf("No DL Functions\n");
92 printf("No DL Functions\n");
93#endif /* NO_DL_FUNCTIONS */
93#endif /* NO_DL_FUNCTIONS */
94 }
95 return NULL;
96}
97
98/*****************************************************************************/
99/* osl_getModuleHandle */
100/*****************************************************************************/
101
94 }
95 return NULL;
96}
97
98/*****************************************************************************/
99/* osl_getModuleHandle */
100/*****************************************************************************/
101
102sal_Bool SAL_CALL
102sal_Bool SAL_CALL
103osl_getModuleHandle(rtl_uString *pModuleName, oslModule *pResult)
104{
103osl_getModuleHandle(rtl_uString *pModuleName, oslModule *pResult)
104{
105 (void) pModuleName; /* avoid warning about unused parameter */
106 *pResult = (oslModule) RTLD_DEFAULT;
107 return sal_True;
105 (void) pModuleName; /* avoid warning about unused parameter */
106 *pResult = (oslModule) RTLD_DEFAULT;
107 return sal_True;
108}
109
110/*****************************************************************************/
111/* osl_unloadModule */
112/*****************************************************************************/
113void SAL_CALL osl_unloadModule(oslModule hModule)
114{
115 if (hModule)
116 {
117#ifndef NO_DL_FUNCTIONS
108}
109
110/*****************************************************************************/
111/* osl_unloadModule */
112/*****************************************************************************/
113void SAL_CALL osl_unloadModule(oslModule hModule)
114{
115 if (hModule)
116 {
117#ifndef NO_DL_FUNCTIONS
118 int nRet = dlclose(hModule);
119
118 int nRet = dlclose(hModule);
119
120#if OSL_DEBUG_LEVEL > 1
120#if OSL_DEBUG_LEVEL > 1
121 if (nRet != 0)
122 {
121 if (nRet != 0)
122 {
123 fprintf(stderr, "error: osl_unloadModule failed with %s\n", dlerror());
123 fprintf(stderr, "error: osl_unloadModule failed with %s\n", dlerror());
124 }
124 }
125#else
125#else
126 (void) nRet;
126 (void) nRet;
127#endif /* if OSL_DEBUG_LEVEL */
128
129#endif /* ifndef NO_DL_FUNCTIONS */
130 }
131}
132
133/*****************************************************************************/
134/* osl_getSymbol */
135/*****************************************************************************/
127#endif /* if OSL_DEBUG_LEVEL */
128
129#endif /* ifndef NO_DL_FUNCTIONS */
130 }
131}
132
133/*****************************************************************************/
134/* osl_getSymbol */
135/*****************************************************************************/
136void* SAL_CALL
136void* SAL_CALL
137osl_getSymbol(oslModule Module, rtl_uString* pSymbolName)
138{
137osl_getSymbol(oslModule Module, rtl_uString* pSymbolName)
138{
139 return (void *) osl_getFunctionSymbol(Module, pSymbolName);
139 return (void *) osl_getFunctionSymbol(Module, pSymbolName);
140}
141
142
143/*****************************************************************************/
144/* osl_getAsciiFunctionSymbol */
145/*****************************************************************************/
140}
141
142
143/*****************************************************************************/
144/* osl_getAsciiFunctionSymbol */
145/*****************************************************************************/
146oslGenericFunction SAL_CALL
146oslGenericFunction SAL_CALL
147osl_getAsciiFunctionSymbol(oslModule Module, const sal_Char *pSymbol)
148{
147osl_getAsciiFunctionSymbol(oslModule Module, const sal_Char *pSymbol)
148{
149 void *fcnAddr = NULL;
150
149 void *fcnAddr = NULL;
150
151#ifndef NO_DL_FUNCTIONS
151#ifndef NO_DL_FUNCTIONS
152 if (pSymbol)
152 if (pSymbol)
153 {
153 {
154 fcnAddr = dlsym(Module, pSymbol);
155
156 if (!fcnAddr)
157 OSL_TRACE("error: osl_getAsciiFunctionSymbol failed with %s\n", dlerror());
154 fcnAddr = dlsym(Module, pSymbol);
155
156 if (!fcnAddr)
157 OSL_TRACE("error: osl_getAsciiFunctionSymbol failed with %s\n", dlerror());
158 }
159#endif
160
158 }
159#endif
160
161 return (oslGenericFunction) fcnAddr;
161 return (oslGenericFunction) fcnAddr;
162}
163
164/*****************************************************************************/
165/* osl_getFunctionSymbol */
166/*****************************************************************************/
162}
163
164/*****************************************************************************/
165/* osl_getFunctionSymbol */
166/*****************************************************************************/
167oslGenericFunction SAL_CALL
167oslGenericFunction SAL_CALL
168osl_getFunctionSymbol(oslModule module, rtl_uString *puFunctionSymbolName)
169{
168osl_getFunctionSymbol(oslModule module, rtl_uString *puFunctionSymbolName)
169{
170 oslGenericFunction pSymbol = NULL;
171
172 if( puFunctionSymbolName )
173 {
174 rtl_String* pSymbolName = NULL;
175
176 rtl_uString2String( &pSymbolName,
177 rtl_uString_getStr(puFunctionSymbolName),
178 rtl_uString_getLength(puFunctionSymbolName),
179 RTL_TEXTENCODING_UTF8,
180 OUSTRING_TO_OSTRING_CVTFLAGS );
170 oslGenericFunction pSymbol = NULL;
181
171
182 if( pSymbolName != NULL )
183 {
184 pSymbol = osl_getAsciiFunctionSymbol(module, rtl_string_getStr(pSymbolName));
185 rtl_string_release(pSymbolName);
186 }
187 }
188
189 return pSymbol;
172 if( puFunctionSymbolName )
173 {
174 rtl_String* pSymbolName = NULL;
175
176 rtl_uString2String( &pSymbolName,
177 rtl_uString_getStr(puFunctionSymbolName),
178 rtl_uString_getLength(puFunctionSymbolName),
179 RTL_TEXTENCODING_UTF8,
180 OUSTRING_TO_OSTRING_CVTFLAGS );
181
182 if( pSymbolName != NULL )
183 {
184 pSymbol = osl_getAsciiFunctionSymbol(module, rtl_string_getStr(pSymbolName));
185 rtl_string_release(pSymbolName);
186 }
187 }
188
189 return pSymbol;
190}
191
192/*****************************************************************************/
193/* osl_getModuleURLFromAddress */
194/*****************************************************************************/
195sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibraryUrl)
196{
197 sal_Bool result = sal_False;
198 Dl_info dl_info;
199
200 if ((result = dladdr(addr, &dl_info)) != 0)
201 {
202 rtl_uString * workDir = NULL;
203 osl_getProcessWorkingDir(&workDir);
190}
191
192/*****************************************************************************/
193/* osl_getModuleURLFromAddress */
194/*****************************************************************************/
195sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibraryUrl)
196{
197 sal_Bool result = sal_False;
198 Dl_info dl_info;
199
200 if ((result = dladdr(addr, &dl_info)) != 0)
201 {
202 rtl_uString * workDir = NULL;
203 osl_getProcessWorkingDir(&workDir);
204 if (workDir)
205 {
204 if (workDir)
205 {
206#if OSL_DEBUG_LEVEL > 1
206#if OSL_DEBUG_LEVEL > 1
207 OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", dl_info.dli_fname);
207 OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", dl_info.dli_fname);
208#endif
208#endif
209 rtl_string2UString(ppLibraryUrl,
210 dl_info.dli_fname,
211 strlen(dl_info.dli_fname),
212 osl_getThreadTextEncoding(),
213 OSTRING_TO_OUSTRING_CVTFLAGS);
214
215 OSL_ASSERT(*ppLibraryUrl != NULL);
216 osl_getFileURLFromSystemPath(*ppLibraryUrl, ppLibraryUrl);
217 osl_getAbsoluteFileURL(workDir, *ppLibraryUrl, ppLibraryUrl);
218
219 rtl_uString_release(workDir);
220 result = sal_True;
221 }
222 else
223 {
224 result = sal_False;
225 }
209 rtl_string2UString(ppLibraryUrl,
210 dl_info.dli_fname,
211 strlen(dl_info.dli_fname),
212 osl_getThreadTextEncoding(),
213 OSTRING_TO_OUSTRING_CVTFLAGS);
214
215 OSL_ASSERT(*ppLibraryUrl != NULL);
216 osl_getFileURLFromSystemPath(*ppLibraryUrl, ppLibraryUrl);
217 osl_getAbsoluteFileURL(workDir, *ppLibraryUrl, ppLibraryUrl);
218
219 rtl_uString_release(workDir);
220 result = sal_True;
221 }
222 else
223 {
224 result = sal_False;
225 }
226 }
227 return result;
228}
229
230/*****************************************************************************/
231/* osl_getModuleURLFromFunctionAddress */
232/*****************************************************************************/
233sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress(oslGenericFunction addr, rtl_uString ** ppLibraryUrl)
234{
226 }
227 return result;
228}
229
230/*****************************************************************************/
231/* osl_getModuleURLFromFunctionAddress */
232/*****************************************************************************/
233sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress(oslGenericFunction addr, rtl_uString ** ppLibraryUrl)
234{
235 return osl_getModuleURLFromAddress((void*)addr, ppLibraryUrl);
235 return osl_getModuleURLFromAddress((void*)addr, ppLibraryUrl);
236}
236}
237