summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorAntoine Pietri <antoine.pietri1@gmail.com>2018-03-12 13:42:34 (GMT)
committerAntoine Pitrou <pitrou@free.fr>2018-03-12 13:42:34 (GMT)
commit5d2a27de625caf2fd5b763d8a8463790ccd954be (patch)
treed875f0d805f4f9b0500a9b1a96d4f8537fd566c4 /Modules
parent4484f9dca9149da135bbae035f10a50d20d1cbbb (diff)
downloadcpython-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.h32
-rw-r--r--Modules/signalmodule.c61
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