@@ -53,7 +53,7 @@ char *prte_ess_base_nspace = NULL;
5353char * prte_ess_base_vpid = NULL ;
5454pmix_list_t prte_ess_base_signals = PMIX_LIST_STATIC_INIT ;
5555
56- static char * forwarded_signals = NULL ;
56+ static char * forwarded_signals = "all" ;
5757
5858static int prte_ess_base_register (pmix_mca_base_register_flag_t flags )
5959{
@@ -82,11 +82,13 @@ static int prte_ess_base_register(pmix_mca_base_register_flag_t flags)
8282 pmix_mca_base_var_register_synonym (ret , "prte" , "prte" , "ess" , "num_procs" ,
8383 PMIX_MCA_BASE_VAR_SYN_FLAG_DEPRECATED );
8484
85- forwarded_signals = NULL ;
85+ forwarded_signals = "all" ;
8686 ret = pmix_mca_base_var_register ("prte" , "ess" , "base" , "forward_signals" ,
87- "Comma-delimited list of additional signals (names or integers) to forward to "
88- "application processes [\"none\" => forward nothing]. Signals provided by "
89- "default include SIGTSTP, SIGUSR1, SIGUSR2, SIGABRT, SIGALRM, and SIGCONT" ,
87+ "Comma-delimited list of signals (names or integers) to be forwarded to "
88+ "application processes [\"none\" => forward nothing, \"all\" => forward all]. "
89+ "Signals provided by default depends upon system definitions. The SIGTERM, SIGHUP, "
90+ "SIGINT signals are always forwarded regardless of this param's settings. The "
91+ "SIGKILL and SIGPIPE signals cannot be forwarded." ,
9092 PMIX_MCA_BASE_VAR_TYPE_STRING ,
9193 & forwarded_signals );
9294 pmix_mca_base_var_register_synonym (ret , "prte" , "ess" , "hnp" , "forward_signals" ,
@@ -104,14 +106,8 @@ static int prte_ess_base_close(void)
104106
105107static int prte_ess_base_open (pmix_mca_base_open_flag_t flags )
106108{
107- int rc ;
108-
109109 PMIX_CONSTRUCT (& prte_ess_base_signals , pmix_list_t );
110110
111- if (PRTE_SUCCESS != (rc = prte_ess_base_setup_signals (forwarded_signals ))) {
112- return rc ;
113- }
114-
115111 return pmix_mca_base_framework_components_open (& prte_ess_base_framework , flags );
116112}
117113
@@ -200,95 +196,110 @@ static struct known_signal known_signals[] = {
200196
201197static bool signals_added = false;
202198
203- int prte_ess_base_setup_signals (char * mysignals )
199+ pmix_status_t prte_ess_base_setup_signals (char * input )
204200{
205201 int i , sval , nsigs ;
206- char * * signals , * tmp ;
202+ char * mysignals , * * signals , * tmp , * sname = NULL ;
207203 prte_ess_base_signal_t * sig ;
208204 bool ignore , found ;
209205
206+ if (NULL == input ) {
207+ mysignals = forwarded_signals ;
208+ } else {
209+ mysignals = input ;
210+ }
211+
210212 /* if they told us "none", then nothing to do */
211- if (NULL != mysignals && 0 == strcmp (mysignals , "none" )) {
212- return PRTE_SUCCESS ;
213+ if (0 == strcasecmp (mysignals , "none" ) || signals_added ) {
214+ return PMIX_SUCCESS ;
213215 }
216+ signals_added = true; // only do this once
214217
215- if (!signals_added ) {
216- /* we know that some signals are (nearly) always defined, regardless
217- * of environment, so add them here */
218+ // handle the "all" special case
219+ if (0 == strcasecmp (mysignals , "all" )) {
218220 nsigs = sizeof (known_signals ) / sizeof (struct known_signal );
219221 for (i = 0 ; i < nsigs ; i ++ ) {
220222 if (known_signals [i ].can_forward ) {
223+ pmix_output_verbose (2 , prte_ess_base_framework .framework_output ,
224+ "Forwarding signal: %s" , known_signals [i ].signame );
221225 ESS_ADDSIGNAL (known_signals [i ].signal , known_signals [i ].signame );
222226 }
223227 }
224- signals_added = true; // only do this once
228+ return PMIX_SUCCESS ;
225229 }
226230
227- /* see if they asked for anything beyond those - note that they may
228- * have asked for some we already cover, and so we ignore any duplicates */
229- if (NULL != mysignals ) {
230- /* if they told us "none", then dump the list */
231- signals = PMIX_ARGV_SPLIT_COMPAT (mysignals , ',' );
232- for (i = 0 ; NULL != signals [i ]; i ++ ) {
233- sval = 0 ;
234- if (0 != strncmp (signals [i ], "SIG" , 3 )) {
235- /* treat it like a number */
236- errno = 0 ;
237- sval = strtoul (signals [i ], & tmp , 10 );
238- if (0 != errno || '\0' != * tmp ) {
239- pmix_show_help ("help-ess-base.txt" , "ess-base:unknown-signal" , true, signals [i ],
240- forwarded_signals );
241- PMIX_ARGV_FREE_COMPAT (signals );
242- return PRTE_ERR_SILENT ;
243- }
231+ /* see what they asked for - ignore any duplicates */
232+ signals = PMIX_ARGV_SPLIT_COMPAT (mysignals , ',' );
233+ for (i = 0 ; NULL != signals [i ]; i ++ ) {
234+ sval = 0 ;
235+ if (0 != strncasecmp (signals [i ], "SIG" , 3 )) {
236+ /* treat it like a number */
237+ errno = 0 ;
238+ sval = strtoul (signals [i ], & tmp , 10 );
239+ if (0 != errno || '\0' != * tmp ) {
240+ pmix_show_help ("help-ess-base.txt" , "ess-base:unknown-signal" , true,
241+ signals [i ], mysignals );
242+ PMIX_ARGV_FREE_COMPAT (signals );
243+ return PMIX_ERR_SILENT ;
244244 }
245-
246- /* see if it is one we already covered */
247- ignore = false;
248- PMIX_LIST_FOREACH (sig , & prte_ess_base_signals , prte_ess_base_signal_t )
249- {
250- if (0 == strcasecmp (signals [i ], sig -> signame ) || sval == sig -> signal ) {
251- /* got it - we will ignore */
252- ignore = true;
245+ // see if it's a known signal number
246+ sname = NULL ;
247+ for (int j = 0 ; NULL != known_signals [j ].signame ; ++ j ) {
248+ if (sval == known_signals [j ].signal ) {
249+ sname = known_signals [j ].signame ;
253250 break ;
254251 }
255252 }
256-
257- if (ignore ) {
258- continue ;
253+ if (NULL == sname ) {
254+ sname = signals [i ];
259255 }
260-
261- /* see if they gave us a signal name */
256+ } else {
257+ /* they gave us a signal name */
262258 found = false;
263- for (int j = 0 ; known_signals [j ].signame ; ++ j ) {
264- if (0 == strcasecmp (signals [i ], known_signals [j ].signame )
265- || sval == known_signals [j ].signal ) {
259+ for (int j = 0 ; NULL != known_signals [j ].signame ; ++ j ) {
260+ if (0 == strcasecmp (signals [i ], known_signals [j ].signame ) ||
261+ sval == known_signals [j ].signal ) {
266262 if (!known_signals [j ].can_forward ) {
267263 pmix_show_help ("help-ess-base.txt" , "ess-base:cannot-forward" , true,
268- known_signals [j ].signame , forwarded_signals );
264+ known_signals [j ].signame , mysignals );
269265 PMIX_ARGV_FREE_COMPAT (signals );
270- return PRTE_ERR_SILENT ;
266+ return PMIX_ERR_SILENT ;
271267 }
272268 found = true;
273- ESS_ADDSIGNAL (known_signals [j ].signal , known_signals [j ].signame );
269+ sval = known_signals [j ].signal ;
270+ sname = known_signals [j ].signame ;
274271 break ;
275272 }
276273 }
277-
278274 if (!found ) {
279- if ( 0 == strncmp ( signals [ i ] , "SIG " , 3 )) {
280- pmix_show_help ( "help-ess-base.txt" , "ess-base:unknown-signal" , true, signals [i ],
281- forwarded_signals );
282- PMIX_ARGV_FREE_COMPAT ( signals ) ;
283- return PRTE_ERR_SILENT ;
284- }
275+ pmix_show_help ( "help-ess-base.txt" , "ess-base:unknown-signal " , true,
276+ signals [i ], mysignals );
277+ PMIX_ARGV_FREE_COMPAT ( signals );
278+ return PMIX_ERR_SILENT ;
279+ }
280+ }
285281
286- ESS_ADDSIGNAL (sval , signals [i ]);
282+ /* see if it is one we already covered */
283+ ignore = false;
284+ PMIX_LIST_FOREACH (sig , & prte_ess_base_signals , prte_ess_base_signal_t ) {
285+ if (0 == strcasecmp (sname , sig -> signame ) || sval == sig -> signal ) {
286+ /* got it - we will ignore */
287+ ignore = true;
288+ break ;
287289 }
288290 }
289- PMIX_ARGV_FREE_COMPAT (signals );
291+
292+ if (ignore ) {
293+ continue ;
294+ }
295+
296+ pmix_output_verbose (2 , prte_ess_base_framework .framework_output ,
297+ "Forwarding signal: %s" , sname );
298+ ESS_ADDSIGNAL (sval , sname );
290299 }
291- return PRTE_SUCCESS ;
300+
301+ PMIX_ARGV_FREE_COMPAT (signals );
302+ return PMIX_SUCCESS ;
292303}
293304
294305/* instantiate the class */
0 commit comments