diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 84e8899e9..93345e652 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -16,6 +16,11 @@ +
The new command epicsEnvUnset varname can be used to
+unset an environment variable.
The libCom macro expansion library has been modified so that when the
diff --git a/src/libCom/env/envDefs.h b/src/libCom/env/envDefs.h
index ac6132541..20f0eb2ad 100644
--- a/src/libCom/env/envDefs.h
+++ b/src/libCom/env/envDefs.h
@@ -95,6 +95,7 @@ epicsShareFunc long epicsShareAPI
envGetBoolConfigParam(const ENV_PARAM *pParam, int *pBool);
epicsShareFunc long epicsShareAPI epicsPrtEnvParams(void);
epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *value);
+epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name);
epicsShareFunc void epicsShareAPI epicsEnvShow (const char *name);
#ifdef __cplusplus
diff --git a/src/libCom/iocsh/libComRegister.c b/src/libCom/iocsh/libComRegister.c
index d3a5cfac4..d8429fa9f 100644
--- a/src/libCom/iocsh/libComRegister.c
+++ b/src/libCom/iocsh/libComRegister.c
@@ -110,6 +110,21 @@ static void epicsEnvSetCallFunc(const iocshArgBuf *args)
epicsEnvSet (name, value);
}
+/* epicsEnvUnset */
+static const iocshArg epicsEnvUnsetArg0 = { "name",iocshArgString};
+static const iocshArg * const epicsEnvUnsetArgs[1] = {&epicsEnvUnsetArg0};
+static const iocshFuncDef epicsEnvUnsetFuncDef = {"epicsEnvUnset",1,epicsEnvUnsetArgs};
+static void epicsEnvUnsetCallFunc(const iocshArgBuf *args)
+{
+ char *name = args[0].sval;
+
+ if (name == NULL) {
+ fprintf(stderr, "Missing environment variable name argument.\n");
+ return;
+ }
+ epicsEnvUnset (name);
+}
+
/* epicsParamShow */
static const iocshFuncDef epicsParamShowFuncDef = {"epicsParamShow",0,NULL};
static void epicsParamShowCallFunc(const iocshArgBuf *args)
@@ -367,6 +382,7 @@ void epicsShareAPI libComRegister(void)
iocshRegister(&pwdFuncDef, pwdCallFunc);
iocshRegister(&epicsEnvSetFuncDef, epicsEnvSetCallFunc);
+ iocshRegister(&epicsEnvUnsetFuncDef, epicsEnvUnsetCallFunc);
iocshRegister(&epicsParamShowFuncDef, epicsParamShowCallFunc);
iocshRegister(&epicsPrtEnvParamsFuncDef, epicsPrtEnvParamsCallFunc);
iocshRegister(&epicsEnvShowFuncDef, epicsEnvShowCallFunc);
diff --git a/src/libCom/osi/os/Darwin/osdEnv.c b/src/libCom/osi/os/Darwin/osdEnv.c
index ab3f93644..f7ff12ced 100644
--- a/src/libCom/osi/os/Darwin/osdEnv.c
+++ b/src/libCom/osi/os/Darwin/osdEnv.c
@@ -39,6 +39,16 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
setenv(name, value, 1);
}
+/*
+ * Unset an environment variable
+ */
+
+epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
+{
+ iocshEnvClear(name);
+ unsetenv(name);
+}
+
/*
* Show the value of the specified, or all, environment variables
*/
diff --git a/src/libCom/osi/os/default/osdEnv.c b/src/libCom/osi/os/default/osdEnv.c
index 682bcc934..0f6fb250d 100644
--- a/src/libCom/osi/os/default/osdEnv.c
+++ b/src/libCom/osi/os/default/osdEnv.c
@@ -55,6 +55,18 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
}
}
+/*
+ * Unset an environment variable
+ * Using putenv with a an existing name but without "=..." deletes
+ */
+
+epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
+{
+ iocshEnvClear(name);
+ if (getenv(name) != NULL)
+ putenv((char*)name);
+}
+
/*
* Show the value of the specified, or all, environment variables
*/
diff --git a/src/libCom/osi/os/iOS/osdEnv.c b/src/libCom/osi/os/iOS/osdEnv.c
index a32cce5ef..0c256725c 100644
--- a/src/libCom/osi/os/iOS/osdEnv.c
+++ b/src/libCom/osi/os/iOS/osdEnv.c
@@ -36,6 +36,16 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
setenv(name, value, 1);
}
+/*
+ * Unset an environment variable
+ */
+
+epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
+{
+ iocshEnvClear(name);
+ unsetenv(name);
+}
+
/*
* Show the value of the specified, or all, environment variables
*/
diff --git a/src/libCom/osi/os/vxWorks/osdEnv.c b/src/libCom/osi/os/vxWorks/osdEnv.c
index c81f49316..88e0ba078 100644
--- a/src/libCom/osi/os/vxWorks/osdEnv.c
+++ b/src/libCom/osi/os/vxWorks/osdEnv.c
@@ -51,6 +51,25 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
}
}
+/*
+ * Unset an environment variable
+ * Basically destroy the name of that variable because vxWorks does not
+ * support to really unset an environment variable.
+ */
+
+epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
+{
+ char* var;
+
+ if (!name) return;
+ iocshEnvClear(name);
+ var = getenv(name);
+ if (!var) return;
+ var -= strlen(name);
+ var --;
+ *var = 0;
+}
+
/*
* Show the value of the specified, or all, environment variables
*/
diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile
index 89eb87f6f..c80339317 100755
--- a/src/libCom/test/Makefile
+++ b/src/libCom/test/Makefile
@@ -62,6 +62,11 @@ epicsEnvTest_SRCS += epicsEnvTest.c
testHarness_SRCS += epicsEnvTest.c
TESTS += epicsEnvTest
+TESTPROD_HOST += epicsEnvUnsetTest
+epicsEnvUnsetTest_SRCS += epicsEnvUnsetTest.c
+testHarness_SRCS += epicsEnvUnsetTest.c
+TESTS += epicsEnvUnsetTest
+
TESTPROD_HOST += epicsErrlogTest
epicsErrlogTest_SRCS += epicsErrlogTest.c
testHarness_SRCS += epicsErrlogTest.c
diff --git a/src/libCom/test/epicsEnvUnsetTest.c b/src/libCom/test/epicsEnvUnsetTest.c
new file mode 100644
index 000000000..e9d0f8603
--- /dev/null
+++ b/src/libCom/test/epicsEnvUnsetTest.c
@@ -0,0 +1,37 @@
+#include