about summary refs log tree commit diff
path: root/nscd/hstcache.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-09-08 15:46:42 +0000
committerUlrich Drepper <drepper@redhat.com>2004-09-08 15:46:42 +0000
commitc207f23b0b6b2d215be65e670d453768ad304247 (patch)
tree5d10943ec51bbda849db9ca2fdcc7b43feb2011c /nscd/hstcache.c
parent0a3ad40da92c0036bd3bd87949f7d7d9864c31c7 (diff)
downloadglibc-c207f23b0b6b2d215be65e670d453768ad304247.tar.gz
glibc-c207f23b0b6b2d215be65e670d453768ad304247.tar.xz
glibc-c207f23b0b6b2d215be65e670d453768ad304247.zip
Update.
	* nscd/connections.c: Implement r/o sharing of nscd's cache with client
	processes via shared memory.
	* nscd/nscd-client.h: Likewise.
	* nscd/nscd.h: Likewise.
	* nscd/nscd_conf.c: Likewise.
	* nscd/nscd_getgr_r.c: Likewise.
	* nscd/nscd_getpw_r.c: Likewise.
	* nscd/nscd_gethst_r.c: Likewise.
	* nscd/nscd.conf: Add new config parameters.
	* nscd/Makefile (aux): Add nscd_helper.
	* nscd/nscd_helper.c: New file.
	* nscd/mem.c (gc): Indicate beginning and end of the gc cycle.

	* nscd/hstcache.c: Simplify a lot.  We cache only the request itself,
	no derived information.
	* connections.c (nscd_init): Fix bug in testing size of the persistent.

	* nis/Makefile (aux): Add nis_hash.
	* nis/nis_hash.c: New file.  Split out from nis_util.c.
	* nis/nis_util.c: Move __nis_hash code in separate file.

	* csu/tst-atomic.c: Improve atomic_increment_val test which would
	not have found a ppc bug.
Diffstat (limited to 'nscd/hstcache.c')
-rw-r--r--nscd/hstcache.c163
1 files changed, 24 insertions, 139 deletions
diff --git a/nscd/hstcache.c b/nscd/hstcache.c
index 5a536b3346..94568d0d2b 100644
--- a/nscd/hstcache.c
+++ b/nscd/hstcache.c
@@ -77,7 +77,7 @@ static const hst_response_header notfound =
 
 static void
 cache_addhst (struct database_dyn *db, int fd, request_header *req,
-	      const void *key, struct hostent *hst, uid_t owner, int add_addr,
+	      const void *key, struct hostent *hst, uid_t owner,
 	      struct hashentry *he, struct datahead *dh, int errval)
 {
   ssize_t total;
@@ -208,7 +208,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
 	 the current cache handling cannot handle and it is more than
 	 questionable whether it is worthwhile complicating the cache
 	 handling just for handling such a special case. */
-      if (he == NULL && (add_addr || hst->h_addr_list[1] == NULL))
+      if (he == NULL && hst->h_addr_list[1] == NULL)
 	{
 	  dataset = (struct dataset *) mempool_alloc (db,
 						      total + req->key_len);
@@ -269,10 +269,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
 	 itself.  This is the case if the resolver is used and the name
 	 is extended by the domainnames from /etc/resolv.conf.  Therefore
 	 we explicitly add the name here.  */
-      if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6)
-	key_copy = memcpy (cp, key, req->key_len);
-      else
-	memset (cp, '\0', req->key_len);
+      key_copy = memcpy (cp, key, req->key_len);
 
       /* Now we can determine whether on refill we have to create a new
 	 record or not.  */
@@ -349,141 +346,21 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
 	     problem is that we always must add the hash table entry
 	     with the FIRST flag set first.  Otherwise we get dangling
 	     pointers in case memory allocation fails.  */
-	  assert (add_addr || hst->h_addr_list[1] == NULL);
-
-	  /* Add the normal addresses.  */
-	  if (add_addr)
-	    {
-	      for (cnt = 0; cnt < h_addr_list_cnt; ++cnt)
-		{
-		  if (cache_add (addr_list_type, addresses, hst->h_length,
-				 &dataset->head, cnt == 0, db, owner) < 0)
-		    {
-		      /* Ensure the data can be recovered.  */
-		      if (cnt == 0)
-			dataset->head.usable = false;
-		      goto out;
-		    }
-		  addresses += hst->h_length;
-		}
-
-	      /* If necessary the IPv6 addresses.  */
-	      if (addr_list_type == GETHOSTBYADDR)
-		for (cnt = 0; cnt < h_addr_list_cnt; ++cnt)
-		  {
-		    if (cache_add (GETHOSTBYADDRv6, addresses, IN6ADDRSZ,
-				   &dataset->head, false, db, owner) < 0)
-		      goto out;
+	  assert (hst->h_addr_list[1] == NULL);
 
-		    addresses += IN6ADDRSZ;
-		  }
-	    }
 	  /* Avoid adding names if more than one address is available.  See
 	     above for more info.  */
-	  else
-	    {
-	      assert (req->type == GETHOSTBYNAME
-		      || req->type == GETHOSTBYNAMEv6
-		      || req->type == GETHOSTBYADDR
-		      || req->type == GETHOSTBYADDRv6);
-
-	      /* If necessary add the key for this request.  */
-	      if (req->type == GETHOSTBYNAME)
-		{
-		  bool first = true;
-		  if (addr_list_type == GETHOSTBYADDR)
-		    {
-		      if (cache_add (GETHOSTBYNAME, key_copy, req->key_len,
-				     &dataset->head, true, db, owner) < 0)
-			{
-			  /* Could not allocate memory.  Make sure the
-			     data gets discarded.  */
-			  dataset->head.usable = false;
-			  goto out;
-			}
-
-		      first = false;
-		    }
-		  if (cache_add (GETHOSTBYNAMEv6, key_copy, req->key_len,
-				 &dataset->head, first, db, owner) < 0)
-		    {
-		      /* Could not allocate memory.  Make sure the
-			 data gets discarded.  */
-		      if (first)
-			dataset->head.usable = false;
-		      goto out;
-		    }
-		}
-	      else if (req->type == GETHOSTBYNAMEv6)
-		{
-		  if (cache_add (GETHOSTBYNAMEv6, key_copy, req->key_len,
-				 &dataset->head, true, db, owner) < 0)
-		    {
-		      /* Could not allocate memory.  Make sure the
-			 data gets discarded.  */
-		      dataset->head.usable = false;
-		      goto out;
-		    }
-
-		  if (addr_list_type == GETHOSTBYADDR
-		      && cache_add (GETHOSTBYNAME, key_copy, req->key_len,
-				    &dataset->head, false, db, owner) < 0)
-		    goto out;
-		}
-
-	      /* And finally the name.  We mark this as the last entry.  */
-	      if (addr_list_type == GETHOSTBYADDR
-		  && req->type == GETHOSTBYADDR
-		  && cache_add (GETHOSTBYNAME, dataset->strdata, h_name_len,
-				&dataset->head, true, db, owner) < 0)
-		{
-		  /* Could not allocate memory.  Make sure the
-		     data gets discarded.  */
-		  dataset->head.usable = false;
-		  goto out;
-		}
-
-	      if (cache_add (GETHOSTBYNAMEv6, dataset->strdata,
-			     h_name_len, &dataset->head,
-			     ((req->type == GETHOSTBYADDR
-			       && addr_list_type != GETHOSTBYADDR)
-			      || req->type == GETHOSTBYADDRv6), db,
-			     owner) < 0)
-		{
-		  /* Could not allocate memory.  Make sure the
-		     data gets discarded.  */
-		  if ((req->type == GETHOSTBYADDR
-		       && addr_list_type != GETHOSTBYADDR)
-		      || req->type == GETHOSTBYADDRv6)
-		    dataset->head.usable = false;
-		  goto out;
-		}
+	  assert (req->type == GETHOSTBYNAME
+		  || req->type == GETHOSTBYNAMEv6
+		  || req->type == GETHOSTBYADDR
+		  || req->type == GETHOSTBYADDRv6);
 
-	      if (addr_list_type == GETHOSTBYADDR
-		  && req->type != GETHOSTBYADDR
-		  && cache_add (GETHOSTBYNAME, dataset->strdata, h_name_len,
-				&dataset->head, false, db, owner) < 0)
-		goto out;
+	  if (cache_add (req->type, key_copy, req->key_len,
+			 &dataset->head, true, db, owner) < 0)
+	    /* Could not allocate memory.  Make sure the
+	       data gets discarded.  */
+	    dataset->head.usable = false;
 
-	      /* First add all the aliases.  */
-	      for (cnt = 0; cnt < h_aliases_cnt; ++cnt)
-		{
-		  if (addr_list_type == GETHOSTBYADDR)
-		    if (cache_add (GETHOSTBYNAME, aliases,
-				   h_aliases_len[cnt], &dataset->head,
-				   false, db, owner) < 0)
-		      break;
-
-		  if (cache_add (GETHOSTBYNAMEv6, aliases,
-				 h_aliases_len[cnt], &dataset->head,
-				 false, db, owner) < 0)
-		    break;
-
-		  aliases += h_aliases_len[cnt];
-		}
-	    }
-
-	out:
 	  pthread_rwlock_unlock (&db->lock);
 	}
     }
@@ -534,10 +411,18 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
 
   if (__builtin_expect (debug_level > 0, 0))
     {
+      const char *str;
+      char buf[INET6_ADDRSTRLEN + 1];
+      if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6)
+	str = key;
+      else
+	str = inet_ntop (req->type == GETHOSTBYADDR ? AF_INET : AF_INET6,
+			 key, buf, sizeof (buf));
+
       if (he == NULL)
-	dbg_log (_("Haven't found \"%s\" in hosts cache!"), (char *) key);
+	dbg_log (_("Haven't found \"%s\" in hosts cache!"), (char *) str);
       else
-	dbg_log (_("Reloading \"%s\" in hosts cache!"), (char *) key);
+	dbg_log (_("Reloading \"%s\" in hosts cache!"), (char *) str);
     }
 
   if (db->secure)
@@ -583,7 +468,7 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
   if (db->secure)
     seteuid (oldeuid);
 
-  cache_addhst (db, fd, req, key, hst, uid, 0, he, dh,
+  cache_addhst (db, fd, req, key, hst, uid, he, dh,
 		h_errno == TRY_AGAIN ? errval : 0);
 
   if (use_malloc)