Bug#272265: libc6: Programs should reload /etc/resolv.conf when it changes
Package: libc6
Version: 2.3.2.ds1-16
Tags: patch
Severity: wishlist
The current DNS resolver in glibc only read the content of
/etc/resolv.conf when a program starts (or during the first call to
one of the resolver function). This is a problem for long-lasting
programs on for example laptops, where the content of the file may
change when a new IP configuration is fetched using DHCP. A
workaround is to use nscd and call 'nscd -i hosts' when the file
changes, but it would be better if the content of the file was reread
automatically when it changes.
The following patch by Torstein Kukuk from
<URL:http://sources.redhat.com/ml/libc-alpha/2004-09/msg00130.html>
fixes this problem, by making sure the timestamp of the file is
checked every time a DNS lookup is done.
Please include this patch in the default glibc used in Debian. It
would make it so much useful on machines with changing IP
configuration.
--- resolv/res_libc.c 6 Aug 2004 17:52:53 -0000 1.20
+++ resolv/res_libc.c 9 Aug 2004 15:14:47 -0000
@@ -22,7 +22,7 @@
#include <arpa/nameser.h>
#include <resolv.h>
#include <bits/libc-lock.h>
-
+#include <sys/stat.h>
/* The following bit is copied from res_data.c (where it is #ifdef'ed
out) since res_init() should go into libc.so but the rest of that
@@ -100,8 +100,17 @@ res_init(void) {
int
__res_maybe_init (res_state resp, int preinit)
{
- if (resp->options & RES_INIT) {
- if (__res_initstamp != resp->_u._ext.initstamp) {
+ static time_t last_mtime;
+ struct stat statbuf;
+ int ret;
+
+
+ if (resp->options & RES_INIT) {
+ ret = stat (_PATH_RESCONF, &statbuf);
+ if (__res_initstamp != resp->_u._ext.initstamp
+ || (ret == 0) && (last_mtime != statbuf.st_mtime))
+ {
+ last_mtime = statbuf.st_mtime;
if (resp->nscount > 0) {
__res_nclose (resp);
for (int ns = 0; ns < MAXNS; ns++) {
Reply to: