From be99f2bb6e42736893937a7e4ded959ba4f8de33 Mon Sep 17 00:00:00 2001 From: Dirk Zimoch <dirk.zimoch@psi.ch> Date: Wed, 4 Jul 2018 15:06:45 +0200 Subject: [PATCH] save and restore MODULE and MODULE_DIR after running a script, because that script may have called require --- require.c | 1 + runScript.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/require.c b/require.c index 43edffe4..e22c6e1a 100644 --- a/require.c +++ b/require.c @@ -638,6 +638,7 @@ void registerModule(const char* module, const char* version, const char* locatio putenvprintf("%s_VERSION=%s", module, version); if (location) { + putenvprintf("MODULE_DIR=%s", m->content+lm+lv); putenvprintf("%s_DIR=%s", module, m->content+lm+lv); pathAdd("SCRIPT_PATH", m->content+lm+lv); } diff --git a/runScript.c b/runScript.c index daf79fa3..62a94984 100644 --- a/runScript.c +++ b/runScript.c @@ -50,6 +50,9 @@ epicsShareFunc int epicsShareAPI iocshCmd(const char *cmd); #include "expr.h" #include "require.h" +#define SAVEENV(var) do { old_##var = getenv(#var); if (old_##var) old_##var=strdup(old_##var); } while(0) +#define RESTOREENV(var) do { if(old_##var) { putenvprintf("%s=%s", #var, old_##var); free(old_##var); }} while(0) + int runScriptDebug=0; int runScript(const char* filename, const char* args) @@ -63,6 +66,8 @@ int runScript(const char* filename, const char* args) long len; char** pairs; int status = 0; + char* old_MODULE = NULL; + char* old_MODULE_DIR = NULL; if (!filename) { @@ -161,8 +166,12 @@ int runScript(const char* filename, const char* args) } } if (file == NULL) { perror(filename); return errno; } + + /* save some environments variables */ + SAVEENV(MODULE); + SAVEENV(MODULE_DIR); - /* line by line after expanding macros with arguments or environment */ + /* execute script line by line after expanding macros with arguments or environment */ while (fgets(line_raw, line_raw_size, file)) { char* p, *x; @@ -246,6 +255,11 @@ end: free(line_exp); if (mac) macDeleteHandle(mac); if (file) fclose(file); + + /* restore environment */ + RESTOREENV(MODULE); + RESTOREENV(MODULE_DIR); + return status; } -- GitLab