static PyObject * nis_cat (PyObject *self, PyObject *args) { char *domain; char *map; struct ypall_callback cb; struct ypcallback_data data; PyObject *dict; int err; if (!PyArg_Parse(args, "s", &map)) return NULL; if ((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; Py_BEGIN_ALLOW_THREADS err = yp_all (domain, map, &cb); Py_END_ALLOW_THREADS if (err != 0) { Py_DECREF(dict); return nis_error(err); } return dict; }
static PyObject * nis_cat (PyObject *self, PyObject *args, PyObject *kwdict) { 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; }
static enum nss_status internal_nis_setservent (intern_t *intern) { char *domainname; struct ypall_callback ypcb; enum nss_status status; if (yp_get_default_domain (&domainname)) return NSS_STATUS_UNAVAIL; while (intern->start != NULL) { if (intern->start->val != NULL) free (intern->start->val); intern->next = intern->start; intern->start = intern->start->next; free (intern->next); } intern->start = NULL; ypcb.foreach = saveit; ypcb.data = (char *) intern; status = yperr2nss (yp_all (domainname, "services.byname", &ypcb)); intern->next = intern->start; return status; }
static enum nss_status internal_nis_setrpcent (intern_t *intern) { char *domainname; struct ypall_callback ypcb; enum nss_status status; if (yp_get_default_domain (&domainname)) return NSS_STATUS_UNAVAIL; internal_nis_endrpcent (intern); ypcb.foreach = _nis_saveit; ypcb.data = (char *) intern; status = yperr2nss (yp_all (domainname, "rpc.bynumber", &ypcb)); /* Mark the last buffer as full. */ if (intern->next != NULL) intern->next->size = intern->offset; intern->next = intern->start; intern->offset = 0; return status; }
VALUE rb_yp_all(int argc, VALUE argv[], VALUE self) { int res; struct ypall_callback ypcb; VALUE domainname, map, cb; rb_scan_args(argc, argv, "21", &domainname, &map, &cb); if( domainname == Qnil ) { domainname = rb_yp_get_default_domain(self); }; switch( argc ) { case 3: ypcb.foreach = rb_ypall_callback; ypcb.data = (char*)cb; break; case 2: ypcb.foreach = rb_ypall_callback; ypcb.data = (char*)Qnil; break; }; res = yp_all(STR2CSTR(domainname), STR2CSTR(map), &ypcb); rb_yp_check_yperr(res); return Qnil; };
static enum nss_status internal_nis_setservent (void) { char *domainname; struct ypall_callback ypcb; enum nss_status status; if (yp_get_default_domain (&domainname)) return NSS_STATUS_UNAVAIL; internal_nis_endservent (); ypcb.foreach = _nis_saveit; ypcb.data = (char *) &intern; status = yperr2nss (yp_all (domainname, "services.byname", &ypcb)); /* Mark the last buffer as full. */ if (intern.next != NULL) intern.next->size = intern.offset; intern.next = intern.start; intern.offset = 0; return status; }
int nis_reload(mnt_map *m, char *map, void (*fn)()) { struct ypall_callback cbinfo; int error; struct nis_callback_data data; if (!domain) { error = determine_nis_domain(); if (error) return error; } data.ncd_m = m; data.ncd_map = map; data.ncd_fn = fn; cbinfo.data = (void *)&data; cbinfo.foreach = (void *)&callback; error = yp_all(domain, map, &cbinfo); if (error) plog(XLOG_ERROR, "error grabbing nis map of %s: %s", map, yperr_string(ypprot_err(error))); return error; }
int main(int argc, char *argv[]) { char *domain = NULL, *inmap; struct ypall_callback ypcb; extern char *optarg; extern int optind; int notrans, c, r, i; notrans = key = 0; while ((c=getopt(argc, argv, "xd:kt")) != -1) switch (c) { case 'x': for (i=0; i<sizeof ypaliases/sizeof ypaliases[0]; i++) printf("Use \"%s\" for \"%s\"\n", ypaliases[i].alias, ypaliases[i].name); exit(0); case 'd': domain = optarg; break; case 't': notrans++; break; case 'k': key++; break; default: usage(); } if (optind + 1 != argc ) usage(); if (!domain) yp_get_default_domain(&domain); inmap = argv[optind]; if (!notrans) { for (i=0; i<sizeof ypaliases/sizeof ypaliases[0]; i++) if (strcmp(inmap, ypaliases[i].alias) == 0) inmap = ypaliases[i].name; } ypcb.foreach = printit; ypcb.data = NULL; r = yp_all(domain, inmap, &ypcb); switch (r) { case 0: break; case YPERR_YPBIND: fprintf(stderr, "ypcat: not running ypbind\n"); exit(1); default: fprintf(stderr, "No such map %s. Reason: %s\n", inmap, yperr_string(r)); exit(1); } exit(0); }
static int getMap_(void) { char *domain; struct ypall_callback incallback; int i; h_initTab_(&hashTab, 64); incallback.foreach = putin_; if ((i = yp_get_default_domain(&domain)) != 0) return(i); return (yp_all(domain, "auto.master", &incallback)); }
static enum nss_status internal_nis_setetherent (void) { char *domainname; struct ypall_callback ypcb; enum nss_status status; yp_get_default_domain (&domainname); internal_nis_endetherent (); ypcb.foreach = saveit; ypcb.data = NULL; status = yperr2nss (yp_all (domainname, "ethers.byname", &ypcb)); next = start; return status; }
static enum nss_status internal_setgrent (char *domainname, intern_t *intern) { struct ypall_callback ypcb; enum nss_status status; ypcb.foreach = _nis_saveit; ypcb.data = (char *) intern; status = yperr2nss (yp_all (domainname, "group.byname", &ypcb)); /* Mark the last buffer as full. */ if (intern->next != NULL) intern->next->size = intern->offset; intern->next = intern->start; intern->offset = 0; return status; }
static enum nss_status internal_nis_setservent (intern_t *intern) { char *domainname; struct ypall_callback ypcb; enum nss_status status; if (yp_get_default_domain (&domainname)) return NSS_STATUS_UNAVAIL; (void) internal_nis_endservent (intern); ypcb.foreach = saveit; ypcb.data = (char *) intern; status = yperr2nss (yp_all (domainname, "services.byname", &ypcb)); intern->next = intern->start; return status; }
enum nss_status internal_nis_setpwent (void) { /* We have to read all the data now. */ char *domain; if (__glibc_unlikely (yp_get_default_domain (&domain))) return NSS_STATUS_UNAVAIL; struct ypall_callback ypcb; ypcb.foreach = _nis_saveit; ypcb.data = (char *) &intern; enum nss_status status = yperr2nss (yp_all (domain, "passwd.byname", &ypcb)); /* Mark the last buffer as full. */ if (intern.next != NULL) intern.next->size = intern.offset; intern.next = intern.start; intern.offset = 0; return status; }
static void fillnameddirtable(UNUSED(HashTable ht)) { if (!allusersadded) { #if defined(HAVE_NIS) || defined(HAVE_NIS_PLUS) FILE *pwf; char buf[BUFSIZ], *p, *d, *de; int skipping, oldct = nameddirtab->ct, usepwf = 1; # ifndef HAVE_NIS_PLUS char domain[YPMAXDOMAIN]; struct ypall_callback cb; /* Get potential matches from NIS and cull those without local accounts */ if (getdomainname(domain, YPMAXDOMAIN) == 0) { cb.foreach = (int (*)()) add_userdir; cb.data = NULL; yp_all(domain, PASSWD_MAP, &cb); } # else /* HAVE_NIS_PLUS */ /* Maybe we should turn this string into a #define'd constant...? */ nis_list("passwd.org_dir", EXPAND_NAME|ALL_RESULTS|FOLLOW_LINKS|FOLLOW_PATH, add_userdir, 0); # endif if (nameddirtab->ct == oldct) { /* Using NIS or NIS+ didn't add any user directories. This seems * fishy, so we fall back to using getpwent(). If we don't have * that, we only use the passwd file. */ #ifdef HAVE_GETPWENT struct passwd *pw; setpwent(); /* loop through the password file/database * * and add all entries returned. */ while ((pw = getpwent()) && !errflag) adduserdir(pw->pw_name, pw->pw_dir, ND_USERNAME, 1); endpwent(); usepwf = 0; #endif /* HAVE_GETPWENT */ } if (usepwf) { /* Don't forget the non-NIS matches from the flat passwd file */ if ((pwf = fopen(PASSWD_FILE, "r")) != NULL) { skipping = 0; while (fgets(buf, BUFSIZ, pwf) != NULL) { if (strchr(buf, '\n') != NULL) { if (!skipping) { if ((p = strchr(buf, ':')) != NULL) { *p++ = '\0'; if ((de = strrchr(p, ':'))) { *de = '\0'; if ((d = strrchr(p, ':'))) { if (*++d && buf[0]) adduserdir(buf, d, ND_USERNAME, 1); } } } } else skipping = 0; } else skipping = 1; } fclose(pwf); } } #else /* no NIS or NIS_PLUS */ #ifdef HAVE_GETPWENT struct passwd *pw; setpwent(); /* loop through the password file/database * * and add all entries returned. */ while ((pw = getpwent()) && !errflag) adduserdir(pw->pw_name, pw->pw_dir, ND_USERNAME, 1); endpwent(); #endif /* HAVE_GETPWENT */ #endif allusersadded = 1; } }
enum nss_status _nss_nis_getservbyport_r (int port, const char *protocol, struct servent *serv, char *buffer, size_t buflen, int *errnop) { enum nss_status status; char *domain; if (yp_get_default_domain (&domain)) return NSS_STATUS_UNAVAIL; /* If the protocol is given, we only need one query. Otherwise try first port/tcp, then port/udp and then fallback to sequential scanning of services.byname. */ const char *proto = protocol != NULL ? protocol : "tcp"; do { char key[sizeof (int) * 3 + strlen (proto) + 2]; char *result; size_t keylen, len; int int_len; /* key is: "port/proto" */ keylen = snprintf (key, sizeof (key), "%d/%s", ntohs (port), proto); status = yperr2nss (yp_match (domain, "services.byname", key, keylen, &result, &int_len)); len = int_len; /* If we found the key, it's ok and parse the result. If not, fall through and parse the complete table. */ if (status == NSS_STATUS_SUCCESS) { struct parser_data *pdata = (void *) buffer; int parse_res; char *p; if ((size_t) (len + 1) > buflen) { free (result); *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } p = strncpy (buffer, result, len); buffer[len] = '\0'; while (isspace (*p)) ++p; free (result); parse_res = _nss_files_parse_servent (p, serv, pdata, buflen, errnop); if (parse_res < 0) { if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; } else return NSS_STATUS_SUCCESS; } } while (protocol == NULL && (proto[0] == 't' ? (proto = "udp") : NULL)); if (port == -1) return NSS_STATUS_NOTFOUND; struct ypall_callback ypcb; struct search_t req; ypcb.foreach = dosearch; ypcb.data = (char *) &req; req.name = NULL; req.proto = protocol; req.port = port; req.serv = serv; req.buffer = buffer; req.buflen = buflen; req.errnop = errnop; req.status = NSS_STATUS_NOTFOUND; status = yperr2nss (yp_all (domain, "services.byname", &ypcb)); if (status != NSS_STATUS_SUCCESS) return status; return req.status; }
enum nss_status _nss_nis_getservbyname_r (const char *name, const char *protocol, struct servent *serv, char *buffer, size_t buflen, int *errnop) { enum nss_status status; char *domain; if (name == NULL) { *errnop = EINVAL; return NSS_STATUS_UNAVAIL; } if (yp_get_default_domain (&domain)) return NSS_STATUS_UNAVAIL; /* If the protocol is given, we could try if our NIS server knows about services.byservicename map. If yes, we only need one query. */ char key[strlen (name) + (protocol ? strlen (protocol) : 0) + 2]; char *cp, *result; size_t keylen, len; int int_len; /* key is: "name/proto" */ cp = stpcpy (key, name); if (protocol) { *cp++ = '/'; strcpy (cp, protocol); } keylen = strlen (key); status = yperr2nss (yp_match (domain, "services.byservicename", key, keylen, &result, &int_len)); len = int_len; /* If we found the key, it's ok and parse the result. If not, fall through and parse the complete table. */ if (status == NSS_STATUS_SUCCESS) { struct parser_data *pdata = (void *) buffer; int parse_res; char *p; if ((size_t) (len + 1) > buflen) { free (result); *errnop = ERANGE; return NSS_STATUS_TRYAGAIN; } p = strncpy (buffer, result, len); buffer[len] = '\0'; while (isspace (*p)) ++p; free (result); parse_res = _nss_files_parse_servent (p, serv, pdata, buflen, errnop); if (parse_res < 0) { if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; } else return NSS_STATUS_SUCCESS; } /* Check if it is safe to rely on services.byservicename. */ if (_nis_default_nss () & NSS_FLAG_SERVICES_AUTHORITATIVE) return status; struct ypall_callback ypcb; struct search_t req; ypcb.foreach = dosearch; ypcb.data = (char *) &req; req.name = name; req.proto = protocol; req.port = -1; req.serv = serv; req.buffer = buffer; req.buflen = buflen; req.errnop = errnop; req.status = NSS_STATUS_NOTFOUND; status = yperr2nss (yp_all (domain, "services.byname", &ypcb)); if (status != NSS_STATUS_SUCCESS) return status; return req.status; }