VirtualBox

source: vbox/trunk/src/VBox/Runtime/generic/RTProcSignalName-generic.cpp

Last change on this file was 98103, checked in by vboxsync, 16 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.5 KB
Line 
1/* $Id: RTProcSignalName-generic.cpp 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * IPRT - RTProcSignalName, generic implementation.
4 */
5
6/*
7 * Copyright (C) 2022-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * The contents of this file may alternatively be used under the terms
26 * of the Common Development and Distribution License Version 1.0
27 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28 * in the VirtualBox distribution, in which case the provisions of the
29 * CDDL are applicable instead of those of the GPL.
30 *
31 * You may elect to license modified versions of this file under the
32 * terms and conditions of either the GPL or the CDDL or both.
33 *
34 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35 */
36
37
38/*********************************************************************************************************************************
39* Header Files *
40*********************************************************************************************************************************/
41#include <iprt/process.h>
42#include "internal/iprt.h"
43
44#include <iprt/asm.h>
45#include <iprt/string.h>
46
47#include <signal.h>
48
49
50RTDECL(const char *) RTProcSignalName(int iSignal)
51{
52#if !defined(IPRT_NO_CRT) || !defined(RT_OS_WINDOWS)
53 switch (iSignal)
54 {
55 /*
56 * Typical bsd/xnu ones:
57 */
58# ifdef SIGHUP
59 RT_CASE_RET_STR(SIGHUP);
60# endif
61# ifdef SIGINT
62 RT_CASE_RET_STR(SIGINT);
63# endif
64# ifdef SIGQUIT
65 RT_CASE_RET_STR(SIGQUIT);
66# endif
67# ifdef SIGILL
68 RT_CASE_RET_STR(SIGILL);
69# endif
70# ifdef SIGTRAP
71 RT_CASE_RET_STR(SIGTRAP);
72# endif
73# ifdef SIGABRT
74 RT_CASE_RET_STR(SIGABRT);
75# endif
76# ifdef SIGEMT
77 RT_CASE_RET_STR(SIGEMT);
78# endif
79# ifdef SIGPOLL
80 RT_CASE_RET_STR(SIGPOLL);
81# endif
82# ifdef SIGFPE
83 RT_CASE_RET_STR(SIGFPE);
84# endif
85# ifdef SIGKILL
86 RT_CASE_RET_STR(SIGKILL);
87# endif
88# ifdef SIGBUS
89 RT_CASE_RET_STR(SIGBUS);
90# endif
91# ifdef SIGSEGV
92 RT_CASE_RET_STR(SIGSEGV);
93# endif
94# ifdef SIGSYS
95 RT_CASE_RET_STR(SIGSYS);
96# endif
97# ifdef SIGPIPE
98 RT_CASE_RET_STR(SIGPIPE);
99# endif
100# ifdef SIGALRM
101 RT_CASE_RET_STR(SIGALRM);
102# endif
103# ifdef SIGTERM
104 RT_CASE_RET_STR(SIGTERM);
105# endif
106# ifdef SIGURG
107 RT_CASE_RET_STR(SIGURG);
108# endif
109# ifdef SIGSTOP
110 RT_CASE_RET_STR(SIGSTOP);
111# endif
112# ifdef SIGTSTP
113 RT_CASE_RET_STR(SIGTSTP);
114# endif
115# ifdef SIGCONT
116 RT_CASE_RET_STR(SIGCONT);
117# endif
118# ifdef SIGCHLD
119 RT_CASE_RET_STR(SIGCHLD);
120# endif
121# ifdef SIGTTIN
122 RT_CASE_RET_STR(SIGTTIN);
123# endif
124# ifdef SIGTTOU
125 RT_CASE_RET_STR(SIGTTOU);
126# endif
127# ifdef SIGIO
128# if !defined(SIGPOLL) || (SIGPOLL+0) != SIGIO
129 RT_CASE_RET_STR(SIGIO);
130# endif
131# endif
132# ifdef SIGXCPU
133 RT_CASE_RET_STR(SIGXCPU);
134# endif
135# ifdef SIGXFSZ
136 RT_CASE_RET_STR(SIGXFSZ);
137# endif
138# ifdef SIGVTALRM
139 RT_CASE_RET_STR(SIGVTALRM);
140# endif
141# ifdef SIGPROF
142 RT_CASE_RET_STR(SIGPROF);
143# endif
144# ifdef SIGWINCH
145 RT_CASE_RET_STR(SIGWINCH);
146# endif
147# ifdef SIGINFO
148 RT_CASE_RET_STR(SIGINFO);
149# endif
150# ifdef SIGUSR1
151 RT_CASE_RET_STR(SIGUSR1);
152# endif
153# ifdef SIGUSR2
154 RT_CASE_RET_STR(SIGUSR2);
155# endif
156# ifdef SIGTHR
157 RT_CASE_RET_STR(SIGTHR);
158# endif
159# ifdef SIGLIBRT
160 RT_CASE_RET_STR(SIGLIBRT);
161# endif
162
163 /*
164 * Additional linux ones:
165 */
166# ifdef SIGIOT
167# if !defined(SIGABRT) || (SIGABRT+0) != SIGIOT
168 RT_CASE_RET_STR(SIGIOT);
169# endif
170# endif
171# ifdef SIGSTKFLT
172 RT_CASE_RET_STR(SIGSTKFLT);
173# endif
174# ifdef SIGLOST
175 RT_CASE_RET_STR(SIGLOST);
176# endif
177# ifdef SIGPWR
178 RT_CASE_RET_STR(SIGPWR);
179# endif
180# ifdef SIGUNUSED
181# if !defined(SIGSYS) || (SIGSYS+0) != SIGUNUSED
182 RT_CASE_RET_STR(SIGUNUSED);
183# endif
184# endif
185 }
186#endif
187
188#if defined(SIGRTMIN) && defined(SIGRTMAX)
189 /*
190 * Real time signals.
191 *
192 * This cannot be done in the switch/case setup because glibc maps SIGRTMIN
193 * and SIGRTMAX to internal libc calls that dynamically resolves their values.
194 */
195 static char const s_szSigRt[] =
196 "SIGRT00\0" "SIGRT01\0" "SIGRT02\0" "SIGRT03\0" "SIGRT04\0" "SIGRT05\0" "SIGRT06\0" "SIGRT07\0" "SIGRT08\0" "SIGRT09\0"
197 "SIGRT10\0" "SIGRT11\0" "SIGRT12\0" "SIGRT13\0" "SIGRT14\0" "SIGRT15\0" "SIGRT16\0" "SIGRT17\0" "SIGRT18\0" "SIGRT19\0"
198 "SIGRT20\0" "SIGRT21\0" "SIGRT22\0" "SIGRT23\0" "SIGRT24\0" "SIGRT25\0" "SIGRT26\0" "SIGRT27\0" "SIGRT28\0" "SIGRT29\0"
199 "SIGRT30\0" "SIGRT31\0" "SIGRT32\0" "SIGRT33\0" "SIGRT34\0" "SIGRT35\0" "SIGRT36\0" "SIGRT37\0" "SIGRT38\0" "SIGRT39\0"
200 "SIGRT40\0" "SIGRT41\0" "SIGRT42\0" "SIGRT43\0" "SIGRT44\0" "SIGRT45\0" "SIGRT46\0" "SIGRT47\0" "SIGRT48\0" "SIGRT49\0"
201 "SIGRT50\0" "SIGRT51\0" "SIGRT52\0" "SIGRT53\0" "SIGRT54\0" "SIGRT55\0" "SIGRT56\0" "SIGRT57\0" "SIGRT58\0" "SIGRT59\0"
202 "SIGRT60\0" "SIGRT61\0" "SIGRT62\0" "SIGRT63\0" "SIGRT64\0";
203 int const iSigRtMin = SIGRTMIN;
204 if (iSignal >= iSigRtMin && iSignal <= SIGRTMAX)
205 {
206 unsigned uRtSig = (unsigned)(iSignal - iSigRtMin);
207 if (uRtSig < (sizeof(s_szSigRt) - 1) / sizeof("SIGRT00"))
208 return &s_szSigRt[uRtSig * sizeof("SIGRT00")];
209 }
210#endif /* SIGRTMIN */
211
212 /*
213 * Do fallback: SIG+nnnn.
214 */
215 static struct { char sz[16]; } s_aFallback[16];
216 static uint32_t volatile s_iFallback = 0;
217 uint32_t const iFallback = ASMAtomicIncU32(&s_iFallback) % RT_ELEMENTS(s_aFallback);
218 s_aFallback[iFallback].sz[0] = 'S';
219 s_aFallback[iFallback].sz[1] = 'I';
220 s_aFallback[iFallback].sz[2] = 'G';
221 RTStrFormatU32(&s_aFallback[iFallback].sz[3], sizeof(s_aFallback[iFallback].sz) - 3, iSignal,
222 10, 0, 0, RTSTR_F_PLUS | RTSTR_F_VALSIGNED);
223 return s_aFallback[iFallback].sz;
224}
225RT_EXPORT_SYMBOL(RTProcSignalName);
226
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use