about summary refs log tree commit diff
path: root/nscd
diff options
context:
space:
mode:
Diffstat (limited to 'nscd')
-rw-r--r--nscd/Makefile4
-rw-r--r--nscd/aicache.c13
-rw-r--r--nscd/gethstbyad_r.c15
-rw-r--r--nscd/gethstbynm3_r.c (renamed from nscd/gethstbynm2_r.c)14
-rw-r--r--nscd/hstcache.c31
5 files changed, 53 insertions, 24 deletions
diff --git a/nscd/Makefile b/nscd/Makefile
index ecd8c89998..f83e40049a 100644
--- a/nscd/Makefile
+++ b/nscd/Makefile
@@ -32,7 +32,7 @@ include ../Makeconfig
 vpath %.c ../locale/programs
 
 nscd-modules := nscd connections pwdcache getpwnam_r getpwuid_r grpcache \
-		getgrnam_r getgrgid_r hstcache gethstbyad_r gethstbynm2_r \
+		getgrnam_r getgrgid_r hstcache gethstbyad_r gethstbynm3_r \
 		getsrvbynm_r getsrvbypt_r servicescache \
 		dbg_log nscd_conf nscd_stat cache mem nscd_setup_thread \
 		xmalloc xstrdup aicache initgrcache gai res_hconf
@@ -106,7 +106,7 @@ CFLAGS-getgrnam_r.c += $(nscd-cflags)
 CFLAGS-getgrgid_r.c += $(nscd-cflags)
 CFLAGS-hstcache.c += $(nscd-cflags)
 CFLAGS-gethstbyad_r.c += $(nscd-cflags)
-CFLAGS-gethstbynm2_r.c += $(nscd-cflags)
+CFLAGS-gethstbynm3_r.c += $(nscd-cflags)
 CFLAGS-dbg_log.c += $(nscd-cflags)
 CFLAGS-nscd_conf.c += $(nscd-cflags)
 CFLAGS-nscd_stat.c += $(nscd-cflags)
diff --git a/nscd/aicache.c b/nscd/aicache.c
index 0dc892bc74..68706a4cf7 100644
--- a/nscd/aicache.c
+++ b/nscd/aicache.c
@@ -110,7 +110,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
   size_t tmpbuf4len = 0;
   char *tmpbuf4 = NULL;
   char *canon = NULL;
-  int32_t ttl = UINT32_MAX;
+  int32_t ttl = INT32_MAX;
   ssize_t total = 0;
   char *key_copy = NULL;
   bool alloca_used = false;
@@ -163,7 +163,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
 	      rc4 = 0;
 	      status[1] = DL_CALL_FCT (fct, (key, AF_INET, &th[1], tmpbuf4,
 					     tmpbuf4len, &rc4, &herrno,
-					     ttl == UINT32_MAX ? &ttl : NULL,
+					     ttl == INT32_MAX ? &ttl : NULL,
 					     canon == NULL ? &canon : NULL));
 	      if (rc4 != ERANGE || herrno != NETDB_INTERNAL)
 		break;
@@ -233,9 +233,9 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
 		      int rc;
 		      while (1)
 			{
-			  rc = __gethostbyaddr_r (addr, addrlen, addrfamily,
-						  &he_mem, tmpbuf, tmpbuflen,
-						  &he, &herrno);
+			  rc = __gethostbyaddr2_r (addr, addrlen, addrfamily,
+						   &he_mem, tmpbuf, tmpbuflen,
+						   &he, &herrno, NULL);
 			  if (rc != ERANGE || herrno != NETDB_INTERNAL)
 			    break;
 			  tmpbuf = extend_alloca (tmpbuf, tmpbuflen,
@@ -285,7 +285,8 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
 	      dataset->head.usable = true;
 
 	      /* Compute the timeout time.  */
-	      dataset->head.timeout = time (NULL) + MIN (db->postimeout, ttl);
+	      dataset->head.timeout = time (NULL) + (ttl == INT32_MAX
+						     ? db->postimeout : ttl);
 
 	      dataset->resp.version = NSCD_VERSION;
 	      dataset->resp.found = 1;
diff --git a/nscd/gethstbyad_r.c b/nscd/gethstbyad_r.c
index e2e8dfe2cc..2e7a09c2bd 100644
--- a/nscd/gethstbyad_r.c
+++ b/nscd/gethstbyad_r.c
@@ -20,12 +20,25 @@
 
 
 #define LOOKUP_TYPE	struct hostent
-#define FUNCTION_NAME	gethostbyaddr
+#define FUNCTION_NAME	gethostbyaddr2
+#define FUNCTION2_NAME	gethostbyaddr
 #define DATABASE_NAME	hosts
 #define ADD_PARAMS	const void *addr, socklen_t len, int type
+#define EXTRA_PARAMS	, int32_t *ttlp
 #define ADD_VARIABLES	addr, len, type
+#define EXTRA_VARIABLES , ttlp
 #define NEED_H_ERRNO	1
 #define NEED__RES	1
 #define NEED__RES_HCONF 1
 
 #include "../nss/getXXbyYY_r.c"
+
+
+int
+__gethostbyaddr_r (const void *addr, socklen_t len, int type,
+		   struct hostent *result_buf, char *buf, size_t buflen,
+		   struct hostent **result, int *h_errnop)
+{
+  return __gethostbyaddr2_r (addr, len, type, result_buf, buf, buflen,
+			     result, h_errnop, NULL);
+}
diff --git a/nscd/gethstbynm2_r.c b/nscd/gethstbynm3_r.c
index 85e95d4a63..a917f893b1 100644
--- a/nscd/gethstbynm2_r.c
+++ b/nscd/gethstbynm3_r.c
@@ -25,10 +25,13 @@
 
 
 #define LOOKUP_TYPE	struct hostent
-#define FUNCTION_NAME	gethostbyname2
+#define FUNCTION_NAME	gethostbyname3
+#define FUNCTION2_NAME	gethostbyname2
 #define DATABASE_NAME	hosts
 #define ADD_PARAMS	const char *name, int af
+#define EXTRA_PARAMS	, int32_t *ttlp, char **canonp
 #define ADD_VARIABLES	name, af
+#define EXTRA_VARIABLES	, ttlp, canonp
 #define NEED_H_ERRNO	1
 #define NEED__RES_HCONF 1
 
@@ -39,3 +42,12 @@
 #define __inet_aton inet_aton
 
 #include "../nss/getXXbyYY_r.c"
+
+
+int
+__gethostbyname2_r (const char *name, int af, struct hostent *ret, char *buf,
+		    size_t buflen, struct hostent **result, int *h_errnop)
+{
+  return __gethostbyname3_r (name, af, ret, buf, buflen, result, h_errnop,
+			     NULL, NULL);
+}
diff --git a/nscd/hstcache.c b/nscd/hstcache.c
index 54222a3408..c93691dcfd 100644
--- a/nscd/hstcache.c
+++ b/nscd/hstcache.c
@@ -80,7 +80,8 @@ static const hst_response_header notfound =
 static void
 cache_addhst (struct database_dyn *db, int fd, request_header *req,
 	      const void *key, struct hostent *hst, uid_t owner,
-	      struct hashentry *he, struct datahead *dh, int errval)
+	      struct hashentry *he, struct datahead *dh, int errval,
+	      int32_t ttl)
 {
   ssize_t total;
   ssize_t written;
@@ -131,7 +132,8 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
 	      dataset->head.usable = true;
 
 	      /* Compute the timeout time.  */
-	      dataset->head.timeout = t + db->negtimeout;
+	      dataset->head.timeout = t + (ttl == INT32_MAX
+					   ? db->negtimeout : ttl);
 
 	      /* This is the reply.  */
 	      memcpy (&dataset->resp, &notfound, total);
@@ -247,7 +249,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
       dataset->head.usable = true;
 
       /* Compute the timeout time.  */
-      dataset->head.timeout = t + db->postimeout;
+      dataset->head.timeout = t + (ttl == INT32_MAX ? db->postimeout : ttl);
 
       dataset->resp.version = NSCD_VERSION;
       dataset->resp.found = 1;
@@ -423,19 +425,19 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
 
 static int
 lookup (int type, void *key, struct hostent *resultbufp, char *buffer,
-	size_t buflen, struct hostent **hst)
+	size_t buflen, struct hostent **hst, int32_t *ttlp)
 {
   if (type == GETHOSTBYNAME)
-    return __gethostbyname2_r (key, AF_INET, resultbufp, buffer, buflen, hst,
-			       &h_errno);
+    return __gethostbyname3_r (key, AF_INET, resultbufp, buffer, buflen, hst,
+			       &h_errno, ttlp, NULL);
   if (type == GETHOSTBYNAMEv6)
-    return __gethostbyname2_r (key, AF_INET6, resultbufp, buffer, buflen, hst,
-			       &h_errno);
+    return __gethostbyname3_r (key, AF_INET6, resultbufp, buffer, buflen, hst,
+			       &h_errno, ttlp, NULL);
   if (type == GETHOSTBYADDR)
-    return __gethostbyaddr_r (key, NS_INADDRSZ, AF_INET, resultbufp, buffer,
-			      buflen, hst, &h_errno);
-  return __gethostbyaddr_r (key, NS_IN6ADDRSZ, AF_INET6, resultbufp, buffer,
-			    buflen, hst, &h_errno);
+    return __gethostbyaddr2_r (key, NS_INADDRSZ, AF_INET, resultbufp, buffer,
+			       buflen, hst, &h_errno, ttlp);
+  return __gethostbyaddr2_r (key, NS_IN6ADDRSZ, AF_INET6, resultbufp, buffer,
+			     buflen, hst, &h_errno, ttlp);
 }
 
 
@@ -453,6 +455,7 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
   struct hostent *hst;
   bool use_malloc = false;
   int errval = 0;
+  int32_t ttl = INT32_MAX;
 
   if (__builtin_expect (debug_level > 0, 0))
     {
@@ -470,7 +473,7 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
 	dbg_log (_("Reloading \"%s\" in hosts cache!"), (char *) str);
     }
 
-  while (lookup (req->type, key, &resultbuf, buffer, buflen, &hst) != 0
+  while (lookup (req->type, key, &resultbuf, buffer, buflen, &hst, &ttl) != 0
 	 && h_errno == NETDB_INTERNAL
 	 && (errval = errno) == ERANGE)
     {
@@ -504,7 +507,7 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
     }
 
   cache_addhst (db, fd, req, key, hst, uid, he, dh,
-		h_errno == TRY_AGAIN ? errval : 0);
+		h_errno == TRY_AGAIN ? errval : 0, ttl);
 
   if (use_malloc)
     free (buffer);