Back to index

python3.2  3.2.2
Classes | Defines | Typedefs | Enumerations | Functions | Variables
nismodule.c File Reference
#include "Python.h"
#include <sys/time.h>
#include <sys/types.h>
#include <rpc/rpc.h>
#include <rpcsvc/yp_prot.h>
#include <rpcsvc/ypclnt.h>

Go to the source code of this file.

Classes

struct  nis_map
struct  ypcallback_data
struct  nismaplist
struct  nisresp_maplist

Defines

#define YPPROC_MAPLIST   11
#define YPPROG   100004
#define YPVERS   2

Typedefs

typedef int(* foreachfunc )(int, char *, int, char *, int, char *)
typedef char * domainname
typedef char * mapname
typedef struct nismaplist
typedef struct nisresp_maplist

Enumerations

enum  nisstat {
  NIS_TRUE = 1, NIS_NOMORE = 2, NIS_FALSE = 0, NIS_NOMAP = -1,
  NIS_NODOM = -2, NIS_NOKEY = -3, NIS_BADOP = -4, NIS_BADDB = -5,
  NIS_YPERR = -6, NIS_BADARGS = -7, NIS_VERS = -8
}

Functions

 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 PyObjectnis_error (int err)
static char * nis_mapname (char *map, int *pfix)
static int nis_foreach (int instatus, char *inkey, int inkeylen, char *inval, int invallen, struct ypcallback_data *indata)
static PyObjectnis_get_default_domain (PyObject *self)
static PyObjectnis_match (PyObject *self, PyObject *args, PyObject *kwdict)
static PyObjectnis_cat (PyObject *self, PyObject *args, PyObject *kwdict)
static bool_t nis_xdr_domainname (XDR *xdrs, domainname *objp)
static bool_t nis_xdr_mapname (XDR *xdrs, mapname *objp)
static bool_t nis_xdr_ypmaplist (XDR *xdrs, nismaplist *objp)
static bool_t nis_xdr_ypstat (XDR *xdrs, nisstat *objp)
static bool_t nis_xdr_ypresp_maplist (XDR *xdrs, nisresp_maplist *objp)
static nisresp_maplistnisproc_maplist_2 (domainname *argp, CLIENT *clnt)
static nismaplistnis_maplist (char *dom)
static PyObjectnis_maps (PyObject *self, PyObject *args, PyObject *kwdict)
 PyDoc_STRVAR (nis__doc__,"This module contains functions for accessing NIS maps.\n")
PyObjectPyInit_nis (void)

Variables

static PyObjectNisError
static struct nis_map aliases []
static struct timeval = { 25, 0 }
static PyMethodDef nis_methods []
static struct PyModuleDef

Class Documentation

struct nis_map

Definition at line 56 of file nismodule.c.

Class Members
char * alias
int fix
char * map
struct ypcallback_data

Definition at line 98 of file nismodule.c.

Collaboration diagram for ypcallback_data:
Class Members
PyObject * dict
int fix
PyThreadState * state
struct nismaplist

Definition at line 263 of file nismodule.c.

Collaboration diagram for nismaplist:
Class Members
mapname map
struct nismaplist * next
struct nisresp_maplist

Definition at line 269 of file nismodule.c.

Collaboration diagram for nisresp_maplist:
Class Members
nismaplist * maps
nisstat stat

Define Documentation

#define YPPROC_MAPLIST   11

Definition at line 236 of file nismodule.c.

#define YPPROG   100004

Definition at line 239 of file nismodule.c.

#define YPVERS   2

Definition at line 242 of file nismodule.c.


Typedef Documentation

typedef char* domainname

Definition at line 245 of file nismodule.c.

typedef int(* foreachfunc)(int, char *, int, char *, int, char *)

Definition at line 95 of file nismodule.c.

typedef char* mapname

Definition at line 246 of file nismodule.c.

typedef struct nismaplist

Definition at line 267 of file nismodule.c.

typedef struct nisresp_maplist

Definition at line 273 of file nismodule.c.


Enumeration Type Documentation

enum nisstat
Enumerator:
NIS_TRUE 
NIS_NOMORE 
NIS_FALSE 
NIS_NOMAP 
NIS_NODOM 
NIS_NOKEY 
NIS_BADOP 
NIS_BADDB 
NIS_YPERR 
NIS_BADARGS 
NIS_VERS 

Definition at line 248 of file nismodule.c.

             {
    NIS_TRUE = 1,
    NIS_NOMORE = 2,
    NIS_FALSE = 0,
    NIS_NOMAP = -1,
    NIS_NODOM = -2,
    NIS_NOKEY = -3,
    NIS_BADOP = -4,
    NIS_BADDB = -5,
    NIS_YPERR = -6,
    NIS_BADARGS = -7,
    NIS_VERS = -8
};

Function Documentation

static PyObject* nis_cat ( PyObject self,
PyObject args,
PyObject kwdict 
) [static]

Definition at line 201 of file nismodule.c.

{
    char *domain = NULL;
    char *map;
    struct ypall_callback cb;
    struct ypcallback_data data;
    PyObject *dict;
    int err;
    static char *kwlist[] = {"map", "domain", NULL};

    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s|s:cat",
                                     kwlist, &map, &domain))
        return NULL;
    if (!domain && ((err = yp_get_default_domain(&domain)) != 0))
        return nis_error(err);
    dict = PyDict_New ();
    if (dict == NULL)
        return NULL;
    cb.foreach = (foreachfunc)nis_foreach;
    data.dict = dict;
    map = nis_mapname (map, &data.fix);
    cb.data = (char *)&data;
    data.state = PyEval_SaveThread();
    err = yp_all (domain, map, &cb);
    PyEval_RestoreThread(data.state);
    if (err != 0) {
        Py_DECREF(dict);
        return nis_error(err);
    }
    return dict;
}

Here is the call graph for this function:

static PyObject* nis_error ( int  err) [static]

Definition at line 50 of file nismodule.c.

{
    PyErr_SetString(NisError, yperr_string(err));
    return NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int nis_foreach ( int  instatus,
char *  inkey,
int  inkeylen,
char *  inval,
int  invallen,
struct ypcallback_data indata 
) [static]

Definition at line 105 of file nismodule.c.

{
    if (instatus == YP_TRUE) {
        PyObject *key;
        PyObject *val;
        int err;

        PyEval_RestoreThread(indata->state);
        if (indata->fix) {
            if (inkeylen > 0 && inkey[inkeylen-1] == '\0')
            inkeylen--;
            if (invallen > 0 && inval[invallen-1] == '\0')
            invallen--;
        }
        key = PyUnicode_DecodeFSDefaultAndSize(inkey, inkeylen);
        val = PyUnicode_DecodeFSDefaultAndSize(inval, invallen);
        if (key == NULL || val == NULL) {
            /* XXX error -- don't know how to handle */
            PyErr_Clear();
            Py_XDECREF(key);
            Py_XDECREF(val);
            indata->state = PyEval_SaveThread();
            return 1;
        }
        err = PyDict_SetItem(indata->dict, key, val);
        Py_DECREF(key);
        Py_DECREF(val);
        if (err != 0)
            PyErr_Clear();
        indata->state = PyEval_SaveThread();
        if (err != 0)
            return 1;
        return 0;
    }
    return 1;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* nis_get_default_domain ( PyObject self) [static]

Definition at line 144 of file nismodule.c.

{
    char *domain;
    int err;
    PyObject *res;

    if ((err = yp_get_default_domain(&domain)) != 0)
        return nis_error(err);

    res = PyUnicode_FromStringAndSize (domain, strlen(domain));
    return res;
}

Here is the call graph for this function:

static nismaplist* nis_maplist ( char *  dom) [static]

Definition at line 358 of file nismodule.c.

{
    nisresp_maplist *list;
    CLIENT *cl;
    char *server = NULL;
    int mapi = 0;

    while (!server && aliases[mapi].map != 0L) {
        yp_master (dom, aliases[mapi].map, &server);
        mapi++;
    }
    if (!server) {
        PyErr_SetString(NisError, "No NIS master found for any map");
        return NULL;
    }
    cl = clnt_create(server, YPPROG, YPVERS, "tcp");
    if (cl == NULL) {
        PyErr_SetString(NisError, clnt_spcreateerror(server));
        goto finally;
    }
    list = nisproc_maplist_2 (&dom, cl);
    clnt_destroy(cl);
    if (list == NULL)
        goto finally;
    if (list->stat != NIS_TRUE)
        goto finally;

    free(server);
    return list->maps;

  finally:
    free(server);
    return NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static char* nis_mapname ( char *  map,
int pfix 
) [static]

Definition at line 73 of file nismodule.c.

{
    int i;

    *pfix = 0;
    for (i=0; aliases[i].alias != 0L; i++) {
        if (!strcmp (aliases[i].alias, map)) {
            *pfix = aliases[i].fix;
            return aliases[i].map;
        }
        if (!strcmp (aliases[i].map, map)) {
            *pfix = aliases[i].fix;
            return aliases[i].map;
        }
    }

    return map;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static PyObject* nis_maps ( PyObject self,
PyObject args,
PyObject kwdict 
) [static]

Definition at line 394 of file nismodule.c.

{
    char *domain = NULL;
    nismaplist *maps;
    PyObject *list;
    int err;
    static char *kwlist[] = {"domain", 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;
    if ((list = PyList_New(0)) == NULL)
        return NULL;
    for (maps = maps; maps; maps = maps->next) {
        PyObject *str = PyUnicode_FromString(maps->map);
        if (!str || PyList_Append(list, str) < 0)
        {
            Py_DECREF(list);
            list = NULL;
            break;
        }
        Py_DECREF(str);
    }
    /* XXX Shouldn't we free the list of maps now? */
    return list;
}

Here is the call graph for this function:

static PyObject* nis_match ( PyObject self,
PyObject args,
PyObject kwdict 
) [static]

Definition at line 158 of file nismodule.c.

{
    char *match;
    char *domain = NULL;
    Py_ssize_t keylen;
    int len;
    char *key, *map;
    int err;
    PyObject *ukey, *bkey, *res;
    int fix;
    static char *kwlist[] = {"key", "map", "domain", NULL};

    if (!PyArg_ParseTupleAndKeywords(args, kwdict,
                                     "Us|s:match", kwlist,
                                     &ukey, &map, &domain))
        return NULL;
    if ((bkey = PyUnicode_EncodeFSDefault(ukey)) == NULL)
        return NULL;
    if (PyBytes_AsStringAndSize(bkey, &key, &keylen) == -1) {
        Py_DECREF(bkey);
        return NULL;
    }
    if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) {
        Py_DECREF(bkey);
        return nis_error(err);
    }
    map = nis_mapname (map, &fix);
    if (fix)
        keylen++;
    Py_BEGIN_ALLOW_THREADS
    err = yp_match (domain, map, key, keylen, &match, &len);
    Py_END_ALLOW_THREADS
    Py_DECREF(bkey);
    if (fix)
        len--;
    if (err != 0)
        return nis_error(err);
    res = PyUnicode_DecodeFSDefaultAndSize(match, len);
    free (match);
    return res;
}

Here is the call graph for this function:

static bool_t nis_xdr_domainname ( XDR *  xdrs,
domainname objp 
) [static]

Definition at line 279 of file nismodule.c.

{
    if (!xdr_string(xdrs, objp, YPMAXDOMAIN)) {
        return (FALSE);
    }
    return (TRUE);
}

Here is the caller graph for this function:

static bool_t nis_xdr_mapname ( XDR *  xdrs,
mapname objp 
) [static]

Definition at line 289 of file nismodule.c.

{
    if (!xdr_string(xdrs, objp, YPMAXMAP)) {
        return (FALSE);
    }
    return (TRUE);
}

Here is the caller graph for this function:

static bool_t nis_xdr_ypmaplist ( XDR *  xdrs,
nismaplist objp 
) [static]

Definition at line 299 of file nismodule.c.

{
    if (!nis_xdr_mapname(xdrs, &objp->map)) {
        return (FALSE);
    }
    if (!xdr_pointer(xdrs, (char **)&objp->next,
                     sizeof(nismaplist), (xdrproc_t)nis_xdr_ypmaplist))
    {
        return (FALSE);
    }
    return (TRUE);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bool_t nis_xdr_ypresp_maplist ( XDR *  xdrs,
nisresp_maplist objp 
) [static]

Definition at line 325 of file nismodule.c.

{
    if (!nis_xdr_ypstat(xdrs, &objp->stat)) {
        return (FALSE);
    }
    if (!xdr_pointer(xdrs, (char **)&objp->maps,
                     sizeof(nismaplist), (xdrproc_t)nis_xdr_ypmaplist))
    {
        return (FALSE);
    }
    return (TRUE);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bool_t nis_xdr_ypstat ( XDR *  xdrs,
nisstat objp 
) [static]

Definition at line 314 of file nismodule.c.

{
    if (!xdr_enum(xdrs, (enum_t *)objp)) {
        return (FALSE);
    }
    return (TRUE);
}

Here is the caller graph for this function:

static nisresp_maplist* nisproc_maplist_2 ( domainname argp,
CLIENT *  clnt 
) [static]

Definition at line 341 of file nismodule.c.

{
    static nisresp_maplist res;

    memset(&res, 0, sizeof(res));
    if (clnt_call(clnt, YPPROC_MAPLIST,
                  (xdrproc_t)nis_xdr_domainname, (caddr_t)argp,
                  (xdrproc_t)nis_xdr_ypresp_maplist, (caddr_t)&res,
                  TIMEOUT) != RPC_SUCCESS)
    {
        return (NULL);
    }
    return (&res);
}

Here is the call graph for this function:

Here is the caller graph for this function:

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  
)
PyDoc_STRVAR ( nis__doc__  ,
"This module contains functions for accessing NIS maps.\n  
)

Definition at line 460 of file nismodule.c.

{
    PyObject *m, *d;
    m = PyModule_Create(&nismodule);
    if (m == NULL)
        return NULL;
    d = PyModule_GetDict(m);
    NisError = PyErr_NewException("nis.error", NULL, NULL);
    if (NisError != NULL)
        PyDict_SetItemString(d, "error", NisError);
    return m;
}

Here is the call graph for this function:


Variable Documentation

struct nis_map aliases[] [static]
Initial value:
 {
    {"match",                   (PyCFunction)nis_match,
                                    METH_VARARGS | METH_KEYWORDS,
                                    match__doc__},
    {"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}            
}

Definition at line 428 of file nismodule.c.

PyObject* NisError [static]

Definition at line 47 of file nismodule.c.

struct PyModuleDef [static]
Initial value:
 {
    PyModuleDef_HEAD_INIT,
    "nis",
    nis__doc__,
    -1,
    nis_methods,
    NULL,
    NULL,
    NULL,
    NULL
}

Definition at line 447 of file nismodule.c.

struct timeval = { 25, 0 } [static]

Definition at line 275 of file nismodule.c.