1 /**************************************************************
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
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 *
20 *************************************************************/
21
22
23
24 #include <rtl/string.h>
25
26 #include <stdlib.h>
27 #include <string.h>
28
29 #ifdef LINUX
30 # ifndef __USE_GNU
31 # define __USE_GNU
32 # endif
33 #endif
34 #include <dlfcn.h>
35
initpyuno()36 void initpyuno ()
37 {
38 Dl_info dl_info;
39 void (*func)(void);
40
41 if (dladdr((void*)&initpyuno, &dl_info) != 0) {
42 void* h = 0;
43 size_t len = strrchr(dl_info.dli_fname, '/') - dl_info.dli_fname + 1;
44 char* libname = malloc(len + RTL_CONSTASCII_LENGTH( SAL_DLLPREFIX "pyuno" SAL_DLLEXTENSION ) + 1);
45 strncpy(libname, dl_info.dli_fname, len);
46 strcpy(libname + (len), SAL_DLLPREFIX "pyuno" SAL_DLLEXTENSION);
47
48 h = dlopen (libname, RTLD_NOW | RTLD_GLOBAL);
49 free(libname);
50 if( h )
51 {
52 func = (void (*)())dlsym (h, "initpyuno");
53 (func) ();
54 }
55 }
56 }
57