From c7e8255e9721eaa97c14958bf016943a61ee03b9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Jul 2007 15:09:19 +0000 Subject: 2007-04-06 Jakub Jelinek * nis/nis_domain_of.c (__nis_domain_of): New function. * include/rpcsvc/nislib.h (__nis_domain_of): New prototype. * nis/nis_lookup.c (nis_lookup): Use __nis_domain_of. * nis/nis_call.c (rec_dirsearch): Likewise. (first_shoot): Likewise. Remove search_parent_first argument. (struct nis_server_cache): Rename search_parent_first field to search_parent. (nis_server_cache_search, nis_server_cache_add): Rename search_parent_first argument to search_parent. (__nisfind_server): Likewise. If search_parent, call __nis_domain_of. --- ChangeLog | 14 ++++++++++++++ include/rpcsvc/nislib.h | 2 ++ nis/nis_call.c | 50 +++++++++++++++++++------------------------------ nis/nis_domain_of.c | 14 ++++++++++++++ nis/nis_lookup.c | 6 ++---- 5 files changed, 51 insertions(+), 35 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9da45031ef..8f94101c6a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2007-04-06 Jakub Jelinek + + * nis/nis_domain_of.c (__nis_domain_of): New function. + * include/rpcsvc/nislib.h (__nis_domain_of): New prototype. + * nis/nis_lookup.c (nis_lookup): Use __nis_domain_of. + * nis/nis_call.c (rec_dirsearch): Likewise. + (first_shoot): Likewise. Remove search_parent_first argument. + (struct nis_server_cache): Rename search_parent_first field + to search_parent. + (nis_server_cache_search, nis_server_cache_add): Rename + search_parent_first argument to search_parent. + (__nisfind_server): Likewise. If search_parent, call + __nis_domain_of. + 2007-04-05 Jakub Jelinek * nis/nis_call.c (__nisfind_server): Replace (*dir)->do_servers diff --git a/include/rpcsvc/nislib.h b/include/rpcsvc/nislib.h index 9c2be0e811..635c513e4d 100644 --- a/include/rpcsvc/nislib.h +++ b/include/rpcsvc/nislib.h @@ -42,4 +42,6 @@ libnsl_hidden_proto (__nis_default_group) libnsl_hidden_proto (__nis_default_access) libnsl_hidden_proto (nis_clone_object) +extern const_nis_name __nis_domain_of (const_nis_name) __THROW; + #endif diff --git a/nis/nis_call.c b/nis/nis_call.c index 379b84d52f..d5d4d03ae9 100644 --- a/nis/nis_call.c +++ b/nis/nis_call.c @@ -421,9 +421,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) case HIGHER_NAME: { /* We need data from a parent domain */ directory_obj *obj; - char ndomain[strlen (dir->do_name) + 3]; - - nis_domain_of_r (dir->do_name, ndomain, sizeof (ndomain)); + const char *ndomain = __nis_domain_of (dir->do_name); /* The root server of our domain is a replica of the parent domain ! (Now I understand why a root server must be a @@ -467,7 +465,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) size_t namelen = strlen (name); char leaf[namelen + 3]; char domain[namelen + 3]; - char ndomain[namelen + 3]; + const char *ndomain; char *cp; strcpy (domain, name); @@ -480,8 +478,8 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) return NULL; } nis_leaf_of_r (domain, leaf, sizeof (leaf)); - nis_domain_of_r (domain, ndomain, sizeof (ndomain)); - strcpy (domain, ndomain); + ndomain = __nis_domain_of (domain); + memmove (domain, ndomain, strlen (ndomain) + 1); } while (nis_dir_cmp (domain, dir->do_name) != SAME_NAME); @@ -534,29 +532,16 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status) /* We try to query the current server for the searched object, maybe he know about it ? */ static directory_obj * -first_shoot (const_nis_name name, int search_parent_first, directory_obj *dir) +first_shoot (const_nis_name name, directory_obj *dir) { directory_obj *obj = NULL; fd_result *fd_res; XDR xdrs; - char domain[strlen (name) + 3]; -#if 0 if (nis_dir_cmp (name, dir->do_name) == SAME_NAME) return dir; -#endif - - const char *search_name = name; - if (search_parent_first) - { - nis_domain_of_r (name, domain, sizeof (domain)); - search_name = domain; - } - - if (nis_dir_cmp (search_name, dir->do_name) == SAME_NAME) - return dir; - fd_res = __nis_finddirectory (dir, search_name); + fd_res = __nis_finddirectory (dir, name); if (fd_res == NULL) return NULL; if (fd_res->status == NIS_SUCCESS @@ -584,7 +569,7 @@ first_shoot (const_nis_name name, int search_parent_first, directory_obj *dir) static struct nis_server_cache { - int search_parent_first; + int search_parent; int uses; unsigned int size; unsigned int server_used; @@ -596,7 +581,7 @@ static time_t nis_cold_start_mtime; __libc_lock_define_initialized (static, nis_server_cache_lock) static directory_obj * -nis_server_cache_search (const_nis_name name, int search_parent_first, +nis_server_cache_search (const_nis_name name, int search_parent, unsigned int *server_used, unsigned int *current_ep, struct timeval *now) { @@ -620,7 +605,7 @@ nis_server_cache_search (const_nis_name name, int search_parent_first, free (nis_server_cache[i]); nis_server_cache[i] = NULL; } - else if (nis_server_cache[i]->search_parent_first == search_parent_first + else if (nis_server_cache[i]->search_parent == search_parent && strcmp (nis_server_cache[i]->name, name) == 0) { ret = calloc (1, sizeof (directory_obj)); @@ -652,7 +637,7 @@ nis_server_cache_search (const_nis_name name, int search_parent_first, } static void -nis_server_cache_add (const_nis_name name, int search_parent_first, +nis_server_cache_add (const_nis_name name, int search_parent, directory_obj *dir, unsigned int server_used, unsigned int current_ep, struct timeval *now) { @@ -671,7 +656,7 @@ nis_server_cache_add (const_nis_name name, int search_parent_first, new = calloc (1, sizeof (*new) + strlen (name) + 8 + size); if (new == NULL) return; - new->search_parent_first = search_parent_first; + new->search_parent = search_parent; new->uses = 1; new->expires = now->tv_sec + dir->do_ttl; new->size = size; @@ -712,7 +697,7 @@ nis_server_cache_add (const_nis_name name, int search_parent_first, } nis_error -__nisfind_server (const_nis_name name, int search_parent_first, +__nisfind_server (const_nis_name name, int search_parent, directory_obj **dir, dir_binding *dbp, unsigned int flags) { nis_error result = NIS_SUCCESS; @@ -731,7 +716,7 @@ __nisfind_server (const_nis_name name, int search_parent_first, (void) gettimeofday (&now, NULL); if ((flags & NO_CACHE) == 0) - *dir = nis_server_cache_search (name, search_parent_first, &server_used, + *dir = nis_server_cache_search (name, search_parent, &server_used, ¤t_ep, &now); if (*dir != NULL) { @@ -761,10 +746,13 @@ __nisfind_server (const_nis_name name, int search_parent_first, return NIS_UNAVAIL; /* Try at first, if servers in "dir" know our object */ - obj = first_shoot (name, search_parent_first, *dir); + const char *search_name = name; + if (search_parent) + search_name = __nis_domain_of (name); + obj = first_shoot (search_name, *dir); if (obj == NULL) { - obj = rec_dirsearch (name, *dir, &status); + obj = rec_dirsearch (search_name, *dir, &status); if (obj == NULL) result = status; } @@ -785,7 +773,7 @@ __nisfind_server (const_nis_name name, int search_parent_first, current_ep = dbp->current_ep; } if ((flags & NO_CACHE) == 0) - nis_server_cache_add (name, search_parent_first, obj, + nis_server_cache_add (name, search_parent, obj, server_used, current_ep, &now); } else diff --git a/nis/nis_domain_of.c b/nis/nis_domain_of.c index eca2066aa3..97d49d36c2 100644 --- a/nis/nis_domain_of.c +++ b/nis/nis_domain_of.c @@ -26,3 +26,17 @@ nis_domain_of (const_nis_name name) return nis_domain_of_r (name, result, NIS_MAXNAMELEN); } + +const_nis_name +__nis_domain_of (const_nis_name name) +{ + const_nis_name cptr = strchr (name, '.'); + + if (cptr++ == NULL) + return ""; + + if (*cptr == '\0') + return "."; + + return cptr; +} diff --git a/nis/nis_lookup.c b/nis/nis_lookup.c index 6fd8d36b22..15b59b622c 100644 --- a/nis/nis_lookup.c +++ b/nis/nis_lookup.c @@ -74,7 +74,6 @@ nis_lookup (const_nis_name name, const unsigned int flags) { static const struct timeval RPCTIMEOUT = {10, 0}; enum clnt_stat result; - char ndomain[strlen (req.ns_name) + 1]; again: result = clnt_call (bptr.clnt, NIS_LOOKUP, @@ -136,10 +135,9 @@ nis_lookup (const_nis_name name, const unsigned int flags) if (__nisbind_next (&bptr) != NIS_SUCCESS) { /* No more servers to search. Try parent. */ - nis_domain_of_r (req.ns_name, ndomain, - sizeof (ndomain)); + const char *ndomain = __nis_domain_of (req.ns_name); req.ns_name = strdupa (ndomain); - if (strcmp (ndomain, ".") == 0) + if (strcmp (req.ns_name, ".") == 0) { NIS_RES_STATUS (res) = NIS_NAMEUNREACHABLE; goto out; -- cgit 1.4.1