From 7151fbe498a3dd47a6d3e3dcb2f6e2a3ff5625da Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Wed, 3 Oct 2018 15:03:11 +0200 Subject: [PATCH 1/5] implement epicsEnvUnset --- src/libCom/iocsh/libComRegister.c | 16 ++++++++++++++++ src/libCom/osi/os/Darwin/osdEnv.c | 10 ++++++++++ src/libCom/osi/os/default/osdEnv.c | 12 ++++++++++++ src/libCom/osi/os/iOS/osdEnv.c | 10 ++++++++++ src/libCom/osi/os/vxWorks/osdEnv.c | 19 +++++++++++++++++++ 5 files changed, 67 insertions(+) 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..27cb1efd2 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 exsiting name but without "=..." deletes the variable. + */ + +epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name) +{ + iocshEnvClear(name); + if (getenv(name) != NULL) + putenv(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..f09897681 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 uset 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 */ From 65714033eafa3f4416583ca540ca5f25d72edd83 Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Wed, 3 Oct 2018 15:29:30 +0200 Subject: [PATCH 2/5] remove compiler warning --- src/libCom/osi/os/default/osdEnv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libCom/osi/os/default/osdEnv.c b/src/libCom/osi/os/default/osdEnv.c index 27cb1efd2..d069f4639 100644 --- a/src/libCom/osi/os/default/osdEnv.c +++ b/src/libCom/osi/os/default/osdEnv.c @@ -64,7 +64,7 @@ epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name) { iocshEnvClear(name); if (getenv(name) != NULL) - putenv(name); + putenv((char*)name); } /* From ce3eadde3487ee9266807a9f0be8a45e8d103d9c Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Fri, 5 Oct 2018 10:50:01 +0200 Subject: [PATCH 3/5] add missing epicsEnvUnset to header --- src/libCom/env/envDefs.h | 1 + 1 file changed, 1 insertion(+) 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 From c3995a9d63fefcc0be6abf0ecd8e8c42995aed05 Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Fri, 5 Oct 2018 17:00:35 +0200 Subject: [PATCH 4/5] added simple test case for epicsEnvUnset --- src/libCom/test/Makefile | 5 ++++ src/libCom/test/epicsEnvUnsetTest.c | 38 +++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/libCom/test/epicsEnvUnsetTest.c 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..3697a4b80 --- /dev/null +++ b/src/libCom/test/epicsEnvUnsetTest.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +#include "macLib.h" +#include "envDefs.h" +#include "errlog.h" +#include "epicsUnitTest.h" +#include "testMain.h" + +static void check(const char* variable, const char* expected) +{ + const char* value; + + value = getenv(variable); + if (!testOk((!expected && !value) || (expected && value && strcmp(expected, value) == 0), + "%s = \"%s\"", variable, value)) + { + testDiag("should have been \"%s\"", expected); + } +} + + +MAIN(epicsEnvUnsetTest) +{ + eltc(0); + testPlan(3); + + check("TEST_VAR_A",NULL); + epicsEnvSet("TEST_VAR_A","test value"); + check("TEST_VAR_A","test value"); + epicsEnvUnset("TEST_VAR_A"); + check("TEST_VAR_A",NULL); + + testDone(); + return 0; +} From 701ef5b93691e83f444ff9b4addfcbf6fdb55072 Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Mon, 8 Oct 2018 10:49:25 +0200 Subject: [PATCH 5/5] mention epicsEnvUnset in RELEASE_NOTES.html --- documentation/RELEASE_NOTES.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 710798082..cd8ca9012 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -16,6 +16,10 @@ +

Unsetting environment variables

+The new command epicsEnvUnset varname can be used to +unset an environment variable. +

Fix problem with numeric soft events

Changing from numeric to named soft events introduced an incompatibility when a numeric event 1-255 is converted from a DOUBLE, e.g. from a calc record.