Change log directory to /var/log (FHS).
[kopensolaris-gnu/glibc.git] / nscd / hstcache.c
index 4e3af9c..b8a80af 100644 (file)
@@ -1,5 +1,5 @@
 /* Cache handling for host lookup.
-   Copyright (C) 1998 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -28,6 +28,7 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
+#include <libintl.h>
 #include <arpa/inet.h>
 
 #include "nscd.h"
@@ -88,7 +89,7 @@ struct hostdata
 
 static void
 cache_addhst (struct database *db, int fd, request_header *req, void *key,
-             struct hostent *hst)
+             struct hostent *hst, uid_t owner)
 {
   ssize_t total;
   ssize_t written;
@@ -115,8 +116,8 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
       /* Now get the lock to safely insert the records.  */
       pthread_rwlock_rdlock (&db->lock);
 
-      cache_add (req->type, copy, req->key_len, &iov_notfound,
-                sizeof (notfound), (void *) -1, 0, t, db);
+      cache_add (req->type, copy, req->key_len, &notfound,
+                sizeof (notfound), (void *) -1, 0, t, db, owner);
 
       pthread_rwlock_unlock (&db->lock);
     }
@@ -227,10 +228,10 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
        {
          if (addr_list_type == GETHOSTBYADDR)
            cache_add (GETHOSTBYNAME, aliases, h_aliases_len[cnt], data, total,
-                      data, 0, t, db);
+                      data, 0, t, db, owner);
 
          cache_add (GETHOSTBYNAMEv6, aliases, h_aliases_len[cnt], data, total,
-                    data, 0, t, db);
+                    data, 0, t, db, owner);
 
          aliases += h_aliases_len[cnt];
        }
@@ -239,7 +240,7 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
       for (cnt = 0; cnt < h_addr_list_cnt; ++cnt)
        {
          cache_add (addr_list_type, addresses, hst->h_length, data, total,
-                    data, 0, t, db);
+                    data, 0, t, db, owner);
          addresses += hst->h_length;
        }
 
@@ -248,7 +249,7 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
        for (cnt = 0; cnt < h_addr_list_cnt; ++cnt)
          {
            cache_add (GETHOSTBYADDRv6, addresses, IN6ADDRSZ, data, total,
-                      data, 0, t, db);
+                      data, 0, t, db, owner);
            addresses += IN6ADDRSZ;
          }
 
@@ -257,17 +258,17 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
        {
          if (addr_list_type == GETHOSTBYADDR)
            cache_add (GETHOSTBYNAME, key_copy, req->key_len, data, total,
-                      data, 0, t, db);
+                      data, 0, t, db, owner);
          cache_add (GETHOSTBYNAMEv6, key_copy, req->key_len, data,
-                    total, data, 0, t, db);
+                    total, data, 0, t, db, owner);
        }
 
       /* And finally the name.  We mark this as the last entry.  */
       if (addr_list_type == GETHOSTBYADDR)
        cache_add (GETHOSTBYNAME, data->strdata, h_name_len, data, total, data,
-                  0, t, db);
+                  0, t, db, owner);
       cache_add (GETHOSTBYNAMEv6, data->strdata, h_name_len, data,
-                total, data, 1, t, db);
+                total, data, 1, t, db, owner);
 
       pthread_rwlock_unlock (&db->lock);
     }
@@ -282,7 +283,8 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
 
 
 void
-addhstbyname (struct database *db, int fd, request_header *req, void *key)
+addhstbyname (struct database *db, int fd, request_header *req,
+             void *key, uid_t uid)
 {
   /* Search for the entry matching the key.  Please note that we don't
      look again in the table whether the dataset is now available.  We
@@ -292,12 +294,19 @@ addhstbyname (struct database *db, int fd, request_header *req, void *key)
   char *buffer = alloca (buflen);
   struct hostent resultbuf;
   struct hostent *hst;
+  uid_t oldeuid = 0;
 
   if (debug_level > 0)
     dbg_log (_("Haven't found \"%s\" in hosts cache!"), key);
 
-  while (gethostbyname2_r (key, AF_INET, &resultbuf, buffer, buflen, &hst,
-                          &h_errno) != 0
+  if (secure[hstdb])
+    {
+      oldeuid = geteuid ();
+      seteuid (uid);
+    }
+
+  while (__gethostbyname2_r (key, AF_INET, &resultbuf, buffer, buflen,
+                            &hst, &h_errno) != 0
         && h_errno == NETDB_INTERNAL
         && errno == ERANGE)
     {
@@ -306,12 +315,16 @@ addhstbyname (struct database *db, int fd, request_header *req, void *key)
       buffer = alloca (buflen);
     }
 
-  cache_addhst (db, fd, req, key, hst);
+  if (secure[hstdb])
+    seteuid (uid);
+
+  cache_addhst (db, fd, req, key, hst, uid);
 }
 
 
 void
-addhstbyaddr (struct database *db, int fd, request_header *req, void *key)
+addhstbyaddr (struct database *db, int fd, request_header *req,
+             void *key, uid_t uid)
 {
   /* Search for the entry matching the key.  Please note that we don't
      look again in the table whether the dataset is now available.  We
@@ -321,16 +334,23 @@ addhstbyaddr (struct database *db, int fd, request_header *req, void *key)
   char *buffer = alloca (buflen);
   struct hostent resultbuf;
   struct hostent *hst;
+  uid_t oldeuid = 0;
 
   if (debug_level > 0)
     {
-      char buf[64];
+      char buf[INET_ADDRSTRLEN];
       dbg_log (_("Haven't found \"%s\" in hosts cache!"),
               inet_ntop (AF_INET, key, buf, sizeof (buf)));
     }
 
-  while (gethostbyaddr_r (key, INADDRSZ, AF_INET, &resultbuf, buffer, buflen,
-                         &hst, &h_errno) != 0
+  if (secure[hstdb])
+    {
+      oldeuid = geteuid ();
+      seteuid (uid);
+    }
+
+  while (__gethostbyaddr_r (key, INADDRSZ, AF_INET, &resultbuf, buffer,
+                           buflen, &hst, &h_errno) != 0
         && h_errno == NETDB_INTERNAL
         && errno == ERANGE)
     {
@@ -339,12 +359,16 @@ addhstbyaddr (struct database *db, int fd, request_header *req, void *key)
       buffer = alloca (buflen);
     }
 
-  cache_addhst (db, fd, req, key, hst);
+  if (secure[hstdb])
+    seteuid (oldeuid);
+
+  cache_addhst (db, fd, req, key, hst, uid);
 }
 
 
 void
-addhstbynamev6 (struct database *db, int fd, request_header *req, void *key)
+addhstbynamev6 (struct database *db, int fd, request_header *req,
+               void *key, uid_t uid)
 {
   /* Search for the entry matching the key.  Please note that we don't
      look again in the table whether the dataset is now available.  We
@@ -354,12 +378,24 @@ addhstbynamev6 (struct database *db, int fd, request_header *req, void *key)
   char *buffer = alloca (buflen);
   struct hostent resultbuf;
   struct hostent *hst;
+  uid_t oldeuid = 0;
 
   if (debug_level > 0)
-    dbg_log (_("Haven't found \"%s\" in hosts cache!"), key);
+    {
+      char buf[INET6_ADDRSTRLEN];
+
+      dbg_log (_("Haven't found \"%s\" in hosts cache!"),
+              inet_ntop (AF_INET6, key, buf, sizeof (buf)));
+    }
+
+  if (secure[hstdb])
+    {
+      oldeuid = geteuid ();
+      seteuid (uid);
+    }
 
-  while (gethostbyname2_r (key, AF_INET6, &resultbuf, buffer, buflen, &hst,
-                          &h_errno) != 0
+  while (__gethostbyname2_r (key, AF_INET6, &resultbuf, buffer, buflen,
+                            &hst, &h_errno) != 0
         && h_errno == NETDB_INTERNAL
         && errno == ERANGE)
     {
@@ -368,12 +404,16 @@ addhstbynamev6 (struct database *db, int fd, request_header *req, void *key)
       buffer = alloca (buflen);
     }
 
-  cache_addhst (db, fd, req, key, hst);
+  if (secure[hstdb])
+    seteuid (oldeuid);
+
+  cache_addhst (db, fd, req, key, hst, uid);
 }
 
 
 void
-addhstbyaddrv6 (struct database *db, int fd, request_header *req, void *key)
+addhstbyaddrv6 (struct database *db, int fd, request_header *req,
+               void *key, uid_t uid)
 {
   /* Search for the entry matching the key.  Please note that we don't
      look again in the table whether the dataset is now available.  We
@@ -383,16 +423,23 @@ addhstbyaddrv6 (struct database *db, int fd, request_header *req, void *key)
   char *buffer = alloca (buflen);
   struct hostent resultbuf;
   struct hostent *hst;
+  uid_t oldeuid = 0;
 
   if (debug_level > 0)
     {
-      char buf[64];
+      char buf[INET6_ADDRSTRLEN];
       dbg_log (_("Haven't found \"%s\" in hosts cache!"),
               inet_ntop (AF_INET6, key, buf, sizeof (buf)));
     }
 
-  while (gethostbyaddr_r (key, IN6ADDRSZ, AF_INET6, &resultbuf, buffer, buflen,
-                         &hst, &h_errno) != 0
+  if (secure[hstdb])
+    {
+      oldeuid = geteuid ();
+      seteuid (uid);
+    }
+
+  while (__gethostbyaddr_r (key, IN6ADDRSZ, AF_INET6, &resultbuf,
+                           buffer, buflen, &hst, &h_errno) != 0
         && h_errno == NETDB_INTERNAL
         && errno == ERANGE)
     {
@@ -401,5 +448,8 @@ addhstbyaddrv6 (struct database *db, int fd, request_header *req, void *key)
       buffer = alloca (buflen);
     }
 
-  cache_addhst (db, fd, req, key, hst);
+  if (secure[hstdb])
+    seteuid (oldeuid);
+
+  cache_addhst (db, fd, req, key, hst, uid);
 }