about summary refs log tree commit diff
path: root/nscd/nscd.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-05-30 17:32:08 +0000
committerUlrich Drepper <drepper@redhat.com>2006-05-30 17:32:08 +0000
commit902c429174f9660eaeb255695f8f335afbfdc54a (patch)
tree2cd188cbcdfd3b82be6aa3187b7755c12b607654 /nscd/nscd.c
parentecc685684824cdbb971438ed944794d4bff4547d (diff)
downloadglibc-902c429174f9660eaeb255695f8f335afbfdc54a.tar.gz
glibc-902c429174f9660eaeb255695f8f335afbfdc54a.tar.xz
glibc-902c429174f9660eaeb255695f8f335afbfdc54a.zip
* nscd/nscd.h (prune_cache): Add fd argument to prototype. cvs/fedora-glibc-20060531T1322
	* nscd/nscd.c (parse_opt): Read response from INVALIDATE request
	to make sure the database has been already invalidated.
	* nscd/cache.c (prune_cache): Add fd argument.  Write response to fd
	after the cache has been invalidated.  Use pthread_mutex_lock rather
	than pthread_mutex_trylock if fd != -1.
	* nscd/connections.c (invalidate_cache): Add fd argument, write
	response to fd if not calling prune_cache, pass fd to prune_cache.
	(handle_request): Adjust invalidate_cache caller.
	(nscd_run): Pass -1 as fd to prune_cache.
Diffstat (limited to 'nscd/nscd.c')
-rw-r--r--nscd/nscd.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/nscd/nscd.c b/nscd/nscd.c
index 16f55cfdeb..6d1e50a837 100644
--- a/nscd/nscd.c
+++ b/nscd/nscd.c
@@ -332,9 +332,6 @@ parse_opt (int key, char *arg, struct argp_state *state)
 	    exit (EXIT_FAILURE);
 
 	  request_header req;
-	  ssize_t nbytes;
-	  struct iovec iov[2];
-
 	  if (strcmp (arg, "passwd") == 0)
 	    req.key_len = sizeof "passwd";
 	  else if (strcmp (arg, "group") == 0)
@@ -347,17 +344,38 @@ parse_opt (int key, char *arg, struct argp_state *state)
 	  req.version = NSCD_VERSION;
 	  req.type = INVALIDATE;
 
+	  struct iovec iov[2];
 	  iov[0].iov_base = &req;
 	  iov[0].iov_len = sizeof (req);
 	  iov[1].iov_base = arg;
 	  iov[1].iov_len = req.key_len;
 
-	  nbytes = TEMP_FAILURE_RETRY (writev (sock, iov, 2));
+	  ssize_t nbytes = TEMP_FAILURE_RETRY (writev (sock, iov, 2));
+
+	  if (nbytes != iov[0].iov_len + iov[1].iov_len)
+	    {
+	      int err = errno;
+	      close (sock);
+	      error (EXIT_FAILURE, err, _("write incomplete"));
+	    }
+
+	  /* Wait for ack.  Older nscd just closed the socket when
+	     prune_cache finished, silently ignore that.  */
+	  int32_t resp = 0;
+	  nbytes = TEMP_FAILURE_RETRY (read (sock, &resp, sizeof (resp)));
+	  if (nbytes != 0 && nbytes != sizeof (resp))
+	    {
+	      int err = errno;
+	      close (sock);
+	      error (EXIT_FAILURE, err, _("cannot read invalidate ACK"));
+	    }
 
 	  close (sock);
 
-	  exit (nbytes != iov[0].iov_len + iov[1].iov_len
-		? EXIT_FAILURE : EXIT_SUCCESS);
+	  if (resp != 0)
+	    error (EXIT_FAILURE, resp, _("invalidation failed"));
+
+	  exit (0);
 	}
 
     case 't':