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:
trasz 2018-10-16 18:17:07 +00:00
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) {