Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libc/gen/getcap.c,v rcsdiff: /ftp/cvs/cvsroot/src/lib/libc/gen/getcap.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.14 retrieving revision 1.23 diff -u -p -r1.14 -r1.23 --- src/lib/libc/gen/getcap.c 1997/07/21 14:07:03 1.14 +++ src/lib/libc/gen/getcap.c 1998/08/26 00:38:40 1.23 @@ -1,4 +1,4 @@ -/* $NetBSD: getcap.c,v 1.14 1997/07/21 14:07:03 jtc Exp $ */ +/* $NetBSD: getcap.c,v 1.23 1998/08/26 00:38:40 perry Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -41,7 +41,7 @@ #if 0 static char sccsid[] = "@(#)getcap.c 8.3 (Berkeley) 3/25/94"; #else -__RCSID("$NetBSD: getcap.c,v 1.14 1997/07/21 14:07:03 jtc Exp $"); +__RCSID("$NetBSD: getcap.c,v 1.23 1998/08/26 00:38:40 perry Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -84,8 +84,8 @@ static size_t topreclen; /* toprec leng static char *toprec; /* Additional record specified by cgetset() */ static int gottoprec; /* Flag indicating retrieval of toprecord */ -static int cdbget __P((DB *, char **, char *)); -static int getent __P((char **, u_int *, char **, int, char *, int, char *)); +static int cdbget __P((DB *, char **, const char *)); +static int getent __P((char **, size_t *, char **, int, const char *, int, char *)); static int nfcmp __P((char *, char *)); /* @@ -95,7 +95,7 @@ static int nfcmp __P((char *, char *)); */ int cgetset(ent) - char *ent; + const char *ent; { if (ent == NULL) { if (toprec) @@ -128,10 +128,12 @@ cgetset(ent) */ char * cgetcap(buf, cap, type) - char *buf, *cap; + char *buf; + const char *cap; int type; { - register char *bp, *cp; + char *bp; + const char *cp; bp = buf; for (;;) { @@ -180,9 +182,10 @@ cgetcap(buf, cap, type) */ int cgetent(buf, db_array, name) - char **buf, **db_array, *name; + char **buf, **db_array; + const char *name; { - u_int dummy; + size_t dummy; return (getent(buf, &dummy, db_array, -1, name, 0, NULL)); } @@ -207,13 +210,15 @@ cgetent(buf, db_array, name) */ static int getent(cap, len, db_array, fd, name, depth, nfield) - char **cap, **db_array, *name, *nfield; - u_int *len; + char **cap, **db_array, *nfield; + const char *name; + size_t *len; int fd, depth; { DB *capdbp; - register char *r_end, *rp = NULL, **db_p; /* pacify gcc */ - int myfd = 0, eof, foundit, retval, clen; + char *r_end, *rp = NULL, **db_p; /* pacify gcc */ + int myfd = 0, eof, foundit, retval; + size_t clen; char *record, *cbuf; int tc_not_resolved; char pbuf[_POSIX_PATH_MAX]; @@ -260,7 +265,7 @@ getent(cap, len, db_array, fd, name, dep */ if (fd >= 0) { - (void)lseek(fd, (off_t)0, L_SET); + (void)lseek(fd, (off_t)0, SEEK_SET); } else { (void)snprintf(pbuf, sizeof(pbuf), "%s.db", *db_p); if ((capdbp = dbopen(pbuf, O_RDONLY, 0, DB_HASH, 0)) @@ -275,7 +280,7 @@ getent(cap, len, db_array, fd, name, dep /* save the data; close frees it */ clen = strlen(record); cbuf = malloc(clen + 1); - memcpy(cbuf, record, clen + 1); + memmove(cbuf, record, clen + 1); if (capdbp->close(capdbp) < 0) { free(cbuf); return (-2); @@ -297,8 +302,8 @@ getent(cap, len, db_array, fd, name, dep */ { char buf[BUFSIZ]; - register char *b_end, *bp; - register int c; + char *b_end, *bp, *cp; + int c, slash; /* * Loop invariants: @@ -307,9 +312,12 @@ getent(cap, len, db_array, fd, name, dep * Rp always points just past last character in record. * B_end always points just past last character in buf. * Bp always points at next character in buf. + * Cp remembers where the last colon was. */ b_end = buf; bp = buf; + cp = 0; + slash = 0; for (;;) { /* @@ -340,12 +348,37 @@ getent(cap, len, db_array, fd, name, dep c = *bp++; if (c == '\n') { - if (rp > record && *(rp-1) == '\\') { + if (slash) { + slash = 0; rp--; continue; } else break; } + if (slash) { + slash = 0; + cp = 0; + } + if (c == ':') { + /* + * If the field was `empty' (i.e. + * contained only white space), back up + * to the colon (eliminating the + * field). + */ + if (cp) + rp = cp; + else + cp = rp; + } else if (c == '\\') { + slash = 1; + } else if (c != ' ' && c != '\t') { + /* + * Forget where the colon was, as this + * is not an empty field. + */ + cp = 0; + } *rp++ = c; /* @@ -370,7 +403,10 @@ getent(cap, len, db_array, fd, name, dep rp = record + pos; } } - /* loop invariant let's us do this */ + /* Eliminate any white space after the last colon. */ + if (cp) + rp = cp + 1; + /* Loop invariant lets us do this. */ *rp++ = '\0'; /* @@ -408,9 +444,8 @@ getent(cap, len, db_array, fd, name, dep * references in it ... */ tc_exp: { - register char *newicap, *s; - register int newilen; - u_int ilen; + char *newicap, *s; + size_t ilen, newilen; int diff, iret, tclen; char *icap, *scan, *tc, *tcstart, *tcend; @@ -517,8 +552,8 @@ tc_exp: { * Insert tc'ed record into our record. */ s = tcstart + newilen; - bcopy(tcend, s, rp - tcend); - bcopy(newicap, tcstart, newilen); + memmove(s, tcend, (size_t)(rp - tcend)); + memmove(tcstart, newicap, newilen); rp += diff; free(icap); @@ -553,11 +588,12 @@ tc_exp: { static int cdbget(capdbp, bp, name) DB *capdbp; - char **bp, *name; + char **bp; + const char *name; { DBT key, data; - key.data = name; + key.data = (char *)name; key.size = strlen(name); for (;;) { @@ -587,9 +623,9 @@ cdbget(capdbp, bp, name) */ int cgetmatch(buf, name) - char *buf, *name; + const char *buf, *name; { - register char *np, *bp; + const char *np, *bp; /* * Start search at beginning of record. @@ -623,10 +659,6 @@ cgetmatch(buf, name) } } - - - - int cgetfirst(buf, db_array) char **buf, **db_array; @@ -659,13 +691,13 @@ cgetclose() */ int cgetnext(bp, db_array) - register char **bp; + char **bp; char **db_array; { size_t len; - int status, i, done; + int status, done; char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE]; - u_int dummy; + size_t dummy; if (dbp == NULL) dbp = db_array; @@ -681,11 +713,12 @@ cgetnext(bp, db_array) } else { line = fgetln(pfp, &len); if (line == NULL && pfp) { - (void)fclose(pfp); if (ferror(pfp)) { (void)cgetclose(); return (-1); } else { + (void)fclose(pfp); + pfp = NULL; if (*++dbp == NULL) { (void)cgetclose(); return (0); @@ -720,7 +753,6 @@ cgetnext(bp, db_array) /* * Line points to a name line. */ - i = 0; done = 0; np = nbuf; for (;;) { @@ -740,11 +772,14 @@ cgetnext(bp, db_array) } else { /* name field extends beyond the line */ line = fgetln(pfp, &len); if (line == NULL && pfp) { - (void)fclose(pfp); if (ferror(pfp)) { (void)cgetclose(); return (-1); } + (void)fclose(pfp); + pfp = NULL; + *np = '\0'; + break; } else line[len - 1] = '\0'; } @@ -785,11 +820,13 @@ cgetnext(bp, db_array) */ int cgetstr(buf, cap, str) - char *buf, *cap; + char *buf; + const char *cap; char **str; { - register u_int m_room; - register char *bp, *mp; + u_int m_room; + const char *bp; + char *mp; int len; char *mem; @@ -828,7 +865,7 @@ cgetstr(buf, cap, str) if (*bp == ':' || *bp == '\0') break; /* drop unfinished escape */ if ('0' <= *bp && *bp <= '7') { - register int n, i; + int n, i; n = 0; i = 3; /* maximum of three octal digits */ @@ -910,10 +947,13 @@ cgetstr(buf, cap, str) */ int cgetustr(buf, cap, str) - char *buf, *cap, **str; + char *buf; + const char *cap; + char **str; { - register u_int m_room; - register char *bp, *mp; + u_int m_room; + const char *bp; + char *mp; int len; char *mem; @@ -979,12 +1019,13 @@ cgetustr(buf, cap, str) */ int cgetnum(buf, cap, num) - char *buf, *cap; + char *buf; + const char *cap; long *num; { - register long n; - register int base, digit; - register char *bp; + long n; + int base, digit; + const char *bp; /* * Find numeric capability cap