about summary refs log tree commit diff
path: root/nss
diff options
context:
space:
mode:
Diffstat (limited to 'nss')
-rw-r--r--nss/db-Makefile5
-rw-r--r--nss/nss_db/db-XXX.c71
-rw-r--r--nss/nss_db/db-alias.c6
-rw-r--r--nss/nss_files/files-alias.c5
-rw-r--r--nss/nss_files/files-hosts.c6
-rw-r--r--nss/nss_files/files-network.c4
-rw-r--r--nss/nss_files/files-parse.c14
-rw-r--r--nss/nss_files/files-service.c5
8 files changed, 91 insertions, 25 deletions
diff --git a/nss/db-Makefile b/nss/db-Makefile
index c10267c4df..b3f1ed4ad5 100644
--- a/nss/db-Makefile
+++ b/nss/db-Makefile
@@ -1,5 +1,5 @@
 # Makefile to (re-)generate db versions of system database files.
-# 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.
 # Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 #
@@ -34,8 +34,7 @@ $(VAR_DB)/passwd.db: /etc/passwd
 	@$(AWK) 'BEGIN { FS=":"; OFS=":"; cnt=0 } \
 		 { printf "0%u ", cnt++; print } \
 		 /^[^#]/ { printf ".%s ", $$1; print; \
-			   if (!uids[$$3]++) \
-			     { printf "=%s ", $$3; print } }' $^ | \
+			   printf "=%s ", $$3; print }' $^ | \
 	$(MAKEDB) -o $@ -
 	@echo "done."
 
diff --git a/nss/nss_db/db-XXX.c b/nss/nss_db/db-XXX.c
index 4d20cae797..1340b77de0 100644
--- a/nss/nss_db/db-XXX.c
+++ b/nss/nss_db/db-XXX.c
@@ -149,6 +149,7 @@ static enum nss_status
 lookup (const DBT *key, struct STRUCTURE *result,
 	void *buffer, size_t buflen, int *errnop H_ERRNO_PROTO)
 {
+  char *p;
   enum nss_status status;
   int err;
   DBT value;
@@ -156,15 +157,59 @@ lookup (const DBT *key, struct STRUCTURE *result,
   /* Open the database.  */
   status = internal_setent (keep_db);
   if (status != NSS_STATUS_SUCCESS)
-    return status;
+    {
+      *errnop = errno;
+      H_ERRNO_SET (NETDB_INTERNAL);
+      return status;
+    }
 
   /* Succeed iff it matches a value that parses correctly.  */
-  err = ((*db->get) (db, key, &value, 0) == 0 &&
-	 parse_line (value.data, result, buffer, buflen, errnop));
-  if (err == 0)
-    status = NSS_STATUS_SUCCESS;
+  err = (*db->get) (db, key, &value, 0);
+  if (err < 0)
+    {
+      *errnop = errno;
+      H_ERRNO_SET (NETDB_INTERNAL);
+      status = NSS_STATUS_UNAVAIL;
+    }
+  else if (err != 0)
+    {
+      H_ERRNO_SET (HOST_NOT_FOUND);
+      status = NSS_STATUS_NOTFOUND;
+    }
   else
-    status = err < 0 ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND;
+    {
+      /* Skip leading blanks.  */
+      p = (char *) value.data;
+      while (isspace (*p))
+	++p;
+
+      err = parse_line (p, result, buffer, buflen, errnop);
+
+      if (err == 0)
+	{
+	  /* If the key begins with '0' we are trying to get the next
+	     entry.  We want to ignore unparsable lines in this case.  */
+	  if (((char *) key->data)[0] == '0')
+	    {
+	      /* Super magical return value.  We need to tell our caller
+		 that it should continue looping.  This value cannot
+		 happen in other cases.  */
+	      status = NSS_STATUS_RETURN;
+	    }
+	  else
+	    {
+	      H_ERRNO_SET (HOST_NOT_FOUND);
+	      status = NSS_STATUS_NOTFOUND;
+	    }
+	}
+      else if (err < 0)
+	{
+	  H_ERRNO_SET (NETDB_INTERNAL);
+	  status = NSS_STATUS_TRYAGAIN;
+	}
+      else
+	status = NSS_STATUS_SUCCESS;
+    }
 
   if (! keep_db)
     internal_endent ();
@@ -196,7 +241,7 @@ _nss_db_get##name##_r (proto,						      \
 {									      \
   DBT key;								      \
   enum nss_status status;						      \
-  const size_t size = (keysize);					      \
+  const size_t size = (keysize) + 1;					      \
   key.data = __alloca (size);						      \
   key.size = KEYPRINTF keypattern;					      \
   __libc_lock_lock (lock);						      \
@@ -221,8 +266,16 @@ CONCAT(_nss_db_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer,
   DBT key;
 
   __libc_lock_lock (lock);
-  key.size = 1 + snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
-  status = lookup (&key, result, buffer, buflen, errnop H_ERRNO_ARG);
+
+  /* Loop until we find a valid entry or hit EOF.  See above for the
+     special meaning of the status value.  */
+  do
+    {
+      key.size = snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
+      status = lookup (&key, result, buffer, buflen, errnop H_ERRNO_ARG);
+    }
+  while (status == NSS_STATUS_RETURN);
+
   __libc_lock_unlock (lock);
 
   return status;
diff --git a/nss/nss_db/db-alias.c b/nss/nss_db/db-alias.c
index 0e72b92ceb..27b7952b30 100644
--- a/nss/nss_db/db-alias.c
+++ b/nss/nss_db/db-alias.c
@@ -1,5 +1,5 @@
 /* Mail alias file parser in nss_db module.
-   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.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -221,13 +221,13 @@ enum nss_status
 _nss_db_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen,
 		       int *errnop)
 {
-  /* Return next entry in host file.  */
+  /* Return next entry in alias file.  */
   enum nss_status status;
   char buf[20];
   DBT key;
 
   __libc_lock_lock (lock);
-  key.size = 1 + snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
+  key.size = snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
   status = lookup (&key, result, buffer, buflen, errnop);
   __libc_lock_unlock (lock);
 
diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
index 733e599103..84d771d94e 100644
--- a/nss/nss_files/files-alias.c
+++ b/nss/nss_files/files-alias.c
@@ -1,5 +1,5 @@
 /* Mail alias file parser in nss_files module.
-   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.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -200,7 +200,8 @@ get_next_alias (const char *match, struct aliasent *result,
 	     looking for.  If it does not match we simply ignore all
 	     lines until the next line containing the start of a new
 	     alias is found.  */
-	  ignore = match != NULL && strcmp (result->alias_name, match) != 0;
+	  ignore = (match != NULL
+		    && strcasecmp (result->alias_name, match) != 0);
 
 	  while (! ignore)
 	    {
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
index d6c4152507..2379919f49 100644
--- a/nss/nss_files/files-hosts.c
+++ b/nss/nss_files/files-hosts.c
@@ -1,5 +1,5 @@
 /* Hosts file parser in nss_files module.
-   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
@@ -89,14 +89,14 @@ DB_LOOKUP (hostbyname, ,,
 	     if (result->h_addrtype != ((_res.options & RES_USE_INET6)
 					? AF_INET6 : AF_INET))
 	       continue;
-	     LOOKUP_NAME (h_name, h_aliases)
+	     LOOKUP_NAME_CASE (h_name, h_aliases)
 	   }, const char *name)
 
 DB_LOOKUP (hostbyname2, ,,
 	   {
 	     if (result->h_addrtype != af)
 	       continue;
-	     LOOKUP_NAME (h_name, h_aliases)
+	     LOOKUP_NAME_CASE (h_name, h_aliases)
 	   }, const char *name, int af)
 
 DB_LOOKUP (hostbyaddr, ,,
diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
index ac5acd5c4e..8180d46e9d 100644
--- a/nss/nss_files/files-network.c
+++ b/nss/nss_files/files-network.c
@@ -1,5 +1,5 @@
 /* Networks file parser in nss_files module.
-   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
@@ -44,7 +44,7 @@ LINE_PARSER
 #include "files-XXX.c"
 
 DB_LOOKUP (netbyname, ,,
-	   LOOKUP_NAME (n_name, n_aliases),
+	   LOOKUP_NAME_CASE (n_name, n_aliases),
 	   const char *name)
 
 DB_LOOKUP (netbyaddr, ,,
diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
index 76df1c6ff0..198b359b4c 100644
--- a/nss/nss_files/files-parse.c
+++ b/nss/nss_files/files-parse.c
@@ -1,5 +1,5 @@
 /* Common code for file-based database parsers in nss_files module.
-   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
@@ -232,6 +232,18 @@ parse_list (char *line, struct parser_data *data, size_t datalen, int *errnop)
     break;								      \
 }
 
+#define LOOKUP_NAME_CASE(nameelt, aliaselt)				      \
+{									      \
+  char **ap;								      \
+  if (! strcasecmp (name, result->nameelt))				      \
+    break;								      \
+  for (ap = result->aliaselt; *ap; ++ap)				      \
+    if (! strcasecmp (name, *ap))					      \
+      break;								      \
+  if (*ap)								      \
+    break;								      \
+}
+
 
 /* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead.  */
 #ifndef GENERIC
diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c
index 317b4fa9cc..186b8a27fc 100644
--- a/nss/nss_files/files-service.c
+++ b/nss/nss_files/files-service.c
@@ -39,7 +39,8 @@ LINE_PARSER
 
 #include GENERIC
 
-DB_LOOKUP (servbyname, 1 + strlen (name), (".%s/%s", name, proto),
+DB_LOOKUP (servbyname, 2 + strlen (name) + strlen (proto),
+	   (".%s/%s", name, proto),
 	   {
 	     /* Must match both protocol (if specified) and name.  */
 	     if (proto != NULL && strcmp (result->s_proto, proto))
@@ -48,7 +49,7 @@ DB_LOOKUP (servbyname, 1 + strlen (name), (".%s/%s", name, proto),
 	   },
 	   const char *name, const char *proto)
 
-DB_LOOKUP (servbyport, 20, ("=%d/%s", port, proto),
+DB_LOOKUP (servbyport, 21 + strlen (proto), ("=%d/%s", port, proto),
 	   {
 	     /* Must match both port and protocol.  */
 	     if (result->s_port == port