Skip to content

Commit f40f162

Browse files
committed
Combine default_envs and extra_envs into one linked list for addReccasterEnvVars
1 parent e93ca6e commit f40f162

File tree

5 files changed

+113
-75
lines changed

5 files changed

+113
-75
lines changed

client/castApp/src/caster.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <epicsAssert.h>
88
#include <epicsThread.h>
99
#include <epicsStdio.h>
10+
#include <cantProceed.h>
1011

1112
#define epicsExportSharedSymbols
1213

@@ -106,6 +107,7 @@ void casterShowMsgDefault(void* arg, struct _caster_t* self)
106107

107108
void casterInit(caster_t *self)
108109
{
110+
size_t i;
109111
memset(self, 0, sizeof(*self));
110112
self->udpport = RECAST_PORT;
111113
self->shutdownEvent = epicsEventMustCreate(epicsEventEmpty);
@@ -114,9 +116,18 @@ void casterInit(caster_t *self)
114116
self->onmsg = &casterShowMsgDefault;
115117
self->current = casterStateInit;
116118
self->timeout = reccastTimeout;
117-
ellInit(&self->extra_envs);
119+
ellInit(&self->envs);
118120
ellInit(&self->exclude_patterns);
119121

122+
/* add default_envs to envs list which can be expanded by the user with addReccasterEnvVars iocsh function */
123+
for (i = 0; default_envs[i]; i++) {
124+
const size_t arg_len = strlen(default_envs[i]) + 1;
125+
string_list_t *new_node = mallocMustSucceed(sizeof(string_list_t) + arg_len, "casterInit");
126+
new_node->item_str = (char *)(new_node + 1);
127+
memcpy(new_node->item_str, default_envs[i], arg_len);
128+
ellAdd(&self->envs, &new_node->node);
129+
}
130+
120131
if(shSocketPair(self->wakeup))
121132
errlogPrintf("Error: casterInit failed to create shutdown socket: %d\n", SOCKERRNO);
122133
}
@@ -137,7 +148,7 @@ void casterShutdown(caster_t *self)
137148
epicsEventMustWait(self->shutdownEvent);
138149

139150
epicsMutexMustLock(self->lock);
140-
ellFree(&self->extra_envs);
151+
ellFree(&self->envs);
141152
ellFree(&self->exclude_patterns);
142153
epicsMutexUnlock(self->lock);
143154

client/castApp/src/caster.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ typedef struct _caster_t {
7474
int shutdown;
7575
char lastmsg[MAX_STRING_SIZE];
7676

77-
ELLLIST extra_envs;
77+
ELLLIST envs;
7878

7979
ELLLIST exclude_patterns;
8080

client/castApp/src/castinit.c

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,19 @@ static void casthook(initHookState state)
7676
}
7777

7878
/* Helper function to add items from iocsh calls to internal linked lists
79+
* self is the caster instance
80+
* itemCount is the number of items we want to add
81+
* items is an array of strings to add to the list
82+
* reccastList is the linked list to add the items to
7983
* funcName is the name of the IOC shell function being called (for error messages)
8084
* itemDesc is string to describe what is being added (for error messages)
81-
* defaultArray is an optional arg for a default list to also check for duplicates
8285
*/
83-
static void addToReccasterLinkedList(caster_t* self, int argc, char **argv, ELLLIST* list, const char* funcName, const char* itemDesc, const char** defaultArray)
86+
static void addToReccasterLinkedList(caster_t* self, int itemCount, char **items, ELLLIST* reccastList, const char* funcName, const char* itemDesc)
8487
{
85-
size_t i, j;
88+
size_t i;
8689
int dup;
8790
ELLNODE *cur;
88-
argv++; argc--; /* skip function arg */
89-
if(argc < 1) {
90-
errlogSevPrintf(errlogMinor, "At least one argument expected for %s\n", funcName);
91-
return;
92-
}
91+
9392
epicsMutexMustLock(self->lock);
9493
if(self->shutdown) {
9594
/* shutdown in progress, silent no-op */
@@ -105,61 +104,58 @@ static void addToReccasterLinkedList(caster_t* self, int argc, char **argv, ELLL
105104
}
106105

107106
/* sanitize input - check for dups and empty args */
108-
for (i = 0; i < argc; i++) {
109-
const size_t arg_len = strlen(argv[i]) + 1;
110-
if(argv[i][0] == '\0') {
107+
for (i = 0; i < itemCount; i++) {
108+
const size_t arg_len = strlen(items[i]) + 1;
109+
if(items[i][0] == '\0') {
111110
errlogSevPrintf(errlogMinor, "Arg is empty for %s\n", funcName);
112111
continue;
113112
}
114113
dup = 0;
115-
/* if the defaultArray arg is used, check if this is a duplicate */
116-
if (defaultArray) {
117-
for(j = 0; defaultArray[j]; j++) {
118-
if(strcmp(argv[i], defaultArray[j]) == 0) {
119-
dup = 1;
120-
break;
121-
}
122-
}
123-
if(dup) {
124-
errlogSevPrintf(errlogMinor, "Item %s is already in list sent by reccaster by default\n", argv[i]);
125-
continue;
126-
}
127-
}
128114
/* check if dup in existing linked list */
129-
for(cur = ellFirst(list); cur; cur = ellNext(cur)) {
115+
for(cur = ellFirst(reccastList); cur; cur = ellNext(cur)) {
130116
string_list_t *pitem = CONTAINER(cur, string_list_t, node);
131-
if (strcmp(argv[i], pitem->item_str) == 0) {
117+
if (strcmp(items[i], pitem->item_str) == 0) {
132118
dup = 1;
133119
break;
134120
}
135121
}
136122
if(dup) {
137-
errlogSevPrintf(errlogMinor, "%s %s already in list for %s\n", itemDesc, argv[i], funcName);
123+
errlogSevPrintf(errlogMinor, "%s %s already in list for %s\n", itemDesc, items[i], funcName);
138124
continue;
139125
}
140126
string_list_t *new_node = mallocMustSucceed(sizeof(string_list_t) + arg_len, funcName);
141127
new_node->item_str = (char *)(new_node + 1);
142-
memcpy(new_node->item_str, argv[i], arg_len);
128+
memcpy(new_node->item_str, items[i], arg_len);
143129

144-
ellAdd(list, &new_node->node);
130+
ellAdd(reccastList, &new_node->node);
145131
}
146132
epicsMutexUnlock(self->lock);
147133
}
148134

149135
/* Example call: addReccasterEnvVars("SECTOR") or addReccasterEnvVars("SECTOR", "BUILDING")
150-
* Appends the given env variables to the extra_envs list to be sent in addition to the default_envs array
136+
* Appends the given env variables to the envs list to be sent. This includes some hard-coded env vars sent by default
151137
*/
152138
void addReccasterEnvVars(caster_t* self, int argc, char **argv)
153139
{
154-
addToReccasterLinkedList(self, argc, argv, &self->extra_envs, "addReccasterEnvVars", "Environment variable", (const char**)default_envs);
140+
argv++; argc--; /* skip function arg */
141+
if(argc < 1) {
142+
errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterEnvVars\n");
143+
return;
144+
}
145+
addToReccasterLinkedList(self, argc, argv, &self->envs, "addReccasterEnvVars", "Environment variable");
155146
}
156147

157148
/* Example call: addReccasterExcludePattern("TEST:*") or addReccasterExcludePattern("TEST:*", "*_")
158149
* Appends the given patterns to the exclude_patterns list so those PVs and their meta-data are not sent
159150
*/
160151
void addReccasterExcludePattern(caster_t* self, int argc, char **argv)
161152
{
162-
addToReccasterLinkedList(self, argc, argv, &self->exclude_patterns, "addReccasterExcludePattern", "Exclude pattern", NULL);
153+
argv++; argc--; /* skip function arg */
154+
if(argc < 1) {
155+
errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterExcludePattern\n");
156+
return;
157+
}
158+
addToReccasterLinkedList(self, argc, argv, &self->exclude_patterns, "addReccasterExcludePattern", "Exclude pattern");
163159
}
164160

165161
static const iocshArg addReccasterEnvVarsArg0 = { "environmentVar", iocshArgArgv };

client/castApp/src/dbcb.c

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ const char* default_envs[] =
4646

4747
static int pushEnv(caster_t *caster)
4848
{
49-
size_t i;
5049
ELLNODE *cur;
5150
int ret = 0;
5251

@@ -64,16 +63,8 @@ static int pushEnv(caster_t *caster)
6463
if(ret)
6564
ERRRET(ret, caster, "Failed to send epics version");
6665

67-
for(i=0; !ret && default_envs[i]; i++) {
68-
const char *val = getenv(default_envs[i]);
69-
if(val && val[0]!='\0')
70-
ret = casterSendInfo(caster, 0, default_envs[i], val);
71-
if(ret)
72-
casterMsg(caster, "Error sending env %s", default_envs[i]);
73-
}
74-
7566
epicsMutexMustLock(caster->lock);
76-
for(cur = ellFirst(&caster->extra_envs); !ret && cur; cur = ellNext(cur)) {
67+
for(cur = ellFirst(&caster->envs); !ret && cur; cur = ellNext(cur)) {
7768
const string_list_t *penvvar = CONTAINER(cur, string_list_t, node);
7869
const char *val = getenv(penvvar->item_str);
7970
if (val && val[0] != '\0')

client/castApp/src/testAddEnvVars.c

Lines changed: 70 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,30 @@ static void testAddEnvVarsX(void)
3131
"DEVICE",
3232
"FAMILY"
3333
};
34-
int expectedNumExtraEnvs = 0;
34+
size_t defaultEnvCount = 0;
35+
while (default_envs[defaultEnvCount]) {
36+
defaultEnvCount++;
37+
}
38+
int expectedNumExtraEnvs = defaultEnvCount;
3539

3640
testDiag("Testing addReccasterEnvVars with one good env");
3741
argvlist[1] = "SECTOR";
3842
argc = 2;
3943
i = 0;
40-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
44+
testOk1(caster.envs.count==expectedNumExtraEnvs);
4145
addReccasterEnvVars(&caster, argc, argvlist);
4246
expectedNumExtraEnvs++;
43-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
47+
testOk1(caster.envs.count==expectedNumExtraEnvs);
4448
ELLNODE *cur;
45-
cur = ellFirst(&caster.extra_envs);
49+
cur = ellFirst(&caster.envs);
4650
while (cur != NULL) {
4751
string_list_t *temp = (string_list_t *)cur;
48-
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i]) == 0);
52+
if (i < defaultEnvCount) {
53+
testOk1(strcmp(temp->item_str, default_envs[i]) == 0);
54+
}
55+
else {
56+
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - defaultEnvCount]) == 0);
57+
}
4958
i++;
5059
cur = ellNext(cur);
5160
}
@@ -55,14 +64,19 @@ static void testAddEnvVarsX(void)
5564
argvlist[2] = "CONTACT";
5665
argc = 3;
5766
i = 0;
58-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
67+
testOk1(caster.envs.count==expectedNumExtraEnvs);
5968
addReccasterEnvVars(&caster, argc, argvlist);
6069
expectedNumExtraEnvs += 2;
61-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
62-
cur = ellFirst(&caster.extra_envs);
70+
testOk1(caster.envs.count==expectedNumExtraEnvs);
71+
cur = ellFirst(&caster.envs);
6372
while (cur != NULL) {
6473
string_list_t *temp = (string_list_t *)cur;
65-
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i]) == 0);
74+
if (i < defaultEnvCount) {
75+
testOk1(strcmp(temp->item_str, default_envs[i]) == 0);
76+
}
77+
else {
78+
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - defaultEnvCount]) == 0);
79+
}
6680
i++;
6781
cur = ellNext(cur);
6882
}
@@ -71,13 +85,18 @@ static void testAddEnvVarsX(void)
7185
argvlist[1] = "SECTOR";
7286
argc = 2;
7387
i = 0;
74-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
88+
testOk1(caster.envs.count==expectedNumExtraEnvs);
7589
addReccasterEnvVars(&caster, argc, argvlist);
76-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
77-
cur = ellFirst(&caster.extra_envs);
90+
testOk1(caster.envs.count==expectedNumExtraEnvs);
91+
cur = ellFirst(&caster.envs);
7892
while (cur != NULL) {
7993
string_list_t *temp = (string_list_t *)cur;
80-
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i]) == 0);
94+
if (i < defaultEnvCount) {
95+
testOk1(strcmp(temp->item_str, default_envs[i]) == 0);
96+
}
97+
else {
98+
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - defaultEnvCount]) == 0);
99+
}
81100
i++;
82101
cur = ellNext(cur);
83102
}
@@ -87,14 +106,19 @@ static void testAddEnvVarsX(void)
87106
argvlist[2] = "DEVICE";
88107
argc = 3;
89108
i = 0;
90-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
109+
testOk1(caster.envs.count==expectedNumExtraEnvs);
91110
addReccasterEnvVars(&caster, argc, argvlist);
92111
expectedNumExtraEnvs++;
93-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
94-
cur = ellFirst(&caster.extra_envs);
112+
testOk1(caster.envs.count==expectedNumExtraEnvs);
113+
cur = ellFirst(&caster.envs);
95114
while (cur != NULL) {
96115
string_list_t *temp = (string_list_t *)cur;
97-
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i]) == 0);
116+
if (i < defaultEnvCount) {
117+
testOk1(strcmp(temp->item_str, default_envs[i]) == 0);
118+
}
119+
else {
120+
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - defaultEnvCount]) == 0);
121+
}
98122
i++;
99123
cur = ellNext(cur);
100124
}
@@ -104,14 +128,19 @@ static void testAddEnvVarsX(void)
104128
argvlist[2] = "FAMILY";
105129
argc = 3;
106130
i = 0;
107-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
131+
testOk1(caster.envs.count==expectedNumExtraEnvs);
108132
addReccasterEnvVars(&caster, argc, argvlist);
109133
expectedNumExtraEnvs++;
110-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
111-
cur = ellFirst(&caster.extra_envs);
134+
testOk1(caster.envs.count==expectedNumExtraEnvs);
135+
cur = ellFirst(&caster.envs);
112136
while (cur != NULL) {
113137
string_list_t *temp = (string_list_t *)cur;
114-
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i]) == 0);
138+
if (i < defaultEnvCount) {
139+
testOk1(strcmp(temp->item_str, default_envs[i]) == 0);
140+
}
141+
else {
142+
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - defaultEnvCount]) == 0);
143+
}
115144
i++;
116145
cur = ellNext(cur);
117146
}
@@ -124,13 +153,18 @@ static void testAddEnvVarsX(void)
124153
argvlist[5] = "ENGINEER";
125154
argc = 6;
126155
i = 0;
127-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
156+
testOk1(caster.envs.count==expectedNumExtraEnvs);
128157
addReccasterEnvVars(&caster, argc, argvlist);
129-
testOk1(caster.extra_envs.count==expectedNumExtraEnvs);
130-
cur = ellFirst(&caster.extra_envs);
158+
testOk1(caster.envs.count==expectedNumExtraEnvs); /* these are all defaults so the count should not change */
159+
cur = ellFirst(&caster.envs);
131160
while (cur != NULL) {
132161
string_list_t *temp = (string_list_t *)cur;
133-
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i]) == 0);
162+
if (i < defaultEnvCount) {
163+
testOk1(strcmp(temp->item_str, default_envs[i]) == 0);
164+
}
165+
else {
166+
testOk1(strcmp(temp->item_str, expectedExtraEnvs[i - defaultEnvCount]) == 0);
167+
}
134168
i++;
135169
cur = ellNext(cur);
136170
}
@@ -145,30 +179,36 @@ static void testAddEnvVarsBadInput(void)
145179
casterInit(&caster);
146180
caster.onmsg = &testLog;
147181

182+
size_t defaultEnvCount = 0;
183+
while (default_envs[defaultEnvCount]) {
184+
defaultEnvCount++;
185+
}
186+
148187
int argc;
149188
char *argvlist[2];
150189
argvlist[0] = "addReccasterEnvVars";
151190

152191
testDiag("Testing addReccasterEnvVars with no arguments");
153192
argc = 1;
154-
testOk1(caster.extra_envs.count==0);
193+
testOk1(caster.envs.count==defaultEnvCount);
155194
addReccasterEnvVars(&caster, argc, argvlist);
156-
testOk1(caster.extra_envs.count==0);
195+
testOk1(caster.envs.count==defaultEnvCount);
157196

158197
testDiag("Testing addReccasterEnvVars with empty string argument");
159198
argvlist[1] = "";
160199
argc = 2;
161-
testOk1(caster.extra_envs.count==0);
200+
testOk1(caster.envs.count==defaultEnvCount);
162201
addReccasterEnvVars(&caster, argc, argvlist);
163-
testOk1(caster.extra_envs.count==0);
202+
testOk1(caster.envs.count==defaultEnvCount);
164203

165204
epicsEventSignal(caster.shutdownEvent);
166205
casterShutdown(&caster);
167206
}
168207

169208
MAIN(testAddEnvVars)
170209
{
171-
testPlan(37);
210+
/* 96 is defaultEnvCount * 6 for each test loop to check default env list */
211+
testPlan(37 + 96);
172212
osiSockAttach();
173213
testAddEnvVarsX();
174214
testAddEnvVarsBadInput();

0 commit comments

Comments
 (0)