summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/syslogmodule.c
diff options
context:
space:
mode:
authorAlexSm <[email protected]>2024-02-16 11:51:30 +0100
committerGitHub <[email protected]>2024-02-16 11:51:30 +0100
commit506ecaee93b52cc12c2e2f97c3d42e3ca2a7f59e (patch)
treed096fb9eb988fbb0ca1ba970041773207ce3aa70 /contrib/tools/python3/src/Modules/syslogmodule.c
parent4749b9e5d260714490997e6f5ee1ee8c1c8fc46c (diff)
parentf200f72c9d7a89c1018e3dc6b46c49fe2ecf84fb (diff)
Merge pull request #1940 from dcherednik/importlib
Library import 14
Diffstat (limited to 'contrib/tools/python3/src/Modules/syslogmodule.c')
-rw-r--r--contrib/tools/python3/src/Modules/syslogmodule.c199
1 files changed, 124 insertions, 75 deletions
diff --git a/contrib/tools/python3/src/Modules/syslogmodule.c b/contrib/tools/python3/src/Modules/syslogmodule.c
index 8416b6344ce..6db8de9c491 100644
--- a/contrib/tools/python3/src/Modules/syslogmodule.c
+++ b/contrib/tools/python3/src/Modules/syslogmodule.c
@@ -54,10 +54,23 @@ Revision history:
#include <syslog.h>
-/* only one instance, only one syslog, so globals should be ok */
-static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */
+/*[clinic input]
+module syslog
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=478f4ac94a1d4cae]*/
+
+#include "clinic/syslogmodule.c.h"
+
+/* only one instance, only one syslog, so globals should be ok,
+ * these fields are writable from the main interpreter only. */
+static PyObject *S_ident_o = NULL; // identifier, held by openlog()
static char S_log_open = 0;
+static inline int
+is_main_interpreter(void)
+{
+ return (PyInterpreterState_Get() == PyInterpreterState_Main());
+}
static PyObject *
syslog_get_argv(void)
@@ -113,18 +126,29 @@ syslog_get_argv(void)
}
+/*[clinic input]
+syslog.openlog
+
+ ident: unicode = NULL
+ logoption as logopt: long = 0
+ facility: long(c_default="LOG_USER") = LOG_USER
+
+Set logging options of subsequent syslog() calls.
+[clinic start generated code]*/
+
static PyObject *
-syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds)
+syslog_openlog_impl(PyObject *module, PyObject *ident, long logopt,
+ long facility)
+/*[clinic end generated code: output=5476c12829b6eb75 input=8a987a96a586eee7]*/
{
- long logopt = 0;
- long facility = LOG_USER;
- PyObject *ident = NULL;
- static char *keywords[] = {"ident", "logoption", "facility", 0};
- const char *ident_str = NULL;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwds,
- "|Ull:openlog", keywords, &ident, &logopt, &facility))
+ // Since the sys.openlog changes the process level state of syslog library,
+ // this operation is only allowed for the main interpreter.
+ if (!is_main_interpreter()) {
+ PyErr_SetString(PyExc_RuntimeError, "subinterpreter can't use syslog.openlog()");
return NULL;
+ }
+
+ const char *ident_str = NULL;
if (ident) {
Py_INCREF(ident);
@@ -158,55 +182,48 @@ syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds)
}
-static PyObject *
-syslog_syslog(PyObject * self, PyObject * args)
-{
- PyObject *message_object;
- const char *message;
- int priority = LOG_INFO;
- if (!PyArg_ParseTuple(args, "iU;[priority,] message string",
- &priority, &message_object)) {
- PyErr_Clear();
- if (!PyArg_ParseTuple(args, "U;[priority,] message string",
- &message_object))
- return NULL;
- }
+/*[clinic input]
+syslog.syslog
- message = PyUnicode_AsUTF8(message_object);
- if (message == NULL)
- return NULL;
+ [
+ priority: int(c_default="LOG_INFO") = LOG_INFO
+ ]
+
+ message: str
+ /
+
+Send the string message to the system logger.
+[clinic start generated code]*/
+
+static PyObject *
+syslog_syslog_impl(PyObject *module, int group_left_1, int priority,
+ const char *message)
+/*[clinic end generated code: output=c3dbc73445a0e078 input=ac83d92b12ea3d4e]*/
+{
if (PySys_Audit("syslog.syslog", "is", priority, message) < 0) {
return NULL;
}
/* if log is not opened, open it now */
if (!S_log_open) {
- PyObject *openargs;
-
- /* Continue even if PyTuple_New fails, because openlog(3) is optional.
- * So, we can still do logging in the unlikely event things are so hosed
- * that we can't do this tuple.
- */
- if ((openargs = PyTuple_New(0))) {
- PyObject *openlog_ret = syslog_openlog(self, openargs, NULL);
- Py_DECREF(openargs);
- if (openlog_ret == NULL) {
- return NULL;
- }
- Py_DECREF(openlog_ret);
+ if (!is_main_interpreter()) {
+ PyErr_SetString(PyExc_RuntimeError, "subinterpreter can't use syslog.syslog() "
+ "until the syslog is opened by the main interpreter");
+ return NULL;
}
- else {
+ PyObject *openlog_ret = syslog_openlog_impl(module, NULL, 0, LOG_USER);
+ if (openlog_ret == NULL) {
return NULL;
}
+ Py_DECREF(openlog_ret);
}
/* Incref ident, because it can be decrefed if syslog.openlog() is
* called when the GIL is released.
*/
- PyObject *ident = S_ident_o;
- Py_XINCREF(ident);
+ PyObject *ident = Py_XNewRef(S_ident_o);
#ifdef __APPLE__
// gh-98178: On macOS, libc syslog() is not thread-safe
syslog(priority, "%s", message);
@@ -219,9 +236,24 @@ syslog_syslog(PyObject * self, PyObject * args)
Py_RETURN_NONE;
}
+
+/*[clinic input]
+syslog.closelog
+
+Reset the syslog module values and call the system library closelog().
+[clinic start generated code]*/
+
static PyObject *
-syslog_closelog(PyObject *self, PyObject *unused)
+syslog_closelog_impl(PyObject *module)
+/*[clinic end generated code: output=97890a80a24b1b84 input=fb77a54d447acf07]*/
{
+ // Since the sys.closelog changes the process level state of syslog library,
+ // this operation is only allowed for the main interpreter.
+ if (!is_main_interpreter()) {
+ PyErr_SetString(PyExc_RuntimeError, "sunbinterpreter can't use syslog.closelog()");
+ return NULL;
+ }
+
if (PySys_Audit("syslog.closelog", NULL) < 0) {
return NULL;
}
@@ -233,51 +265,67 @@ syslog_closelog(PyObject *self, PyObject *unused)
Py_RETURN_NONE;
}
-static PyObject *
-syslog_setlogmask(PyObject *self, PyObject *args)
-{
- long maskpri, omaskpri;
+/*[clinic input]
+syslog.setlogmask -> long
- if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
- return NULL;
+ maskpri: long
+ /
+
+Set the priority mask to maskpri and return the previous mask value.
+[clinic start generated code]*/
+
+static long
+syslog_setlogmask_impl(PyObject *module, long maskpri)
+/*[clinic end generated code: output=d6ed163917b434bf input=adff2c2b76c7629c]*/
+{
if (PySys_Audit("syslog.setlogmask", "l", maskpri) < 0) {
- return NULL;
+ return -1;
}
- omaskpri = setlogmask(maskpri);
- return PyLong_FromLong(omaskpri);
+
+ return setlogmask(maskpri);
}
-static PyObject *
-syslog_log_mask(PyObject *self, PyObject *args)
+/*[clinic input]
+syslog.LOG_MASK -> long
+
+ pri: long
+ /
+
+Calculates the mask for the individual priority pri.
+[clinic start generated code]*/
+
+static long
+syslog_LOG_MASK_impl(PyObject *module, long pri)
+/*[clinic end generated code: output=c4a5bbfcc74c7c94 input=534829cb7fb5f7d2]*/
{
- long mask;
- long pri;
- if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
- return NULL;
- mask = LOG_MASK(pri);
- return PyLong_FromLong(mask);
+ return LOG_MASK(pri);
}
-static PyObject *
-syslog_log_upto(PyObject *self, PyObject *args)
+/*[clinic input]
+syslog.LOG_UPTO -> long
+
+ pri: long
+ /
+
+Calculates the mask for all priorities up to and including pri.
+[clinic start generated code]*/
+
+static long
+syslog_LOG_UPTO_impl(PyObject *module, long pri)
+/*[clinic end generated code: output=9eab083c90601d7e input=5e906d6c406b7458]*/
{
- long mask;
- long pri;
- if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
- return NULL;
- mask = LOG_UPTO(pri);
- return PyLong_FromLong(mask);
+ return LOG_UPTO(pri);
}
/* List of functions defined in the module */
static PyMethodDef syslog_methods[] = {
- {"openlog", _PyCFunction_CAST(syslog_openlog), METH_VARARGS | METH_KEYWORDS},
- {"closelog", syslog_closelog, METH_NOARGS},
- {"syslog", syslog_syslog, METH_VARARGS},
- {"setlogmask", syslog_setlogmask, METH_VARARGS},
- {"LOG_MASK", syslog_log_mask, METH_VARARGS},
- {"LOG_UPTO", syslog_log_upto, METH_VARARGS},
+ SYSLOG_OPENLOG_METHODDEF
+ SYSLOG_CLOSELOG_METHODDEF
+ SYSLOG_SYSLOG_METHODDEF
+ SYSLOG_SETLOGMASK_METHODDEF
+ SYSLOG_LOG_MASK_METHODDEF
+ SYSLOG_LOG_UPTO_METHODDEF
{NULL, NULL, 0}
};
@@ -358,6 +406,7 @@ syslog_exec(PyObject *module)
static PyModuleDef_Slot syslog_slots[] = {
{Py_mod_exec, syslog_exec},
+ {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
{0, NULL}
};