bpo-1635741: Port grp and pwd to multiphase initialization (GH-23360)
Signed-off-by: Christian Heimes <christian@python.org>
diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c
index 901a3ed..14d3f9d 100644
--- a/Modules/pwdmodule.c
+++ b/Modules/pwdmodule.c
@@ -59,8 +59,6 @@ get_pwd_state(PyObject *module)
return (pwdmodulestate *)state;
}
-#define modulestate_global get_pwd_state(PyState_FindModule(&pwdmodule))
-
static struct PyModuleDef pwdmodule;
#define DEFAULT_BUFFER_SIZE 1024
@@ -79,10 +77,10 @@ sets(PyObject *v, int i, const char* val)
}
static PyObject *
-mkpwent(struct passwd *p)
+mkpwent(PyObject *module, struct passwd *p)
{
int setIndex = 0;
- PyObject *v = PyStructSequence_New(modulestate_global->StructPwdType);
+ PyObject *v = PyStructSequence_New(get_pwd_state(module)->StructPwdType);
if (v == NULL)
return NULL;
@@ -194,7 +192,7 @@ pwd_getpwuid(PyObject *module, PyObject *uidobj)
Py_DECREF(uid_obj);
return NULL;
}
- retval = mkpwent(p);
+ retval = mkpwent(module, p);
#ifdef HAVE_GETPWUID_R
PyMem_RawFree(buf);
#endif
@@ -274,7 +272,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *name)
}
goto out;
}
- retval = mkpwent(p);
+ retval = mkpwent(module, p);
out:
PyMem_RawFree(buf);
Py_DECREF(bytes);
@@ -300,7 +298,7 @@ pwd_getpwall_impl(PyObject *module)
return NULL;
setpwent();
while ((p = getpwent()) != NULL) {
- PyObject *v = mkpwent(p);
+ PyObject *v = mkpwent(module, p);
if (v == NULL || PyList_Append(d, v) != 0) {
Py_XDECREF(v);
Py_DECREF(d);
@@ -323,6 +321,26 @@ static PyMethodDef pwd_methods[] = {
{NULL, NULL} /* sentinel */
};
+static int
+pwdmodule_exec(PyObject *module)
+{
+ pwdmodulestate *state = get_pwd_state(module);
+
+ state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc);
+ if (state->StructPwdType == NULL) {
+ return -1;
+ }
+ if (PyModule_AddType(module, state->StructPwdType) < 0) {
+ return -1;
+ }
+ return 0;
+}
+
+static PyModuleDef_Slot pwdmodule_slots[] = {
+ {Py_mod_exec, pwdmodule_exec},
+ {0, NULL}
+};
+
static int pwdmodule_traverse(PyObject *m, visitproc visit, void *arg) {
Py_VISIT(get_pwd_state(m)->StructPwdType);
return 0;
@@ -337,34 +355,19 @@ static void pwdmodule_free(void *m) {
static struct PyModuleDef pwdmodule = {
PyModuleDef_HEAD_INIT,
- "pwd",
- pwd__doc__,
- sizeof(pwdmodulestate),
- pwd_methods,
- NULL,
- pwdmodule_traverse,
- pwdmodule_clear,
- pwdmodule_free,
+ .m_name = "pwd",
+ .m_doc = pwd__doc__,
+ .m_size = sizeof(pwdmodulestate),
+ .m_methods = pwd_methods,
+ .m_slots = pwdmodule_slots,
+ .m_traverse = pwdmodule_traverse,
+ .m_clear = pwdmodule_clear,
+ .m_free = pwdmodule_free,
};
PyMODINIT_FUNC
PyInit_pwd(void)
{
- PyObject *m;
- if ((m = PyState_FindModule(&pwdmodule)) != NULL) {
- Py_INCREF(m);
- return m;
- }
- if ((m = PyModule_Create(&pwdmodule)) == NULL)
- return NULL;
-
- pwdmodulestate *state = PyModule_GetState(m);
- state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc);
- if (state->StructPwdType == NULL) {
- return NULL;
- }
- Py_INCREF(state->StructPwdType);
- PyModule_AddObject(m, "struct_passwd", (PyObject *) state->StructPwdType);
- return m;
+ return PyModuleDef_Init(&pwdmodule);
}