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

@ -350,6 +350,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(exception)
STRUCT_FOR_ID(exp)
STRUCT_FOR_ID(extend)
STRUCT_FOR_ID(facility)
STRUCT_FOR_ID(factory)
STRUCT_FOR_ID(family)
STRUCT_FOR_ID(fanout)
@ -392,6 +393,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(hi)
STRUCT_FOR_ID(hook)
STRUCT_FOR_ID(id)
STRUCT_FOR_ID(ident)
STRUCT_FOR_ID(ignore)
STRUCT_FOR_ID(imag)
STRUCT_FOR_ID(importlib)
@ -447,6 +449,7 @@ struct _Py_global_strings {
STRUCT_FOR_ID(lo)
STRUCT_FOR_ID(locale)
STRUCT_FOR_ID(locals)
STRUCT_FOR_ID(logoption)
STRUCT_FOR_ID(loop)
STRUCT_FOR_ID(mapping)
STRUCT_FOR_ID(match)

View File

@ -859,6 +859,7 @@ extern "C" {
INIT_ID(exception), \
INIT_ID(exp), \
INIT_ID(extend), \
INIT_ID(facility), \
INIT_ID(factory), \
INIT_ID(family), \
INIT_ID(fanout), \
@ -901,6 +902,7 @@ extern "C" {
INIT_ID(hi), \
INIT_ID(hook), \
INIT_ID(id), \
INIT_ID(ident), \
INIT_ID(ignore), \
INIT_ID(imag), \
INIT_ID(importlib), \
@ -956,6 +958,7 @@ extern "C" {
INIT_ID(lo), \
INIT_ID(locale), \
INIT_ID(locals), \
INIT_ID(logoption), \
INIT_ID(loop), \
INIT_ID(mapping), \
INIT_ID(match), \
@ -2026,6 +2029,8 @@ _PyUnicode_InitStaticStrings(void) {
PyUnicode_InternInPlace(&string);
string = &_Py_ID(extend);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(facility);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(factory);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(family);
@ -2110,6 +2115,8 @@ _PyUnicode_InitStaticStrings(void) {
PyUnicode_InternInPlace(&string);
string = &_Py_ID(id);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(ident);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(ignore);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(imag);
@ -2220,6 +2227,8 @@ _PyUnicode_InitStaticStrings(void) {
PyUnicode_InternInPlace(&string);
string = &_Py_ID(locals);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(logoption);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(loop);
PyUnicode_InternInPlace(&string);
string = &_Py_ID(mapping);
@ -5981,6 +5990,10 @@ _PyStaticObjects_CheckRefcnt(void) {
_PyObject_Dump((PyObject *)&_Py_ID(extend));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
};
if (Py_REFCNT((PyObject *)&_Py_ID(facility)) < _PyObject_IMMORTAL_REFCNT) {
_PyObject_Dump((PyObject *)&_Py_ID(facility));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
};
if (Py_REFCNT((PyObject *)&_Py_ID(factory)) < _PyObject_IMMORTAL_REFCNT) {
_PyObject_Dump((PyObject *)&_Py_ID(factory));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
@ -6149,6 +6162,10 @@ _PyStaticObjects_CheckRefcnt(void) {
_PyObject_Dump((PyObject *)&_Py_ID(id));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
};
if (Py_REFCNT((PyObject *)&_Py_ID(ident)) < _PyObject_IMMORTAL_REFCNT) {
_PyObject_Dump((PyObject *)&_Py_ID(ident));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
};
if (Py_REFCNT((PyObject *)&_Py_ID(ignore)) < _PyObject_IMMORTAL_REFCNT) {
_PyObject_Dump((PyObject *)&_Py_ID(ignore));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
@ -6369,6 +6386,10 @@ _PyStaticObjects_CheckRefcnt(void) {
_PyObject_Dump((PyObject *)&_Py_ID(locals));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
};
if (Py_REFCNT((PyObject *)&_Py_ID(logoption)) < _PyObject_IMMORTAL_REFCNT) {
_PyObject_Dump((PyObject *)&_Py_ID(logoption));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");
};
if (Py_REFCNT((PyObject *)&_Py_ID(loop)) < _PyObject_IMMORTAL_REFCNT) {
_PyObject_Dump((PyObject *)&_Py_ID(loop));
Py_FatalError("immortal object has less refcnt than expected _PyObject_IMMORTAL_REFCNT");

257
Modules/clinic/syslogmodule.c.h generated Normal file
View File

@ -0,0 +1,257 @@
/*[clinic input]
preserve
[clinic start generated code]*/
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
# include "pycore_gc.h" // PyGC_Head
# include "pycore_runtime.h" // _Py_ID()
#endif
PyDoc_STRVAR(syslog_openlog__doc__,
"openlog($module, /, ident=<unrepresentable>, logoption=0,\n"
" facility=LOG_USER)\n"
"--\n"
"\n"
"Set logging options of subsequent syslog() calls.");
#define SYSLOG_OPENLOG_METHODDEF \
{"openlog", _PyCFunction_CAST(syslog_openlog), METH_FASTCALL|METH_KEYWORDS, syslog_openlog__doc__},
static PyObject *
syslog_openlog_impl(PyObject *module, PyObject *ident, long logopt,
long facility);
static PyObject *
syslog_openlog(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
#define NUM_KEYWORDS 3
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_item = { &_Py_ID(ident), &_Py_ID(logoption), &_Py_ID(facility), },
};
#undef NUM_KEYWORDS
#define KWTUPLE (&_kwtuple.ob_base.ob_base)
#else // !Py_BUILD_CORE
# define KWTUPLE NULL
#endif // !Py_BUILD_CORE
static const char * const _keywords[] = {"ident", "logoption", "facility", NULL};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "openlog",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[3];
Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
PyObject *ident = NULL;
long logopt = 0;
long facility = LOG_USER;
args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 3, 0, argsbuf);
if (!args) {
goto exit;
}
if (!noptargs) {
goto skip_optional_pos;
}
if (args[0]) {
if (!PyUnicode_Check(args[0])) {
_PyArg_BadArgument("openlog", "argument 'ident'", "str", args[0]);
goto exit;
}
if (PyUnicode_READY(args[0]) == -1) {
goto exit;
}
ident = args[0];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (args[1]) {
logopt = PyLong_AsLong(args[1]);
if (logopt == -1 && PyErr_Occurred()) {
goto exit;
}
if (!--noptargs) {
goto skip_optional_pos;
}
}
facility = PyLong_AsLong(args[2]);
if (facility == -1 && PyErr_Occurred()) {
goto exit;
}
skip_optional_pos:
return_value = syslog_openlog_impl(module, ident, logopt, facility);
exit:
return return_value;
}
PyDoc_STRVAR(syslog_syslog__doc__,
"syslog([priority=LOG_INFO,] message)\n"
"Send the string message to the system logger.");
#define SYSLOG_SYSLOG_METHODDEF \
{"syslog", (PyCFunction)syslog_syslog, METH_VARARGS, syslog_syslog__doc__},
static PyObject *
syslog_syslog_impl(PyObject *module, int group_left_1, int priority,
const char *message);
static PyObject *
syslog_syslog(PyObject *module, PyObject *args)
{
PyObject *return_value = NULL;
int group_left_1 = 0;
int priority = LOG_INFO;
const char *message;
switch (PyTuple_GET_SIZE(args)) {
case 1:
if (!PyArg_ParseTuple(args, "s:syslog", &message)) {
goto exit;
}
break;
case 2:
if (!PyArg_ParseTuple(args, "is:syslog", &priority, &message)) {
goto exit;
}
group_left_1 = 1;
break;
default:
PyErr_SetString(PyExc_TypeError, "syslog.syslog requires 1 to 2 arguments");
goto exit;
}
return_value = syslog_syslog_impl(module, group_left_1, priority, message);
exit:
return return_value;
}
PyDoc_STRVAR(syslog_closelog__doc__,
"closelog($module, /)\n"
"--\n"
"\n"
"Reset the syslog module values and call the system library closelog().");
#define SYSLOG_CLOSELOG_METHODDEF \
{"closelog", (PyCFunction)syslog_closelog, METH_NOARGS, syslog_closelog__doc__},
static PyObject *
syslog_closelog_impl(PyObject *module);
static PyObject *
syslog_closelog(PyObject *module, PyObject *Py_UNUSED(ignored))
{
return syslog_closelog_impl(module);
}
PyDoc_STRVAR(syslog_setlogmask__doc__,
"setlogmask($module, maskpri, /)\n"
"--\n"
"\n"
"Set the priority mask to maskpri and return the previous mask value.");
#define SYSLOG_SETLOGMASK_METHODDEF \
{"setlogmask", (PyCFunction)syslog_setlogmask, METH_O, syslog_setlogmask__doc__},
static long
syslog_setlogmask_impl(PyObject *module, long maskpri);
static PyObject *
syslog_setlogmask(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
long maskpri;
long _return_value;
maskpri = PyLong_AsLong(arg);
if (maskpri == -1 && PyErr_Occurred()) {
goto exit;
}
_return_value = syslog_setlogmask_impl(module, maskpri);
if ((_return_value == -1) && PyErr_Occurred()) {
goto exit;
}
return_value = PyLong_FromLong(_return_value);
exit:
return return_value;
}
PyDoc_STRVAR(syslog_LOG_MASK__doc__,
"LOG_MASK($module, pri, /)\n"
"--\n"
"\n"
"Calculates the mask for the individual priority pri.");
#define SYSLOG_LOG_MASK_METHODDEF \
{"LOG_MASK", (PyCFunction)syslog_LOG_MASK, METH_O, syslog_LOG_MASK__doc__},
static long
syslog_LOG_MASK_impl(PyObject *module, long pri);
static PyObject *
syslog_LOG_MASK(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
long pri;
long _return_value;
pri = PyLong_AsLong(arg);
if (pri == -1 && PyErr_Occurred()) {
goto exit;
}
_return_value = syslog_LOG_MASK_impl(module, pri);
if ((_return_value == -1) && PyErr_Occurred()) {
goto exit;
}
return_value = PyLong_FromLong(_return_value);
exit:
return return_value;
}
PyDoc_STRVAR(syslog_LOG_UPTO__doc__,
"LOG_UPTO($module, pri, /)\n"
"--\n"
"\n"
"Calculates the mask for all priorities up to and including pri.");
#define SYSLOG_LOG_UPTO_METHODDEF \
{"LOG_UPTO", (PyCFunction)syslog_LOG_UPTO, METH_O, syslog_LOG_UPTO__doc__},
static long
syslog_LOG_UPTO_impl(PyObject *module, long pri);
static PyObject *
syslog_LOG_UPTO(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
long pri;
long _return_value;
pri = PyLong_AsLong(arg);
if (pri == -1 && PyErr_Occurred()) {
goto exit;
}
_return_value = syslog_LOG_UPTO_impl(module, pri);
if ((_return_value == -1) && PyErr_Occurred()) {
goto exit;
}
return_value = PyLong_FromLong(_return_value);
exit:
return return_value;
}
/*[clinic end generated code: output=3b1bdb16565b8fda input=a9049054013a1b77]*/

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,49 +169,38 @@ 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);
PyObject *openlog_ret = syslog_openlog_impl(module, NULL, 0, LOG_USER);
if (openlog_ret == NULL) {
return NULL;
}
Py_DECREF(openlog_ret);
}
else {
return NULL;
}
}
/* Incref ident, because it can be decrefed if syslog.openlog() is
* called when the GIL is released.
@ -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;
}
omaskpri = setlogmask(maskpri);
return PyLong_FromLong(omaskpri);
return -1;
}
static PyObject *
syslog_log_mask(PyObject *self, PyObject *args)
{
long mask;
long pri;
if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
return NULL;
mask = LOG_MASK(pri);
return PyLong_FromLong(mask);
return setlogmask(maskpri);
}
static PyObject *
syslog_log_upto(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_UPTO", &pri))
return NULL;
mask = LOG_UPTO(pri);
return PyLong_FromLong(mask);
return LOG_MASK(pri);
}
/*[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]*/
{
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}
};