bpo-1635741: Port syslog module to multiphase initialization (GH-19907) · python/cpython@92a98ed
@@ -261,72 +261,55 @@ static PyMethodDef syslog_methods[] = {
261261 {NULL, NULL, 0}
262262};
263263264-/* Initialization function for the module */
265-266-267-static struct PyModuleDef syslogmodule = {
268-PyModuleDef_HEAD_INIT,
269-"syslog",
270-NULL,
271--1,
272-syslog_methods,
273-NULL,
274-NULL,
275-NULL,
276-NULL
277-};
278264279-PyMODINIT_FUNC
280-PyInit_syslog(void)
265+static int
266+syslog_exec(PyObject *module)
281267{
282-PyObject *m;
283-284-/* Create the module and add the functions */
285-m = PyModule_Create(&syslogmodule);
286-if (m == NULL)
287-return NULL;
288-289-/* Add some symbolic constants to the module */
290-268+#define ADD_INT_MACRO(module, macro) \
269+ do { \
270+ if (PyModule_AddIntConstant(module, #macro, macro) < 0) { \
271+ return -1; \
272+ } \
273+ } while (0)
291274/* Priorities */
292-PyModule_AddIntMacro(m, LOG_EMERG);
293-PyModule_AddIntMacro(m, LOG_ALERT);
294-PyModule_AddIntMacro(m, LOG_CRIT);
295-PyModule_AddIntMacro(m, LOG_ERR);
296-PyModule_AddIntMacro(m, LOG_WARNING);
297-PyModule_AddIntMacro(m, LOG_NOTICE);
298-PyModule_AddIntMacro(m, LOG_INFO);
299-PyModule_AddIntMacro(m, LOG_DEBUG);
275+ADD_INT_MACRO(module, LOG_EMERG);
276+ADD_INT_MACRO(module, LOG_ALERT);
277+ADD_INT_MACRO(module, LOG_CRIT);
278+ADD_INT_MACRO(module, LOG_ERR);
279+ADD_INT_MACRO(module, LOG_WARNING);
280+ADD_INT_MACRO(module, LOG_NOTICE);
281+ADD_INT_MACRO(module, LOG_INFO);
282+ADD_INT_MACRO(module, LOG_DEBUG);
300283301284/* openlog() option flags */
302-PyModule_AddIntMacro(m, LOG_PID);
303-PyModule_AddIntMacro(m, LOG_CONS);
304-PyModule_AddIntMacro(m, LOG_NDELAY);
285+ADD_INT_MACRO(module, LOG_PID);
286+ADD_INT_MACRO(module, LOG_CONS);
287+ADD_INT_MACRO(module, LOG_NDELAY);
305288#ifdef LOG_ODELAY
306-PyModule_AddIntMacro(m, LOG_ODELAY);
289+ADD_INT_MACRO(module, LOG_ODELAY);
307290#endif
308291#ifdef LOG_NOWAIT
309-PyModule_AddIntMacro(m, LOG_NOWAIT);
292+ADD_INT_MACRO(module, LOG_NOWAIT);
310293#endif
311294#ifdef LOG_PERROR
312-PyModule_AddIntMacro(m, LOG_PERROR);
295+ADD_INT_MACRO(module, LOG_PERROR);
313296#endif
314297315298/* Facilities */
316-PyModule_AddIntMacro(m, LOG_KERN);
317-PyModule_AddIntMacro(m, LOG_USER);
318-PyModule_AddIntMacro(m, LOG_MAIL);
319-PyModule_AddIntMacro(m, LOG_DAEMON);
320-PyModule_AddIntMacro(m, LOG_AUTH);
321-PyModule_AddIntMacro(m, LOG_LPR);
322-PyModule_AddIntMacro(m, LOG_LOCAL0);
323-PyModule_AddIntMacro(m, LOG_LOCAL1);
324-PyModule_AddIntMacro(m, LOG_LOCAL2);
325-PyModule_AddIntMacro(m, LOG_LOCAL3);
326-PyModule_AddIntMacro(m, LOG_LOCAL4);
327-PyModule_AddIntMacro(m, LOG_LOCAL5);
328-PyModule_AddIntMacro(m, LOG_LOCAL6);
329-PyModule_AddIntMacro(m, LOG_LOCAL7);
299+ADD_INT_MACRO(module, LOG_KERN);
300+ADD_INT_MACRO(module, LOG_USER);
301+ADD_INT_MACRO(module, LOG_MAIL);
302+ADD_INT_MACRO(module, LOG_DAEMON);
303+ADD_INT_MACRO(module, LOG_AUTH);
304+ADD_INT_MACRO(module, LOG_LPR);
305+ADD_INT_MACRO(module, LOG_LOCAL0);
306+ADD_INT_MACRO(module, LOG_LOCAL1);
307+ADD_INT_MACRO(module, LOG_LOCAL2);
308+ADD_INT_MACRO(module, LOG_LOCAL3);
309+ADD_INT_MACRO(module, LOG_LOCAL4);
310+ADD_INT_MACRO(module, LOG_LOCAL5);
311+ADD_INT_MACRO(module, LOG_LOCAL6);
312+ADD_INT_MACRO(module, LOG_LOCAL7);
330313331314#ifndef LOG_SYSLOG
332315#define LOG_SYSLOG LOG_DAEMON
@@ -341,14 +324,35 @@ PyInit_syslog(void)
341324#define LOG_CRON LOG_DAEMON
342325#endif
343326344-PyModule_AddIntMacro(m, LOG_SYSLOG);
345-PyModule_AddIntMacro(m, LOG_CRON);
346-PyModule_AddIntMacro(m, LOG_UUCP);
347-PyModule_AddIntMacro(m, LOG_NEWS);
327+ADD_INT_MACRO(module, LOG_SYSLOG);
328+ADD_INT_MACRO(module, LOG_CRON);
329+ADD_INT_MACRO(module, LOG_UUCP);
330+ADD_INT_MACRO(module, LOG_NEWS);
348331349332#ifdef LOG_AUTHPRIV
350-PyModule_AddIntMacro(m, LOG_AUTHPRIV);
333+ADD_INT_MACRO(module, LOG_AUTHPRIV);
351334#endif
352335353-return m;
336+return 0;
354337}
338+339+static PyModuleDef_Slot syslog_slots[] = {
340+ {Py_mod_exec, syslog_exec},
341+ {0, NULL}
342+};
343+344+/* Initialization function for the module */
345+346+static struct PyModuleDef syslogmodule = {
347+PyModuleDef_HEAD_INIT,
348+ .m_name = "syslog",
349+ .m_size = 0,
350+ .m_methods = syslog_methods,
351+ .m_slots = syslog_slots,
352+};
353+354+PyMODINIT_FUNC
355+PyInit_syslog(void)
356+{
357+return PyModuleDef_Init(&syslogmodule);
358+}