gh-95011: Migrate syslog module to Argument Clinic (GH-95012)

This commit is contained in:
Noam Cohen 2022-10-08 21:31:57 +03:00 committed by GitHub
parent 4ed00be98f
commit 5405537813
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 380 additions and 75 deletions

View file

@ -54,6 +54,13 @@ Revision history:
#include <syslog.h>
/*[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 */
static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */
static char S_log_open = 0;
@ -113,18 +120,22 @@ syslog_get_argv(void)
}
static PyObject *
syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds)
{
long logopt = 0;
long facility = LOG_USER;
PyObject *ident = NULL;
static char *keywords[] = {"ident", "logoption", "facility", 0};
const char *ident_str = NULL;
/*[clinic input]
syslog.openlog
if (!PyArg_ParseTupleAndKeywords(args, kwds,
"|Ull:openlog", keywords, &ident, &logopt, &facility))
return NULL;
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_impl(PyObject *module, PyObject *ident, long logopt,
long facility)
/*[clinic end generated code: output=5476c12829b6eb75 input=8a987a96a586eee7]*/
{
const char *ident_str = NULL;
if (ident) {
Py_INCREF(ident);
@ -158,48 +169,37 @@ syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds)
}
/*[clinic input]
syslog.syslog
[
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(PyObject * self, PyObject * args)
syslog_syslog_impl(PyObject *module, int group_left_1, int priority,
const char *message)
/*[clinic end generated code: output=c3dbc73445a0e078 input=ac83d92b12ea3d4e]*/
{
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;
}
message = PyUnicode_AsUTF8(message_object);
if (message == NULL)
return NULL;
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);
}
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
@ -214,8 +214,16 @@ 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]*/
{
if (PySys_Audit("syslog.closelog", NULL) < 0) {
return NULL;
@ -228,51 +236,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}
};