diff options
Diffstat (limited to 'accel-pptpd/triton')
-rw-r--r-- | accel-pptpd/triton/loader.c | 40 | ||||
-rw-r--r-- | accel-pptpd/triton/triton.c | 7 | ||||
-rw-r--r-- | accel-pptpd/triton/triton.h | 2 | ||||
-rw-r--r-- | accel-pptpd/triton/triton_p.h | 1 |
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, §->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 |