diff options
author | Antoine Pietri <antoine.pietri1@gmail.com> | 2018-03-12 13:42:34 (GMT) |
---|---|---|
committer | Antoine Pitrou <pitrou@free.fr> | 2018-03-12 13:42:34 (GMT) |
commit | 5d2a27de625caf2fd5b763d8a8463790ccd954be (patch) | |
tree | d875f0d805f4f9b0500a9b1a96d4f8537fd566c4 /Modules | |
parent | 4484f9dca9149da135bbae035f10a50d20d1cbbb (diff) | |
download | cpython-5d2a27de625caf2fd5b763d8a8463790ccd954be.zip cpython-5d2a27de625caf2fd5b763d8a8463790ccd954be.tar.gz cpython-5d2a27de625caf2fd5b763d8a8463790ccd954be.tar.bz2 |
signal: add strsignal() (#6017)
Co-authored-by: Vajrasky Kok <sky.kok@speaklikeaking.com>
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/clinic/signalmodule.c.h | 32 | ||||
-rw-r--r-- | Modules/signalmodule.c | 61 |
2 files changed, 92 insertions, 1 deletions
diff --git a/Modules/clinic/signalmodule.c.h b/Modules/clinic/signalmodule.c.h index dc3aadf..1c43971 100644 --- a/Modules/clinic/signalmodule.c.h +++ b/Modules/clinic/signalmodule.c.h @@ -129,6 +129,36 @@ exit: return return_value; } +PyDoc_STRVAR(signal_strsignal__doc__, +"strsignal($module, signalnum, /)\n" +"--\n" +"\n" +"Return the system description of the given signal.\n" +"\n" +"The return values can be such as \"Interrupt\", \"Segmentation fault\", etc.\n" +"Returns None if the signal is not recognized."); + +#define SIGNAL_STRSIGNAL_METHODDEF \ + {"strsignal", (PyCFunction)signal_strsignal, METH_O, signal_strsignal__doc__}, + +static PyObject * +signal_strsignal_impl(PyObject *module, int signalnum); + +static PyObject * +signal_strsignal(PyObject *module, PyObject *arg) +{ + PyObject *return_value = NULL; + int signalnum; + + if (!PyArg_Parse(arg, "i:strsignal", &signalnum)) { + goto exit; + } + return_value = signal_strsignal_impl(module, signalnum); + +exit: + return return_value; +} + #if defined(HAVE_SIGINTERRUPT) PyDoc_STRVAR(signal_siginterrupt__doc__, @@ -440,4 +470,4 @@ exit: #ifndef SIGNAL_PTHREAD_KILL_METHODDEF #define SIGNAL_PTHREAD_KILL_METHODDEF #endif /* !defined(SIGNAL_PTHREAD_KILL_METHODDEF) */ -/*[clinic end generated code: output=36132f4189381fe0 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=7b41486acf93aa8e input=a9049054013a1b77]*/ diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index b553eed..7916160 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -504,6 +504,66 @@ signal_getsignal_impl(PyObject *module, int signalnum) } } + +/*[clinic input] +signal.strsignal + + signalnum: int + / + +Return the system description of the given signal. + +The return values can be such as "Interrupt", "Segmentation fault", etc. +Returns None if the signal is not recognized. +[clinic start generated code]*/ + +static PyObject * +signal_strsignal_impl(PyObject *module, int signalnum) +/*[clinic end generated code: output=44e12e1e3b666261 input=b77914b03f856c74]*/ +{ + char *res; + + if (signalnum < 1 || signalnum >= NSIG) { + PyErr_SetString(PyExc_ValueError, + "signal number out of range"); + return NULL; + } + +#ifdef MS_WINDOWS + /* Custom redefinition of POSIX signals allowed on Windows */ + switch (signalnum) { + case SIGINT: + res = "Interrupt"; + break; + case SIGILL: + res = "Illegal instruction"; + break; + case SIGABRT: + res = "Aborted"; + break; + case SIGFPE: + res = "Floating point exception"; + break; + case SIGSEGV: + res = "Segmentation fault"; + break; + case SIGTERM: + res = "Terminated"; + break; + default: + Py_RETURN_NONE; + } +#else + errno = 0; + res = strsignal(signalnum); + + if (errno || res == NULL || strstr(res, "Unknown signal") != NULL) + Py_RETURN_NONE; +#endif + + return Py_BuildValue("s", res); +} + #ifdef HAVE_SIGINTERRUPT /*[clinic input] @@ -1152,6 +1212,7 @@ static PyMethodDef signal_methods[] = { SIGNAL_SETITIMER_METHODDEF SIGNAL_GETITIMER_METHODDEF SIGNAL_SIGNAL_METHODDEF + SIGNAL_STRSIGNAL_METHODDEF SIGNAL_GETSIGNAL_METHODDEF {"set_wakeup_fd", (PyCFunction)signal_set_wakeup_fd, METH_VARARGS | METH_KEYWORDS, set_wakeup_fd_doc}, SIGNAL_SIGINTERRUPT_METHODDEF |