svn commit: r339387 - head/lib/libc/gen
Edward Tomasz Napierala
trasz at FreeBSD.org
Tue Oct 16 18:17:08 UTC 2018
Author: trasz
Date: Tue Oct 16 18:17:07 2018
New Revision: 339387
URL: https://svnweb.freebsd.org/changeset/base/339387
Log:
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
Modified:
head/lib/libc/gen/getgrent.c
Modified: head/lib/libc/gen/getgrent.c
==============================================================================
--- head/lib/libc/gen/getgrent.c Tue Oct 16 17:28:10 2018 (r339386)
+++ head/lib/libc/gen/getgrent.c Tue Oct 16 18:17:07 2018 (r339387)
@@ -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) {
More information about the svn-src-all
mailing list