diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2009-10-13 22:34:15 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-13 22:34:15 +0200 |
commit | fea942bf0a3daf5e1eebc6a7a6f252abbba65009 (patch) | |
tree | 9eaaad692daf31ef9acf299e87aa37b1fd445152 /libc/inet | |
parent | 96a4928454fb7a8361a0b33940006ff491506f4d (diff) |
libc/inet/resolv.c: reread resolv.conf if its mtime was changed
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libc/inet')
-rw-r--r-- | libc/inet/resolv.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/libc/inet/resolv.c b/libc/inet/resolv.c index 66114668c..ee06b44be 100644 --- a/libc/inet/resolv.c +++ b/libc/inet/resolv.c @@ -312,6 +312,7 @@ Domain name in a message can be represented as either: #include <arpa/nameser.h> #include <sys/utsname.h> #include <sys/un.h> +#include <sys/stat.h> #include <bits/uClibc_mutex.h> /* poll() is not supported in kernel <= 2.0, therefore if __NR_poll is @@ -948,7 +949,7 @@ static char *skip_and_NUL_space(char *p) /* Must be called under __resolv_lock. */ void attribute_hidden __open_nameservers(void) { - static uint8_t last_time; + static uint32_t resolv_conf_mtime; char szBuffer[MAXLEN_searchdomain]; FILE *fp; @@ -956,11 +957,11 @@ void attribute_hidden __open_nameservers(void) sockaddr46_t sa; if (!__res_sync) { - /* Provide for periodic reread of /etc/resolv.conf */ - /* cur_time "ticks" every 256 seconds */ - uint8_t cur_time = ((unsigned)time(NULL)) >> 8; - if (last_time != cur_time) { - last_time = cur_time; + /* Reread /etc/resolv.conf if it was modified. */ + struct stat sb; + stat("/etc/resolv.conf", &sb); + if (resolv_conf_mtime != (uint32_t)sb.st_mtime) { + resolv_conf_mtime = sb.st_mtime; __close_nameservers(); /* force config reread */ } } @@ -969,6 +970,7 @@ void attribute_hidden __open_nameservers(void) goto sync; fp = fopen("/etc/resolv.conf", "r"); +#ifdef FALLBACK_TO_CONFIG_RESOLVCONF if (!fp) { /* If we do not have a pre-populated /etc/resolv.conf then try to use the one from /etc/config which exists on numerous @@ -976,6 +978,7 @@ void attribute_hidden __open_nameservers(void) may be the only /etc dir that was mounted rw. */ fp = fopen("/etc/config/resolv.conf", "r"); } +#endif if (fp) { while (fgets(szBuffer, sizeof(szBuffer), fp) != NULL) { |