Get rid unneccessary useless calls to lseek(2) from getgrent(3).
Looks like this: fstatat(AT_FDCWD,"/etc/nsswitch.conf",{ mode=-rw-r--r-- ,inode=2167001,size=390,blksize=32768 },0x0) = 0 (0x0) open("/etc/group",O_RDONLY|O_CLOEXEC,0666) = 3 (0x3) fstat(3,{ mode=-rw-r--r-- ,inode=2166927,size=919,blksize=32768 }) = 0 (0x0) -lseek(3,0x0,SEEK_CUR) = 0 (0x0) -lseek(3,0x0,SEEK_SET) = 0 (0x0) read(3,"# $FreeBSD: release/10.0.0/etc/g"...,32768) = 919 (0x397) close(3) = 0 (0x0) Reviewed by: kib Approved by: re (gjb) MFC after: 2 weeks Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D17571
This commit is contained in:
parent
62f96009c0
commit
b698561093
@ -836,8 +836,9 @@ files_group(void *retval, void *mdata, va_list ap)
|
||||
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 @@ files_group(void *retval, void *mdata, va_list ap)
|
||||
*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 @@ files_group(void *retval, void *mdata, va_list ap)
|
||||
&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 @@ compat_group(void *retval, void *mdata, va_list ap)
|
||||
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 @@ compat_group(void *retval, void *mdata, va_list ap)
|
||||
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 @@ compat_group(void *retval, void *mdata, va_list ap)
|
||||
*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 @@ docompat:
|
||||
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 @@ docompat:
|
||||
&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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user