diff options
| author | ray <> | 2007-05-17 03:55:08 +0000 |
|---|---|---|
| committer | ray <> | 2007-05-17 03:55:08 +0000 |
| commit | 76e72c2cbf982bde55d62c7ec7b62f7cd6b53616 (patch) | |
| tree | b109276f19d89392c4c718d4035bf3a195462c39 /src/lib/libc | |
| parent | 9a364ffb85cbe4c22d7e8895aeebced0acd0ed7a (diff) | |
| download | openbsd-76e72c2cbf982bde55d62c7ec7b62f7cd6b53616.tar.gz openbsd-76e72c2cbf982bde55d62c7ec7b62f7cd6b53616.tar.bz2 openbsd-76e72c2cbf982bde55d62c7ec7b62f7cd6b53616.zip | |
Improve reentrancy by not using global variable. Removes two
wrappers around fopen/fclose. From tbert.
OK millert@, tedu@, and itojun@.
Diffstat (limited to 'src/lib/libc')
| -rw-r--r-- | src/lib/libc/net/getaddrinfo.c | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/src/lib/libc/net/getaddrinfo.c b/src/lib/libc/net/getaddrinfo.c index 3f8521cb31..5e11ab00c3 100644 --- a/src/lib/libc/net/getaddrinfo.c +++ b/src/lib/libc/net/getaddrinfo.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: getaddrinfo.c,v 1.64 2007/05/12 21:38:14 ray Exp $ */ | 1 | /* $OpenBSD: getaddrinfo.c,v 1.65 2007/05/17 03:55:08 ray Exp $ */ |
| 2 | /* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */ | 2 | /* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */ |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| @@ -217,9 +217,8 @@ static const struct afd *find_afd(int); | |||
| 217 | static int ip6_str2scopeid(char *, struct sockaddr_in6 *, u_int32_t *); | 217 | static int ip6_str2scopeid(char *, struct sockaddr_in6 *, u_int32_t *); |
| 218 | #endif | 218 | #endif |
| 219 | 219 | ||
| 220 | static void _sethtent(void); | 220 | static struct addrinfo * _gethtent(const char *, const struct addrinfo *, |
| 221 | static void _endhtent(void); | 221 | FILE *); |
| 222 | static struct addrinfo * _gethtent(const char *, const struct addrinfo *); | ||
| 223 | static struct addrinfo *_files_getaddrinfo(const char *, | 222 | static struct addrinfo *_files_getaddrinfo(const char *, |
| 224 | const struct addrinfo *); | 223 | const struct addrinfo *); |
| 225 | 224 | ||
| @@ -949,7 +948,6 @@ ip6_str2scopeid(char *scope, struct sockaddr_in6 *sin6, u_int32_t *scopeid) | |||
| 949 | 948 | ||
| 950 | static const char AskedForGot[] = | 949 | static const char AskedForGot[] = |
| 951 | "gethostby*.getanswer: asked for \"%s\", got \"%s\""; | 950 | "gethostby*.getanswer: asked for \"%s\", got \"%s\""; |
| 952 | static FILE *hostf = NULL; | ||
| 953 | 951 | ||
| 954 | static struct addrinfo * | 952 | static struct addrinfo * |
| 955 | getanswer(const querybuf *answer, int anslen, const char *qname, int qtype, | 953 | getanswer(const querybuf *answer, int anslen, const char *qname, int qtype, |
| @@ -1221,28 +1219,8 @@ _dns_getaddrinfo(const char *name, const struct addrinfo *pai) | |||
| 1221 | return sentinel.ai_next; | 1219 | return sentinel.ai_next; |
| 1222 | } | 1220 | } |
| 1223 | 1221 | ||
| 1224 | static FILE *hostf; | ||
| 1225 | |||
| 1226 | static void | ||
| 1227 | _sethtent(void) | ||
| 1228 | { | ||
| 1229 | if (!hostf) | ||
| 1230 | hostf = fopen(_PATH_HOSTS, "r" ); | ||
| 1231 | else | ||
| 1232 | rewind(hostf); | ||
| 1233 | } | ||
| 1234 | |||
| 1235 | static void | ||
| 1236 | _endhtent(void) | ||
| 1237 | { | ||
| 1238 | if (hostf) { | ||
| 1239 | (void) fclose(hostf); | ||
| 1240 | hostf = NULL; | ||
| 1241 | } | ||
| 1242 | } | ||
| 1243 | |||
| 1244 | static struct addrinfo * | 1222 | static struct addrinfo * |
| 1245 | _gethtent(const char *name, const struct addrinfo *pai) | 1223 | _gethtent(const char *name, const struct addrinfo *pai, FILE *hostf) |
| 1246 | { | 1224 | { |
| 1247 | char *p; | 1225 | char *p; |
| 1248 | char *cp, *tname, *cname; | 1226 | char *cp, *tname, *cname; |
| @@ -1251,8 +1229,6 @@ _gethtent(const char *name, const struct addrinfo *pai) | |||
| 1251 | const char *addr; | 1229 | const char *addr; |
| 1252 | char hostbuf[8*1024]; | 1230 | char hostbuf[8*1024]; |
| 1253 | 1231 | ||
| 1254 | if (!hostf && !(hostf = fopen(_PATH_HOSTS, "r" ))) | ||
| 1255 | return (NULL); | ||
| 1256 | again: | 1232 | again: |
| 1257 | if (!(p = fgets(hostbuf, sizeof hostbuf, hostf))) | 1233 | if (!(p = fgets(hostbuf, sizeof hostbuf, hostf))) |
| 1258 | return (NULL); | 1234 | return (NULL); |
| @@ -1308,17 +1284,21 @@ _files_getaddrinfo(const char *name, const struct addrinfo *pai) | |||
| 1308 | { | 1284 | { |
| 1309 | struct addrinfo sentinel, *cur; | 1285 | struct addrinfo sentinel, *cur; |
| 1310 | struct addrinfo *p; | 1286 | struct addrinfo *p; |
| 1287 | FILE *hostf; | ||
| 1288 | |||
| 1289 | hostf = fopen(_PATH_HOSTS, "r"); | ||
| 1290 | if (hostf == NULL) | ||
| 1291 | return NULL; | ||
| 1311 | 1292 | ||
| 1312 | memset(&sentinel, 0, sizeof(sentinel)); | 1293 | memset(&sentinel, 0, sizeof(sentinel)); |
| 1313 | cur = &sentinel; | 1294 | cur = &sentinel; |
| 1314 | 1295 | ||
| 1315 | _sethtent(); | 1296 | while ((p = _gethtent(name, pai, hostf)) != NULL) { |
| 1316 | while ((p = _gethtent(name, pai)) != NULL) { | ||
| 1317 | cur->ai_next = p; | 1297 | cur->ai_next = p; |
| 1318 | while (cur && cur->ai_next) | 1298 | while (cur && cur->ai_next) |
| 1319 | cur = cur->ai_next; | 1299 | cur = cur->ai_next; |
| 1320 | } | 1300 | } |
| 1321 | _endhtent(); | 1301 | fclose(hostf); |
| 1322 | 1302 | ||
| 1323 | return sentinel.ai_next; | 1303 | return sentinel.ai_next; |
| 1324 | } | 1304 | } |
