summaryrefslogtreecommitdiff
path: root/accel-pptpd/triton
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/triton')
-rw-r--r--accel-pptpd/triton/loader.c40
-rw-r--r--accel-pptpd/triton/triton.c7
-rw-r--r--accel-pptpd/triton/triton.h2
-rw-r--r--accel-pptpd/triton/triton_p.h1
4 files changed, 46 insertions, 4 deletions
diff --git a/accel-pptpd/triton/loader.c b/accel-pptpd/triton/loader.c
index a390f0a9..24d1cbcb 100644
--- a/accel-pptpd/triton/loader.c
+++ b/accel-pptpd/triton/loader.c
@@ -2,7 +2,45 @@
#include <string.h>
#include <unistd.h>
#include <stdio.h>
-#include <pthread.h>
+#include <errno.h>
+#include <dlfcn.h>
#include "triton_p.h"
+int load_modules(const char *name)
+{
+ struct conf_sect_t *sect;
+ struct conf_option_t *opt;
+
+ sect = conf_get_section(name);
+ if (!sect) {
+ fprintf(stderr, "loader: section '%s' not found\n", name);
+ return -1;
+ }
+
+ char *cwd = getcwd(NULL,0);
+
+ list_for_each_entry(opt, &sect->items, entry) {
+ if (!strcmp(opt->name,"path") && opt->val) {
+ if (chdir(opt->val)) {
+ fprintf(stderr,"loader: chdir '%s': %s\n", opt->val, strerror(errno));
+ goto out_err;
+ }
+ continue;
+ }
+ if (!dlopen(opt->name, RTLD_NOW | RTLD_GLOBAL)) {
+ fprintf(stderr,"loader: failed to load module '%s': %s\n",opt->name, dlerror());
+ goto out_err;
+ }
+ }
+
+ chdir(cwd);
+ free(cwd);
+ return 0;
+
+out_err:
+ chdir(cwd);
+ free(cwd);
+ return -1;
+}
+
diff --git a/accel-pptpd/triton/triton.c b/accel-pptpd/triton/triton.c
index 8c8d5a38..9aa7462b 100644
--- a/accel-pptpd/triton/triton.c
+++ b/accel-pptpd/triton/triton.c
@@ -188,7 +188,7 @@ void __export triton_unregister_ctx(struct triton_ctx_t *ud)
spin_unlock(&ctx_list_lock);
}
-int __export triton_init(const char *conf_file)
+int __export triton_init(const char *conf_file, const char *mod_sect)
{
ctx_pool = mempool_create(sizeof(struct _triton_ctx_t));
@@ -210,7 +210,10 @@ int __export triton_init(const char *conf_file)
if (timer_init())
return -1;
-
+
+ if (load_modules(mod_sect))
+ return -1;
+
return 0;
}
diff --git a/accel-pptpd/triton/triton.h b/accel-pptpd/triton/triton.h
index 2543a234..1009d67a 100644
--- a/accel-pptpd/triton/triton.h
+++ b/accel-pptpd/triton/triton.h
@@ -67,7 +67,7 @@ char *conf_get_opt(const char *sect, const char *name);
#define TRITON_ERR_NOMSG -6
#define TRITON_ERR_BUSY -5
-int triton_init(const char *conf_file);
+int triton_init(const char *conf_file, const char *mod_sect);
void triton_run(void);
void triton_terminate(void);
diff --git a/accel-pptpd/triton/triton_p.h b/accel-pptpd/triton/triton_p.h
index 24850bfd..0f7e7160 100644
--- a/accel-pptpd/triton/triton_p.h
+++ b/accel-pptpd/triton/triton_p.h
@@ -75,5 +75,6 @@ void triton_thread_wakeup(struct _triton_thread_t*);
int conf_load(const char *fname);
void triton_log_error(const char *fmt,...);
void triton_log_debug(const char *fmt,...);
+int load_modules(const char *name);
#endif