aboutsummaryrefslogtreecommitdiff
path: root/ark/src/soul_load.c
blob: fcf04a96008a1462c7314f6364a2e078e3128464 (plain) (blame)
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
#include "soul.h"

#include <dlfcn.h>
#include <stdio.h>

#include "soul_exports.h"

int load_soul_from_dl_(dlhandle_t dl, soul_t *soul)
{
  void *ptr;
  int ret = 0;

  const char **name = dlsym(dl, "soul_name");
  if (name) {
    soul->soul_name = *name;
  }
  else {
    soul->soul_name = NULL;
  }

  soul->state = NULL;
  soul->library_handle = dl;

#define LOAD_SYM(ret_type, sym, args)                                          \
  do {                                                                         \
    ptr = dlsym(dl, #sym);                                                     \
    if (!ptr) {                                                                \
      fprintf(stderr, "Soul missing %s\n", #sym);                              \
      ret |= 1;                                                                \
    }                                                                          \
    soul->sym = (ret_type(*) args)ptr;                                         \
  } while (0);

  ARKSOUL_EXPORTS(LOAD_SYM);

#undef LOAD_SYM

  return ret;
}