summaryrefslogtreecommitdiff
path: root/Modules/grpmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/grpmodule.c')
-rw-r--r--Modules/grpmodule.c71
1 files changed, 36 insertions, 35 deletions
diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c
index c4d16819e4..f6298ca0ee 100644
--- a/Modules/grpmodule.c
+++ b/Modules/grpmodule.c
@@ -46,20 +46,19 @@ get_grp_state(PyObject *module)
return (grpmodulestate *)state;
}
-#define modulestate_global get_grp_state(PyState_FindModule(&grpmodule))
-
static struct PyModuleDef grpmodule;
#define DEFAULT_BUFFER_SIZE 1024
static PyObject *
-mkgrent(struct group *p)
+mkgrent(PyObject *module, struct group *p)
{
int setIndex = 0;
PyObject *v, *w;
char **member;
- if ((v = PyStructSequence_New(modulestate_global->StructGrpType)) == NULL)
+ v = PyStructSequence_New(get_grp_state(module)->StructGrpType);
+ if (v == NULL)
return NULL;
if ((w = PyList_New(0)) == NULL) {
@@ -170,7 +169,7 @@ grp_getgrgid_impl(PyObject *module, PyObject *id)
Py_DECREF(gid_obj);
return NULL;
}
- retval = mkgrent(p);
+ retval = mkgrent(module, p);
#ifdef HAVE_GETGRGID_R
PyMem_RawFree(buf);
#endif
@@ -248,7 +247,7 @@ grp_getgrnam_impl(PyObject *module, PyObject *name)
}
goto out;
}
- retval = mkgrent(p);
+ retval = mkgrent(module, p);
out:
PyMem_RawFree(buf);
Py_DECREF(bytes);
@@ -275,7 +274,7 @@ grp_getgrall_impl(PyObject *module)
return NULL;
setgrent();
while ((p = getgrent()) != NULL) {
- PyObject *v = mkgrent(p);
+ PyObject *v = mkgrent(module, p);
if (v == NULL || PyList_Append(d, v) != 0) {
Py_XDECREF(v);
Py_DECREF(d);
@@ -311,6 +310,26 @@ users are not explicitly listed as members of the groups they are in\n\
according to the password database. Check both databases to get\n\
complete membership information.)");
+static int
+grpmodule_exec(PyObject *module)
+{
+ grpmodulestate *state = get_grp_state(module);
+
+ state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc);
+ if (state->StructGrpType == NULL) {
+ return -1;
+ }
+ if (PyModule_AddType(module, state->StructGrpType) < 0) {
+ return -1;
+ }
+ return 0;
+}
+
+static PyModuleDef_Slot grpmodule_slots[] = {
+ {Py_mod_exec, grpmodule_exec},
+ {0, NULL}
+};
+
static int grpmodule_traverse(PyObject *m, visitproc visit, void *arg) {
Py_VISIT(get_grp_state(m)->StructGrpType);
return 0;
@@ -326,37 +345,19 @@ static void grpmodule_free(void *m) {
}
static struct PyModuleDef grpmodule = {
- PyModuleDef_HEAD_INIT,
- "grp",
- grp__doc__,
- sizeof(grpmodulestate),
- grp_methods,
- NULL,
- grpmodule_traverse,
- grpmodule_clear,
- grpmodule_free,
+ PyModuleDef_HEAD_INIT,
+ .m_name = "grp",
+ .m_doc = grp__doc__,
+ .m_size = sizeof(grpmodulestate),
+ .m_methods = grp_methods,
+ .m_slots = grpmodule_slots,
+ .m_traverse = grpmodule_traverse,
+ .m_clear = grpmodule_clear,
+ .m_free = grpmodule_free,
};
PyMODINIT_FUNC
PyInit_grp(void)
{
- PyObject *m;
- if ((m = PyState_FindModule(&grpmodule)) != NULL) {
- Py_INCREF(m);
- return m;
- }
-
- if ((m = PyModule_Create(&grpmodule)) == NULL) {
- return NULL;
- }
-
- grpmodulestate *state = PyModule_GetState(m);
- state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc);
- if (state->StructGrpType == NULL) {
- return NULL;
- }
-
- Py_INCREF(state->StructGrpType);
- PyModule_AddObject(m, "struct_group", (PyObject *) state->StructGrpType);
- return m;
+ return PyModuleDef_Init(&grpmodule);
}