about summary refs log tree commit diff
path: root/nis
diff options
context:
space:
mode:
Diffstat (limited to 'nis')
-rw-r--r--nis/Banner2
-rw-r--r--nis/Makefile8
-rw-r--r--nis/nis_call.c26
-rw-r--r--nis/nis_checkpoint.c4
-rw-r--r--nis/nis_intern.h21
-rw-r--r--nis/nis_mkdir.c4
-rw-r--r--nis/nis_ping.c4
-rw-r--r--nis/nis_rmdir.c4
-rw-r--r--nis/nis_server.c6
-rw-r--r--nis/nis_util.c14
-rw-r--r--nis/nss_nis/nis-alias.c16
-rw-r--r--nis/nss_nis/nis-ethers.c34
-rw-r--r--nis/nss_nis/nis-grp.c32
-rw-r--r--nis/nss_nis/nis-hosts.c2
-rw-r--r--nis/nss_nis/nis-network.c4
-rw-r--r--nis/nss_nis/nis-proto.c32
-rw-r--r--nis/nss_nis/nis-publickey.c4
-rw-r--r--nis/nss_nis/nis-pwd.c2
-rw-r--r--nis/nss_nis/nis-rpc.c2
-rw-r--r--nis/nss_nis/nis-service.c5
-rw-r--r--nis/nss_nis/nis-spwd.c17
-rw-r--r--nis/nss_nisplus/nisplus-alias.c28
-rw-r--r--nis/nss_nisplus/nisplus-ethers.c41
-rw-r--r--nis/nss_nisplus/nisplus-grp.c42
-rw-r--r--nis/nss_nisplus/nisplus-hosts.c2
-rw-r--r--nis/nss_nisplus/nisplus-proto.c33
-rw-r--r--nis/nss_nisplus/nisplus-publickey.c4
-rw-r--r--nis/nss_nisplus/nisplus-pwd.c41
-rw-r--r--nis/nss_nisplus/nisplus-rpc.c33
-rw-r--r--nis/nss_nisplus/nisplus-service.c36
-rw-r--r--nis/nss_nisplus/nisplus-spwd.c24
31 files changed, 300 insertions, 227 deletions
diff --git a/nis/Banner b/nis/Banner
index c280caad63..0937be7419 100644
--- a/nis/Banner
+++ b/nis/Banner
@@ -1 +1 @@
-NIS(YP)/NIS+ NSS modules 0.15 by Thorsten Kukuk
+NIS(YP)/NIS+ NSS modules 0.16 by Thorsten Kukuk
diff --git a/nis/Makefile b/nis/Makefile
index e114faf1c7..b31aad4401 100644
--- a/nis/Makefile
+++ b/nis/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -23,7 +23,7 @@ subdir	:= nis
 
 headers			:= $(wildcard rpcsvc/*.[hx])
 distribute		:= nss-nis.h nss-nisplus.h nis_intern.h Banner \
-			nisplus-parser.h
+			nisplus-parser.h nis_cache2.h
 
 # These are the databases available for the nis (and perhaps later nisplus)
 # service.  This must be a superset of the services in nss.
@@ -44,8 +44,8 @@ vpath %.c $(subdir-dirs)
 
 libnsl-routines = yp_xdr ypclnt ypupdate_xdr \
                   nis_subr nis_local_names nis_free nis_file \
-                  nis_print nis_error nis_call nis_lookup\
-                  nis_table nis_xdr nis_server nis_ping\
+                  nis_print nis_error nis_call nis_lookup nis_cache\
+                  nis_table nis_xdr nis_server nis_ping nis_cache2_xdr\
 		  nis_checkpoint nis_mkdir nis_rmdir nis_getservlist\
 		  nis_verifygroup nis_ismember nis_addmember nis_util\
 		  nis_removemember nis_creategroup nis_destroygroup\
diff --git a/nis/nis_call.c b/nis/nis_call.c
index cea508e5b6..196f6b36f1 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -186,7 +186,8 @@ __bind_connect (dir_binding *dbp)
 }
 
 static dir_binding *
-__bind_create (const nis_server *serv_val, u_int serv_len, u_long flags)
+__bind_create (const nis_server *serv_val, u_int serv_len, u_long flags,
+	       cache2_info *cinfo)
 {
   dir_binding *dbp;
   u_int i;
@@ -268,7 +269,14 @@ __bind_create (const nis_server *serv_val, u_int serv_len, u_long flags)
 	dbp->server_val[i].pkey.n_bytes = NULL;
     }
 
-  if (__nis_findfastest (dbp) < 1)
+  dbp->class = -1;
+  if (cinfo != NULL && cinfo->server_used >= 0)
+    {
+      dbp->server_used = cinfo->server_used;
+      dbp->current_ep = cinfo->current_ep;
+      dbp->class = cinfo->class;
+    }
+  else if (__nis_findfastest (dbp) < 1)
     {
       __bind_destroy (dbp);
       return NULL;
@@ -280,7 +288,7 @@ __bind_create (const nis_server *serv_val, u_int serv_len, u_long flags)
 nis_error
 __do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
 	       xdrproc_t xargs, caddr_t req, xdrproc_t xres, caddr_t resp,
-	       u_long flags, nis_cb *cb)
+	       u_long flags, nis_cb *cb, cache2_info *cinfo)
 {
   enum clnt_stat result;
   nis_error retcode;
@@ -289,7 +297,8 @@ __do_niscall2 (const nis_server *server, u_int server_len, u_long prog,
   if (flags & MASTER_ONLY)
     server_len = 1;
 
-  if ((dbp = __bind_create (server, server_len, flags)) == NULL)
+  dbp = __bind_create (server, server_len, flags, cinfo);
+  if (dbp == NULL)
     return NIS_NAMEUNREACHABLE;
   while (__bind_connect (dbp) != NIS_SUCCESS)
     {
@@ -549,10 +558,15 @@ __do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
   directory_obj *dir = NULL;
   nis_server *server;
   u_int server_len;
+  cache2_info cinfo = {-1, -1, -1};
 
   if (name == NULL)
     return NIS_BADNAME;
 
+  /* Search in local cache. In the moment, we ignore the fastest server */
+  if (!(flags & NO_CACHE))
+    dir = __nis_cache_search (name, flags, &cinfo);
+
   if (dir == NULL)
     {
       nis_error status;
@@ -578,7 +592,7 @@ __do_niscall (const_nis_name name, u_long prog, xdrproc_t xargs,
 
 
   retcode = __do_niscall2 (server, server_len, prog, xargs, req, xres, resp,
-			   flags, cb);
+			   flags, cb, &cinfo);
 
   nis_free_directory (dir);
 
diff --git a/nis/nis_checkpoint.c b/nis/nis_checkpoint.c
index f4bd07252c..665dccba06 100644
--- a/nis/nis_checkpoint.c
+++ b/nis/nis_checkpoint.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -51,7 +51,7 @@ nis_checkpoint(const_nis_name dirname)
 	  if (__do_niscall2 (&NIS_RES_OBJECT(res2)->DI_data.do_servers.do_servers_val[i],
 			     1, NIS_CHECKPOINT, (xdrproc_t) xdr_nis_name,
 			     (caddr_t) &dirname, (xdrproc_t) xdr_cp_result,
-			     (caddr_t) &cpres, 0, NULL) != RPC_SUCCESS)
+			     (caddr_t) &cpres, 0, NULL, NULL) != RPC_SUCCESS)
 	    NIS_RES_STATUS (res) = NIS_RPCERROR;
 	  else
 	    {
diff --git a/nis/nis_intern.h b/nis/nis_intern.h
index e714621f1b..22b753d246 100644
--- a/nis/nis_intern.h
+++ b/nis/nis_intern.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -32,6 +32,7 @@ struct dir_binding
   u_int server_used;             /* Which server we are bind in the moment ? */
   u_int current_ep;              /* Which endpoint of the server are in use? */
   u_int trys;                    /* How many server have we tried ? */
+  u_int class;                   /* From which class is server_val ? */
   bool_t master_only;            /* Is only binded to the master */
   bool_t use_auth;               /* Do we use AUTH ? */
   bool_t use_udp;                /* Do we use UDP ? */
@@ -42,6 +43,14 @@ struct dir_binding
 };
 typedef struct dir_binding dir_binding;
 
+struct cache2_info
+{
+  long server_used;
+  long current_ep;
+  long class;
+};
+typedef struct cache2_info cache2_info;
+
 struct nis_cb
   {
     nis_server *serv;
@@ -59,7 +68,8 @@ extern long __nis_findfastest __P ((dir_binding *bind));
 extern nis_error __do_niscall2 __P ((const nis_server *serv, u_int serv_len,
 				     u_long prog, xdrproc_t xargs, caddr_t req,
 				     xdrproc_t xres, caddr_t resp,
-				     u_long flags, nis_cb *cb));
+				     u_long flags, nis_cb *cb,
+				     cache2_info *cinfo));
 extern nis_error __do_niscall __P ((const_nis_name name, u_long prog,
 				    xdrproc_t xargs, caddr_t req,
 				    xdrproc_t xres, caddr_t resp,
@@ -75,6 +85,13 @@ extern struct nis_cb *__nis_create_callback
 	    const void *userdata, u_long flags));
 extern nis_error __nis_destroy_callback __P ((struct nis_cb *cb));
 
+#ifdef _LIBC
+/* NIS+ Cache functions */
+extern directory_obj *__nis_cache_search __P ((const_nis_name name,
+					       u_long flags,
+					       cache2_info *cinfo));
+#endif
+
 __END_DECLS
 
 #endif
diff --git a/nis/nis_mkdir.c b/nis/nis_mkdir.c
index acd0122bdf..e7858306ee 100644
--- a/nis/nis_mkdir.c
+++ b/nis/nis_mkdir.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -33,7 +33,7 @@ nis_mkdir (const_nis_name dir, const nis_server *server)
     res2 = __do_niscall2 (server, 1, NIS_MKDIR,
 			  (xdrproc_t) xdr_nis_name,
 			  (caddr_t) &dir, (xdrproc_t) xdr_nis_error,
-			  (caddr_t) &res, 0, NULL);
+			  (caddr_t) &res, 0, NULL, NULL);
   if (res2 != NIS_SUCCESS)
     return res2;
 
diff --git a/nis/nis_ping.c b/nis/nis_ping.c
index 1397cb9c98..03562c3e84 100644
--- a/nis/nis_ping.c
+++ b/nis/nis_ping.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -59,7 +59,7 @@ nis_ping (const_nis_name dirname, u_long utime, const nis_object *dirobj)
     __do_niscall2 (&obj->DI_data.do_servers.do_servers_val[i], 1,
 		   NIS_PING, (xdrproc_t) xdr_ping_args,
 		   (caddr_t) &args, (xdrproc_t) xdr_void,
-		   (caddr_t) NULL, 0, NULL);
+		   (caddr_t) NULL, 0, NULL, NULL);
   if (res)
     nis_freeresult (res);
 }
diff --git a/nis/nis_rmdir.c b/nis/nis_rmdir.c
index f1214f9f80..1fc1f09639 100644
--- a/nis/nis_rmdir.c
+++ b/nis/nis_rmdir.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -31,7 +31,7 @@ nis_rmdir (const_nis_name dir, const nis_server *server)
   res2 = __do_niscall2 (server, 1, NIS_RMDIR,
 			(xdrproc_t) xdr_nis_name,
 			(caddr_t) &dir, (xdrproc_t) xdr_nis_error,
-			(caddr_t) &res, 0, NULL);
+			(caddr_t) &res, 0, NULL, NULL);
   if (res2 != NIS_SUCCESS)
     return res2;
 
diff --git a/nis/nis_server.c b/nis/nis_server.c
index 7eb785423a..26b7ca5358 100644
--- a/nis/nis_server.c
+++ b/nis/nis_server.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -39,7 +39,7 @@ nis_servstate (const nis_server *serv, const nis_tag *tags,
 
   if (__do_niscall2 (serv, 1, NIS_SERVSTATE, (xdrproc_t) xdr_nis_taglist,
 		     (caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
-		     (caddr_t) &tagres, 0, NULL) != RPC_SUCCESS)
+		     (caddr_t) &tagres, 0, NULL, NULL) != RPC_SUCCESS)
     return NIS_RPCERROR;
 
   *result = tagres.tags.tags_val;
@@ -65,7 +65,7 @@ nis_stats (const nis_server *serv, const nis_tag *tags,
 
   if (__do_niscall2 (serv, 1, NIS_STATUS, (xdrproc_t) xdr_nis_taglist,
 		     (caddr_t) &taglist, (xdrproc_t) xdr_nis_taglist,
-		     (caddr_t) &tagres, 0, NULL) != RPC_SUCCESS)
+		     (caddr_t) &tagres, 0, NULL, NULL) != RPC_SUCCESS)
     return NIS_RPCERROR;
 
   *result = tagres.tags.tags_val;
diff --git a/nis/nis_util.c b/nis/nis_util.c
index fd9ff26bf5..e516647bec 100644
--- a/nis/nis_util.c
+++ b/nis/nis_util.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -32,12 +32,12 @@ __nis_finddirectory (directory_obj *dir, const_nis_name name)
   fd_args.requester = nis_local_host();
   fd_res = calloc (1, sizeof (fd_result));
 
-  if ((status = __do_niscall2 (dir->do_servers.do_servers_val,
-			       dir->do_servers.do_servers_len,
-			       NIS_FINDDIRECTORY, (xdrproc_t) xdr_fd_args,
-			       (caddr_t) &fd_args, (xdrproc_t) xdr_fd_result,
-			       (caddr_t) fd_res,
-			       NO_AUTHINFO|USE_DGRAM, NULL)) != NIS_SUCCESS)
+  status = __do_niscall2 (dir->do_servers.do_servers_val,
+			  dir->do_servers.do_servers_len,
+			  NIS_FINDDIRECTORY, (xdrproc_t) xdr_fd_args,
+			  (caddr_t) &fd_args, (xdrproc_t) xdr_fd_result,
+			  (caddr_t) fd_res, NO_AUTHINFO|USE_DGRAM, NULL, NULL);
+  if (status != NIS_SUCCESS)
     fd_res->status = status;
 
   return fd_res;
diff --git a/nis/nss_nis/nis-alias.c b/nis/nss_nis/nis-alias.c
index 0d0294082d..6ef23012b8 100644
--- a/nis/nss_nis/nis-alias.c
+++ b/nis/nss_nis/nis-alias.c
@@ -231,7 +231,7 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -262,11 +262,13 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias,
 
   alias->alias_local = 0;
   parse_res = _nss_nis_parse_aliasent (name, p, alias, buffer, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
 
-  if (parse_res)
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  return NSS_STATUS_SUCCESS;
 }
diff --git a/nis/nss_nis/nis-ethers.c b/nis/nss_nis/nis-ethers.c
index cbc37591ee..a5723747fc 100644
--- a/nis/nss_nis/nis-ethers.c
+++ b/nis/nss_nis/nis-ethers.c
@@ -200,7 +200,7 @@ _nss_nis_gethostton_r (const char *name, struct ether *eth,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -231,13 +231,14 @@ _nss_nis_gethostton_r (const char *name, struct ether *eth,
   free (result);
 
   parse_res = _nss_files_parse_etherent (p, eth, data, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
-
-  if (!parse_res)
-    return NSS_STATUS_NOTFOUND;
-  else
-    return NSS_STATUS_SUCCESS;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
+  return NSS_STATUS_SUCCESS;
 }
 
 enum nss_status
@@ -252,7 +253,7 @@ _nss_nis_getntohost_r (struct ether_addr *addr, struct ether *eth,
 
   if (addr == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -291,11 +292,12 @@ _nss_nis_getntohost_r (struct ether_addr *addr, struct ether *eth,
   free (result);
 
   parse_res = _nss_files_parse_etherent (p, eth, data, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
-
-  if (!parse_res)
-    return NSS_STATUS_NOTFOUND;
-  else
-    return NSS_STATUS_SUCCESS;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
+  return NSS_STATUS_SUCCESS;
 }
diff --git a/nis/nss_nis/nis-grp.c b/nis/nss_nis/nis-grp.c
index 98cc4fd878..40d45825e4 100644
--- a/nis/nss_nis/nis-grp.c
+++ b/nis/nss_nis/nis-grp.c
@@ -166,7 +166,7 @@ _nss_nis_getgrnam_r (const char *name, struct group *grp,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -197,13 +197,14 @@ _nss_nis_getgrnam_r (const char *name, struct group *grp,
   free (result);
 
   parse_res = _nss_files_parse_grent (p, grp, data, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
-
-  if (parse_res)
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
+  return NSS_STATUS_SUCCESS;
 }
 
 enum nss_status
@@ -245,11 +246,12 @@ _nss_nis_getgrgid_r (gid_t gid, struct group *grp,
   free (result);
 
   parse_res = _nss_files_parse_grent (p, grp, data, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
-
-  if (parse_res)
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
+  return NSS_STATUS_SUCCESS;
 }
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
index e627d24399..c9d355171a 100644
--- a/nis/nss_nis/nis-hosts.c
+++ b/nis/nss_nis/nis-hosts.c
@@ -246,7 +246,7 @@ _nss_nis_gethostbyname2_r (const char *name, int af, struct hostent *host,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
diff --git a/nis/nss_nis/nis-network.c b/nis/nss_nis/nis-network.c
index 4fcf729b34..93cff5ce93 100644
--- a/nis/nss_nis/nis-network.c
+++ b/nis/nss_nis/nis-network.c
@@ -115,7 +115,7 @@ internal_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen,
       if ((size_t) (len + 1) > buflen)
         {
           free (result);
-          __set_errno (ERANGE);
+	  *errnop = ERANGE;
 	  *herrnop = NETDB_INTERNAL;
           return NSS_STATUS_TRYAGAIN;
         }
@@ -171,7 +171,7 @@ _nss_nis_getnetbyname_r (const char *name, struct netent *net, char *buffer,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       *herrnop = NETDB_INTERNAL;
       return NSS_STATUS_UNAVAIL;
     }
diff --git a/nis/nss_nis/nis-proto.c b/nis/nss_nis/nis-proto.c
index a6f57fde98..3af0f4e896 100644
--- a/nis/nss_nis/nis-proto.c
+++ b/nis/nss_nis/nis-proto.c
@@ -192,7 +192,7 @@ _nss_nis_getprotobyname_r (const char *name, struct protoent *proto,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -223,13 +223,14 @@ _nss_nis_getprotobyname_r (const char *name, struct protoent *proto,
   free (result);
 
   parse_res = _nss_files_parse_protoent (p, proto, data, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
-
-  if (parse_res)
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
+  return NSS_STATUS_SUCCESS;
 }
 
 enum nss_status
@@ -271,11 +272,12 @@ _nss_nis_getprotobynumber_r (int number, struct protoent *proto,
   free (result);
 
   parse_res = _nss_files_parse_protoent (p, proto, data, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
-
-  if (parse_res)
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
+  return NSS_STATUS_SUCCESS;
 }
diff --git a/nis/nss_nis/nis-publickey.c b/nis/nss_nis/nis-publickey.c
index 1c485d9d23..1ab041f435 100644
--- a/nis/nss_nis/nis-publickey.c
+++ b/nis/nss_nis/nis-publickey.c
@@ -42,7 +42,7 @@ _nss_nis_getpublickey (const char *netname, char *pkey, int *errnop)
 
   if (netname == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -84,7 +84,7 @@ _nss_nis_getsecretkey (const char *netname, char *skey, char *passwd,
 
   if (netname == NULL || passwd == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
diff --git a/nis/nss_nis/nis-pwd.c b/nis/nss_nis/nis-pwd.c
index 8924886e1e..296526d7e6 100644
--- a/nis/nss_nis/nis-pwd.c
+++ b/nis/nss_nis/nis-pwd.c
@@ -166,7 +166,7 @@ _nss_nis_getpwnam_r (const char *name, struct passwd *pwd,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
diff --git a/nis/nss_nis/nis-rpc.c b/nis/nss_nis/nis-rpc.c
index 3be99496e4..879e90af6d 100644
--- a/nis/nss_nis/nis-rpc.c
+++ b/nis/nss_nis/nis-rpc.c
@@ -207,7 +207,7 @@ _nss_nis_getrpcbyname_r (const char *name, struct rpcent *rpc,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
diff --git a/nis/nss_nis/nis-service.c b/nis/nss_nis/nis-service.c
index 0aa35cc34b..dfae9f7be2 100644
--- a/nis/nss_nis/nis-service.c
+++ b/nis/nss_nis/nis-service.c
@@ -34,7 +34,6 @@ extern int _nss_files_parse_servent (char *line, struct servent *result,
 				     char *data, size_t datalen, int *errnop);
 
 
-
 __libc_lock_define_initialized (static, lock)
 
 struct response_t
@@ -208,7 +207,7 @@ _nss_nis_getservbyname_r (const char *name, char *protocol,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -252,7 +251,7 @@ _nss_nis_getservbyport_r (int port, char *protocol, struct servent *serv,
 
   if (protocol == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
diff --git a/nis/nss_nis/nis-spwd.c b/nis/nss_nis/nis-spwd.c
index 5be010d433..452f91dc0b 100644
--- a/nis/nss_nis/nis-spwd.c
+++ b/nis/nss_nis/nis-spwd.c
@@ -166,7 +166,7 @@ _nss_nis_getspnam_r (const char *name, struct spwd *sp,
 
   if (name == NULL)
     {
-      __set_errno (EINVAL);
+      *errnop = EINVAL;
       return NSS_STATUS_UNAVAIL;
     }
 
@@ -197,11 +197,12 @@ _nss_nis_getspnam_r (const char *name, struct spwd *sp,
   free (result);
 
   parse_res = _nss_files_parse_spent (p, sp, data, buflen, errnop);
-  if (parse_res == -1)
-    return NSS_STATUS_TRYAGAIN;
-
-  if (parse_res)
-    return NSS_STATUS_SUCCESS;
-  else
-    return NSS_STATUS_NOTFOUND;
+  if (parse_res < 1)
+    {
+      if (parse_res == -1)
+	return NSS_STATUS_TRYAGAIN;
+      else
+	return NSS_STATUS_NOTFOUND;
+    }
+  return NSS_STATUS_SUCCESS;
 }
diff --git a/nis/nss_nisplus/nisplus-alias.c b/nis/nss_nisplus/nisplus-alias.c
index 381ad18228..732c02dbfa 100644
--- a/nis/nss_nisplus/nisplus-alias.c
+++ b/nis/nss_nisplus/nisplus-alias.c
@@ -127,7 +127,7 @@ _nss_nisplus_parse_aliasent (nis_result *result, unsigned long entry,
 	{
 	  /* Skip leading blanks.  */
 	  while (isspace (*line))
-	    line++;
+	    ++line;
 
 	  if (*line == '\0')
 	    break;
@@ -138,12 +138,11 @@ _nss_nisplus_parse_aliasent (nis_result *result, unsigned long entry,
 	  alias->alias_members[alias->alias_members_len] = line;
 
 	  while (*line != '\0' && *line != ',')
-	    line++;
+	    ++line;
 
 	  if (line != alias->alias_members[alias->alias_members_len])
 	    {
-	      *line = '\0';
-	      line++;
+	      *line++ = '\0';
 	      alias->alias_members_len++;
 	    }
 	}
@@ -265,7 +264,12 @@ _nss_nisplus_getaliasbyname_r (const char *name, struct aliasent *alias,
 	return status;
     }
 
-  if (name != NULL || strlen (name) <= 8)
+  if (name != NULL)
+    {
+      *errnop = EINVAL;
+      return NSS_STATUS_UNAVAIL;
+    }
+  else
     {
       nis_result *result;
       char buf[strlen (name) + 30 + tablename_len];
@@ -279,11 +283,13 @@ _nss_nisplus_getaliasbyname_r (const char *name, struct aliasent *alias,
 
       parse_res = _nss_nisplus_parse_aliasent (result, 0, alias,
 					       buffer, buflen, errnop);
-      if (parse_res == -1)
-	return NSS_STATUS_TRYAGAIN;
-
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
+      if (parse_res < 1)
+	{
+	  if (parse_res == -1)
+	    return NSS_STATUS_TRYAGAIN;
+	  else
+	    return NSS_STATUS_NOTFOUND;
+	}
+      return NSS_STATUS_SUCCESS;
     }
-  return NSS_STATUS_NOTFOUND;
 }
diff --git a/nis/nss_nisplus/nisplus-ethers.c b/nis/nss_nisplus/nisplus-ethers.c
index 76805f1403..50f032a289 100644
--- a/nis/nss_nisplus/nisplus-ethers.c
+++ b/nis/nss_nisplus/nisplus-ethers.c
@@ -233,6 +233,11 @@ _nss_nisplus_gethostton_r (const char *name, struct etherent *eth,
 
   if (name != NULL)
     {
+      *errnop = EINVAL;
+      return NSS_STATUS_UNAVAIL;
+    }
+  else
+    {
       nis_result *result;
       char buf[strlen (name) + 40 + tablename_len];
 
@@ -249,17 +254,19 @@ _nss_nisplus_gethostton_r (const char *name, struct etherent *eth,
 
       parse_res = _nss_nisplus_parse_etherent (result, eth, buffer,
 					       buflen, errnop);
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  nis_freeresult (result);
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      nis_freeresult (result);
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	   return NSS_STATUS_NOTFOUND;
 	}
-
-      if (parse_res)
-        return NSS_STATUS_SUCCESS;
+      return NSS_STATUS_SUCCESS;
     }
-  return NSS_STATUS_NOTFOUND;
 }
 
 enum nss_status
@@ -303,15 +310,17 @@ _nss_nisplus_getntohost_r (const struct ether_addr *addr,
 
       parse_res = _nss_nisplus_parse_etherent (result, eth, buffer,
 					       buflen, errnop);
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  nis_freeresult (result);
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      nis_freeresult (result);
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	    return NSS_STATUS_NOTFOUND;
 	}
-
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
+      return NSS_STATUS_SUCCESS;
     }
-  return NSS_STATUS_NOTFOUND;
 }
diff --git a/nis/nss_nisplus/nisplus-grp.c b/nis/nss_nisplus/nisplus-grp.c
index 4ac048ef05..d014c8b119 100644
--- a/nis/nss_nisplus/nisplus-grp.c
+++ b/nis/nss_nisplus/nisplus-grp.c
@@ -171,8 +171,11 @@ _nss_nisplus_getgrnam_r (const char *name, struct group *gr,
 	return status;
     }
 
-  if (name == NULL || strlen (name) > 8)
-    return NSS_STATUS_NOTFOUND;
+  if (name == NULL)
+    {
+      *errnop = EINVAL;
+      return NSS_STATUS_NOTFOUND;
+    }
   else
     {
       nis_result *result;
@@ -193,16 +196,17 @@ _nss_nisplus_getgrnam_r (const char *name, struct group *gr,
       parse_res = _nss_nisplus_parse_grent (result, 0, gr, buffer, buflen,
 					    errnop);
       nis_freeresult (result);
-
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	    return NSS_STATUS_NOTFOUND;
 	}
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
-
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_SUCCESS;
     }
 }
 
@@ -239,16 +243,16 @@ _nss_nisplus_getgrgid_r (const gid_t gid, struct group *gr,
 					  errnop);
 
     nis_freeresult (result);
-
-    if (parse_res == -1)
+    if (parse_res < 1)
       {
-	*errnop = ERANGE;
-	return NSS_STATUS_TRYAGAIN;
+	if (parse_res == -1)
+	  {
+	    *errnop = ERANGE;
+	    return NSS_STATUS_TRYAGAIN;
+	  }
+	else
+	  return NSS_STATUS_NOTFOUND;
       }
-
-    if (parse_res)
-      return NSS_STATUS_SUCCESS;
-
-    return NSS_STATUS_NOTFOUND;
+    return NSS_STATUS_SUCCESS;
   }
 }
diff --git a/nis/nss_nisplus/nisplus-hosts.c b/nis/nss_nisplus/nisplus-hosts.c
index 8514a63e8a..3b022b6df7 100644
--- a/nis/nss_nisplus/nisplus-hosts.c
+++ b/nis/nss_nisplus/nisplus-hosts.c
@@ -285,7 +285,7 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer,
       if (parse_res < 1 && *errnop != ERANGE)
 	parse_res = _nss_nisplus_parse_hostent (result, AF_INET, host,
 						buffer, buflen, errnop);
-      if (parse_res < 1 && *errnop == ERANGE)
+      if (parse_res == -1)
         {
 	  nis_freeresult (result);
 	  result = saved_res;
diff --git a/nis/nss_nisplus/nisplus-proto.c b/nis/nss_nisplus/nisplus-proto.c
index 262276f301..aa2271c385 100644
--- a/nis/nss_nisplus/nisplus-proto.c
+++ b/nis/nss_nisplus/nisplus-proto.c
@@ -323,15 +323,17 @@ _nss_nisplus_getprotobyname_r (const char *name, struct protoent *proto,
 
       nis_freeresult (result);
 
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	    return NSS_STATUS_NOTFOUND;
 	}
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
-
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_SUCCESS;
     }
 }
 
@@ -369,15 +371,16 @@ _nss_nisplus_getprotobynumber_r (const int number, struct protoent *proto,
 
     nis_freeresult (result);
 
-    if (parse_res == -1)
+    if (parse_res < 1)
       {
-	*errnop = ERANGE;
-	return NSS_STATUS_TRYAGAIN;
+	if (parse_res == -1)
+	  {
+	    *errnop = ERANGE;
+	    return NSS_STATUS_TRYAGAIN;
+	  }
+	else
+	  return NSS_STATUS_NOTFOUND;
       }
-
-    if (parse_res)
-      return NSS_STATUS_SUCCESS;
-
-    return NSS_STATUS_NOTFOUND;
+    return NSS_STATUS_SUCCESS;
   }
 }
diff --git a/nis/nss_nisplus/nisplus-publickey.c b/nis/nss_nisplus/nisplus-publickey.c
index 24d217b804..47062b4812 100644
--- a/nis/nss_nisplus/nisplus-publickey.c
+++ b/nis/nss_nisplus/nisplus-publickey.c
@@ -290,8 +290,8 @@ _nss_nisplus_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp,
     return NSS_STATUS_UNAVAIL;
 
   /*
-   *      3.  Use principal name to look up uid/gid information in
-   *      LOCAL entry in **local** cred table.
+   * 3.  Use principal name to look up uid/gid information in
+   *     LOCAL entry in **local** cred table.
    */
   domain = nis_local_directory ();
   if ((strlen (principal) + strlen (domain) + 45) > (size_t) NIS_MAXNAMELEN)
diff --git a/nis/nss_nisplus/nisplus-pwd.c b/nis/nss_nisplus/nisplus-pwd.c
index 18114ad7e5..45c364ac39 100644
--- a/nis/nss_nisplus/nisplus-pwd.c
+++ b/nis/nss_nisplus/nisplus-pwd.c
@@ -179,8 +179,11 @@ _nss_nisplus_getpwnam_r (const char *name, struct passwd *pw,
 	return status;
     }
 
-  if (name == NULL || strlen (name) > 8)
-    return NSS_STATUS_NOTFOUND;
+  if (name == NULL)
+    {
+      *errnop = EINVAL;
+      return NSS_STATUS_UNAVAIL;
+    }
   else
     {
       nis_result *result;
@@ -203,16 +206,17 @@ _nss_nisplus_getpwnam_r (const char *name, struct passwd *pw,
 
       nis_freeresult (result);
 
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	    return NSS_STATUS_NOTFOUND;
 	}
-
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
-
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_SUCCESS;
     }
 }
 
@@ -249,15 +253,16 @@ _nss_nisplus_getpwuid_r (const uid_t uid, struct passwd *pw,
 
     nis_freeresult (result);
 
-    if (parse_res == -1)
+    if (parse_res < 1)
       {
-	*errnop = ERANGE;
-	return NSS_STATUS_TRYAGAIN;
+	if (parse_res == -1)
+	  {
+	    *errnop = ERANGE;
+	    return NSS_STATUS_TRYAGAIN;
+	  }
+	else
+	  return NSS_STATUS_NOTFOUND;
       }
-
-    if (parse_res)
-      return NSS_STATUS_SUCCESS;
-
-    return NSS_STATUS_NOTFOUND;
+    return NSS_STATUS_SUCCESS;
   }
 }
diff --git a/nis/nss_nisplus/nisplus-rpc.c b/nis/nss_nisplus/nisplus-rpc.c
index 452fb4cc5e..105e80241b 100644
--- a/nis/nss_nisplus/nisplus-rpc.c
+++ b/nis/nss_nisplus/nisplus-rpc.c
@@ -320,16 +320,16 @@ _nss_nisplus_getrpcbyname_r (const char *name, struct rpcent *rpc,
 
       nis_freeresult (result);
 
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  return NSS_STATUS_NOTFOUND;
 	}
-
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
-
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_SUCCESS;
     }
 }
 
@@ -367,15 +367,16 @@ _nss_nisplus_getrpcbynumber_r (const int number, struct rpcent *rpc,
 
     nis_freeresult (result);
 
-    if (parse_res == -1)
+    if (parse_res < 1)
       {
-	*errnop = ERANGE;
-	return NSS_STATUS_TRYAGAIN;
+	if (parse_res == -1)
+	  {
+	    *errnop = ERANGE;
+	    return NSS_STATUS_TRYAGAIN;
+	  }
+	else
+	  return NSS_STATUS_NOTFOUND;
       }
-
-    if (parse_res)
-      return NSS_STATUS_SUCCESS;
-
-    return NSS_STATUS_NOTFOUND;
+    return NSS_STATUS_SUCCESS;
   }
 }
diff --git a/nis/nss_nisplus/nisplus-service.c b/nis/nss_nisplus/nisplus-service.c
index 1cb1aec8d7..8f681d3e1c 100644
--- a/nis/nss_nisplus/nisplus-service.c
+++ b/nis/nss_nisplus/nisplus-service.c
@@ -115,7 +115,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv,
     {
       /* Skip leading blanks.  */
       while (isspace (*line))
-        line++;
+        ++line;
 
       if (*line == '\0')
         break;
@@ -332,16 +332,17 @@ _nss_nisplus_getservbyname_r (const char *name, const char *protocol,
 					      errnop);
       nis_freeresult (result);
 
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	    return NSS_STATUS_NOTFOUND;
 	}
-
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
-
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_SUCCESS;
     }
 }
 
@@ -386,15 +387,16 @@ _nss_nisplus_getservbynumber_r (const int number, const char *protocol,
 					      errnop);
       nis_freeresult (result);
 
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	    return NSS_STATUS_NOTFOUND;
 	}
-
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
-
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_SUCCESS;
     }
 }
diff --git a/nis/nss_nisplus/nisplus-spwd.c b/nis/nss_nisplus/nisplus-spwd.c
index 54bbc32f3c..094f56d255 100644
--- a/nis/nss_nisplus/nisplus-spwd.c
+++ b/nis/nss_nisplus/nisplus-spwd.c
@@ -177,8 +177,11 @@ _nss_nisplus_getspnam_r (const char *name, struct spwd *sp,
 	return status;
     }
 
-  if (name == NULL || strlen (name) > 8)
-    return NSS_STATUS_NOTFOUND;
+  if (name == NULL)
+    {
+      *errnop = EINVAL;
+      return NSS_STATUS_NOTFOUND;
+    }
   else
     {
       nis_result *result;
@@ -200,15 +203,16 @@ _nss_nisplus_getspnam_r (const char *name, struct spwd *sp,
 					    errnop);
       nis_freeresult (result);
 
-      if (parse_res == -1)
+      if (parse_res < 1)
 	{
-	  *errnop = ERANGE;
-	  return NSS_STATUS_TRYAGAIN;
+	  if (parse_res == -1)
+	    {
+	      *errnop = ERANGE;
+	      return NSS_STATUS_TRYAGAIN;
+	    }
+	  else
+	    return NSS_STATUS_NOTFOUND;
 	}
-
-      if (parse_res)
-	return NSS_STATUS_SUCCESS;
-
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_SUCCESS;
     }
 }