| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 1 | /*********************************************************** | 
 | 2 |     Written by: | 
 | 3 | 	Fred Gansevles <Fred.Gansevles@cs.utwente.nl> | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 4 | 	B&O group, | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 5 | 	Faculteit der Informatica, | 
 | 6 | 	Universiteit Twente, | 
 | 7 | 	Enschede, | 
 | 8 | 	the Netherlands. | 
 | 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 |  | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 26 | PyDoc_STRVAR(get_default_domain__doc__,  | 
 | 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 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 52 | 	PyErr_SetString(NisError, yperr_string(err)); | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 53 | 	return NULL; | 
 | 54 | } | 
 | 55 |  | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 56 | static struct nis_map { | 
 | 57 | 	char *alias; | 
 | 58 | 	char *map; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 59 | 	int  fix; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 60 | } aliases [] = { | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +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 | { | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 75 | 	int i; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 76 |  | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +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 | 	} | 
 | 88 |  | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 89 | 	return map; | 
 | 90 | } | 
 | 91 |  | 
| Brett Cannon | f6067ec | 2004-07-10 00:57:37 +0000 | [diff] [blame] | 92 | #ifdef __APPLE__ | 
 | 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 { | 
 | 99 | 	PyObject	*dict; | 
 | 100 | 	int			fix; | 
| Amaury Forgeot d'Arc | 968117e | 2008-07-02 23:40:28 +0000 | [diff] [blame] | 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 | { | 
 | 108 | 	if (instatus == YP_TRUE) { | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 109 | 		PyObject *key; | 
 | 110 | 		PyObject *val; | 
| Guido van Rossum | e77a757 | 1993-11-03 15:01:26 +0000 | [diff] [blame] | 111 | 		int err; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 112 |  | 
| Amaury Forgeot d'Arc | 968117e | 2008-07-02 23:40:28 +0000 | [diff] [blame] | 113 | 		PyEval_RestoreThread(indata->state); | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 114 | 		if (indata->fix) { | 
| Neal Norwitz | 6623906 | 2002-11-04 23:21:09 +0000 | [diff] [blame] | 115 | 		    if (inkeylen > 0 && inkey[inkeylen-1] == '\0') | 
 | 116 | 			inkeylen--; | 
 | 117 | 		    if (invallen > 0 && inval[invallen-1] == '\0') | 
 | 118 | 			invallen--; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 119 | 		} | 
| Gregory P. Smith | dd96db6 | 2008-06-09 04:58:54 +0000 | [diff] [blame] | 120 | 		key = PyString_FromStringAndSize(inkey, inkeylen); | 
 | 121 | 		val = PyString_FromStringAndSize(inval, invallen); | 
| Guido van Rossum | e77a757 | 1993-11-03 15:01:26 +0000 | [diff] [blame] | 122 | 		if (key == NULL || val == NULL) { | 
 | 123 | 			/* XXX error -- don't know how to handle */ | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 124 | 			PyErr_Clear(); | 
 | 125 | 			Py_XDECREF(key); | 
 | 126 | 			Py_XDECREF(val); | 
| Guido van Rossum | e77a757 | 1993-11-03 15:01:26 +0000 | [diff] [blame] | 127 | 			return 1; | 
 | 128 | 		} | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 129 | 		err = PyDict_SetItem(indata->dict, key, val); | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 130 | 		Py_DECREF(key); | 
 | 131 | 		Py_DECREF(val); | 
| Amaury Forgeot d'Arc | 968117e | 2008-07-02 23:40:28 +0000 | [diff] [blame] | 132 | 		if (err != 0) | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 133 | 			PyErr_Clear(); | 
| Amaury Forgeot d'Arc | 968117e | 2008-07-02 23:40:28 +0000 | [diff] [blame] | 134 | 		indata->state = PyEval_SaveThread(); | 
 | 135 | 		if (err != 0) | 
 | 136 | 		  	return 1; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 137 | 		return 0; | 
 | 138 | 	} | 
 | 139 | 	return 1; | 
 | 140 | } | 
 | 141 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 142 | static PyObject * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 143 | nis_get_default_domain (PyObject *self) | 
 | 144 | { | 
 | 145 | 	char *domain; | 
 | 146 | 	int err; | 
 | 147 | 	PyObject *res; | 
 | 148 |  | 
 | 149 | 	if ((err = yp_get_default_domain(&domain)) != 0) | 
 | 150 | 		return nis_error(err); | 
 | 151 |  | 
| Gregory P. Smith | dd96db6 | 2008-06-09 04:58:54 +0000 | [diff] [blame] | 152 | 	res = PyString_FromStringAndSize (domain, strlen(domain)); | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 153 | 	return res; | 
 | 154 | } | 
 | 155 |  | 
 | 156 | static PyObject * | 
 | 157 | nis_match (PyObject *self, PyObject *args, PyObject *kwdict) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 158 | { | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 159 | 	char *match; | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 160 | 	char *domain = NULL; | 
| Guido van Rossum | e77a757 | 1993-11-03 15:01:26 +0000 | [diff] [blame] | 161 | 	int keylen, len; | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 162 | 	char *key, *map; | 
 | 163 | 	int err; | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 164 | 	PyObject *res; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 165 | 	int fix; | 
| Martin v. Löwis | 15e6274 | 2006-02-27 16:46:16 +0000 | [diff] [blame] | 166 | 	static char *kwlist[] = {"key", "map", "domain", NULL}; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 167 |  | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 168 | 	if (!PyArg_ParseTupleAndKeywords(args, kwdict, | 
 | 169 | 					 "t#s|s:match", kwlist, | 
 | 170 | 					 &key, &keylen, &map, &domain)) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 171 | 		return NULL; | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 172 | 	if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 173 | 		return nis_error(err); | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 174 | 	map = nis_mapname (map, &fix); | 
 | 175 | 	if (fix) | 
 | 176 | 	    keylen++; | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 177 | 	Py_BEGIN_ALLOW_THREADS | 
| Guido van Rossum | e77a757 | 1993-11-03 15:01:26 +0000 | [diff] [blame] | 178 | 	err = yp_match (domain, map, key, keylen, &match, &len); | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 179 | 	Py_END_ALLOW_THREADS | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 180 | 	if (fix) | 
 | 181 | 	    len--; | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 182 | 	if (err != 0) | 
 | 183 | 		return nis_error(err); | 
| Gregory P. Smith | dd96db6 | 2008-06-09 04:58:54 +0000 | [diff] [blame] | 184 | 	res = PyString_FromStringAndSize (match, len); | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 185 | 	free (match); | 
 | 186 | 	return res; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 187 | } | 
 | 188 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 189 | static PyObject * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 190 | nis_cat (PyObject *self, PyObject *args, PyObject *kwdict) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 191 | { | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 192 | 	char *domain = NULL; | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 193 | 	char *map; | 
 | 194 | 	struct ypall_callback cb; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 195 | 	struct ypcallback_data data; | 
 | 196 | 	PyObject *dict; | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 197 | 	int err; | 
| Martin v. Löwis | 15e6274 | 2006-02-27 16:46:16 +0000 | [diff] [blame] | 198 | 	static char *kwlist[] = {"map", "domain", NULL}; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 199 |  | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 200 | 	if (!PyArg_ParseTupleAndKeywords(args, kwdict, "s|s:cat", | 
 | 201 | 				         kwlist, &map, &domain)) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 202 | 		return NULL; | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 203 | 	if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 204 | 		return nis_error(err); | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 205 | 	dict = PyDict_New (); | 
 | 206 | 	if (dict == NULL) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 207 | 		return NULL; | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 208 | 	cb.foreach = (foreachfunc)nis_foreach; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 209 | 	data.dict = dict; | 
 | 210 | 	map = nis_mapname (map, &data.fix); | 
 | 211 | 	cb.data = (char *)&data; | 
| Amaury Forgeot d'Arc | 968117e | 2008-07-02 23:40:28 +0000 | [diff] [blame] | 212 | 	data.state = PyEval_SaveThread(); | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 213 | 	err = yp_all (domain, map, &cb); | 
| Amaury Forgeot d'Arc | 968117e | 2008-07-02 23:40:28 +0000 | [diff] [blame] | 214 | 	PyEval_RestoreThread(data.state); | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 215 | 	if (err != 0) { | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 216 | 		Py_DECREF(dict); | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 217 | 		return nis_error(err); | 
 | 218 | 	} | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 219 | 	return dict; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 220 | } | 
 | 221 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 222 | /* These should be u_long on Sun h/w but not on 64-bit h/w. | 
 | 223 |    This is not portable to machines with 16-bit ints and no prototypes */ | 
 | 224 | #ifndef YPPROC_MAPLIST | 
 | 225 | #define YPPROC_MAPLIST	11 | 
 | 226 | #endif | 
 | 227 | #ifndef YPPROG | 
 | 228 | #define YPPROG		100004 | 
 | 229 | #endif | 
 | 230 | #ifndef YPVERS | 
 | 231 | #define YPVERS		2 | 
 | 232 | #endif | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 233 |  | 
 | 234 | typedef char *domainname; | 
 | 235 | typedef char *mapname; | 
 | 236 |  | 
 | 237 | enum nisstat { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 238 | 	NIS_TRUE = 1, | 
 | 239 | 	NIS_NOMORE = 2, | 
 | 240 | 	NIS_FALSE = 0, | 
 | 241 | 	NIS_NOMAP = -1, | 
 | 242 | 	NIS_NODOM = -2, | 
 | 243 | 	NIS_NOKEY = -3, | 
 | 244 | 	NIS_BADOP = -4, | 
 | 245 | 	NIS_BADDB = -5, | 
 | 246 | 	NIS_YPERR = -6, | 
 | 247 | 	NIS_BADARGS = -7, | 
 | 248 | 	NIS_VERS = -8 | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 249 | }; | 
 | 250 | typedef enum nisstat nisstat; | 
 | 251 |  | 
 | 252 | struct nismaplist { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 253 | 	mapname map; | 
 | 254 | 	struct nismaplist *next; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 255 | }; | 
 | 256 | typedef struct nismaplist nismaplist; | 
 | 257 |  | 
 | 258 | struct nisresp_maplist { | 
 | 259 | 	nisstat stat; | 
 | 260 | 	nismaplist *maps; | 
 | 261 | }; | 
 | 262 | typedef struct nisresp_maplist nisresp_maplist; | 
 | 263 |  | 
 | 264 | static struct timeval TIMEOUT = { 25, 0 }; | 
 | 265 |  | 
 | 266 | static | 
 | 267 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 268 | nis_xdr_domainname(XDR *xdrs, domainname *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 269 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 270 | 	if (!xdr_string(xdrs, objp, YPMAXDOMAIN)) { | 
 | 271 | 		return (FALSE); | 
 | 272 | 	} | 
 | 273 | 	return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 274 | } | 
 | 275 |  | 
 | 276 | static | 
 | 277 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 278 | nis_xdr_mapname(XDR *xdrs, mapname *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 279 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 280 | 	if (!xdr_string(xdrs, objp, YPMAXMAP)) { | 
 | 281 | 		return (FALSE); | 
 | 282 | 	} | 
 | 283 | 	return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 284 | } | 
 | 285 |  | 
 | 286 | static | 
 | 287 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 288 | nis_xdr_ypmaplist(XDR *xdrs, nismaplist *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 289 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 290 | 	if (!nis_xdr_mapname(xdrs, &objp->map)) { | 
 | 291 | 		return (FALSE); | 
 | 292 | 	} | 
 | 293 | 	if (!xdr_pointer(xdrs, (char **)&objp->next, | 
| Guido van Rossum | c501583 | 1998-10-07 16:36:14 +0000 | [diff] [blame] | 294 | 			 sizeof(nismaplist), (xdrproc_t)nis_xdr_ypmaplist)) | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 295 | 	{ | 
 | 296 | 		return (FALSE); | 
 | 297 | 	} | 
 | 298 | 	return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 299 | } | 
 | 300 |  | 
 | 301 | static | 
 | 302 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 303 | nis_xdr_ypstat(XDR *xdrs, nisstat *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 304 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 305 | 	if (!xdr_enum(xdrs, (enum_t *)objp)) { | 
 | 306 | 		return (FALSE); | 
 | 307 | 	} | 
 | 308 | 	return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 309 | } | 
 | 310 |  | 
 | 311 |  | 
 | 312 | static | 
 | 313 | bool_t | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 314 | nis_xdr_ypresp_maplist(XDR *xdrs, nisresp_maplist *objp) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 315 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 316 | 	if (!nis_xdr_ypstat(xdrs, &objp->stat)) { | 
 | 317 | 		return (FALSE); | 
 | 318 | 	} | 
 | 319 | 	if (!xdr_pointer(xdrs, (char **)&objp->maps, | 
| Guido van Rossum | c501583 | 1998-10-07 16:36:14 +0000 | [diff] [blame] | 320 | 			 sizeof(nismaplist), (xdrproc_t)nis_xdr_ypmaplist)) | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 321 | 	{ | 
 | 322 | 		return (FALSE); | 
 | 323 | 	} | 
 | 324 | 	return (TRUE); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 325 | } | 
 | 326 |  | 
 | 327 |  | 
 | 328 | static | 
 | 329 | nisresp_maplist * | 
| Peter Schneider-Kamp | 39e0e5a | 2000-07-10 13:12:27 +0000 | [diff] [blame] | 330 | nisproc_maplist_2(domainname *argp, CLIENT *clnt) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 331 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 332 | 	static nisresp_maplist res; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 333 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 334 | 	memset(&res, 0, sizeof(res)); | 
| Guido van Rossum | c501583 | 1998-10-07 16:36:14 +0000 | [diff] [blame] | 335 | 	if (clnt_call(clnt, YPPROC_MAPLIST, | 
 | 336 | 		      (xdrproc_t)nis_xdr_domainname, (caddr_t)argp, | 
 | 337 | 		      (xdrproc_t)nis_xdr_ypresp_maplist, (caddr_t)&res, | 
 | 338 | 		      TIMEOUT) != RPC_SUCCESS) | 
 | 339 | 	{ | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 340 | 		return (NULL); | 
 | 341 | 	} | 
 | 342 | 	return (&res); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 343 | } | 
 | 344 |  | 
 | 345 | static | 
 | 346 | nismaplist * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 347 | nis_maplist (char *dom) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 348 | { | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 349 | 	nisresp_maplist *list; | 
| Thomas Wouters | e75e6d0 | 2001-01-21 23:34:12 +0000 | [diff] [blame] | 350 | 	CLIENT *cl; | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 351 | 	char *server = NULL; | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 352 | 	int mapi = 0; | 
| Barry Warsaw | 3696c52 | 1996-12-11 00:29:14 +0000 | [diff] [blame] | 353 |  | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 354 | 	while (!server && aliases[mapi].map != 0L) { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 355 | 		yp_master (dom, aliases[mapi].map, &server); | 
 | 356 | 		mapi++; | 
 | 357 | 	} | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 358 |         if (!server) { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 359 |             PyErr_SetString(NisError, "No NIS master found for any map"); | 
 | 360 |             return NULL; | 
 | 361 |         } | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 362 | 	cl = clnt_create(server, YPPROG, YPVERS, "tcp"); | 
 | 363 | 	if (cl == NULL) { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 364 | 		PyErr_SetString(NisError, clnt_spcreateerror(server)); | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 365 | 		goto finally; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 366 | 	} | 
 | 367 | 	list = nisproc_maplist_2 (&dom, cl); | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 368 | 	clnt_destroy(cl); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 369 | 	if (list == NULL) | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 370 | 		goto finally; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 371 | 	if (list->stat != NIS_TRUE) | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 372 | 		goto finally; | 
 | 373 |  | 
| Guido van Rossum | b18618d | 2000-05-03 23:44:39 +0000 | [diff] [blame] | 374 | 	free(server); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 375 | 	return list->maps; | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 376 |  | 
 | 377 |   finally: | 
| Guido van Rossum | b18618d | 2000-05-03 23:44:39 +0000 | [diff] [blame] | 378 | 	free(server); | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 379 | 	return NULL; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 380 | } | 
 | 381 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 382 | static PyObject * | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 383 | nis_maps (PyObject *self, PyObject *args, PyObject *kwdict) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 384 | { | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 385 | 	char *domain = NULL; | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 386 | 	nismaplist *maps; | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 387 | 	PyObject *list; | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 388 |         int err; | 
| Martin v. Löwis | 15e6274 | 2006-02-27 16:46:16 +0000 | [diff] [blame] | 389 | 	static char *kwlist[] = {"domain", NULL}; | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 390 |  | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 391 | 	if (!PyArg_ParseTupleAndKeywords(args, kwdict, | 
 | 392 | 					 "|s:maps", kwlist, &domain)) | 
 | 393 | 		return NULL; | 
 | 394 | 	if (!domain && ((err = yp_get_default_domain (&domain)) != 0)) { | 
 | 395 | 		nis_error(err); | 
 | 396 | 		return NULL; | 
 | 397 | 	} | 
 | 398 |  | 
 | 399 | 	if ((maps = nis_maplist (domain)) == NULL) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 400 | 		return NULL; | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 401 | 	if ((list = PyList_New(0)) == NULL) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 402 | 		return NULL; | 
| Guido van Rossum | 61b705a | 2000-02-29 15:52:40 +0000 | [diff] [blame] | 403 | 	for (maps = maps; maps; maps = maps->next) { | 
| Gregory P. Smith | dd96db6 | 2008-06-09 04:58:54 +0000 | [diff] [blame] | 404 | 		PyObject *str = PyString_FromString(maps->map); | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 405 | 		if (!str || PyList_Append(list, str) < 0) | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 406 | 		{ | 
 | 407 | 			Py_DECREF(list); | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 408 | 			list = NULL; | 
 | 409 | 			break; | 
 | 410 | 		} | 
| Barry Warsaw | 4bc9d39 | 1997-01-09 22:22:05 +0000 | [diff] [blame] | 411 | 		Py_DECREF(str); | 
| Guido van Rossum | 3562d52 | 1992-08-12 15:26:16 +0000 | [diff] [blame] | 412 | 	} | 
 | 413 | 	/* XXX Shouldn't we free the list of maps now? */ | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 414 | 	return list; | 
 | 415 | } | 
 | 416 |  | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 417 | static PyMethodDef nis_methods[] = { | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 418 | 	{"match",		(PyCFunction)nis_match, | 
 | 419 | 					METH_VARARGS | METH_KEYWORDS, | 
 | 420 | 					match__doc__}, | 
 | 421 | 	{"cat",			(PyCFunction)nis_cat, | 
 | 422 | 					METH_VARARGS | METH_KEYWORDS, | 
 | 423 | 					cat__doc__}, | 
 | 424 | 	{"maps",		(PyCFunction)nis_maps, | 
 | 425 | 					METH_VARARGS | METH_KEYWORDS, | 
 | 426 | 					maps__doc__}, | 
 | 427 | 	{"get_default_domain",	(PyCFunction)nis_get_default_domain, | 
 | 428 |  					METH_NOARGS, | 
 | 429 | 					get_default_domain__doc__}, | 
 | 430 | 	{NULL,			NULL}		 /* Sentinel */ | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 431 | }; | 
 | 432 |  | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 433 | PyDoc_STRVAR(nis__doc__, | 
 | 434 | "This module contains functions for accessing NIS maps.\n"); | 
 | 435 |  | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 436 | void | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 437 | initnis (void) | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 438 | { | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 439 | 	PyObject *m, *d; | 
| Martin v. Löwis | 57a34e8 | 2006-02-04 19:12:37 +0000 | [diff] [blame] | 440 | 	m = Py_InitModule3("nis", nis_methods, nis__doc__); | 
| Neal Norwitz | 1ac754f | 2006-01-19 06:09:39 +0000 | [diff] [blame] | 441 | 	if (m == NULL) | 
 | 442 | 		return; | 
| Barry Warsaw | adbf4e6 | 1996-12-11 00:15:58 +0000 | [diff] [blame] | 443 | 	d = PyModule_GetDict(m); | 
| Guido van Rossum | 0cb96de | 1997-10-01 04:29:29 +0000 | [diff] [blame] | 444 | 	NisError = PyErr_NewException("nis.error", NULL, NULL); | 
 | 445 | 	if (NisError != NULL) | 
 | 446 | 		PyDict_SetItemString(d, "error", NisError); | 
| Guido van Rossum | 9de7a01 | 1992-08-12 14:57:12 +0000 | [diff] [blame] | 447 | } |