1
/*___INFO__MARK_BEGIN__*/
2
/*************************************************************************
4
* The Contents of this file are made available subject to the terms of
5
* the Sun Industry Standards Source License Version 1.2
7
* Sun Microsystems Inc., March, 2001
10
* Sun Industry Standards Source License Version 1.2
11
* =================================================
12
* The contents of this file are subject to the Sun Industry Standards
13
* Source License Version 1.2 (the "License"); You may not use this file
14
* except in compliance with the License. You may obtain a copy of the
15
* License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
17
* Software provided under this License is provided on an "AS IS" basis,
18
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
19
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
20
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
21
* See the License for the specific provisions governing your rights and
22
* obligations concerning the Software.
24
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
26
* Copyright: 2001 by Sun Microsystems, Inc.
28
* All Rights Reserved.
30
************************************************************************/
31
/*___INFO__MARK_END__*/
39
#include "sge_signal.h"
40
#include "sge_string.h"
42
#include "msg_utilib.h"
53
#if defined(CRAY) && !defined(SIGXCPU)
54
# define SIGXCPU SIGCPULIM
59
# define NSIG (SIGUSR2+1)
62
const sig_mapT sig_map[] =
64
{SGE_SIGHUP, SIGHUP, "HUP"},
65
{SGE_SIGINT, SIGINT, "INT"},
66
{SGE_SIGQUIT, SIGQUIT, "QUIT"},
67
{SGE_SIGILL, SIGILL, "ILL"},
68
{SGE_SIGTRAP, SIGTRAP, "TRAP"},
69
{SGE_SIGABRT, SIGABRT, "ABRT"},
70
{SGE_SIGIOT, SIGIOT, "IOT"},
72
{SGE_SIGEMT, SIGEMT, "EMT"},
74
{SGE_SIGEMT, SIGUNKNOWN, "EMT"},
76
{SGE_SIGFPE, SIGFPE, "FPE"},
77
{SGE_SIGKILL, SIGKILL, "KILL"},
78
{SGE_SIGSEGV, SIGSEGV, "SEGV"},
79
{SGE_SIGPIPE, SIGPIPE, "PIPE"},
80
{SGE_SIGALRM, SIGALRM, "ALRM"},
81
{SGE_SIGTERM, SIGTERM, "TERM"},
82
{SGE_SIGURG, SIGURG, "URG"},
83
{SGE_SIGSTOP, SIGSTOP, "STOP"},
84
{SGE_SIGTSTP, SIGTSTP, "TSTP"},
85
{SGE_SIGCONT, SIGCONT, "CONT"},
86
{SGE_SIGCHLD, SIGCHLD, "CHLD"},
87
{SGE_SIGTTIN, SIGTTIN, "TTIN"},
88
{SGE_SIGTTOU, SIGTTOU, "TTOU"},
89
{SGE_SIGIO, SIGIO, "IO"},
90
{SGE_SIGXCPU, SIGXCPU, "XCPU"},
92
{SGE_SIGXFSZ, SIGXFSZ, "XFSZ"},
94
#if !(defined(CRAY) || defined(NECSX4) || defined(NECSX5))
95
{SGE_SIGVTALRM, SIGVTALRM, "VTALRM"},
96
{SGE_SIGPROF, SIGPROF, "PROF"},
98
{SGE_SIGWINCH, SIGWINCH, "WINCH"},
99
{SGE_SIGUSR1, SIGUSR1, "USR1"},
100
{SGE_SIGUSR2, SIGUSR2, "USR2"},
101
{SGE_SIGBUS, SIGBUS, "BUS"},
102
{SGE_MIGRATE, SIGTTOU, "MIGRATE"},
106
/****** uti/signal/sge_unmap_signal() *****************************************
108
* sge_unmap_signal() -- Unmap 32bit SGE/EE signal to system signal
111
* int sge_unmap_signal(u_long32 sge_sig)
114
* Unmap the 32bit SGE/EEsignal to the system specific signal
117
* u_long32 sge_sig - SGE/EE signal
120
* int - system signal
123
* MT-NOTE: sge_unmap_signal() is MT safe
125
******************************************************************************/
126
int sge_unmap_signal(u_long32 sge_sig)
128
const sig_mapT *mapptr=sig_map;
130
while (mapptr->sge_sig) {
131
if (mapptr->sge_sig == sge_sig) {
139
/****** uti/signal/sge_map_signal() *******************************************
141
* sge_map_signal() -- Map system signal to 32bit SGE/EE signal
144
* u_long32 sge_map_signal(int sys_sig)
147
* Map the system specific signal to the 32bit sge signal
150
* int sys_sig - system signal
153
* u_long32 - SGE/EE Signal
156
* MT-NOTE: sge_map_signal() is MT safe
158
******************************************************************************/
159
u_long32 sge_map_signal(int sys_sig)
161
const sig_mapT *mapptr=sig_map;
163
while (mapptr->sge_sig) {
164
if (mapptr->sig == sys_sig) {
165
return mapptr->sge_sig;
172
/****** uti/signal/sge_str2signal() ********************************************
174
* str2signal() -- Make a SGE/SGEEE signal out of a string
177
* u_long32 sge_str2signal(const char *str)
180
* Make a sge signal out of a string. 'str' can be the signal name
181
* (caseinsensitive) without sig or the signal number (Take care
182
* numbers are system dependent).
185
* const char *str - signal string
188
* u_long32 - SGE/EE signal
191
* MT-NOTE: sge_str2signal() is MT safe
193
******************************************************************************/
194
u_long32 sge_str2signal(const char *str)
196
const sig_mapT *mapptr=sig_map;
199
/* look for signal names in mapping table */
200
while (mapptr->sge_sig) {
201
if (!strcasecmp(str, mapptr->signame)) {
202
return mapptr->sge_sig;
207
/* could not find per name -> look for signal numbers */
208
if (sge_strisint(str)) {
209
signum = strtol(str, NULL, 10);
211
while (mapptr->sge_sig) {
212
if ((int) signum == mapptr->sig) {
213
return mapptr->sge_sig;
222
/****** uti/signal/sge_sys_str2signal() ***************************************
224
* sge_sys_str2signal() -- Make a SGE/SGEEE signal out of a string
227
* u_long32 sge_sys_str2signal(const char *str)
230
* Make a SGE/SGEEE signal out of a string
233
* const char *str - signal name
236
* u_long32 - SGE/EE signal
239
* MT-NOTE: sge_sys_str2signal() is MT safe
241
******************************************************************************/
242
u_long32 sge_sys_str2signal(const char *str)
244
const sig_mapT *mapptr=sig_map;
247
/* look for signal names in mapping table */
248
while (mapptr->sge_sig) {
249
if (!strcasecmp(str, mapptr->signame)) {
255
/* could not find per name -> look for signal numbers */
256
if (sge_strisint(str)) {
257
signum = strtol(str, NULL, 10);
264
/****** uti/signal/sge_sig2str() **********************************************
266
* sge_sig2str() -- Make a string out of a SGE/EE signal
269
* const char* sge_sig2str(u_long32 sge_sig)
272
* Make a string out of a SGE/EE signal
275
* u_long32 sge_sig - SGE/EE signal
278
* const char* - signal string
281
* MT-NOTE: sge_sig2str() is MT safe
283
******************************************************************************/
284
const char *sge_sig2str(u_long32 sge_sig)
286
const sig_mapT *mapptr;
288
/* look for signal names in mapping table */
289
for (mapptr=sig_map; mapptr->sge_sig; mapptr++) {
290
if (sge_sig == mapptr->sge_sig) {
291
return mapptr->signame;
295
return MSG_PROC_UNKNOWNSIGNAL;
298
/****** uti/signal/sge_sys_sig2str() ******************************************
300
* sge_sys_sig2str() -- Make a string out of a system signal
303
* const char* sge_sys_sig2str(u_long32 sys_sig)
306
* Make a string out of a system signal
309
* u_long32 sys_sig - system signal
312
* const char* - signal string
315
* MT-NOTE: sge_sys_sig2str() is MT safe
317
******************************************************************************/
318
const char *sge_sys_sig2str(u_long32 sys_sig)
320
const sig_mapT *mapptr;
322
/* look for signal names in mapping table */
323
for (mapptr=sig_map; mapptr->sge_sig; mapptr++) {
324
if ((int) sys_sig == mapptr->sig) {
325
return mapptr->signame;
329
return MSG_PROC_UNKNOWNSIGNAL;
332
/****** uti/signal/sge_set_def_sig_mask() *************************************
334
* sge_set_def_sig_mask() -- Set signal mask to default
337
* void sge_set_def_sig_mask(int sig_num, err_func_t err_func)
340
* Set signal mask to default for all signals except given signal
343
* sigset_t sig_num - signals which should be ignored
344
* (use sigemptyset and sigaddset to set signals,
345
* if NULL, no signals are ignored)
346
* err_func_t err_func - callback function to report errors
349
* MT-NOTE: sge_set_def_sig_mask() is MT safe
351
******************************************************************************/
352
void sge_set_def_sig_mask(sigset_t* sig_num, err_func_t err_func)
355
struct sigaction sig_vec;
359
* never set default handler for
360
* SIGKILL and SIGSTOP
362
if ((i == SIGKILL) || (i == SIGSTOP)) {
368
* on HPUX don't set default handler for
369
* _SIGRESERVE and SIGDIL
372
if ((i == _SIGRESERVE) || (i == SIGDIL)) {
379
* never set default handler for signals set
380
* in sig_num if not NULL
382
if (sig_num != NULL && sigismember(sig_num, i)) {
388
sigemptyset(&sig_vec.sa_mask);
389
sig_vec.sa_flags = 0;
390
sig_vec.sa_handler = 0;
391
sig_vec.sa_handler = SIG_DFL;
392
if (sigaction(i, &sig_vec, NULL)) {
395
snprintf(err_str, 256, MSG_PROC_SIGACTIONFAILED_IS, i, strerror(errno));
403
/****** uti/signal/sge_unblock_all_signals() **********************************
405
* sge_unblock_all_signals()
408
* void sge_unblock_all_signals(void)
411
* Allow for all signals.
414
* MT-NOTE: sge_unblock_all_signals() is MT safe
416
*******************************************************************************/
417
void sge_unblock_all_signals(void)
420
/* unblock all signals */
421
/* without this we depend on shell to unblock the signals */
422
/* result is that SIGXCPU was not delivered with several shells */
423
sigemptyset(&sigmask);
424
sigprocmask(SIG_SETMASK, &sigmask, NULL);