Date: Tue, 16 Oct 2018 18:17:07 +0000 (UTC) From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r339387 - head/lib/libc/gen Message-ID: <201810161817.w9GIH77p053082@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201810161817.w9GIH77p053082>