diff options
Diffstat (limited to 'doc/sources/c/main.c')
| -rw-r--r-- | doc/sources/c/main.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/doc/sources/c/main.c b/doc/sources/c/main.c new file mode 100644 index 0000000..96d60ad --- /dev/null +++ b/doc/sources/c/main.c @@ -0,0 +1,56 @@ +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <dlfcn.h> + +#define PATH_LENGTH 256 + +int main(int argc, char * argv[]) +{ + char path[PATH_LENGTH], *msg = NULL; + const char* (*fmt)(); + void *module; + + getcwd(path, PATH_LENGTH); + strcat(path, "/"); + strcat(path, "module.so"); + + /* Load module */ + module = dlopen(path, RTLD_NOW); + + /* Error ! */ + if(!module) + { + msg = dlerror(); + + if(msg != NULL) + { + dlclose(module); + exit(1); + } + } + + /* Try to resolve function "fmt_info()" */ + fmt = dlsym(module, "fmt_info"); + + msg = dlerror(); + + if(msg != NULL) + { + perror(msg); + dlclose(module); + exit(1); + } + + /* call fmt_info() through a pointer*/ + printf("%s\n", fmt()); + + /* close module */ + if(dlclose(module)) + { + perror("error"); + exit(1); + } + + return 0; +} |
