Looks good, ok nicm.
On Wed, Jul 06, 2011 at 05:30:49PM -0400, Todd C. Miller wrote:
> Using stdio in getent() results in a minor wallclock speedup but
> halves the system time on my test machine. As a bonus we can reuse
> pfp in tcgetnext().
>
> - todd
>
> Index: lib/libc/gen/getcap.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/gen/getcap.c,v
> retrieving revision 1.28
> diff -u -r1.28 getcap.c
> --- lib/libc/gen/getcap.c 6 Jul 2011 18:51:09 -0000 1.28
> +++ lib/libc/gen/getcap.c 6 Jul 2011 21:28:46 -0000
> @@ -58,7 +58,7 @@
> static int gottoprec; /* Flag indicating retrieval of toprecord */
>
> static int cdbget(DB *, char **, const char *);
> -static int getent(char **, u_int *, char **, int, const char *, int, char
> *);
> +static int getent(char **, u_int *, char **, FILE *, const char *, int,
> char *);
> static int nfcmp(const char *, char *);
>
> static int usedb = 1;
> @@ -168,12 +168,12 @@
> {
> u_int dummy;
>
> - return (getent(buf, &dummy, db_array, -1, name, 0, NULL));
> + return (getent(buf, &dummy, db_array, NULL, name, 0, NULL));
> }
>
> /*
> - * Getent implements the functions of cgetent. If fd is non-negative,
> - * *db_array has already been opened and fd is the open file descriptor. We
> + * Getent implements the functions of cgetent. If fp is non-NULL,
> + * *db_array has already been opened and fp is the open file descriptor. We
> * do this to save time and avoid using up file descriptors for tc=
> * recursions.
> *
> @@ -190,7 +190,7 @@
> * MAX_RECURSION.
> */
> static int
> -getent(char **cap, u_int *len, char **db_array, int fd,
> +getent(char **cap, u_int *len, char **db_array, FILE *fp,
> const char *name, int depth, char *nfield)
> {
> DB *capdbp;
> @@ -240,8 +240,8 @@
> /*
> * Open database if not already open.
> */
> - if (fd >= 0) {
> - (void)lseek(fd, (off_t)0, SEEK_SET);
> + if (fp != NULL) {
> + (void)fseek(fp, 0L, SEEK_SET);
> myfd = 0;
> opened++;
> } else {
> @@ -272,8 +272,8 @@
> *cap = cbuf;
> return (retval);
> } else {
> - fd = open(*db_p, O_RDONLY, 0);
> - if (fd < 0) {
> + fp = fopen(*db_p, "r");
> + if (fp == NULL) {
> /* No error on unfound file. */
> continue;
> }
> @@ -308,20 +308,19 @@
> rp = record;
> for (;;) {
> if (bp >= b_end) {
> - int n;
> + size_t n;
>
> - n = read(fd, buf, sizeof(buf));
> - if (n <= 0) {
> + n = fread(buf, 1, sizeof(buf), fp);
> + if (n == 0) {
> + eof = feof(fp);
> if (myfd)
> - (void)close(fd);
> - if (n < 0) {
> - free(record);
> - return (-2);
> - } else {
> - fd = -1;
> - eof = 1;
> + (void)fclose(fp);
> + if (eof) {
> + fp = NULL;
> break;
> }
> + free(record);
> + return (-2);
> }
> b_end = buf+n;
> bp = buf;
> @@ -343,7 +342,7 @@
> * some more.
> */
> if (rp >= r_end) {
> - u_int pos;
> + size_t pos;
> size_t newsize;
> char *nrecord;
>
> @@ -354,7 +353,7 @@
> if (record)
> free(record);
> if (myfd)
> - (void)close(fd);
> + (void)fclose(fp);
> errno = ENOMEM;
> return (-2);
> }
> @@ -440,13 +439,13 @@
> tclen = s - tcstart;
> tcend = s;
>
> - iret = getent(&icap, &ilen, db_p, fd, tc, depth+1,
> + iret = getent(&icap, &ilen, db_p, fp, tc, depth+1,
> NULL);
> if (iret != 0) {
> /* an error */
> if (iret < -1) {
> if (myfd)
> - (void)close(fd);
> + (void)fclose(fp);
> free(record);
> return (iret);
> }
> @@ -498,7 +497,7 @@
> if (record)
> free(record);
> if (myfd)
> - (void)close(fd);
> + (void)fclose(fp);
> free(ibuf);
> errno = ENOMEM;
> return (-2);
> @@ -532,7 +531,7 @@
> * return capability, length and success.
> */
> if (myfd)
> - (void)close(fd);
> + (void)fclose(fp);
> *len = rp - record - 1; /* don't count NUL */
> if (r_end > rp) {
> char *nrecord;
> @@ -660,13 +659,12 @@
> cgetnext(char **cap, char **db_array)
> {
> size_t len;
> - int serrno, status = -1;
> - char nbuf[BSIZE];
> - char *record = NULL, *r_end, *rp;
> - char buf[BUFSIZ];
> - char *b_end, *bp;
> - int c;
> + int c, serrno, status = -1;
> + char buf[BUFSIZ], nbuf[BSIZE];
> + char *b_end, *bp, *r_end, *rp;
> + char *record = NULL;
> u_int dummy;
> + off_t pos;
>
> if (dbp == NULL)
> dbp = db_array;
> @@ -747,17 +745,17 @@
> * some more.
> */
> if (rp >= r_end) {
> - size_t newsize, pos;
> + size_t newsize, off;
> char *nrecord;
>
> - pos = rp - record;
> + off = rp - record;
> newsize = r_end - record + BFRAG;
> nrecord = realloc(record, newsize);
> if (nrecord == NULL)
> goto done;
> record = nrecord;
> r_end = record + newsize;
> - rp = record + pos;
> + rp = record + off;
> }
> }
> /* loop invariant lets us do this */
> @@ -783,7 +781,10 @@
> nbuf[len] = '\0';
>
> /* return value of getent() is one less than cgetnext() */
> - status = getent(cap, &dummy, db_array, -1, nbuf, 0, NULL) + 1;
> + pos = ftello(pfp);
> + status = getent(cap, &dummy, db_array, pfp, nbuf, 0, NULL) + 1;
> + if (status > 0)
> + fseeko(pfp, pos, SEEK_SET);
> done:
> serrno = errno;
> free(record);