about summary refs log tree commit diff
path: root/nscd/nscd_stat.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-10-18 15:16:22 +0000
committerUlrich Drepper <drepper@redhat.com>1998-10-18 15:16:22 +0000
commit67479a700e3bd2e52980c00ac35c888589ac0a36 (patch)
tree2a13dea0fbd27ba19d0b19d5849699128d495806 /nscd/nscd_stat.c
parent6cde0c6047769a661b8cf7e4f93842914a4bb54f (diff)
downloadglibc-67479a700e3bd2e52980c00ac35c888589ac0a36.tar.gz
glibc-67479a700e3bd2e52980c00ac35c888589ac0a36.tar.xz
glibc-67479a700e3bd2e52980c00ac35c888589ac0a36.zip
Update.
1998-10-18  Ulrich Drepper  <drepper@cygnus.com>

	* resolv/nss_dns/dns-host.c: Add missing errnop parameter to the
	NSS functions.
	* resolv/nss_dns/dns-network.c: Likewise.

	* grp/Makefile: Don't search for linuxhtreads in add-ons, use
	have-thread-library to determine whether threads are available.
	* pwd/Makefile: Remove wrong comment.

	* inet/Makefile: Define CFLAGS-gethstbyad_r.c, CFLAGS-gethstbynm_r.c,
	and CFLAGS-gethstbynm2_r.c to -DUSE_NSCD=1.

	* locale/C-messages.c: Define default strings for YESTR and NOSTR.

	* nss/Versions: Add __nss_hosts_lookup.

	* nss/getXXbyYY.c: Remove unneeded assignment.

	* nss/getXXbyYY_r.c: Include nscd/nscd_proto.h only if needed.

	Almost complete rewrite of the NSCD to make it smaller, faster,
	add more functionnality and make it easier to extend.
	* nscd/Makfile (routines): Add nscd_gethst_r.
	(nscd-modules): Add hstcache, gethstbyad_r, gethstbynm2_r, and cache.
	* nscd/cache.c: New file.
	* nscd/gethstbyad_r.c: New file.
	* nscd/gethstbynm2_r.c: New file.
	* nscd/hstcache.c: New file.
	* nscd/nscd_gethst_r.c: New file.
	* nscd/connections.c: Rewritten.  Don't start new thread for every
	new connection.  Use a fixed set of threads which handle all
	connections and also the cache cleanup.
	* nscd/grpcache.c: Rewritten to use generic cache handling functions
	in cache.c.
	* nscd/nscd.c: Recognize new parameter nthreads.  Adjust initialization
	for rewrite.  Remove handle_requests function.
	* nscd/nscd.h (NSCD_VERSION): Bump to 2.
	Define new data structure for the new unified cache and the host
	database entries.
	* nscd/nscd_conf.c: Rewrite parsing partly to allow adding of more
	databases easily.  Recognize check-files and threads definitions.
	* nscd/nscd.conf: Add definition of enable-cache and check-files to
	passwd and group definitions.  Add new set of definitions for hosts.
	* nscd/nscd_getgr_r.c: Rewrite for new protocol.
	* nscd/nscd_getpw_r.c: Likewise.
	* nscd/nscd_proto.h: Add prototype for host database functions.
	* nscd/nscd_stat.c: Rewrite to simplify printing of information
	for many databases.
	* nscd/dbg_log.c: Remove unnecessary variable initializations.
	Global variable debug_flag is renamed to dbg_level.
	* nscd/dbg_log.h: Declare set_logfile.
Diffstat (limited to 'nscd/nscd_stat.c')
-rw-r--r--nscd/nscd_stat.c181
1 files changed, 135 insertions, 46 deletions
diff --git a/nscd/nscd_stat.c b/nscd/nscd_stat.c
index d8182885ac..f9d21aeb01 100644
--- a/nscd/nscd_stat.c
+++ b/nscd/nscd_stat.c
@@ -17,71 +17,160 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA. */
 
+#include <errno.h>
+#include <error.h>
+#include <langinfo.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
-#include <sys/types.h>
+
 #include "nscd.h"
+#include "dbg_log.h"
+
+/* We use this to make sure the receiver is the same.  */
+static const char compilation[21] = __DATE__ " " __TIME__;
+
+/* Statistic data for one database.  */
+struct dbstat
+{
+  int enabled;
+  int check_file;
+  size_t module;
+
+  unsigned long int postimeout;
+  unsigned long int negtimeout;
+
+  unsigned long int poshit;
+  unsigned long int neghit;
+  unsigned long int posmiss;
+  unsigned long int negmiss;
+};
+
+/* Record for transmitting statistics.  */
+struct statdata
+{
+  char version[sizeof (compilation)];
+  int debug_level;
+  int ndbs;
+  struct dbstat dbs[lastdb];
+};
+
 
 void
-print_stat (void)
+send_stats (int fd, struct database dbs[lastdb])
 {
-  int sock = __nscd_open_socket ();
-  request_header req;
-  stat_response_header resp;
-  ssize_t nbytes;
+  struct statdata data;
+  int cnt;
+
+  memcpy (data.version, compilation, sizeof (compilation));
+  data.debug_level = debug_level;
+  data.ndbs = lastdb;
+
+  for (cnt = 0; cnt < lastdb; ++cnt)
+    {
+      data.dbs[cnt].enabled = dbs[cnt].enabled;
+      data.dbs[cnt].check_file = dbs[cnt].check_file;
+      data.dbs[cnt].module = dbs[cnt].module;
+      data.dbs[cnt].postimeout = dbs[cnt].postimeout;
+      data.dbs[cnt].negtimeout = dbs[cnt].negtimeout;
+      data.dbs[cnt].poshit = dbs[cnt].poshit;
+      data.dbs[cnt].neghit = dbs[cnt].neghit;
+      data.dbs[cnt].posmiss = dbs[cnt].posmiss;
+      data.dbs[cnt].negmiss = dbs[cnt].negmiss;
+    }
 
-  if (sock == -1)
+  if (TEMP_FAILURE_RETRY (write (fd, &data, sizeof (data))) != sizeof (data))
     {
-      fputs (_("nscd not running!\n"), stdout);
-      exit (EXIT_FAILURE);
+      char buf[256];
+      dbg_log (_("cannot write statistics: %s"),
+	       strerror_r (errno, buf, sizeof (buf)));
     }
+}
+
+
+int
+receive_print_stats (void)
+{
+  struct statdata data;
+  request_header req;
+  ssize_t nbytes;
+  int fd;
+  int i;
 
+  /* Open a socket to the running nscd.  */
+  fd = nscd_open_socket ();
+  if (fd == -1)
+    error (EXIT_FAILURE, 0, _("nscd not running!\n"));
+
+  /* Send the request.  */
   req.version = NSCD_VERSION;
   req.type = GETSTAT;
   req.key_len = 0;
-  nbytes = write (sock, &req, sizeof (request_header));
+  nbytes = TEMP_FAILURE_RETRY (write (fd, &req, sizeof (request_header)));
   if (nbytes != sizeof (request_header))
     {
-      perror (_("write incomplete"));
-      close (sock);
-      exit (EXIT_FAILURE);
+      int err = errno;
+      close (fd);
+      error (EXIT_FAILURE, err, _("write incomplete"));
     }
 
-  nbytes = read (sock, &resp, sizeof (stat_response_header));
-  if (nbytes != sizeof (stat_response_header))
+  /* Read as much data as we expect.  */
+  if (TEMP_FAILURE_RETRY (read (fd, &data, sizeof (data))) != sizeof (data)
+      || (memcmp (data.version, compilation, sizeof (compilation)) != 0
+	  /* Yes, this is an assignment!  */
+	  && errno == EINVAL))
     {
-      perror (_("read incomplete"));
-      close (sock);
-      exit (EXIT_FAILURE);
+      /* Not the right version.  */
+      int err = errno;
+      close (fd);
+      error (EXIT_FAILURE, err, _("cannot read statistics data"));
     }
 
-  close (sock);
-
-  printf (_("nscd configuration:\n\n"));
-  printf (_("%12d  server debug level\n\n"), resp.debug_level);
-
-  printf (_("passwd cache:\n\n"));
-  printf (_("%12s  cache is enabled\n"), resp.pw_enabled ? _("Yes") : _("No"));
-  printf (_("%12ld  cache hits on positive entries\n"), resp.pw_poshit);
-  printf (_("%12ld  cache hits on negative entries\n"), resp.pw_neghit);
-  printf (_("%12ld  cache misses on positive entries\n"), resp.pw_posmiss);
-  printf (_("%12ld  cache misses on negative entries\n"), resp.pw_negmiss);
-  printf (_("%12ld  suggested size\n"), resp.pw_size);
-  printf (_("%12ld  seconds time to live for positive entries\n"),
-	  resp.pw_posttl);
-  printf (_("%12ld  seconds time to live for negative entries\n\n"),
-	  resp.pw_negttl);
-
-  printf (_("group cache:\n\n"));
-  printf (_("%12s  cache is enabled\n"), resp.gr_enabled ? _("Yes") : _("No"));
-  printf (_("%12ld  cache hits on positive entries\n"), resp.gr_poshit);
-  printf (_("%12ld  cache hits on negative entries\n"), resp.gr_neghit);
-  printf (_("%12ld  cache misses on positive entries\n"), resp.gr_posmiss);
-  printf (_("%12ld  cache misses on negative entries\n"), resp.gr_negmiss);
-  printf (_("%12ld  suggested size\n"), resp.gr_size);
-  printf (_("%12ld  seconds time to live for positive entries\n"),
-	  resp.gr_posttl);
-  printf (_("%12ld  seconds time to live for negative entries\n"),
-	  resp.gr_negttl);
+  printf (_("nscd configuration:\n\n%15d  server debug level\n"),
+	  data.debug_level);
+
+  for (i = 0; i < lastdb; ++i)
+    {
+      unsigned long int hit = data.dbs[i].poshit + data.dbs[i].neghit;
+      unsigned long int all = hit + data.dbs[i].posmiss + data.dbs[i].negmiss;
+      const char *enabled = nl_langinfo (data.dbs[i].enabled ? YESSTR : NOSTR);
+      const char *check_file = nl_langinfo (data.dbs[i].check_file
+					    ? YESSTR : NOSTR);
+
+      if (enabled[0] == '\0')
+	/* The locale does not provide this information so we have to
+	   translate it ourself.  Since we should avoid short translation
+	   terms we artifically increase the length.  */
+	enabled = data.dbs[i].enabled ? _("     yes") : _("      no");
+      if (check_file[0] == '\0')
+	check_file = data.dbs[i].check_file ? _("     yes") : _("      no");
+
+      if (all == 0)
+	/* If nothing happened so far report a 0% hit rate.  */
+	all = 1;
+
+      printf (_("\n%s cache:\n\n"
+		"%15s  cache is enabled\n"
+		"%15Zd  suggested size\n"
+		"%15ld  seconds time to live for positive entries\n"
+		"%15ld  seconds time to live for negative entries\n"
+		"%15ld  cache hits on positive entries\n"
+		"%15ld  cache hits on negative entries\n"
+		"%15ld  cache misses on positive entries\n"
+		"%15ld  cache misses on negative entries\n"
+		"%15ld%% cache hit rate\n"
+		"%15s  check /etc/%s for changes\n"),
+	      dbnames[i], enabled,
+	      data.dbs[i].module,
+	      data.dbs[i].postimeout, data.dbs[i].negtimeout,
+	      data.dbs[i].poshit, data.dbs[i].neghit,
+	      data.dbs[i].posmiss, data.dbs[i].negmiss,
+	      (100 * hit) / all,
+	      check_file, dbnames[i]);
+    }
+
+  close (fd);
+
+  exit (0);
 }