Build with debug symbols enabled.
[oweals/cde.git] / cde / lib / DtSvc / DtEncap / usersig.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /*
24  * File:         usersig.c $XConsortium: usersig.c /main/4 1996/06/21 17:33:04 ageorge $
25  * Language:     C
26  *
27  * (c) Copyright 1989, Hewlett-Packard Company, all rights reserved.
28  *
29  * (c) Copyright 1993, 1994 Hewlett-Packard Company                     *
30  * (c) Copyright 1993, 1994 International Business Machines Corp.       *
31  * (c) Copyright 1993, 1994 Sun Microsystems, Inc.                      *
32  * (c) Copyright 1993, 1994 Novell, Inc.                                *
33  */
34
35 #define __need_all_signals
36 #include <bms/sbport.h> /* NOTE: sbport.h must be the first include. */
37
38 #include <signal.h>
39
40 #include <bms/bms.h>
41 #include <bms/Symbolic.h>
42 #include <bms/usersig.h>
43 #include "DtSvcLock.h"
44
45 static XeSymTable Xe_sig_table = (XeSymTable) NULL;
46
47
48 /*-------------------------------------------------------------------------+*/
49 static void Xe_addsig(XeString name, int value)
50 /*-------------------------------------------------------------------------+*/
51 {
52     XeSymbol sym = Xe_intern(Xe_sig_table, name);
53     sym->value = (void *)value;
54 }
55
56 /*-------------------------------------------------------------------------+*/
57 static void Xe_init_sig_table(void)
58 /*-------------------------------------------------------------------------+*/
59 {
60 #   define SIG_HASH_SIZE 32
61
62     _DtSvcProcessLock();
63     Xe_sig_table = Xe_new_symtab(SIG_HASH_SIZE);
64
65     Xe_addsig((XeString)"SIGABRT", SIGABRT);          /* Add the XOPEN XPG3 signals */
66     Xe_addsig((XeString)"SIGALRM", SIGALRM);
67     Xe_addsig((XeString)"SIGFPE",  SIGFPE);
68     Xe_addsig((XeString)"SIGHUP",  SIGHUP);
69     Xe_addsig((XeString)"SIGILL",  SIGILL);
70     Xe_addsig((XeString)"SIGINT",  SIGINT);
71     Xe_addsig((XeString)"SIGKILL", SIGKILL);
72     Xe_addsig((XeString)"SIGPIPE", SIGPIPE);
73     Xe_addsig((XeString)"SIGQUIT", SIGQUIT);
74     Xe_addsig((XeString)"SIGSEGV", SIGSEGV);
75     Xe_addsig((XeString)"SIGTERM", SIGTERM);
76     Xe_addsig((XeString)"SIGUSR1", SIGUSR1);
77     Xe_addsig((XeString)"SIGUSR2", SIGUSR2);
78     Xe_addsig((XeString)"SIGCHLD", SIGCHLD);
79     Xe_addsig((XeString)"SIGCONT", SIGCONT);
80     Xe_addsig((XeString)"SIGSTOP", SIGSTOP);
81     Xe_addsig((XeString)"SIGTSTP", SIGTSTP);
82     Xe_addsig((XeString)"SIGTTIN", SIGTTIN);
83     Xe_addsig((XeString)"SIGTTOU", SIGTTOU);
84     
85     /* 0 is a valid XPG3 signal, but it doesn't have a name. */
86
87     Xe_addsig((XeString)"ZERO", 0);
88  
89     /* Now add signals that may or may not be around on a given platform */    
90
91 #   ifdef SIGIO    
92     Xe_addsig((XeString)"SIGIO", SIGIO);                /*  hpux sun apollo */
93 #   else
94 #       ifdef SIGPOLL
95            Xe_addsig((XeString)"SIGIO", SIGPOLL);       /*  hpux sun apollo */
96 #       endif
97 #    endif
98
99 #   ifdef SIGPOLL    
100     Xe_addsig((XeString)"SIGPOLL", SIGPOLL);            /*  hpux sun apollo */
101 #   else
102 #       ifdef SIGIO
103            Xe_addsig((XeString)"SIGPOLL", SIGIO);       /*  hpux sun apollo */
104 #       endif
105 #   endif
106
107 #   ifdef SIGEMT    
108     Xe_addsig((XeString)"SIGEMT", SIGEMT);              /*  hpux sun apollo */
109 #   endif
110
111 #   ifdef SIGBUS    
112     Xe_addsig((XeString)"SIGBUS", SIGBUS);              /*  hpux sun apollo */
113 #   endif
114
115 #   ifdef SIGIOT    
116     Xe_addsig((XeString)"SIGIOT", SIGIOT);              /*  hpux sun apollo */
117 #   endif
118
119 #   ifdef SIGURG    
120     Xe_addsig((XeString)"SIGURG", SIGURG);              /*  hpux sun apollo */
121 #   endif
122
123 #   ifdef SIGSYS    
124     Xe_addsig((XeString)"SIGSYS", SIGSYS);              /*  hpux sun apollo */
125 #   endif
126
127 #   ifdef SIGTRAP    
128     Xe_addsig((XeString)"SIGTRAP", SIGTRAP);            /*  hpux sun apollo */
129 #   endif
130
131 #   ifdef SIGPROF    
132     Xe_addsig((XeString)"SIGPROF", SIGPROF);            /*  hpux sun apollo */
133 #   endif
134
135 #   ifdef SIGCLD    
136     Xe_addsig((XeString)"SIGCLD", SIGCLD);              /*  hpux sun apollo */
137 #   endif
138
139 #   ifdef SIGVTALRM    
140     Xe_addsig((XeString)"SIGVTALRM", SIGVTALRM);        /*  hpux sun apollo */
141 #   endif
142
143 #   ifdef SIGWINCH
144           Xe_addsig((XeString)"SIGWINCH", SIGWINCH);
145 #   endif
146     _DtSvcProcessUnlock();
147 }
148
149
150 /*-------------------------------------------------------------------------+*/
151 int XeNameToSignal(XeString name)
152 /*-------------------------------------------------------------------------+*/
153
154 /* Return SIG_NOT_IN_TABLE if signal name is not in hash table */
155
156 {
157     XeSymbol sym;
158
159     _DtSvcProcessLock();
160     if (!Xe_sig_table) Xe_init_sig_table();
161
162     sym = Xe_lookup(Xe_sig_table, name);
163
164     _DtSvcProcessUnlock();
165     return (sym) ? (int) sym->value : XE_SIG_NOT_IN_TABLE;
166 }
167
168 /*-------------------------------------------------------------------------+*/
169 XeString XeSignalToName(int sig)
170 /*-------------------------------------------------------------------------+*/
171 {
172    switch (sig) 
173    {
174     /* These are XOPEN XPG3 signals */       
175     /* ---------------------------- */
176     case SIGABRT:       return (XeString)"SIGABRT"; /* "SIGIOT" is an alias */
177     case SIGALRM:       return (XeString)"SIGALRM";
178     case SIGFPE:        return (XeString)"SIGFPE";
179     case SIGHUP:        return (XeString)"SIGHUP";
180     case SIGILL:        return (XeString)"SIGILL";
181     case SIGINT:        return (XeString)"SIGINT";
182     case SIGKILL:       return (XeString)"SIGKILL";
183     case SIGPIPE:       return (XeString)"SIGPIPE";
184     case SIGQUIT:       return (XeString)"SIGQUIT";
185     case SIGSEGV:       return (XeString)"SIGSEGV";
186     case SIGTERM:       return (XeString)"SIGTERM";
187     case SIGUSR1:       return (XeString)"SIGUSR1";
188     case SIGUSR2:       return (XeString)"SIGUSR2";
189     case SIGCHLD:       return (XeString)"SIGCHLD"; /* "SIGCLD" is an alias */
190     case SIGCONT:       return (XeString)"SIGCONT";
191     case SIGSTOP:       return (XeString)"SIGSTOP";
192     case SIGTSTP:       return (XeString)"SIGTSTP";
193     case SIGTTIN:       return (XeString)"SIGTTIN";
194     case SIGTTOU:       return (XeString)"SIGTTOU";
195
196     /* 0 is a valid signal under XPG3, but it doesn't have a signal name */
197
198     case 0:             return (XeString)"ZERO";
199
200
201     /* NOTE: we have ifdef's for cases that are duplicated by other values   */
202     /*       included but contain no code.  This is so when you compare this */
203     /*       code to the stuff in Xe_init_sig_table() above, you see a one   */
204     /*       to one correspondance.                                          */
205      
206 #   ifdef SIGIO                                 /*  hpux sun apollo */
207                                                 /*  (SIGPOLL, SIGTINT are aliases) */
208     case SIGIO:         return (XeString)"SIGIO"; 
209 #   endif
210
211 #   ifdef SIGPOLL                               /*  hpux sun apollo */
212 /*  ----> Duplicated by SIGIO above
213     case SIGPOLL:       return (XeString)"SIGPOLL";     
214 */
215 #   endif
216
217
218 #   ifdef SIGEMT                                /*  hpux sun apollo */
219     case SIGEMT:        return (XeString)"SIGEMT";      
220 #   endif
221
222 #   ifdef SIGBUS                                /*  hpux sun apollo */
223     case SIGBUS:        return (XeString)"SIGBUS";      
224 #   endif
225
226 #   ifdef SIGIOT                                /*  hpux sun apollo */
227 /*  ----> Duplicated by SIGABRT above
228
229     case SIGIOT:        return (XeString)"SIGIOT";      
230 */
231 #   endif
232
233 #   ifdef SIGURG                                /*  hpux sun apollo */
234     case SIGURG:        return (XeString)"SIGURG";      
235 #   endif
236
237 #   ifdef SIGSYS                                /*  hpux sun apollo */
238     case SIGSYS:        return (XeString)"SIGSYS";      
239 #   endif
240
241 #   ifdef SIGTRAP                               /*  hpux sun apollo */
242     case SIGTRAP:       return (XeString)"SIGTRAP";     
243 #   endif
244
245 #   ifdef SIGPROF                               /*  hpux sun apollo */
246     case SIGPROF:       return (XeString)"SIGPROF";     
247 #   endif
248
249 #   ifdef SIGCLD                                /*  hpux sun apollo */
250 /*  ----> Duplicated by SIGCHLD above
251     case SIGCLD:        return (XeString)"SIGCLD";      
252 */
253 #   endif
254
255 #   ifdef SIGVTALRM                             /*  hpux sun apollo */
256     case SIGVTALRM:     return (XeString)"SIGVTALRM";   
257 #   endif
258
259 #   ifdef SIGWINCH                              /*  sun apollo */
260     case SIGWINCH:      return (XeString)"SIGWINCH";    
261 #   endif
262
263
264     default:            return XeString_NULL;
265     }
266 }
267