From 80b4df3b082f5f51afc0add1f2e59dc5822deef1 Mon Sep 17 00:00:00 2001 From: Martin Winter Date: Thu, 20 Apr 2017 23:03:03 -0700 Subject: [PATCH] lib: Add CLI option --moduledir to override default module location (needed for snap support) Signed-off-by: Martin Winter --- lib/libfrr.c | 21 ++++++++++++++++++--- lib/libfrr.h | 2 ++ lib/module.c | 6 +++--- lib/module.h | 2 +- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/lib/libfrr.c b/lib/libfrr.c index 64f8be2ca6..de83e14f0e 100644 --- a/lib/libfrr.c +++ b/lib/libfrr.c @@ -34,6 +34,7 @@ DEFINE_HOOK(frr_late_init, (struct thread_master *tm), (tm)) const char frr_sysconfdir[] = SYSCONFDIR; const char frr_vtydir[] = DAEMON_VTY_DIR; +const char frr_moduledir[] = MODULE_PATH; char config_default[256]; static char pidfile_default[256]; @@ -61,7 +62,8 @@ static void opt_extend(const struct optspec *os) } -#define OPTION_VTYSOCK 1000 +#define OPTION_VTYSOCK 1000 +#define OPTION_MODULEDIR 1002 static const struct option lo_always[] = { { "help", no_argument, NULL, 'h' }, @@ -69,6 +71,7 @@ static const struct option lo_always[] = { { "daemon", no_argument, NULL, 'd' }, { "module", no_argument, NULL, 'M' }, { "vty_socket", required_argument, NULL, OPTION_VTYSOCK }, + { "moduledir", required_argument, NULL, OPTION_MODULEDIR }, { NULL } }; static const struct optspec os_always = { @@ -77,7 +80,8 @@ static const struct optspec os_always = { " -v, --version Print program version\n" " -d, --daemon Runs in daemon mode\n" " -M, --module Load specified module\n" - " --vty_socket Override vty socket path\n", + " --vty_socket Override vty socket path\n" + " --moduledir Override modules directory\n", lo_always }; @@ -193,6 +197,7 @@ struct option_chain { struct option_chain *next; const char *arg; }; + static struct option_chain *modules = NULL, **modnext = &modules; static int errors = 0; @@ -277,6 +282,14 @@ static int frr_opt(int opt) } di->vty_sock_path = optarg; break; + case OPTION_MODULEDIR: + if (di->module_path) { + fprintf(stderr, "----moduledir option specified more than once!\n"); + errors++; + break; + } + di->module_path = optarg; + break; case 'u': if (di->flags & FRR_NO_PRIVSEP) return 1; @@ -319,6 +332,8 @@ struct thread_master *frr_init(void) struct option_chain *oc; struct frrmod_runtime *module; char moderr[256]; + const char *dir; + dir = di->module_path ? di->module_path : frr_moduledir; srandom(time(NULL)); @@ -331,7 +346,7 @@ struct thread_master *frr_init(void) frrmod_init(di->module); while (modules) { modules = (oc = modules)->next; - module = frrmod_load(oc->arg, moderr, sizeof(moderr)); + module = frrmod_load(oc->arg, dir, moderr, sizeof(moderr)); if (!module) { fprintf(stderr, "%s\n", moderr); exit(1); diff --git a/lib/libfrr.h b/lib/libfrr.h index a40fc34892..0cc7ad564b 100644 --- a/lib/libfrr.h +++ b/lib/libfrr.h @@ -52,6 +52,7 @@ struct frr_daemon_info { const char *config_file; const char *pid_file; const char *vty_path; + const char *module_path; const char *proghelp; void (*printhelp)(FILE *target); @@ -107,5 +108,6 @@ extern void frr_run(struct thread_master *master); extern char config_default[256]; extern const char frr_sysconfdir[]; extern const char frr_vtydir[]; +extern const char frr_moduledir[]; #endif /* _ZEBRA_FRR_H */ diff --git a/lib/module.c b/lib/module.c index 4ebe3c0da2..c7dd5538cd 100644 --- a/lib/module.c +++ b/lib/module.c @@ -69,7 +69,7 @@ void frrmod_init(struct frrmod_runtime *modinfo) } struct frrmod_runtime *frrmod_load(const char *spec, - char *err, size_t err_len) + const char *dir, char *err, size_t err_len) { void *handle = NULL; char name[PATH_MAX], fullpath[PATH_MAX], *args; @@ -84,12 +84,12 @@ struct frrmod_runtime *frrmod_load(const char *spec, if (!strchr(name, '/')) { if (!handle && execname) { snprintf(fullpath, sizeof(fullpath), "%s/%s_%s.so", - MODULE_PATH, execname, name); + dir, execname, name); handle = dlopen(fullpath, RTLD_NOW | RTLD_GLOBAL); } if (!handle) { snprintf(fullpath, sizeof(fullpath), "%s/%s.so", - MODULE_PATH, name); + dir, name); handle = dlopen(fullpath, RTLD_NOW | RTLD_GLOBAL); } } diff --git a/lib/module.h b/lib/module.h index cb66e60976..01819f91e1 100644 --- a/lib/module.h +++ b/lib/module.h @@ -95,7 +95,7 @@ extern struct frrmod_runtime *frrmod_list; extern void frrmod_init(struct frrmod_runtime *modinfo); extern struct frrmod_runtime *frrmod_load(const char *spec, - char *err, size_t err_len); + const char *dir, char *err, size_t err_len); #if 0 /* not implemented yet */ extern void frrmod_unload(struct frrmod_runtime *module); -- 2.39.5