diff --git a/client/castApp/src/Makefile b/client/castApp/src/Makefile index 0cb31e8..5ecc431 100644 --- a/client/castApp/src/Makefile +++ b/client/castApp/src/Makefile @@ -45,6 +45,7 @@ TESTS += testtcp TESTPROD_HOST += testAddEnvVars testAddEnvVars_SRCS += testAddEnvVars.c +testAddEnvVars_SRCS += dbcb.c testAddEnvVars_SYS_LIBS_WIN32 = ws2_32 TESTS += testAddEnvVars diff --git a/client/castApp/src/caster.c b/client/castApp/src/caster.c index b838797..a84395b 100644 --- a/client/castApp/src/caster.c +++ b/client/castApp/src/caster.c @@ -114,15 +114,18 @@ void casterInit(caster_t *self) self->onmsg = &casterShowMsgDefault; self->current = casterStateInit; self->timeout = reccastTimeout; + ellInit(&self->envs); ellInit(&self->exclude_patterns); + /* add default_envs to envs list which can be expanded by the user with addReccasterEnvVars iocsh function */ + addToReccasterLinkedList(self, default_envs_count, default_envs, &self->envs, "casterInit", "Default environment variable"); + if(shSocketPair(self->wakeup)) errlogPrintf("Error: casterInit failed to create shutdown socket: %d\n", SOCKERRNO); } void casterShutdown(caster_t *self) { - int i; epicsUInt32 junk = htonl(0xdeadbeef); epicsMutexMustLock(self->lock); @@ -137,13 +140,7 @@ void casterShutdown(caster_t *self) epicsEventMustWait(self->shutdownEvent); epicsMutexMustLock(self->lock); - for (i = 0; i < self->num_extra_envs; i++) { - free(self->extra_envs[i]); - } - free(self->extra_envs); - epicsMutexUnlock(self->lock); - - epicsMutexMustLock(self->lock); + ellFree(&self->envs); ellFree(&self->exclude_patterns); epicsMutexUnlock(self->lock); diff --git a/client/castApp/src/caster.h b/client/castApp/src/caster.h index 4199f6d..de5b751 100644 --- a/client/castApp/src/caster.h +++ b/client/castApp/src/caster.h @@ -22,6 +22,7 @@ epicsShareExtern double reccastTimeout; epicsShareExtern double reccastMaxHoldoff; extern const char* default_envs[]; +extern const size_t default_envs_count; typedef enum { casterUDPSetup, @@ -74,9 +75,7 @@ typedef struct _caster_t { int shutdown; char lastmsg[MAX_STRING_SIZE]; - char **extra_envs; - int num_extra_envs; - + ELLLIST envs; ELLLIST exclude_patterns; } caster_t; @@ -107,10 +106,13 @@ epicsShareFunc int casterPushPDB(void *junk, caster_t *caster); epicsShareFunc -void addReccasterEnvVars(caster_t* self, int argc, char **argv); +int addToReccasterLinkedList(caster_t* self, size_t itemCount, const char **items, ELLLIST* reccastList, const char* funcName, const char* itemDesc); + +epicsShareFunc +int addReccasterEnvVars(caster_t* self, int argc, char **argv); epicsShareFunc -void addReccasterExcludePattern(caster_t* self, int argc, char **argv); +int addReccasterExcludePattern(caster_t* self, int argc, char **argv); /* internal */ diff --git a/client/castApp/src/castinit.c b/client/castApp/src/castinit.c index bd601be..9b53973 100644 --- a/client/castApp/src/castinit.c +++ b/client/castApp/src/castinit.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,16 @@ #include "caster.h" +#ifndef VERSION_INT +# define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P)) +#endif +#ifndef EPICS_VERSION_INT +# define EPICS_VERSION_INT VERSION_INT(EPICS_VERSION, EPICS_REVISION, EPICS_MODIFICATION, EPICS_PATCH_LEVEL) +#endif +#if EPICS_VERSION_INT < VERSION_INT(7,0,3,1) +static int iocshSetError(int err) { return err; } +#endif + static caster_t thecaster; typedef struct { @@ -75,119 +86,88 @@ static void casthook(initHookState state) epicsAtExit(&castexit, NULL); } -/* - Example call: addReccasterEnvVars("SECTOR") or addReccasterEnvVars("SECTOR", "BUILDING") - Appends the given env variables to the extra_envs list to be sent in addition to the default_envs array -*/ -void addReccasterEnvVars(caster_t* self, int argc, char **argv) +/* Helper function to add items from iocsh calls to internal linked lists + * self is the caster instance + * itemCount is the number of items in the items array + * items is the array of strings to add to the list + * reccastList is the linked list to add the items to + * funcName is the name of the IOC shell function being called (for error messages) + * itemDesc is string to describe what is being added (for error messages) + */ +int addToReccasterLinkedList(caster_t* self, size_t itemCount, const char **items, ELLLIST* reccastList, const char* funcName, const char* itemDesc) { - size_t i, j; - int ret = 0; - - argv++; argc--; /* skip function arg */ - if(argc < 1) { - errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterEnvVars\n"); - return; - } + size_t i; + int dup; + ELLNODE *cur; epicsMutexMustLock(self->lock); if(self->shutdown) { /* shutdown in progress, silent no-op */ epicsMutexUnlock(self->lock); - return; + return 0; } else if(self->current != casterStateInit) { /* Attempt to add after iocInit(), when we may be connected. - To fully support, would need to force reconnect or resend w/ updated envs list. */ - errlogSevPrintf(errlogMinor, "addReccasterEnvVars called after iocInit() when reccaster might already be connected. Not supported\n"); + To fully support, would need to force reconnect or resend w/ updated list. */ + errlogSevPrintf(errlogMinor, "%s called after iocInit() when reccaster might already be connected. Not supported\n", funcName); epicsMutexUnlock(self->lock); - return; + return -1; } - int new_extra_envs_size = self->num_extra_envs + argc; - int num_new_extra_envs = self->num_extra_envs; - char **new_extra_envs = calloc(new_extra_envs_size, sizeof(*new_extra_envs)); - if(new_extra_envs == NULL) { - errlogSevPrintf(errlogMajor, "Error in memory allocation of new_extra_envs from addReccasterEnvVars\n"); - epicsMutexUnlock(self->lock); - return; - } - /* copy self->extra_envs into new_extra_envs with room for new envs */ - for(i=0; i < self->num_extra_envs; i++) { - if((new_extra_envs[i] = strdup(self->extra_envs[i])) == NULL) { - errlogSevPrintf(errlogMinor, "strdup error for copying %s to new_extra_envs[%zu] from addReccasterEnvVars\n", self->extra_envs[i], i); - ret = 1; - break; - } - } - int found_dup; /* sanitize input - check for dups and empty args */ - if(!ret) { - for(i=0; i < argc; i++) { - if(argv[i] == NULL) { - errlogSevPrintf(errlogMinor, "Arg is NULL for addReccasterEnvVars\n"); - continue; - } - else if(argv[i][0] == '\0') { - errlogSevPrintf(errlogMinor, "Arg is empty for addReccasterEnvVars\n"); - continue; - } - found_dup = 0; - /* check if dup in self->default_envs */ - for(j = 0; default_envs[j]; j++) { - if(strcmp(argv[i], default_envs[j]) == 0) { - found_dup = 1; - errlogSevPrintf(errlogMinor, "Env var %s is already in env list sent by reccaster by default\n", argv[i]); - break; - } - } - if(found_dup) { - continue; - } - /* check if dup in self->extra_envs */ - for(j = 0; j < num_new_extra_envs; j++) { - if(new_extra_envs[j] == NULL) { - continue; - } - if(strcmp(argv[i], new_extra_envs[j]) == 0) { - found_dup = 1; - errlogSevPrintf(errlogMinor, "Env var %s is already in extra_envs list\n", argv[i]); - break; - } - } - if(found_dup) { - continue; - } - if((new_extra_envs[num_new_extra_envs] = strdup(argv[i])) == NULL) { - errlogSevPrintf(errlogMinor, "strdup error for copying %s to new_extra_envs[%d] from addReccasterEnvVars\n", argv[i], num_new_extra_envs); - ret = 1; + for (i = 0; i < itemCount; i++) { + const size_t arg_len = strlen(items[i]) + 1; + if(items[i][0] == '\0') { + errlogSevPrintf(errlogMinor, "Arg is empty for %s\n", funcName); + continue; + } + dup = 0; + /* check if dup in existing linked list */ + for(cur = ellFirst(reccastList); cur; cur = ellNext(cur)) { + string_list_t *pitem = CONTAINER(cur, string_list_t, node); + if (strcmp(items[i], pitem->item_str) == 0) { + dup = 1; break; } - /* this is a valid arg and we have added the new env var to our array, increment new_extra_envs count */ - num_new_extra_envs++; } + if(dup) { + errlogSevPrintf(errlogMinor, "%s %s already in list for %s\n", itemDesc, items[i], funcName); + continue; + } + string_list_t *new_node = mallocMustSucceed(sizeof(string_list_t) + arg_len, funcName); + new_node->item_str = (char *)(new_node + 1); + memcpy(new_node->item_str, items[i], arg_len); + + ellAdd(reccastList, &new_node->node); } - /* if we have no allocation issues and have at least one new env var that is valid, add to self->extra_envs */ - if(!ret && num_new_extra_envs > self->num_extra_envs) { - /* from this point, nothing can fail */ - char ** tmp; - tmp = self->extra_envs; /* swap pointers so we can clean up new_extra_envs on success/failure */ - self->extra_envs = new_extra_envs; - new_extra_envs = tmp; - - new_extra_envs_size = self->num_extra_envs; /* with swap of pointers also swap size */ - self->num_extra_envs = num_new_extra_envs; - } - /* cleanup new_extra_envs[] on success or failure */ - for(i = 0; i < new_extra_envs_size; i++) { - free(new_extra_envs[i]); - } - free(new_extra_envs); epicsMutexUnlock(self->lock); + return 0; +} + +/* Example call: addReccasterEnvVars("SECTOR") or addReccasterEnvVars("SECTOR", "BUILDING") + * Appends the given env variables to the envs list to be sent. This includes some hard-coded env vars sent by default + */ +int addReccasterEnvVars(caster_t* self, int argc, char **argv) +{ + argv++; argc--; /* skip function arg */ + if(argc < 1) { + errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterEnvVars\n"); + return -1; + } + return addToReccasterLinkedList(self, argc, (const char **)argv, &self->envs, "addReccasterEnvVars", "Environment variable"); +} - if(ret) { - errlogSevPrintf(errlogMajor, "Error in addReccasterEnvVars - reccaster might not send the extra env vars specified\n"); +/* Example call: addReccasterExcludePattern("TEST:*") or addReccasterExcludePattern("TEST:*", "*_") + * Appends the given patterns to the exclude_patterns list so those PVs and their meta-data are not sent + */ +int addReccasterExcludePattern(caster_t* self, int argc, char **argv) +{ + argv++; argc--; /* skip function arg */ + if(argc < 1) { + errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterExcludePattern\n"); + return -1; } + return addToReccasterLinkedList(self, argc, (const char **)argv, &self->exclude_patterns, "addReccasterExcludePattern", "Exclude pattern"); } static const iocshArg addReccasterEnvVarsArg0 = { "environmentVar", iocshArgArgv }; @@ -205,58 +185,7 @@ static const iocshFuncDef addReccasterEnvVarsFuncDef = { }; static void addReccasterEnvVarsCallFunc(const iocshArgBuf *args) { - addReccasterEnvVars(&thecaster, args[0].aval.ac, args[0].aval.av); -} - -void addReccasterExcludePattern(caster_t* self, int argc, char **argv) { - size_t i; - int dup; - ELLNODE *cur; - argv++; argc--; /* skip function arg */ - if (argc < 1) { - errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterExcludePattern\n"); - return; - } - epicsMutexMustLock(self->lock); - if (self->shutdown) { - /* shutdown in progress, silent no-op */ - epicsMutexUnlock(self->lock); - return; - } - /* error if called after iocInit() */ - if (self->current != casterStateInit) { - errlogSevPrintf(errlogMinor, "addReccasterExcludePattern called after iocInit() when reccaster might already be connected. Not supported\n"); - epicsMutexUnlock(self->lock); - return; - } - - for (i = 0; i < argc; i++) { - const size_t arg_len = strlen(argv[i]) + 1; - if (argv[i][0] == '\0') { - errlogSevPrintf(errlogMinor, "Arg is empty for addReccasterExcludePattern\n"); - continue; - } - /* check duplicates */ - dup = 0; - for(cur = ellFirst(&self->exclude_patterns); cur; cur = ellNext(cur)) { - const string_list_t *ppattern = CONTAINER(cur, string_list_t, node); - if (strcmp(argv[i], ppattern->item_str) == 0) { - dup = 1; - break; - } - } - if (dup) { - errlogSevPrintf(errlogMinor, "Duplicate pattern %s in addReccasterExcludePattern\n", argv[i]); - continue; - } - string_list_t *new_node = mallocMustSucceed(sizeof(string_list_t) + arg_len, "addReccasterExcludePattern"); - new_node->item_str = (char *)(new_node + 1); - memcpy(new_node->item_str, argv[i], arg_len); - - ellAdd(&self->exclude_patterns, &new_node->node); - } - - epicsMutexUnlock(self->lock); + iocshSetError(addReccasterEnvVars(&thecaster, args[0].aval.ac, args[0].aval.av)); } static const iocshArg addReccasterExcludePatternArg0 = { "excludePattern", iocshArgArgv }; @@ -264,11 +193,17 @@ static const iocshArg * const addReccasterExcludePatternArgs[] = { &addReccaster static const iocshFuncDef addReccasterExcludePatternFuncDef = { "addReccasterExcludePattern", 1, - addReccasterExcludePatternArgs + addReccasterExcludePatternArgs, +#ifdef IOCSHFUNCDEF_HAS_USAGE + "By default, reccaster will send all PVs on IOC startup.\n" + "This function allows you to exclude PVs by specifying patterns to exclude.\n" + "Must be called before iocInit\n" + "Example: addReccasterExcludePattern 'TEST:*' '*_'\n" +#endif }; - -static void addReccasterExcludePatternCallFunc(const iocshArgBuf *args) { - addReccasterExcludePattern(&thecaster, args[0].aval.ac, args[0].aval.av); +static void addReccasterExcludePatternCallFunc(const iocshArgBuf *args) +{ + iocshSetError(addReccasterExcludePattern(&thecaster, args[0].aval.ac, args[0].aval.av)); } static void reccasterRegistrar(void) diff --git a/client/castApp/src/dbcb.c b/client/castApp/src/dbcb.c index 7559e19..7ede086 100644 --- a/client/castApp/src/dbcb.c +++ b/client/castApp/src/dbcb.c @@ -35,7 +35,6 @@ const char* default_envs[] = "PWD", "EPICS_HOST_ARCH", "IOCNAME", - "HOSTNAME", /* iocStats */ "ENGINEER", @@ -43,10 +42,11 @@ const char* default_envs[] = NULL }; +const size_t default_envs_count = NELEMENTS(default_envs) - 1; /* exclude NULL */ static int pushEnv(caster_t *caster) { - size_t i; + ELLNODE *cur; int ret = 0; if(!getenv("HOSTNAME")) { @@ -63,21 +63,14 @@ static int pushEnv(caster_t *caster) if(ret) ERRRET(ret, caster, "Failed to send epics version"); - for(i=0; !ret && default_envs[i]; i++) { - const char *val = getenv(default_envs[i]); - if(val && val[0]!='\0') - ret = casterSendInfo(caster, 0, default_envs[i], val); - if(ret) - casterMsg(caster, "Error sending env %s", default_envs[i]); - } - epicsMutexMustLock(caster->lock); - for (i = 0; !ret && i < caster->num_extra_envs; i++) { - const char *val = getenv(caster->extra_envs[i]); + for(cur = ellFirst(&caster->envs); !ret && cur; cur = ellNext(cur)) { + const string_list_t *penvvar = CONTAINER(cur, string_list_t, node); + const char *val = getenv(penvvar->item_str); if (val && val[0] != '\0') - ret = casterSendInfo(caster, 0, caster->extra_envs[i], val); + ret = casterSendInfo(caster, 0, penvvar->item_str, val); if (ret) - casterMsg(caster, "Error sending env %s", caster->extra_envs[i]); + casterMsg(caster, "Error sending env %s", penvvar->item_str); } epicsMutexUnlock(caster->lock); diff --git a/client/castApp/src/testAddEnvVars.c b/client/castApp/src/testAddEnvVars.c index fb81f12..696bc1e 100644 --- a/client/castApp/src/testAddEnvVars.c +++ b/client/castApp/src/testAddEnvVars.c @@ -14,7 +14,7 @@ static void testLog(void* arg, struct _caster_t* self) static void testAddEnvVarsX(void) { - int i; + int i = 0; caster_t caster; casterInit(&caster); caster.onmsg = &testLog; @@ -29,79 +29,116 @@ static void testAddEnvVarsX(void) "BUILDING", "CONTACT", "DEVICE", - "Field", "FAMILY" }; - int expectedNumExtraEnvs = 0; + int expectedNumExtraEnvs = default_envs_count; testDiag("Testing addReccasterEnvVars with one good env"); argvlist[1] = "SECTOR"; argc = 2; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); + i = 0; + testOk1(caster.envs.count==expectedNumExtraEnvs); addReccasterEnvVars(&caster, argc, argvlist); expectedNumExtraEnvs++; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - for(i=0; i < expectedNumExtraEnvs; i++) { - testOk1(strcmp(caster.extra_envs[i], expectedExtraEnvs[i]) == 0); + testOk1(caster.envs.count==expectedNumExtraEnvs); + ELLNODE *cur; + cur = ellFirst(&caster.envs); + while (cur != NULL) { + string_list_t *temp = (string_list_t *)cur; + if (i < default_envs_count) { + testOk1(strcmp(temp->item_str, default_envs[i]) == 0); + } + else { + testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - default_envs_count]) == 0); + } + i++; + cur = ellNext(cur); } testDiag("Testing addReccasterEnvVars with two more good envs"); argvlist[1] = "BUILDING"; argvlist[2] = "CONTACT"; argc = 3; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); + i = 0; + testOk1(caster.envs.count==expectedNumExtraEnvs); addReccasterEnvVars(&caster, argc, argvlist); expectedNumExtraEnvs += 2; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - for(i=0; i < expectedNumExtraEnvs; i++) { - testOk1(strcmp(caster.extra_envs[i], expectedExtraEnvs[i]) == 0); + testOk1(caster.envs.count==expectedNumExtraEnvs); + cur = ellFirst(&caster.envs); + while (cur != NULL) { + string_list_t *temp = (string_list_t *)cur; + if (i < default_envs_count) { + testOk1(strcmp(temp->item_str, default_envs[i]) == 0); + } + else { + testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - default_envs_count]) == 0); + } + i++; + cur = ellNext(cur); } testDiag("Testing addReccasterEnvVars with duplicate env"); argvlist[1] = "SECTOR"; argc = 2; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); + i = 0; + testOk1(caster.envs.count==expectedNumExtraEnvs); addReccasterEnvVars(&caster, argc, argvlist); - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - for(i=0; i < expectedNumExtraEnvs; i++) { - testOk1(strcmp(caster.extra_envs[i], expectedExtraEnvs[i]) == 0); + testOk1(caster.envs.count==expectedNumExtraEnvs); + cur = ellFirst(&caster.envs); + while (cur != NULL) { + string_list_t *temp = (string_list_t *)cur; + if (i < default_envs_count) { + testOk1(strcmp(temp->item_str, default_envs[i]) == 0); + } + else { + testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - default_envs_count]) == 0); + } + i++; + cur = ellNext(cur); } testDiag("Testing addReccasterEnvVars with one dup and one good env"); argvlist[1] = "CONTACT"; argvlist[2] = "DEVICE"; argc = 3; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); + i = 0; + testOk1(caster.envs.count==expectedNumExtraEnvs); addReccasterEnvVars(&caster, argc, argvlist); expectedNumExtraEnvs++; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - for(i=0; i < expectedNumExtraEnvs; i++) { - testOk1(strcmp(caster.extra_envs[i], expectedExtraEnvs[i]) == 0); - } - - testDiag("Testing addReccasterEnvVars with NULL argument and then a good env"); - argvlist[1] = NULL; - argvlist[2] = "Field"; - argc = 3; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - addReccasterEnvVars(&caster, argc, argvlist); - expectedNumExtraEnvs++; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - for(i=0; i < expectedNumExtraEnvs; i++) { - testOk1(strcmp(caster.extra_envs[i], expectedExtraEnvs[i]) == 0); + testOk1(caster.envs.count==expectedNumExtraEnvs); + cur = ellFirst(&caster.envs); + while (cur != NULL) { + string_list_t *temp = (string_list_t *)cur; + if (i < default_envs_count) { + testOk1(strcmp(temp->item_str, default_envs[i]) == 0); + } + else { + testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - default_envs_count]) == 0); + } + i++; + cur = ellNext(cur); } testDiag("Testing addReccasterEnvVars with a good env and a dup of that env"); - argvlist[1] = NULL; + argvlist[1] = "FAMILY"; argvlist[2] = "FAMILY"; - argvlist[3] = "FAMILY"; - argc = 4; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); + argc = 3; + i = 0; + testOk1(caster.envs.count==expectedNumExtraEnvs); addReccasterEnvVars(&caster, argc, argvlist); expectedNumExtraEnvs++; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - for(i=0; i < expectedNumExtraEnvs; i++) { - testOk1(strcmp(caster.extra_envs[i], expectedExtraEnvs[i]) == 0); + testOk1(caster.envs.count==expectedNumExtraEnvs); + cur = ellFirst(&caster.envs); + while (cur != NULL) { + string_list_t *temp = (string_list_t *)cur; + if (i < default_envs_count) { + testOk1(strcmp(temp->item_str, default_envs[i]) == 0); + } + else { + testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - default_envs_count]) == 0); + } + i++; + cur = ellNext(cur); } testDiag("Testing addReccasterEnvVars with a env vars from default list"); @@ -111,11 +148,21 @@ static void testAddEnvVarsX(void) argvlist[4] = "RSRV_SERVER_PORT"; argvlist[5] = "ENGINEER"; argc = 6; - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); + i = 0; + testOk1(caster.envs.count==expectedNumExtraEnvs); addReccasterEnvVars(&caster, argc, argvlist); - testOk1(caster.num_extra_envs==expectedNumExtraEnvs); - for(i=0; i < expectedNumExtraEnvs; i++) { - testOk1(strcmp(caster.extra_envs[i], expectedExtraEnvs[i]) == 0); + testOk1(caster.envs.count==expectedNumExtraEnvs); /* these are all defaults so the count should not change */ + cur = ellFirst(&caster.envs); + while (cur != NULL) { + string_list_t *temp = (string_list_t *)cur; + if (i < default_envs_count) { + testOk1(strcmp(temp->item_str, default_envs[i]) == 0); + } + else { + testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - default_envs_count]) == 0); + } + i++; + cur = ellNext(cur); } epicsEventSignal(caster.shutdownEvent); @@ -129,28 +176,21 @@ static void testAddEnvVarsBadInput(void) caster.onmsg = &testLog; int argc; - char *argvlist[2]; + char *argvlist[3]; argvlist[0] = "addReccasterEnvVars"; testDiag("Testing addReccasterEnvVars with no arguments"); argc = 1; - testOk1(caster.num_extra_envs==0); + testOk1(caster.envs.count==default_envs_count); addReccasterEnvVars(&caster, argc, argvlist); - testOk1(caster.num_extra_envs==0); + testOk1(caster.envs.count==default_envs_count); testDiag("Testing addReccasterEnvVars with empty string argument"); argvlist[1] = ""; argc = 2; - testOk1(caster.num_extra_envs==0); - addReccasterEnvVars(&caster, argc, argvlist); - testOk1(caster.num_extra_envs==0); - - testDiag("Testing addReccasterEnvVars with NULL argument"); - argvlist[1] = NULL; - argc = 2; - testOk1(caster.num_extra_envs==0); + testOk1(caster.envs.count==default_envs_count); addReccasterEnvVars(&caster, argc, argvlist); - testOk1(caster.num_extra_envs==0); + testOk1(caster.envs.count==default_envs_count); epicsEventSignal(caster.shutdownEvent); casterShutdown(&caster); @@ -158,7 +198,7 @@ static void testAddEnvVarsBadInput(void) MAIN(testAddEnvVars) { - testPlan(48); + testPlan(37 + default_envs_count * 6); osiSockAttach(); testAddEnvVarsX(); testAddEnvVarsBadInput();