| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 1 | /*********************************************************** | 
 | 2 |     Written by: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 3 |     Fred Gansevles <Fred.Gansevles@cs.utwente.nl> | 
 | 4 |     B&O group, | 
 | 5 |     Faculteit der Informatica, | 
 | 6 |     Universiteit Twente, | 
 | 7 |     Enschede, | 
 | 8 |     the Netherlands. | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 9 | ******************************************************************/ | 
 | 10 |  | 
 | 11 | /* NIS module implementation */ | 
 | 12 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 13 | #include "Python.h" | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 14 |  | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 15 | #include <sys/time.h> | 
 | 16 | #include <sys/types.h> | 
 | 17 | #include <rpc/rpc.h> | 
 | 18 | #include <rpcsvc/yp_prot.h> | 
| Guido van Rossum | 8a170cb | 1996-08-08 19:11:41 +0000 | [diff] [blame] | 19 | #include <rpcsvc/ypclnt.h> | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 20 |  | 
| Guido van Rossum | 259552d | 1996-12-09 18:46:28 +0000 | [diff] [blame] | 21 | #ifdef __sgi | 
 | 22 | /* This is missing from rpcsvc/ypclnt.h */ | 
| Thomas Wouters | bd4bc4e | 2000-07-22 23:57:55 +0000 | [diff] [blame] | 23 | extern int yp_get_default_domain(char **); | 
| Guido van Rossum | 259552d | 1996-12-09 18:46:28 +0000 | [diff] [blame] | 24 | #endif | 
 | 25 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 26 | PyDoc_STRVAR(get_default_domain__doc__, | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 27 | "get_default_domain() -> str\n\ | 
 | 28 | Corresponds to the C library yp_get_default_domain() call, returning\n\ | 
 | 29 | the default NIS domain.\n"); | 
 | 30 |  | 
 | 31 | PyDoc_STRVAR(match__doc__, | 
 | 32 | "match(key, map, domain = defaultdomain)\n\ | 
 | 33 | Corresponds to the C library yp_match() call, returning the value of\n\ | 
 | 34 | key in the given map. Optionally domain can be specified but it\n\ | 
 | 35 | defaults to the system default domain.\n"); | 
 | 36 |  | 
 | 37 | PyDoc_STRVAR(cat__doc__, | 
 | 38 | "cat(map, domain = defaultdomain)\n\ | 
 | 39 | Returns the entire map as a dictionary. Optionally domain can be\n\ | 
 | 40 | specified but it defaults to the system default domain.\n"); | 
 | 41 |  | 
 | 42 | PyDoc_STRVAR(maps__doc__, | 
 | 43 | "maps(domain = defaultdomain)\n\ | 
 | 44 | Returns an array of all available NIS maps within a domain. If domain\n\ | 
 | 45 | is not specified it defaults to the system default domain.\n"); | 
 | 46 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 47 | static PyObject *NisError; | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 48 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 49 | static PyObject * | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 50 | nis_error (int err) | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 51 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 52 |     PyErr_SetString(NisError, yperr_string(err)); | 
 | 53 |     return NULL; | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 54 | } | 
 | 55 |  | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 56 | static struct nis_map { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 57 |     char *alias; | 
 | 58 |     char *map; | 
 | 59 |     int  fix; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 60 | } aliases [] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 61 |     {"passwd",          "passwd.byname",        0}, | 
 | 62 |     {"group",           "group.byname",         0}, | 
 | 63 |     {"networks",        "networks.byaddr",      0}, | 
 | 64 |     {"hosts",           "hosts.byname",         0}, | 
 | 65 |     {"protocols",       "protocols.bynumber",   0}, | 
 | 66 |     {"services",        "services.byname",      0}, | 
 | 67 |     {"aliases",         "mail.aliases",         1}, /* created with 'makedbm -a' */ | 
 | 68 |     {"ethers",          "ethers.byname",        0}, | 
 | 69 |     {0L,                0L,                     0} | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 70 | }; | 
 | 71 |  | 
 | 72 | static char * | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 73 | nis_mapname (char *map, int *pfix) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 74 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 75 |     int i; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 76 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 77 |     *pfix = 0; | 
 | 78 |     for (i=0; aliases[i].alias != 0L; i++) { | 
 | 79 |         if (!strcmp (aliases[i].alias, map)) { | 
 | 80 |             *pfix = aliases[i].fix; | 
 | 81 |             return aliases[i].map; | 
 | 82 |         } | 
 | 83 |         if (!strcmp (aliases[i].map, map)) { | 
 | 84 |             *pfix = aliases[i].fix; | 
 | 85 |             return aliases[i].map; | 
 | 86 |         } | 
 | 87 |     } | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 88 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 89 |     return map; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 90 | } | 
 | 91 |  | 
| Amaury Forgeot d'Arc | 783f86e | 2009-07-07 06:51:26 +0000 | [diff] [blame] | 92 | #if defined(__APPLE__) || defined(__OpenBSD__) || defined(__FreeBSD__) | 
| Brett Cannon | f6067ec | 2004-07-10 00:57:37 +0000 | [diff] [blame] | 93 | typedef int (*foreachfunc)(unsigned long, char *, int, char *, int, void *); | 
 | 94 | #else | 
| Tim Peters | dbd9ba6 | 2000-07-09 03:09:57 +0000 | [diff] [blame] | 95 | typedef int (*foreachfunc)(int, char *, int, char *, int, char *); | 
| Brett Cannon | f6067ec | 2004-07-10 00:57:37 +0000 | [diff] [blame] | 96 | #endif | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 97 |  | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 98 | struct ypcallback_data { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 99 |     PyObject            *dict; | 
 | 100 |     int                         fix; | 
 | 101 |     PyThreadState *state; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 102 | }; | 
 | 103 |  | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 104 | static int | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 105 | nis_foreach (int instatus, char *inkey, int inkeylen, char *inval, | 
 | 106 |              int invallen, struct ypcallback_data *indata) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 107 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 108 |     if (instatus == YP_TRUE) { | 
 | 109 |         PyObject *key; | 
 | 110 |         PyObject *val; | 
 | 111 |         int err; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 112 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 113 |         PyEval_RestoreThread(indata->state); | 
 | 114 |         if (indata->fix) { | 
 | 115 |             if (inkeylen > 0 && inkey[inkeylen-1] == '\0') | 
 | 116 |             inkeylen--; | 
 | 117 |             if (invallen > 0 && inval[invallen-1] == '\0') | 
 | 118 |             invallen--; | 
 | 119 |         } | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 120 |         key = PyUnicode_DecodeFSDefaultAndSize(inkey, inkeylen); | 
 | 121 |         val = PyUnicode_DecodeFSDefaultAndSize(inval, invallen); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 122 |         if (key == NULL || val == NULL) { | 
 | 123 |             /* XXX error -- don't know how to handle */ | 
 | 124 |             PyErr_Clear(); | 
 | 125 |             Py_XDECREF(key); | 
 | 126 |             Py_XDECREF(val); | 
| Martin v. Löwis | dfaf9ec | 2010-08-18 16:12:23 +0000 | [diff] [blame] | 127 |             indata->state = PyEval_SaveThread(); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 128 |             return 1; | 
 | 129 |         } | 
 | 130 |         err = PyDict_SetItem(indata->dict, key, val); | 
 | 131 |         Py_DECREF(key); | 
 | 132 |         Py_DECREF(val); | 
 | 133 |         if (err != 0) | 
 | 134 |             PyErr_Clear(); | 
 | 135 |         indata->state = PyEval_SaveThread(); | 
 | 136 |         if (err != 0) | 
 | 137 |             return 1; | 
 | 138 |         return 0; | 
 | 139 |     } | 
 | 140 |     return 1; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 141 | } | 
 | 142 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 143 | static PyObject * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 144 | nis_get_default_domain (PyObject *self) | 
 | 145 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 146 |     char *domain; | 
 | 147 |     int err; | 
 | 148 |     PyObject *res; | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 149 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 150 |     if ((err = yp_get_default_domain(&domain)) != 0) | 
 | 151 |         return nis_error(err); | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 152 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 153 |     res = PyUnicode_FromStringAndSize (domain, strlen(domain)); | 
 | 154 |     return res; | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 155 | } | 
 | 156 |  | 
 | 157 | static PyObject * | 
 | 158 | nis_match (PyObject *self, PyObject *args, PyObject *kwdict) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 159 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 160 |     char *match; | 
 | 161 |     char *domain = NULL; | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 162 |     Py_ssize_t keylen; | 
 | 163 |     int len; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 164 |     char *key, *map; | 
 | 165 |     int err; | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 166 |     PyObject *ukey, *bkey, *res; | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 167 |     int fix; | 
 | 168 |     static char *kwlist[] = {"key", "map", "domain", NULL}; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 169 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 170 |     if (!PyArg_ParseTupleAndKeywords(args, kwdict, | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 171 |                                      "Us|s:match", kwlist, | 
 | 172 |                                      &ukey, &map, &domain)) | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 173 |         return NULL; | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 174 |     if ((bkey = PyUnicode_EncodeFSDefault(ukey)) == NULL) | 
 | 175 |         return NULL; | 
 | 176 |     if (PyBytes_AsStringAndSize(bkey, &key, &keylen) == -1) { | 
 | 177 |         Py_DECREF(bkey); | 
 | 178 |         return NULL; | 
 | 179 |     } | 
 | 180 |     if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) { | 
 | 181 |         Py_DECREF(bkey); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 182 |         return nis_error(err); | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 183 |     } | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 184 |     map = nis_mapname (map, &fix); | 
 | 185 |     if (fix) | 
 | 186 |         keylen++; | 
 | 187 |     Py_BEGIN_ALLOW_THREADS | 
 | 188 |     err = yp_match (domain, map, key, keylen, &match, &len); | 
 | 189 |     Py_END_ALLOW_THREADS | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 190 |     Py_DECREF(bkey); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 191 |     if (fix) | 
 | 192 |         len--; | 
 | 193 |     if (err != 0) | 
 | 194 |         return nis_error(err); | 
| Martin v. Löwis | 5ea823c | 2010-08-19 09:11:51 +0000 | [diff] [blame] | 195 |     res = PyUnicode_DecodeFSDefaultAndSize(match, len); | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 196 |     free (match); | 
 | 197 |     return res; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 198 | } | 
 | 199 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 200 | static PyObject * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 201 | nis_cat (PyObject *self, PyObject *args, PyObject *kwdict) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 202 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 203 |     char *domain = NULL; | 
 | 204 |     char *map; | 
 | 205 |     struct ypall_callback cb; | 
 | 206 |     struct ypcallback_data data; | 
 | 207 |     PyObject *dict; | 
 | 208 |     int err; | 
 | 209 |     static char *kwlist[] = {"map", "domain", NULL}; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 210 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 211 |     if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s|s:cat", | 
 | 212 |                                      kwlist, &map, &domain)) | 
 | 213 |         return NULL; | 
 | 214 |     if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) | 
 | 215 |         return nis_error(err); | 
 | 216 |     dict = PyDict_New (); | 
 | 217 |     if (dict == NULL) | 
 | 218 |         return NULL; | 
 | 219 |     cb.foreach = (foreachfunc)nis_foreach; | 
 | 220 |     data.dict = dict; | 
 | 221 |     map = nis_mapname (map, &data.fix); | 
 | 222 |     cb.data = (char *)&data; | 
 | 223 |     data.state = PyEval_SaveThread(); | 
 | 224 |     err = yp_all (domain, map, &cb); | 
 | 225 |     PyEval_RestoreThread(data.state); | 
 | 226 |     if (err != 0) { | 
 | 227 |         Py_DECREF(dict); | 
 | 228 |         return nis_error(err); | 
 | 229 |     } | 
 | 230 |     return dict; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 231 | } | 
 | 232 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 233 | /* These should be u_long on Sun h/w but not on 64-bit h/w. | 
 | 234 |    This is not portable to machines with 16-bit ints and no prototypes */ | 
 | 235 | #ifndef YPPROC_MAPLIST | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 236 | #define YPPROC_MAPLIST  11 | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 237 | #endif | 
 | 238 | #ifndef YPPROG | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 239 | #define YPPROG          100004 | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 240 | #endif | 
 | 241 | #ifndef YPVERS | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 242 | #define YPVERS          2 | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 243 | #endif | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 244 |  | 
 | 245 | typedef char *domainname; | 
 | 246 | typedef char *mapname; | 
 | 247 |  | 
 | 248 | enum nisstat { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 249 |     NIS_TRUE = 1, | 
 | 250 |     NIS_NOMORE = 2, | 
 | 251 |     NIS_FALSE = 0, | 
 | 252 |     NIS_NOMAP = -1, | 
 | 253 |     NIS_NODOM = -2, | 
 | 254 |     NIS_NOKEY = -3, | 
 | 255 |     NIS_BADOP = -4, | 
 | 256 |     NIS_BADDB = -5, | 
 | 257 |     NIS_YPERR = -6, | 
 | 258 |     NIS_BADARGS = -7, | 
 | 259 |     NIS_VERS = -8 | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 260 | }; | 
 | 261 | typedef enum nisstat nisstat; | 
 | 262 |  | 
 | 263 | struct nismaplist { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 264 |     mapname map; | 
 | 265 |     struct nismaplist *next; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 266 | }; | 
 | 267 | typedef struct nismaplist nismaplist; | 
 | 268 |  | 
 | 269 | struct nisresp_maplist { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 270 |     nisstat stat; | 
 | 271 |     nismaplist *maps; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 272 | }; | 
 | 273 | typedef struct nisresp_maplist nisresp_maplist; | 
 | 274 |  | 
 | 275 | static struct timeval TIMEOUT = { 25, 0 }; | 
 | 276 |  | 
 | 277 | static | 
 | 278 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 279 | nis_xdr_domainname(XDR *xdrs, domainname *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 280 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 281 |     if (!xdr_string(xdrs, objp, YPMAXDOMAIN)) { | 
 | 282 |         return (FALSE); | 
 | 283 |     } | 
 | 284 |     return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 285 | } | 
 | 286 |  | 
 | 287 | static | 
 | 288 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 289 | nis_xdr_mapname(XDR *xdrs, mapname *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 290 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 291 |     if (!xdr_string(xdrs, objp, YPMAXMAP)) { | 
 | 292 |         return (FALSE); | 
 | 293 |     } | 
 | 294 |     return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 295 | } | 
 | 296 |  | 
 | 297 | static | 
 | 298 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 299 | nis_xdr_ypmaplist(XDR *xdrs, nismaplist *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 300 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 301 |     if (!nis_xdr_mapname(xdrs, &objp->map)) { | 
 | 302 |         return (FALSE); | 
 | 303 |     } | 
 | 304 |     if (!xdr_pointer(xdrs, (char **)&objp->next, | 
 | 305 |                      sizeof(nismaplist), (xdrproc_t)nis_xdr_ypmaplist)) | 
 | 306 |     { | 
 | 307 |         return (FALSE); | 
 | 308 |     } | 
 | 309 |     return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 310 | } | 
 | 311 |  | 
 | 312 | static | 
 | 313 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 314 | nis_xdr_ypstat(XDR *xdrs, nisstat *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 315 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 316 |     if (!xdr_enum(xdrs, (enum_t *)objp)) { | 
 | 317 |         return (FALSE); | 
 | 318 |     } | 
 | 319 |     return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 320 | } | 
 | 321 |  | 
 | 322 |  | 
 | 323 | static | 
 | 324 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 325 | nis_xdr_ypresp_maplist(XDR *xdrs, nisresp_maplist *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 326 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 327 |     if (!nis_xdr_ypstat(xdrs, &objp->stat)) { | 
 | 328 |         return (FALSE); | 
 | 329 |     } | 
 | 330 |     if (!xdr_pointer(xdrs, (char **)&objp->maps, | 
 | 331 |                      sizeof(nismaplist), (xdrproc_t)nis_xdr_ypmaplist)) | 
 | 332 |     { | 
 | 333 |         return (FALSE); | 
 | 334 |     } | 
 | 335 |     return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 336 | } | 
 | 337 |  | 
 | 338 |  | 
 | 339 | static | 
 | 340 | nisresp_maplist * | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 341 | nisproc_maplist_2(domainname *argp, CLIENT *clnt) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 342 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 343 |     static nisresp_maplist res; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 344 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 345 |     memset(&res, 0, sizeof(res)); | 
 | 346 |     if (clnt_call(clnt, YPPROC_MAPLIST, | 
 | 347 |                   (xdrproc_t)nis_xdr_domainname, (caddr_t)argp, | 
 | 348 |                   (xdrproc_t)nis_xdr_ypresp_maplist, (caddr_t)&res, | 
 | 349 |                   TIMEOUT) != RPC_SUCCESS) | 
 | 350 |     { | 
 | 351 |         return (NULL); | 
 | 352 |     } | 
 | 353 |     return (&res); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 354 | } | 
 | 355 |  | 
 | 356 | static | 
 | 357 | nismaplist * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 358 | nis_maplist (char *dom) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 359 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 360 |     nisresp_maplist *list; | 
 | 361 |     CLIENT *cl; | 
 | 362 |     char *server = NULL; | 
 | 363 |     int mapi = 0; | 
| Barry Warsaw | 3696c52 | 1996-12-11 00:29:14 +0000 | [diff] [blame] | 364 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 365 |     while (!server && aliases[mapi].map != 0L) { | 
 | 366 |         yp_master (dom, aliases[mapi].map, &server); | 
 | 367 |         mapi++; | 
 | 368 |     } | 
 | 369 |     if (!server) { | 
 | 370 |         PyErr_SetString(NisError, "No NIS master found for any map"); | 
 | 371 |         return NULL; | 
 | 372 |     } | 
 | 373 |     cl = clnt_create(server, YPPROG, YPVERS, "tcp"); | 
 | 374 |     if (cl == NULL) { | 
 | 375 |         PyErr_SetString(NisError, clnt_spcreateerror(server)); | 
 | 376 |         goto finally; | 
 | 377 |     } | 
 | 378 |     list = nisproc_maplist_2 (&dom, cl); | 
 | 379 |     clnt_destroy(cl); | 
 | 380 |     if (list == NULL) | 
 | 381 |         goto finally; | 
 | 382 |     if (list->stat != NIS_TRUE) | 
 | 383 |         goto finally; | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 384 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 385 |     free(server); | 
 | 386 |     return list->maps; | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 387 |  | 
 | 388 |   finally: | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 389 |     free(server); | 
 | 390 |     return NULL; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 391 | } | 
 | 392 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 393 | static PyObject * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 394 | nis_maps (PyObject *self, PyObject *args, PyObject *kwdict) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 395 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 396 |     char *domain = NULL; | 
 | 397 |     nismaplist *maps; | 
 | 398 |     PyObject *list; | 
 | 399 |     int err; | 
 | 400 |     static char *kwlist[] = {"domain", NULL}; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 401 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 402 |     if (!PyArg_ParseTupleAndKeywords(args, kwdict, | 
 | 403 |                                      "|s:maps", kwlist, &domain)) | 
 | 404 |         return NULL; | 
 | 405 |     if (!domain && ((err = yp_get_default_domain (&domain)) != 0)) { | 
 | 406 |         nis_error(err); | 
 | 407 |         return NULL; | 
 | 408 |     } | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 409 |  | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 410 |     if ((maps = nis_maplist (domain)) == NULL) | 
 | 411 |         return NULL; | 
 | 412 |     if ((list = PyList_New(0)) == NULL) | 
 | 413 |         return NULL; | 
 | 414 |     for (maps = maps; maps; maps = maps->next) { | 
 | 415 |         PyObject *str = PyUnicode_FromString(maps->map); | 
 | 416 |         if (!str || PyList_Append(list, str) < 0) | 
 | 417 |         { | 
 | 418 |             Py_DECREF(list); | 
 | 419 |             list = NULL; | 
 | 420 |             break; | 
 | 421 |         } | 
 | 422 |         Py_DECREF(str); | 
 | 423 |     } | 
 | 424 |     /* XXX Shouldn't we free the list of maps now? */ | 
 | 425 |     return list; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 426 | } | 
 | 427 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 428 | static PyMethodDef nis_methods[] = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 429 |     {"match",                   (PyCFunction)nis_match, | 
 | 430 |                                     METH_VARARGS | METH_KEYWORDS, | 
 | 431 |                                     match__doc__}, | 
 | 432 |     {"cat",                     (PyCFunction)nis_cat, | 
 | 433 |                                     METH_VARARGS | METH_KEYWORDS, | 
 | 434 |                                     cat__doc__}, | 
 | 435 |     {"maps",                    (PyCFunction)nis_maps, | 
 | 436 |                                     METH_VARARGS | METH_KEYWORDS, | 
 | 437 |                                     maps__doc__}, | 
 | 438 |     {"get_default_domain",      (PyCFunction)nis_get_default_domain, | 
 | 439 |                                     METH_NOARGS, | 
 | 440 |                                     get_default_domain__doc__}, | 
 | 441 |     {NULL,                      NULL}            /* Sentinel */ | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 442 | }; | 
 | 443 |  | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 444 | PyDoc_STRVAR(nis__doc__, | 
 | 445 | "This module contains functions for accessing NIS maps.\n"); | 
 | 446 |  | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 447 | static struct PyModuleDef nismodule = { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 448 |     PyModuleDef_HEAD_INIT, | 
 | 449 |     "nis", | 
 | 450 |     nis__doc__, | 
 | 451 |     -1, | 
 | 452 |     nis_methods, | 
 | 453 |     NULL, | 
 | 454 |     NULL, | 
 | 455 |     NULL, | 
 | 456 |     NULL | 
| Martin v. Löwis | 1a21451 | 2008-06-11 05:26:20 +0000 | [diff] [blame] | 457 | }; | 
 | 458 |  | 
 | 459 | PyObject* | 
 | 460 | PyInit_nis (void) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 461 | { | 
| Antoine Pitrou | f95a1b3 | 2010-05-09 15:52:27 +0000 | [diff] [blame] | 462 |     PyObject *m, *d; | 
 | 463 |     m = PyModule_Create(&nismodule); | 
 | 464 |     if (m == NULL) | 
 | 465 |         return NULL; | 
 | 466 |     d = PyModule_GetDict(m); | 
 | 467 |     NisError = PyErr_NewException("nis.error", NULL, NULL); | 
 | 468 |     if (NisError != NULL) | 
 | 469 |         PyDict_SetItemString(d, "error", NisError); | 
 | 470 |     return m; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 471 | } |