Skip to content

Commit d63fb5f

Browse files
tiranadorilson
authored andcommitted
bpo-1635741: Port grp and pwd to multiphase initialization (pythonGH-23360)
Signed-off-by: Christian Heimes <christian@python.org>
1 parent 4f3a280 commit d63fb5f

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:
253252
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 *state = 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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy