diff options
Diffstat (limited to 'src/lib/libc/net/res_init.c')
| -rw-r--r-- | src/lib/libc/net/res_init.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/src/lib/libc/net/res_init.c b/src/lib/libc/net/res_init.c index f4a8d31cb1..110542a404 100644 --- a/src/lib/libc/net/res_init.c +++ b/src/lib/libc/net/res_init.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: res_init.c,v 1.31 2005/03/25 13:24:12 otto Exp $ */ | 1 | /* $OpenBSD: res_init.c,v 1.32 2005/03/30 02:58:28 tedu Exp $ */ |
| 2 | 2 | ||
| 3 | /* | 3 | /* |
| 4 | * ++Copyright++ 1985, 1989, 1993 | 4 | * ++Copyright++ 1985, 1989, 1993 |
| @@ -60,7 +60,7 @@ | |||
| 60 | static char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93"; | 60 | static char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93"; |
| 61 | static char rcsid[] = "$From: res_init.c,v 8.7 1996/09/28 06:51:07 vixie Exp $"; | 61 | static char rcsid[] = "$From: res_init.c,v 8.7 1996/09/28 06:51:07 vixie Exp $"; |
| 62 | #else | 62 | #else |
| 63 | static char rcsid[] = "$OpenBSD: res_init.c,v 1.31 2005/03/25 13:24:12 otto Exp $"; | 63 | static char rcsid[] = "$OpenBSD: res_init.c,v 1.32 2005/03/30 02:58:28 tedu Exp $"; |
| 64 | #endif | 64 | #endif |
| 65 | #endif /* LIBC_SCCS and not lint */ | 65 | #endif /* LIBC_SCCS and not lint */ |
| 66 | 66 | ||
| @@ -68,6 +68,7 @@ static char rcsid[] = "$OpenBSD: res_init.c,v 1.31 2005/03/25 13:24:12 otto Exp | |||
| 68 | #include <sys/param.h> | 68 | #include <sys/param.h> |
| 69 | #include <sys/socket.h> | 69 | #include <sys/socket.h> |
| 70 | #include <sys/time.h> | 70 | #include <sys/time.h> |
| 71 | #include <sys/stat.h> | ||
| 71 | #include <netinet/in.h> | 72 | #include <netinet/in.h> |
| 72 | #include <arpa/inet.h> | 73 | #include <arpa/inet.h> |
| 73 | #include <arpa/nameser.h> | 74 | #include <arpa/nameser.h> |
| @@ -131,6 +132,8 @@ void *__THREAD_NAME(_res_ext); | |||
| 131 | struct __res_state_ext _res_ext; | 132 | struct __res_state_ext _res_ext; |
| 132 | #endif /* INET6 */ | 133 | #endif /* INET6 */ |
| 133 | 134 | ||
| 135 | int __res_chktime = 30; | ||
| 136 | |||
| 134 | /* | 137 | /* |
| 135 | * Set up default settings. If the configuration file exist, the values | 138 | * Set up default settings. If the configuration file exist, the values |
| 136 | * there will have precedence. Otherwise, the server address is set to | 139 | * there will have precedence. Otherwise, the server address is set to |
| @@ -155,6 +158,14 @@ struct __res_state_ext _res_ext; | |||
| 155 | int | 158 | int |
| 156 | res_init(void) | 159 | res_init(void) |
| 157 | { | 160 | { |
| 161 | |||
| 162 | return (_res_init(1)); | ||
| 163 | } | ||
| 164 | |||
| 165 | int | ||
| 166 | _res_init(int usercall) | ||
| 167 | { | ||
| 168 | struct stat sb; | ||
| 158 | struct __res_state *_resp = _THREAD_PRIVATE(_res, _res, &_res); | 169 | struct __res_state *_resp = _THREAD_PRIVATE(_res, _res, &_res); |
| 159 | #ifdef INET6 | 170 | #ifdef INET6 |
| 160 | struct __res_state_ext *_res_extp = _THREAD_PRIVATE(_res_ext, _res_ext, | 171 | struct __res_state_ext *_res_extp = _THREAD_PRIVATE(_res_ext, _res_ext, |
| @@ -176,6 +187,29 @@ res_init(void) | |||
| 176 | int dots; | 187 | int dots; |
| 177 | #endif | 188 | #endif |
| 178 | 189 | ||
| 190 | if (usercall == 0) { | ||
| 191 | if (_resp->options & RES_INIT && | ||
| 192 | _resp->reschktime >= time(NULL)) | ||
| 193 | return (0); | ||
| 194 | _resp->reschktime = time(NULL) + __res_chktime; | ||
| 195 | if (stat(_PATH_RESCONF, &sb) != -1) { | ||
| 196 | if (timespeccmp(&sb.st_mtimespec, | ||
| 197 | &_resp->restimespec, ==)) | ||
| 198 | return (0); | ||
| 199 | else | ||
| 200 | _resp->restimespec = sb.st_mtimespec; | ||
| 201 | } else { | ||
| 202 | /* | ||
| 203 | * Lost the file, in chroot? | ||
| 204 | * Don' trash settings | ||
| 205 | */ | ||
| 206 | if (timespecisset(&_resp->restimespec)) | ||
| 207 | return (0); | ||
| 208 | } | ||
| 209 | } else | ||
| 210 | _resp->reschktime = time(NULL) + __res_chktime; | ||
| 211 | |||
| 212 | |||
| 179 | /* | 213 | /* |
| 180 | * These three fields used to be statically initialized. This made | 214 | * These three fields used to be statically initialized. This made |
| 181 | * it hard to use this code in a shared library. It is necessary, | 215 | * it hard to use this code in a shared library. It is necessary, |
