* nscd/hstcache.c (addhstbyname): Add cast to avoid warning.
[kopensolaris-gnu/glibc.git] / nscd / connections.c
index c0686e8..7ba36bb 100644 (file)
@@ -1,5 +1,5 @@
 /* Inner loops of cache daemon.
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -69,7 +69,7 @@ const char *serv2str[LASTREQ] =
 static struct database dbs[lastdb] =
 {
   [pwddb] = {
-    lock: PTHREAD_RWLOCK_INITIALIZER,
+    lock: PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP,
     enabled: 0,
     check_file: 1,
     filename: "/etc/passwd",
@@ -79,7 +79,7 @@ static struct database dbs[lastdb] =
     negtimeout: 20
   },
   [grpdb] = {
-    lock: PTHREAD_RWLOCK_INITIALIZER,
+    lock: PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP,
     enabled: 0,
     check_file: 1,
     filename: "/etc/group",
@@ -89,7 +89,7 @@ static struct database dbs[lastdb] =
     negtimeout: 60
   },
   [hstdb] = {
-    lock: PTHREAD_RWLOCK_INITIALIZER,
+    lock: PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP,
     enabled: 0,
     check_file: 1,
     filename: "/etc/hosts",
@@ -207,7 +207,8 @@ invalidate_cache (char *key)
     number = hstdb;
   else return;
 
-  prune_cache (&dbs[number], LONG_MAX);
+  if (dbs[number].enabled)
+    prune_cache (&dbs[number], LONG_MAX);
 }
 
 
@@ -244,7 +245,7 @@ cannot handle old request version %d; current version is %d"),
                                  key, buf, sizeof (buf)));
            }
          else
-           dbg_log ("\t%s (%s)", serv2str[req->type], key);
+           dbg_log ("\t%s (%s)", serv2str[req->type], (char *)key);
        }
 
       /* Is this service enabled?  */
@@ -292,7 +293,7 @@ cannot handle old request version %d; current version is %d"),
   else if (debug_level > 0)
     {
       if (req->type == INVALIDATE)
-       dbg_log ("\t%s (%s)", serv2str[req->type], key);
+       dbg_log ("\t%s (%s)", serv2str[req->type], (char *)key);
       else
        dbg_log ("\t%s", serv2str[req->type]);
     }
@@ -350,6 +351,9 @@ cannot handle old request version %d; current version is %d"),
          struct ucred caller;
          socklen_t optlen = sizeof (caller);
 
+         /* Some systems have no SO_PEERCRED implementation.  They don't
+            care about security so we don't as well.  */
+#ifdef SO_PEERCRED
          if (getsockopt (fd, SOL_SOCKET, SO_PEERCRED, &caller, &optlen) < 0)
            {
              char buf[256];
@@ -359,6 +363,7 @@ cannot handle old request version %d; current version is %d"),
            }
          else
            if (caller.uid == 0)
+#endif
              {
                if (req->type == GETSTAT)
                  send_stats (fd, dbs);
@@ -371,7 +376,8 @@ cannot handle old request version %d; current version is %d"),
       break;
 
     default:
-      abort ();
+      /* Ignore the command, it's nothing we know.  */
+      break;
     }
 }
 
@@ -382,7 +388,7 @@ static void *
 __attribute__ ((__noreturn__))
 nscd_run (void *p)
 {
-  long my_number = (long) p;
+  long int my_number = (long int) p;
   struct pollfd conn;
   int run_prune = my_number < lastdb && dbs[my_number].enabled;
   time_t now = time (NULL);
@@ -433,6 +439,9 @@ nscd_run (void *p)
              continue;
            }
 
+         /* Some systems have no SO_PEERCRED implementation.  They don't
+            care about security so we don't as well.  */
+#ifdef SO_PEERCRED
          if (secure_in_use)
            {
              struct ucred caller;
@@ -451,13 +460,14 @@ nscd_run (void *p)
                  || secure[serv2db[req.type]])
                uid = caller.uid;
            }
+#endif
 
          /* It should not be possible to crash the nscd with a silly
-            request (i.e., a terribly large key.  We limit the size
+            request (i.e., a terribly large key).  We limit the size
             to 1kb.  */
          if (req.key_len < 0 || req.key_len > 1024)
            {
-             dbg_log (_("key length in request too long: %Zd"), req.key_len);
+             dbg_log (_("key length in request too long: %zd"), req.key_len);
              close (fd);
              continue;
            }
@@ -496,7 +506,7 @@ nscd_run (void *p)
 void
 start_threads (void)
 {
-  long i;
+  long int i;
   pthread_attr_t attr;
   pthread_t th;