8000 bpo-1635741: Port grp and pwd to multiphase initialization (GH-23360) · python/cpython@fa2eee9 · GitHub
[go: up one dir, main page]

Skip to content

Commit fa2eee9

Browse files
authored
bpo-1635741: Port grp and pwd to multiphase initialization (GH-23360)
Signed-off-by: Christian Heimes <christian@python.org>
1 parent cc0cd43 commit fa2eee9

File tree

3 files changed

+72
-66
lines changed

3 files changed

+72
-66
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Port :mod:`grp` and :mod:`pwd` extension modules to multiphase
2+
initialization (:pep:`489`)

Modules/grpmodule.c

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,19 @@ get_grp_state(PyObject *module)
4646
return (grpmodulestate *)state;
4747
}
4848

49-
#define modulestate_global get_grp_state(PyState_FindModule(&grpmodule))
50-
5149
static struct PyModuleDef grpmodule;
5250

5351
#define DEFAULT_BUFFER_SIZE 1024
5452

5553
static PyObject *
56-
mkgrent(struct group *p)
54+
mkgrent(PyObject *module, struct group *p)
5755
{
5856
int setIndex = 0;
5957
PyObject *v, *w;
6058
char **member;
6159

62-
if ((v = PyStructSequence_New(modulestate_global->StructGrpType)) == NULL)
60+
v = PyStructSequence_New(get_grp_state(module)->StructGrpType);
61+
if (v == NULL)
6362
return NULL;
6463

6564
if ((w = PyList_New(0)) == NULL) {
@@ -170,7 +169,7 @@ grp_getgrgid_impl(PyObject *module, PyObject *id)
170169
Py_DECREF(gid_obj);
171170
return NULL;
172171
}
173-
retval = mkgrent(p);
172+
retval = mkgrent(module, p);
174173
#ifdef HAVE_GETGRGID_R
175174
PyMem_RawFree(buf);
176175
#endif
@@ -248,7 +247,7 @@ grp_getgrnam_impl(PyObject *module, PyObject *name)
248247
}
249248
goto out;
250249
}
251-
retval = mkgrent(p);
250+
retval = mkgrent(module, p);
252251
out:
2 8000 53252
PyMem_RawFree(buf);
254253
Py_DECREF(bytes);
@@ -275,7 +274,7 @@ grp_getgrall_impl(PyObject *module)
275274
return NULL;
276275
setgrent();
277276
while ((p = getgrent()) != NULL) {
278-
PyObject *v = mkgrent(p);
277+
PyObject *v = mkgrent(module, p);
279278
if (v == NULL || PyList_Append(d, v) != 0) {
280279
Py_XDECREF(v);
281280
Py_DECREF(d);
@@ -311,6 +310,26 @@ users are not explicitly listed as members of the groups they are in\n\
311310
according to the password database. Check both databases to get\n\
312311
complete membership information.)");
313312

313+
static int
314+
grpmodule_exec(PyObject *module)
315+
{
316+
grpmodulestate *s 628C tate = get_grp_state(module);
317+
318+
state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc);
319+
if (state->StructGrpType == NULL) {
320+
return -1;
321+
}
322+
if (PyModule_AddType(module, state->StructGrpType) < 0) {
323+
return -1;
324+
}
325+
return 0;
326+
}
327+
328+
static PyModuleDef_Slot grpmodule_slots[] = {
329+
{Py_mod_exec, grpmodule_exec},
330+
{0, NULL}
331+
};
332+
314333
static int grpmodule_traverse(PyObject *m, visitproc visit, void *arg) {
315334
Py_VISIT(get_grp_state(m)->StructGrpType);
316335
return 0;
@@ -326,37 +345,19 @@ static void grpmodule_free(void *m) {
326345
}
327346

328347
static struct PyModuleDef grpmodule = {
329-
PyModuleDef_HEAD_INIT,
330-
"grp",
331-
grp__doc__,
332-
sizeof(grpmodulestate),
333-
grp_methods,
334-
NULL,
335-
grpmodule_traverse,
336-
grpmodule_clear,
337-
grpmodule_free,
348+
PyModuleDef_HEAD_INIT,
349+
.m_name = "grp",
350+
.m_doc = grp__doc__,
351+
.m_size = sizeof(grpmodulestate),
352+
.m_methods = grp_methods,
353+
.m_slots = grpmodule_slots,
354+
.m_traverse = grpmodule_traverse,
355+
.m_clear = grpmodule_clear,
356+
.m_free = grpmodule_free,
338357
};
339358

340359
PyMODINIT_FUNC
341360
PyInit_grp(void)
342361
{
343-
PyObject *m;
344-
if ((m = PyState_FindModule(&grpmodule)) != NULL) {
345-
Py_INCREF(m);
346-
return m;
347-
}
348-
349-
if ((m = PyModule_Create(&grpmodule)) == NULL) {
350-
return NULL;
351-
}
352-
353-
grpmodulestate *state = PyModule_GetState(m);
354-
state->StructGrpType = PyStructSequence_NewType(&struct_group_type_desc);
355-
if (state->StructGrpType == NULL) {
356-
return NULL;
357-
}
358-
359-
Py_INCREF(state->StructGrpType);
360-
PyModule_AddObject(m, "struct_group", (PyObject *) state->StructGrpType);
361-
return m;
362+
return PyModuleDef_Init(&grpmodule);
362363
}

Modules/pwdmodule.c

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ get_pwd_state(PyObject *module)
5959
return (pwdmodulestate *)state;
6060
}
6161

62-
#define modulestate_global get_pwd_state(PyState_FindModule(&pwdmodule))
63-
6462
static struct PyModuleDef pwdmodule;
6563

6664
#define DEFAULT_BUFFER_SIZE 1024
@@ -79,10 +77,10 @@ sets(PyObject *v, int i, const char* val)
7977
}
8078

8179
static PyObject *
82-
mkpwent(struct passwd *p)
80+
mkpwent(PyObject *module, struct passwd *p)
8381
{
8482
int setIndex = 0;
85-
PyObject *v = PyStructSequence_New(modulestate_global->StructPwdType);
83+
PyObject *v = PyStructSequence_New(get_pwd_state(module)->StructPwdType);
8684
if (v == NULL)
8785
return NULL;
8886

@@ -194,7 +192,7 @@ pwd_getpwuid(PyObject *module, PyObject *uidobj)
194192
Py_DECREF(uid_obj);
195193
return NULL;
196194
}
197-
retval = mkpwent(p);
195+
retval = mkpwent(module, p);
198196
#ifdef HAVE_GETPWUID_R
199197
PyMem_RawFree(buf);
200198
#endif
@@ -274,7 +272,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *name)
274272
}
275273
goto out;
276274
}
277-
retval = mkpwent(p);
275+
retval = mkpwent(module, p);
278276
out:
279277
PyMem_RawFree(buf);
280278
Py_DECREF(bytes);
@@ -300,7 +298,7 @@ pwd_getpwall_impl(PyObject *module)
300298
return NULL;
301299
setpwent();
302300
while ((p = getpwent()) != NULL) {
303-
PyObject *v = mkpwent(p);
301+
PyObject *v = mkpwent(module, p);
304302
if (v == NULL || PyList_Append(d, v) != 0) {
305303
Py_XDECREF(v);
306304
Py_DECREF(d);
@@ -323,6 +321,26 @@ static PyMethodDef pwd_methods[] = {
323321
{NULL, NULL} /* sentinel */
324322
};
325323

324+
static int
325+
pwdmodule_exec(PyObject *module)
326+
{
327+
pwdmodulestate *state = get_pwd_state(module);
328+
329+
state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc);
330+
if (state->StructPwdType == NULL) {
331+
return -1;
332+
}
333+
if (PyModule_AddType(module, state->StructPwdType) < 0) {
334+
return -1;
335+
}
336+
return 0;
337+
}
338+
339+
static PyModuleDef_Slot pwdmodule_slots[] = {
340+
{Py_mod_exec, pwdmodule_exec},
341+
{0, NULL}
342+
};
343+
326344
static int pwdmodule_traverse(PyObject *m, visitproc visit, void *arg) {
327345
Py_VISIT(get_pwd_state(m)->StructPwdType);
328346
return 0;
@@ -337,34 +355,19 @@ static void pwdmodule_free(void *m) {
337355

338356
static struct PyModuleDef pwdmodule = {
339357
PyModuleDef_HEAD_INIT,
340-
"pwd",
341-
pwd__doc__,
342-
sizeof(pwdmodulestate),
343-
pwd_methods,
344-
NULL,
345-
pwdmodule_traverse,
346-
pwdmodule_clear,
347-
pwdmodule_free,
358+
.m_name = "pwd",
359+
.m_doc = pwd__doc__,
360+
.m_size = sizeof(pwdmodulestate),
361+
.m_methods = pwd_methods,
362+
.m_slots = pwdmodule_slots,
363+
.m_traverse = pwdmodule_traverse,
364+
.m_clear = pwdmodule_clear,
365+
.m_free = pwdmodule_free,
348366
};
349367

350368

351369
PyMODINIT_FUNC
352370
PyInit_pwd(void)
353371
{
354-
PyObject *m;
355-
if ((m = PyState_FindModule(&pwdmodule)) != NULL) {
356-
Py_INCREF(m);
357-
return m;
358-
}
359-
if ((m = PyModule_Create(&pwdmodule)) == NULL)
360-
return NULL;
361-
362-
pwdmodulestate *state = PyModule_GetState(m);
363-
state->StructPwdType = PyStructSequence_NewType(&struct_pwd_type_desc);
364-
if (state->StructPwdType == NULL) {
365-
return NULL;
366-
}
367-
Py_INCREF(state->StructPwdType);
368-
PyModule_AddObject(m, "struct_passwd", (PyObject *) state->StructPwdType);
369-
return m;
372+
return PyModuleDef_Init(&pwdmodule);
370373
}

0 commit comments

Comments
 (0)
0