summaryrefslogtreecommitdiff
path: root/src/dltools.c
blob: 2a52f5368500ab58d0a68b9fd98829a9af4890aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdbool.h>
#include <stdlib.h>

#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
/* include winapi */
#else
#include <dlfcn.h>
#endif

#include <engine/dltools.h>
#include <engine/logging.h>

bool dynamic_library_close(void* shared_library) {
#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  return true;
#else
  return dlclose(shared_library) == 0;
#endif
}

void* dynamic_library_open(const char* library_path) {
#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  return NULL;
#else
  return dlopen(library_path, RTLD_NOW);
#endif
}

char* dynamic_library_get_error(void) {
#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  return "unsupported on windows";
#else
  return dlerror();
#endif
}

void* dynamic_library_reload(void* shared_library, const char* library_path) {
  void* library_address = NULL;
  if (!dynamic_library_close(shared_library)) {
    ERROR("Failed to close shared library: %s", dynamic_library_get_error());
    ERROR("Reloading dynamic library failed.");
    return library_address;
  }
  if ((library_address = dynamic_library_open(library_path)) == NULL) {
    ERROR("Failed to open shared library: %s", dynamic_library_get_error());
    ERROR("Reloading dynamic library %s failed.", library_path);
  }
  return library_address;
}

void* dynamic_library_get_symbol(void* restrict shared_library,
                                 const char* symbol) {
#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
  return NULL;
#else
  return dlsym(shared_library, symbol);
#endif
}