@@ -75,21 +75,21 @@ static void casthook(initHookState state)
7575 epicsAtExit (& castexit , NULL );
7676}
7777
78- /*
79- Example call: addReccasterEnvVars("SECTOR") or addReccasterEnvVars("SECTOR", "BUILDING")
80- Appends the given env variables to the extra_envs list to be sent in addition to the default_envs array
81- */
82- void addReccasterEnvVars (caster_t * self , int argc , char * * argv )
78+ /* Helper function to add items from iocsh calls to internal linked lists
79+ * funcName is the name of the IOC shell function being called (for error messages)
80+ * 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
82+ */
83+ static void addToReccasterLinkedList (caster_t * self , int argc , char * * argv , ELLLIST * list , const char * funcName , const char * itemDesc , const char * * defaultArray )
8384{
8485 size_t i , j ;
8586 int dup ;
8687 ELLNODE * cur ;
8788 argv ++ ; argc -- ; /* skip function arg */
8889 if (argc < 1 ) {
89- errlogSevPrintf (errlogMinor , "At least one argument expected for addReccasterEnvVars \n" );
90+ errlogSevPrintf (errlogMinor , "At least one argument expected for %s \n" , funcName );
9091 return ;
9192 }
92-
9393 epicsMutexMustLock (self -> lock );
9494 if (self -> shutdown ) {
9595 /* shutdown in progress, silent no-op */
@@ -98,8 +98,8 @@ void addReccasterEnvVars(caster_t* self, int argc, char **argv)
9898 }
9999 else if (self -> current != casterStateInit ) {
100100 /* Attempt to add after iocInit(), when we may be connected.
101- To fully support, would need to force reconnect or resend w/ updated envs list. */
102- errlogSevPrintf (errlogMinor , "addReccasterEnvVars called after iocInit() when reccaster might already be connected. Not supported\n" );
101+ To fully support, would need to force reconnect or resend w/ updated list. */
102+ errlogSevPrintf (errlogMinor , "%s called after iocInit() when reccaster might already be connected. Not supported\n" , funcName );
103103 epicsMutexUnlock (self -> lock );
104104 return ;
105105 }
@@ -108,43 +108,60 @@ void addReccasterEnvVars(caster_t* self, int argc, char **argv)
108108 for (i = 0 ; i < argc ; i ++ ) {
109109 const size_t arg_len = strlen (argv [i ]) + 1 ;
110110 if (argv [i ][0 ] == '\0' ) {
111- errlogSevPrintf (errlogMinor , "Arg is empty for addReccasterEnvVars \n" );
111+ errlogSevPrintf (errlogMinor , "Arg is empty for %s \n" , funcName );
112112 continue ;
113113 }
114114 dup = 0 ;
115- /* check if dup in self->default_envs */
116- for (j = 0 ; default_envs [j ]; j ++ ) {
117- if (strcmp (argv [i ], default_envs [j ]) == 0 ) {
118- dup = 1 ;
119- break ;
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 ;
120126 }
121127 }
122- if (dup ) {
123- errlogSevPrintf (errlogMinor , "Env var %s is already in env list sent by reccaster by default\n" , argv [i ]);
124- continue ;
125- }
126- /* check if dup in self->extra_envs */
127- for (cur = ellFirst (& self -> extra_envs ); cur ; cur = ellNext (cur )) {
128- const string_list_t * penvvar = CONTAINER (cur , string_list_t , node );
129- if (strcmp (argv [i ], penvvar -> item_str ) == 0 ) {
128+ /* check if dup in existing linked list */
129+ for (cur = ellFirst (list ); cur ; cur = ellNext (cur )) {
130+ string_list_t * pitem = CONTAINER (cur , string_list_t , node );
131+ if (strcmp (argv [i ], pitem -> item_str ) == 0 ) {
130132 dup = 1 ;
131133 break ;
132134 }
133135 }
134136 if (dup ) {
135- errlogSevPrintf (errlogMinor , "Env var %s is already in extra_envs list\n" , argv [i ]);
137+ errlogSevPrintf (errlogMinor , "%s %s already in list for %s \n" , itemDesc , argv [i ], funcName );
136138 continue ;
137139 }
138- string_list_t * new_node = mallocMustSucceed (sizeof (string_list_t ) + arg_len , "addReccasterEnvVars" );
140+ string_list_t * new_node = mallocMustSucceed (sizeof (string_list_t ) + arg_len , funcName );
139141 new_node -> item_str = (char * )(new_node + 1 );
140142 memcpy (new_node -> item_str , argv [i ], arg_len );
141143
142- ellAdd (& self -> extra_envs , & new_node -> node );
144+ ellAdd (list , & new_node -> node );
143145 }
144-
145146 epicsMutexUnlock (self -> lock );
146147}
147148
149+ /* 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
151+ */
152+ void addReccasterEnvVars (caster_t * self , int argc , char * * argv )
153+ {
154+ addToReccasterLinkedList (self , argc , argv , & self -> extra_envs , "addReccasterEnvVars" , "Environment variable" , (const char * * )default_envs );
155+ }
156+
157+ /* Example call: addReccasterExcludePattern("TEST:*") or addReccasterExcludePattern("TEST:*", "*_")
158+ * Appends the given patterns to the exclude_patterns list so those PVs and their meta-data are not sent
159+ */
160+ void addReccasterExcludePattern (caster_t * self , int argc , char * * argv )
161+ {
162+ addToReccasterLinkedList (self , argc , argv , & self -> exclude_patterns , "addReccasterExcludePattern" , "Exclude pattern" , NULL );
163+ }
164+
148165static const iocshArg addReccasterEnvVarsArg0 = { "environmentVar" , iocshArgArgv };
149166static const iocshArg * const addReccasterEnvVarsArgs [] = { & addReccasterEnvVarsArg0 };
150167static const iocshFuncDef addReccasterEnvVarsFuncDef = {
@@ -163,57 +180,6 @@ static void addReccasterEnvVarsCallFunc(const iocshArgBuf *args)
163180 addReccasterEnvVars (& thecaster , args [0 ].aval .ac , args [0 ].aval .av );
164181}
165182
166- void addReccasterExcludePattern (caster_t * self , int argc , char * * argv ) {
167- size_t i ;
168- int dup ;
169- ELLNODE * cur ;
170- argv ++ ; argc -- ; /* skip function arg */
171- if (argc < 1 ) {
172- errlogSevPrintf (errlogMinor , "At least one argument expected for addReccasterExcludePattern\n" );
173- return ;
174- }
175- epicsMutexMustLock (self -> lock );
176- if (self -> shutdown ) {
177- /* shutdown in progress, silent no-op */
178- epicsMutexUnlock (self -> lock );
179- return ;
180- }
181- /* error if called after iocInit() */
182- if (self -> current != casterStateInit ) {
183- errlogSevPrintf (errlogMinor , "addReccasterExcludePattern called after iocInit() when reccaster might already be connected. Not supported\n" );
184- epicsMutexUnlock (self -> lock );
185- return ;
186- }
187-
188- for (i = 0 ; i < argc ; i ++ ) {
189- const size_t arg_len = strlen (argv [i ]) + 1 ;
190- if (argv [i ][0 ] == '\0' ) {
191- errlogSevPrintf (errlogMinor , "Arg is empty for addReccasterExcludePattern\n" );
192- continue ;
193- }
194- /* check duplicates */
195- dup = 0 ;
196- for (cur = ellFirst (& self -> exclude_patterns ); cur ; cur = ellNext (cur )) {
197- const string_list_t * ppattern = CONTAINER (cur , string_list_t , node );
198- if (strcmp (argv [i ], ppattern -> item_str ) == 0 ) {
199- dup = 1 ;
200- break ;
201- }
202- }
203- if (dup ) {
204- errlogSevPrintf (errlogMinor , "Duplicate pattern %s in addReccasterExcludePattern\n" , argv [i ]);
205- continue ;
206- }
207- string_list_t * new_node = mallocMustSucceed (sizeof (string_list_t ) + arg_len , "addReccasterExcludePattern" );
208- new_node -> item_str = (char * )(new_node + 1 );
209- memcpy (new_node -> item_str , argv [i ], arg_len );
210-
211- ellAdd (& self -> exclude_patterns , & new_node -> node );
212- }
213-
214- epicsMutexUnlock (self -> lock );
215- }
216-
217183static const iocshArg addReccasterExcludePatternArg0 = { "excludePattern" , iocshArgArgv };
218184static const iocshArg * const addReccasterExcludePatternArgs [] = { & addReccasterExcludePatternArg0 };
219185static const iocshFuncDef addReccasterExcludePatternFuncDef = {
@@ -227,7 +193,6 @@ static const iocshFuncDef addReccasterExcludePatternFuncDef = {
227193 "Example: addReccasterExcludePattern 'TEST:*' '*_'\n"
228194#endif
229195};
230-
231196static void addReccasterExcludePatternCallFunc (const iocshArgBuf * args ) {
232197 addReccasterExcludePattern (& thecaster , args [0 ].aval .ac , args [0 ].aval .av );
233198}
0 commit comments