This source file includes following definitions.
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
- FT_DECLARE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include "private/ftdm_core.h"
21 #include "ftdm_dso.h"
22 #include <stdlib.h>
23 #include <string.h>
24
25 #ifdef WIN32
26 #include <windows.h>
27 #include <stdio.h>
28
29
30 FT_DECLARE(ftdm_status_t) ftdm_dso_destroy(ftdm_dso_lib_t *lib) {
31 if (lib && *lib) {
32 FreeLibrary(*lib);
33 *lib = NULL;
34 }
35 return FTDM_SUCCESS;
36 }
37
38 FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err) {
39 HINSTANCE lib;
40
41 lib = LoadLibraryEx(path, NULL, 0);
42
43 if (!lib) {
44 LoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
45 }
46
47 if (!lib) {
48 DWORD error = GetLastError();
49 char tmp[80];
50 sprintf(tmp, "dll open error [%ul]\n", error);
51 *err = ftdm_strdup(tmp);
52 }
53
54 return lib;
55 }
56
57 FT_DECLARE(void*) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char **err) {
58 FARPROC func = GetProcAddress(lib, sym);
59 if (!func) {
60 DWORD error = GetLastError();
61 char tmp[80];
62 sprintf(tmp, "dll sym error [%ul]\n", error);
63 *err = ftdm_strdup(tmp);
64 }
65 return (void *)(intptr_t)func;
66 }
67
68 #else
69
70
71
72
73
74
75
76
77
78
79
80 #include <dlfcn.h>
81
82 FT_DECLARE(ftdm_status_t) ftdm_dso_destroy(ftdm_dso_lib_t *lib) {
83 int rc;
84 if (lib && *lib) {
85 rc = dlclose(*lib);
86 if (rc) {
87 ftdm_log(FTDM_LOG_ERROR, "Failed to close lib %p: %s\n", *lib, dlerror());
88 return FTDM_FAIL;
89 }
90 ftdm_log(FTDM_LOG_DEBUG, "lib %p was closed with success\n", *lib);
91 *lib = NULL;
92 return FTDM_SUCCESS;
93 }
94 ftdm_log(FTDM_LOG_ERROR, "Invalid pointer provided to ftdm_dso_destroy\n");
95 return FTDM_FAIL;
96 }
97
98 FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err) {
99 void *lib = dlopen(path, RTLD_NOW | RTLD_LOCAL);
100 if (lib == NULL) {
101 *err = ftdm_strdup(dlerror());
102 }
103 return lib;
104 }
105
106 FT_DECLARE(void *) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char **err) {
107 void *func = dlsym(lib, sym);
108 if (!func) {
109 *err = ftdm_strdup(dlerror());
110 }
111 return func;
112 }
113 #endif
114
115
116
117
118
119
120
121
122
123
124
125
126