if (selinux_enabled) nscd_avc_print_stats (&data.cstats);
receive_print_stats (void){  struct statdata data;  request_header req;  ssize_t nbytes;  int fd;  int i;  uid_t uid = getuid ();  /* Find out whether there is another user but root allowed to     request statistics.  */  if (uid != 0)    {      /* User specified?  */      if(stat_user == NULL || stat_uid != uid)	{	  if (stat_user != NULL)	    error (EXIT_FAILURE, 0,		   _("Only root or %s is allowed to use this option!"),		   stat_user);	  else	    error (EXIT_FAILURE, 0,		   _("Only root is allowed to use this option!"));	}    }  /* 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 = TEMP_FAILURE_RETRY (write (fd, &req, sizeof (request_header)));  if (nbytes != sizeof (request_header))    {      int err = errno;      close (fd);      error (EXIT_FAILURE, err, _("write incomplete"));    }  /* 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)))    {      /* Not the right version.  */      int err = errno;      close (fd);      error (EXIT_FAILURE, err, _("cannot read statistics data"));    }  printf (_("nscd configuration:\n\n%15d  server debug level\n"),	  data.debug_level);  /* We know that we can simply subtract time_t values.  */  unsigned long int diff = data.runtime;  unsigned int ndays = 0;  unsigned int nhours = 0;  unsigned int nmins = 0;  if (diff > 24 * 60 * 60)    {      ndays = diff / (24 * 60 * 60);      diff %= 24 * 60 * 60;    }  if (diff > 60 * 60)    {      nhours = diff / (60 * 60);      diff %= 60 * 60;    }  if (diff > 60)    {      nmins = diff / 60;      diff %= 60;    }  if (ndays != 0)    printf (_("%3ud %2uh %2um %2lus  server runtime\n"),	    ndays, nhours, nmins, diff);  else if (nhours != 0)    printf (_("    %2uh %2um %2lus  server runtime\n"), nhours, nmins, diff);  else if (nmins != 0)    printf (_("        %2um %2lus  server runtime\n"), nmins, diff);  else    printf (_("            %2lus  server runtime\n"), diff);  printf (_("%15lu  number of times clients had to wait\n"),	  data.client_queued);  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);      const char *shared = nl_langinfo (data.dbs[i].shared ? YESSTR : NOSTR);      const char *persistent = nl_langinfo (data.dbs[i].persistent					    ? 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 (shared[0] == '\0')	shared = data.dbs[i].shared ? _("     yes") : _("      no");      if (persistent[0] == '\0')	persistent = data.dbs[i].persistent ? _("     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"		"%15s  cache is persistent\n"		"%15s  cache is shared\n"		"%15zu  suggested size\n"		"%15zu  total data pool size\n"		"%15zu  used data pool size\n"		"%15lu  seconds time to live for positive entries\n"		"%15lu  seconds time to live for negative entries\n"		"%15" PRIuMAX "  cache hits on positive entries\n"		"%15" PRIuMAX "  cache hits on negative entries\n"		"%15" PRIuMAX "  cache misses on positive entries\n"		"%15" PRIuMAX "  cache misses on negative entries\n"		"%15lu%% cache hit rate\n"		"%15zu  current number of cached values\n"		"%15zu  maximum number of cached values\n"		"%15zu  maximum chain length searched\n"		"%15" PRIuMAX "  number of delays on rdlock\n"		"%15" PRIuMAX "  number of delays on wrlock\n"		"%15" PRIuMAX "  memory allocations failed\n"		"%15s  check /etc/%s for changes\n"),	      dbnames[i], enabled, persistent, shared,	      data.dbs[i].module,	      data.dbs[i].datasize, data.dbs[i].dataused,	      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,	      data.dbs[i].nentries, data.dbs[i].maxnentries,	      data.dbs[i].maxnsearched,	      data.dbs[i].rdlockdelayed,	      data.dbs[i].wrlockdelayed,	      data.dbs[i].addfailed, check_file, dbnames[i]);    }  close (fd);  exit (0);}