Index: head/lib/libc/gen/getgrent.c =================================================================== --- head/lib/libc/gen/getgrent.c +++ head/lib/libc/gen/getgrent.c @@ -836,8 +836,9 @@ char *buffer; size_t bufsize, linesize; off_t pos; - int rv, stayopen, *errnop; + int fresh, rv, stayopen, *errnop; + fresh = 0; name = NULL; gid = (gid_t)-1; how = (enum nss_lookup_type)mdata; @@ -860,19 +861,24 @@ *errnop = files_getstate(&st); if (*errnop != 0) return (NS_UNAVAIL); - if (st->fp == NULL && - ((st->fp = fopen(_PATH_GROUP, "re")) == NULL)) { - *errnop = errno; - return (NS_UNAVAIL); + if (st->fp == NULL) { + st->fp = fopen(_PATH_GROUP, "re"); + if (st->fp == NULL) { + *errnop = errno; + return (NS_UNAVAIL); + } + fresh = 1; } if (how == nss_lt_all) stayopen = 1; else { - rewind(st->fp); + if (!fresh) + rewind(st->fp); stayopen = st->stayopen; } rv = NS_NOTFOUND; - pos = ftello(st->fp); + if (stayopen) + pos = ftello(st->fp); while ((line = fgetln(st->fp, &linesize)) != NULL) { if (line[linesize-1] == '\n') linesize--; @@ -894,7 +900,8 @@ &buffer[linesize + 1], bufsize - linesize - 1, errnop); if (rv & NS_TERMINATE) break; - pos = ftello(st->fp); + if (stayopen) + pos = ftello(st->fp); } if (st->fp != NULL && !stayopen) { fclose(st->fp); @@ -1304,7 +1311,7 @@ void *discard; size_t bufsize, linesize; off_t pos; - int rv, stayopen, *errnop; + int fresh, rv, stayopen, *errnop; #define set_lookup_type(x, y) do { \ int i; \ @@ -1312,6 +1319,7 @@ x[i].mdata = (void *)y; \ } while (0) + fresh = 0; name = NULL; gid = (gid_t)-1; how = (enum nss_lookup_type)mdata; @@ -1334,16 +1342,20 @@ *errnop = compat_getstate(&st); if (*errnop != 0) return (NS_UNAVAIL); - if (st->fp == NULL && - ((st->fp = fopen(_PATH_GROUP, "re")) == NULL)) { - *errnop = errno; - rv = NS_UNAVAIL; - goto fin; + if (st->fp == NULL) { + st->fp = fopen(_PATH_GROUP, "re"); + if (st->fp == NULL) { + *errnop = errno; + rv = NS_UNAVAIL; + goto fin; + } + fresh = 1; } if (how == nss_lt_all) stayopen = 1; else { - rewind(st->fp); + if (!fresh) + rewind(st->fp); stayopen = st->stayopen; } docompat: @@ -1406,7 +1418,8 @@ break; } rv = NS_NOTFOUND; - pos = ftello(st->fp); + if (stayopen) + pos = ftello(st->fp); while ((line = fgetln(st->fp, &linesize)) != NULL) { if (line[linesize-1] == '\n') linesize--; @@ -1447,7 +1460,8 @@ &buffer[linesize + 1], bufsize - linesize - 1, errnop); if (rv & NS_TERMINATE) break; - pos = ftello(st->fp); + if (stayopen) + pos = ftello(st->fp); } fin: if (st->fp != NULL && !stayopen) {