Patch #1422385: Changes to nis module to support multiple NIS domains

This commit is contained in:
Martin v. Löwis 2006-02-04 19:12:37 +00:00
parent faa26dfdd8
commit 57a34e8026
4 changed files with 101 additions and 26 deletions

View File

@ -15,7 +15,7 @@ only available for \UNIX.
The \module{nis} module defines the following functions: The \module{nis} module defines the following functions:
\begin{funcdesc}{match}{key, mapname} \begin{funcdesc}{match}{key, mapname[, domain=default_domain]}
Return the match for \var{key} in map \var{mapname}, or raise an Return the match for \var{key} in map \var{mapname}, or raise an
error (\exception{nis.error}) if there is none. error (\exception{nis.error}) if there is none.
Both should be strings, \var{key} is 8-bit clean. Both should be strings, \var{key} is 8-bit clean.
@ -24,9 +24,13 @@ and other joys).
Note that \var{mapname} is first checked if it is an alias to another Note that \var{mapname} is first checked if it is an alias to another
name. name.
\versionchanged[The \var{domain} argument allows to override
the NIS domain used for the lookup. If unspecified, lookup is in the
default NIS domain]{2.5}
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{cat}{mapname} \begin{funcdesc}{cat}{mapname[, domain=default_domain]}
Return a dictionary mapping \var{key} to \var{value} such that Return a dictionary mapping \var{key} to \var{value} such that
\code{match(\var{key}, \var{mapname})==\var{value}}. \code{match(\var{key}, \var{mapname})==\var{value}}.
Note that both keys and values of the dictionary are arbitrary Note that both keys and values of the dictionary are arbitrary
@ -34,12 +38,23 @@ arrays of bytes.
Note that \var{mapname} is first checked if it is an alias to another Note that \var{mapname} is first checked if it is an alias to another
name. name.
\versionchanged[The \var{domain} argument allows to override
the NIS domain used for the lookup. If unspecified, lookup is in the
default NIS domain]{2.5}
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{maps}{} \begin{funcdesc}{maps}{[domain=default_domain]}
Return a list of all valid maps. Return a list of all valid maps.
\versionchanged[The \var{domain} argument allows to override
the NIS domain used for the lookup. If unspecified, lookup is in the
default NIS domain]{2.5}
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{get_default_domain}{}
Return the system default NIS domain. \versionadded{2.5}
\end{funcdesc}
The \module{nis} module defines the following exception: The \module{nis} module defines the following exception:

View File

@ -47,6 +47,7 @@ Neal Becker
Robin Becker Robin Becker
Bill Bedford Bill Bedford
Reimer Behrends Reimer Behrends
Ben Bell
Thomas Bellman Thomas Bellman
Juan M. Bello Rivas Juan M. Bello Rivas
Alexander Belopolsky Alexander Belopolsky

View File

@ -216,6 +216,9 @@ Core and builtins
Extension Modules Extension Modules
----------------- -----------------
- Patch #1422385: The nis module now supports access to domains other
than the system default domain.
- Use Win32 API to implement os.stat/fstat. As a result, subsecond timestamps - Use Win32 API to implement os.stat/fstat. As a result, subsecond timestamps
are reported, the limit on path name lengths is removed, and stat reports are reported, the limit on path name lengths is removed, and stat reports
WindowsError now (instead of OSError). WindowsError now (instead of OSError).

View File

@ -23,6 +23,27 @@
extern int yp_get_default_domain(char **); extern int yp_get_default_domain(char **);
#endif #endif
PyDoc_STRVAR(get_default_domain__doc__,
"get_default_domain() -> str\n\
Corresponds to the C library yp_get_default_domain() call, returning\n\
the default NIS domain.\n");
PyDoc_STRVAR(match__doc__,
"match(key, map, domain = defaultdomain)\n\
Corresponds to the C library yp_match() call, returning the value of\n\
key in the given map. Optionally domain can be specified but it\n\
defaults to the system default domain.\n");
PyDoc_STRVAR(cat__doc__,
"cat(map, domain = defaultdomain)\n\
Returns the entire map as a dictionary. Optionally domain can be\n\
specified but it defaults to the system default domain.\n");
PyDoc_STRVAR(maps__doc__,
"maps(domain = defaultdomain)\n\
Returns an array of all available NIS maps within a domain. If domain\n\
is not specified it defaults to the system default domain.\n");
static PyObject *NisError; static PyObject *NisError;
static PyObject * static PyObject *
@ -116,19 +137,36 @@ nis_foreach (int instatus, char *inkey, int inkeylen, char *inval,
} }
static PyObject * static PyObject *
nis_match (PyObject *self, PyObject *args) nis_get_default_domain (PyObject *self)
{
char *domain;
int err;
PyObject *res;
if ((err = yp_get_default_domain(&domain)) != 0)
return nis_error(err);
res = PyString_FromStringAndSize (domain, strlen(domain));
return res;
}
static PyObject *
nis_match (PyObject *self, PyObject *args, PyObject *kwdict)
{ {
char *match; char *match;
char *domain; char *domain = NULL;
int keylen, len; int keylen, len;
char *key, *map; char *key, *map;
int err; int err;
PyObject *res; PyObject *res;
int fix; int fix;
static const char *kwlist[] = {"key", "map", "domain", NULL};
if (!PyArg_ParseTuple(args, "t#s:match", &key, &keylen, &map)) if (!PyArg_ParseTupleAndKeywords(args, kwdict,
"t#s|s:match", kwlist,
&key, &keylen, &map, &domain))
return NULL; return NULL;
if ((err = yp_get_default_domain(&domain)) != 0) if (!domain && ((err = yp_get_default_domain(&domain)) != 0))
return nis_error(err); return nis_error(err);
map = nis_mapname (map, &fix); map = nis_mapname (map, &fix);
if (fix) if (fix)
@ -146,18 +184,20 @@ nis_match (PyObject *self, PyObject *args)
} }
static PyObject * static PyObject *
nis_cat (PyObject *self, PyObject *args) nis_cat (PyObject *self, PyObject *args, PyObject *kwdict)
{ {
char *domain; char *domain = NULL;
char *map; char *map;
struct ypall_callback cb; struct ypall_callback cb;
struct ypcallback_data data; struct ypcallback_data data;
PyObject *dict; PyObject *dict;
int err; int err;
static const char *kwlist[] = {"map", "domain", NULL};
if (!PyArg_ParseTuple(args, "s:cat", &map)) if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s|s:cat",
kwlist, &map, &domain))
return NULL; return NULL;
if ((err = yp_get_default_domain(&domain)) != 0) if (!domain && ((err = yp_get_default_domain(&domain)) != 0))
return nis_error(err); return nis_error(err);
dict = PyDict_New (); dict = PyDict_New ();
if (dict == NULL) if (dict == NULL)
@ -301,19 +341,12 @@ nisproc_maplist_2(domainname *argp, CLIENT *clnt)
static static
nismaplist * nismaplist *
nis_maplist (void) nis_maplist (char *dom)
{ {
nisresp_maplist *list; nisresp_maplist *list;
char *dom;
CLIENT *cl; CLIENT *cl;
char *server = NULL; char *server = NULL;
int mapi = 0; int mapi = 0;
int err;
if ((err = yp_get_default_domain (&dom)) != 0) {
nis_error(err);
return NULL;
}
while (!server && aliases[mapi].map != 0L) { while (!server && aliases[mapi].map != 0L) {
yp_master (dom, aliases[mapi].map, &server); yp_master (dom, aliases[mapi].map, &server);
@ -344,12 +377,23 @@ nis_maplist (void)
} }
static PyObject * static PyObject *
nis_maps (PyObject *self) nis_maps (PyObject *self, PyObject *args, PyObject *kwdict)
{ {
char *domain = NULL;
nismaplist *maps; nismaplist *maps;
PyObject *list; PyObject *list;
int err;
static const char *kwlist[] = {"domain", NULL};
if ((maps = nis_maplist ()) == NULL) if (!PyArg_ParseTupleAndKeywords(args, kwdict,
"|s:maps", kwlist, &domain))
return NULL;
if (!domain && ((err = yp_get_default_domain (&domain)) != 0)) {
nis_error(err);
return NULL;
}
if ((maps = nis_maplist (domain)) == NULL)
return NULL; return NULL;
if ((list = PyList_New(0)) == NULL) if ((list = PyList_New(0)) == NULL)
return NULL; return NULL;
@ -368,17 +412,29 @@ nis_maps (PyObject *self)
} }
static PyMethodDef nis_methods[] = { static PyMethodDef nis_methods[] = {
{"match", nis_match, METH_VARARGS}, {"match", (PyCFunction)nis_match,
{"cat", nis_cat, METH_VARARGS}, METH_VARARGS | METH_KEYWORDS,
{"maps", (PyCFunction)nis_maps, METH_NOARGS}, match__doc__},
{NULL, NULL} /* Sentinel */ {"cat", (PyCFunction)nis_cat,
METH_VARARGS | METH_KEYWORDS,
cat__doc__},
{"maps", (PyCFunction)nis_maps,
METH_VARARGS | METH_KEYWORDS,
maps__doc__},
{"get_default_domain", (PyCFunction)nis_get_default_domain,
METH_NOARGS,
get_default_domain__doc__},
{NULL, NULL} /* Sentinel */
}; };
PyDoc_STRVAR(nis__doc__,
"This module contains functions for accessing NIS maps.\n");
void void
initnis (void) initnis (void)
{ {
PyObject *m, *d; PyObject *m, *d;
m = Py_InitModule("nis", nis_methods); m = Py_InitModule3("nis", nis_methods, nis__doc__);
if (m == NULL) if (m == NULL)
return; return;
d = PyModule_GetDict(m); d = PyModule_GetDict(m);