@@ -44,12 +44,42 @@ PyDoc_STRVAR(maps__doc__,
44
44
Returns an array of all available NIS maps within a domain. If domain\n\
45
45
is not specified it defaults to the system default domain.\n" );
46
46
47
- static PyObject * NisError ;
47
+ typedef struct {
48
+ PyObject * nis_error ;
49
+ } nis_state ;
50
+
51
+ static inline nis_state *
52
+ get_nis_state (PyObject * module )
53
+ {
54
+ void * state = PyModule_GetState (module );
55
+ assert (state != NULL );
56
+ return (nis_state * )state ;
57
+ }
58
+
59
+ static int
60
+ nis_clear (PyObject * m )
61
+ {
62
+ Py_CLEAR (get_nis_state (m )-> nis_error );
63
+ return 0 ;
64
+ }
65
+
66
+ static int
67
+ nis_traverse (PyObject * m , visitproc visit , void * arg )
68
+ {
69
+ Py_VISIT (get_nis_state (m )-> nis_error );
70
+ return 0 ;
71
+ }
72
+
73
+ static void
74
+ nis_free (void * m )
75
+ {
76
+ nis_clear ((PyObject * ) m );
77
+ }
48
78
49
79
static PyObject *
50
- nis_error ( int err )
80
+ nis_error ( nis_state * state , int err )
51
81
{
52
- PyErr_SetString (NisError , yperr_string (err ));
82
+ PyErr_SetString (state -> nis_error , yperr_string (err ));
53
83
return NULL ;
54
84
}
55
85
@@ -70,7 +100,7 @@ static struct nis_map {
70
100
};
71
101
72
102
static char *
73
- nis_mapname (char * map , int * pfix )
103
+ nis_mapname (char * map , int * pfix )
74
104
{
75
105
int i ;
76
106
@@ -98,7 +128,7 @@ struct ypcallback_data {
98
128
};
99
129
100
130
static int
101
- nis_foreach (int instatus , char * inkey , int inkeylen , char * inval ,
131
+ nis_foreach (int instatus , char * inkey , int inkeylen , char * inval ,
102
132
int invallen , struct ypcallback_data * indata )
103
133
{
104
134
if (instatus == YP_TRUE ) {
@@ -137,21 +167,22 @@ nis_foreach (int instatus, char *inkey, int inkeylen, char *inval,
137
167
}
138
168
139
169
static PyObject *
140
- nis_get_default_domain (PyObject * self , PyObject * Py_UNUSED (ignored ))
170
+ nis_get_default_domain (PyObject * module , PyObject * Py_UNUSED (ignored ))
141
171
{
142
172
char * domain ;
143
173
int err ;
144
174
PyObject * res ;
145
-
146
- if ((err = yp_get_default_domain (& domain )) != 0 )
147
- return nis_error (err );
175
+ nis_state * state = get_nis_state (module );
176
+ if ((err = yp_get_default_domain (& domain )) != 0 ) {
177
+ return nis_error (state , err );
178
+ }
148
179
149
180
res = PyUnicode_FromStringAndSize (domain , strlen (domain ));
150
181
return res ;
151
182
}
152
183
153
184
static PyObject *
154
- nis_match (PyObject * self , PyObject * args , PyObject * kwdict )
185
+ nis_match (PyObject * module , PyObject * args , PyObject * kwdict )
155
186
{
156
187
char * match ;
157
188
char * domain = NULL ;
@@ -165,18 +196,22 @@ nis_match (PyObject *self, PyObject *args, PyObject *kwdict)
165
196
166
197
if (!PyArg_ParseTupleAndKeywords (args , kwdict ,
167
198
"Us|s:match" , kwlist ,
168
- & ukey , & map , & domain ))
199
+ & ukey , & map , & domain )) {
169
200
return NULL ;
170
- if ((bkey = PyUnicode_EncodeFSDefault (ukey )) == NULL )
201
+ }
202
+ if ((bkey = PyUnicode_EncodeFSDefault (ukey )) == NULL ) {
171
203
return NULL ;
204
+ }
172
205
/* check for embedded null bytes */
173
206
if (PyBytes_AsStringAndSize (bkey , & key , & keylen ) == -1 ) {
174
207
Py_DECREF (bkey );
175
208
return NULL ;
176
209
}
210
+
211
+ nis_state * state = get_nis_state (module );
177
212
if (!domain && ((err = yp_get_default_domain (& domain )) != 0 )) {
178
213
Py_DECREF (bkey );
179
- return nis_error (err );
214
+ return nis_error (state , err );
180
215
}
181
216
map = nis_mapname (map , & fix );
182
217
if (fix )
@@ -187,15 +222,16 @@ nis_match (PyObject *self, PyObject *args, PyObject *kwdict)
187
222
Py_DECREF (bkey );
188
223
if (fix )
189
224
len -- ;
190
- if (err != 0 )
191
- return nis_error (err );
225
+ if (err != 0 ) {
226
+ return nis_error (state , err );
227
+ }
192
228
res = PyUnicode_DecodeFSDefaultAndSize (match , len );
193
229
free (match );
194
230
return res ;
195
231
}
196
232
197
233
static PyObject *
198
- nis_cat (PyObject * self , PyObject * args , PyObject * kwdict )
234
+ nis_cat (PyObject * module , PyObject * args , PyObject * kwdict )
199
235
{
200
236
char * domain = NULL ;
201
237
char * map ;
@@ -206,10 +242,13 @@ nis_cat (PyObject *self, PyObject *args, PyObject *kwdict)
206
242
static char * kwlist [] = {"map" , "domain" , NULL };
207
243
208
244
if (!PyArg_ParseTupleAndKeywords (args , kwdict , "s|s:cat" ,
209
- kwlist , & map , & domain ))
245
+ kwlist , & map , & domain )) {
210
246
return NULL ;
211
- if (!domain && ((err = yp_get_default_domain (& domain )) != 0 ))
212
- return nis_error (err );
247
+ }
248
+ nis_state * state = get_nis_state (module );
249
+ if (!domain && ((err = yp_get_default_domain (& domain )) != 0 )) {
250
+ return nis_error (state , err );
251
+ }
213
252
dict = PyDict_New ();
214
253
if (dict == NULL )
215
254
return NULL ;
@@ -222,7 +261,7 @@ nis_cat (PyObject *self, PyObject *args, PyObject *kwdict)
222
261
PyEval_RestoreThread (data .state );
223
262
if (err != 0 ) {
224
263
Py_DECREF (dict );
225
- return nis_error (err );
264
+ return nis_error (state , err );
226
265
}
227
266
return dict ;
228
267
}
@@ -352,7 +391,7 @@ nisproc_maplist_2(domainname *argp, CLIENT *clnt)
352
391
353
392
static
354
393
nismaplist *
355
- nis_maplist ( char * dom )
394
+ nis_maplist ( nis_state * state , char * dom )
356
395
{
357
396
nisresp_maplist * list ;
358
397
CLIENT * cl ;
@@ -364,12 +403,12 @@ nis_maplist (char *dom)
364
403
mapi ++ ;
365
404
}
366
405
if (!server ) {
367
- PyErr_SetString (NisError , "No NIS master found for any map" );
406
+ PyErr_SetString (state -> nis_error , "No NIS master found for any map" );
368
407
return NULL ;
369
408
}
370
409
cl = clnt_create (server , YPPROG , YPVERS , "tcp" );
371
410
if (cl == NULL ) {
372
- PyErr_SetString (NisError , clnt_spcreateerror (server ));
411
+ PyErr_SetString (state -> nis_error , clnt_spcreateerror (server ));
373
412
goto finally ;
374
413
}
375
414
list = nisproc_maplist_2 (& dom , cl );
@@ -388,7 +427,7 @@ nis_maplist (char *dom)
388
427
}
389
428
390
429
static PyObject *
391
- nis_maps (PyObject * self , PyObject * args , PyObject * kwdict )
430
+ nis_maps (PyObject * module , PyObject * args , PyObject * kwdict )
392
431
{
393
432
char * domain = NULL ;
394
433
nismaplist * maps ;
@@ -397,17 +436,22 @@ nis_maps (PyObject *self, PyObject *args, PyObject *kwdict)
397
436
static char * kwlist [] = {"domain" , NULL };
398
437
399
438
if (!PyArg_ParseTupleAndKeywords (args , kwdict ,
400
- "|s:maps" , kwlist , & domain ))
439
+ "|s:maps" , kwlist , & domain )) {
401
440
return NULL ;
441
+ }
442
+
443
+ nis_state * state = get_nis_state (module );
402
444
if (!domain && ((err = yp_get_default_domain (& domain )) != 0 )) {
403
- nis_error (err );
445
+ nis_error (state , err );
404
446
return NULL ;
405
447
}
406
448
407
- if ((maps = nis_maplist ( domain )) == NULL )
449
+ if ((maps = nis_maplist ( state , domain )) == NULL ) {
408
450
return NULL ;
409
- if ((list = PyList_New (0 )) == NULL )
451
+ }
452
+ if ((list = PyList_New (0 )) == NULL ) {
410
453
return NULL ;
454
+ }
411
455
for (; maps ; maps = maps -> next ) {
412
456
PyObject * str = PyUnicode_FromString (maps -> map );
413
457
if (!str || PyList_Append (list , str ) < 0 )
@@ -439,31 +483,45 @@ static PyMethodDef nis_methods[] = {
439
483
{NULL , NULL } /* Sentinel */
440
484
};
441
485
486
+ static int
487
+ nis_exec (PyObject * module )
488
+ {
489
+ nis_state * state = get_nis_state (module );
490
+ state -> nis_error = PyErr_NewException ("nis.error" , NULL , NULL );
491
+ if (state -> nis_error == NULL ) {
492
+ return -1 ;
493
+ }
494
+
495
+ Py_INCREF (state -> nis_error );
496
+ if (PyModule_AddObject (module , "error" , state -> nis_error ) < 0 ) {
497
+ Py_DECREF (state -> nis_error );
498
+ return -1 ;
499
+ }
500
+ return 0 ;
501
+ }
502
+
503
+ static PyModuleDef_Slot nis_slots [] = {
504
+ {Py_mod_exec , nis_exec },
505
+ {0 , NULL }
506
+ };
507
+
442
508
PyDoc_STRVAR (nis__doc__ ,
443
509
"This module contains functions for accessing NIS maps.\n" );
444
510
445
511
static struct PyModuleDef nismodule = {
446
512
PyModuleDef_HEAD_INIT ,
447
- "nis" ,
448
- nis__doc__ ,
449
- -1 ,
450
- nis_methods ,
451
- NULL ,
452
- NULL ,
453
- NULL ,
454
- NULL
513
+ . m_name = "nis" ,
514
+ . m_doc = nis__doc__ ,
515
+ . m_size = sizeof ( nis_state ) ,
516
+ . m_methods = nis_methods ,
517
+ . m_traverse = nis_traverse ,
518
+ . m_clear = nis_clear ,
519
+ . m_free = nis_free ,
520
+ . m_slots = nis_slots ,
455
521
};
456
522
457
523
PyMODINIT_FUNC
458
524
PyInit_nis (void )
459
525
{
460
- PyObject * m , * d ;
461
- m = PyModule_Create (& nismodule );
462
- if (m == NULL )
463
- return NULL ;
464
- d = PyModule_GetDict (m );
465
- NisError = PyErr_NewException ("nis.error" , NULL , NULL );
466
- if (NisError != NULL )
467
- PyDict_SetItemString (d , "error" , NisError );
468
- return m ;
526
+ return PyModuleDef_Init (& nismodule );
469
527
}
0 commit comments