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