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.3 retrieving revision 1.18 diff -u -p -r1.3 -r1.18 --- src/lib/libc/gen/getcap.c 1993/07/30 08:22:19 1.3 +++ src/lib/libc/gen/getcap.c 1998/03/02 23:39:49 1.18 @@ -1,6 +1,8 @@ +/* $NetBSD: getcap.c,v 1.18 1998/03/02 23:39:49 thorpej Exp $ */ + /*- - * Copyright (c) 1992 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Casey Leedom of Lawrence Livermore National Laboratory. @@ -34,13 +36,17 @@ * SUCH DAMAGE. */ +#include #if defined(LIBC_SCCS) && !defined(lint) -/*static char sccsid[] = "from: @(#)getcap.c 5.15 (Berkeley) 3/19/93";*/ -static char rcsid[] = "$Id: getcap.c,v 1.3 1993/07/30 08:22:19 mycroft Exp $"; +#if 0 +static char sccsid[] = "@(#)getcap.c 8.3 (Berkeley) 3/25/94"; +#else +__RCSID("$NetBSD: getcap.c,v 1.18 1998/03/02 23:39:49 thorpej Exp $"); +#endif #endif /* LIBC_SCCS and not lint */ +#include "namespace.h" #include - #include #include #include @@ -51,6 +57,19 @@ static char rcsid[] = "$Id: getcap.c,v 1 #include #include +#ifdef __weak_alias +__weak_alias(cgetcap,_cgetcap); +__weak_alias(cgetclose,_cgetclose); +__weak_alias(cgetent,_cgetent); +__weak_alias(cgetfirst,_cgetfirst); +__weak_alias(cgetmatch,_cgetmatch); +__weak_alias(cgetnext,_cgetnext); +__weak_alias(cgetnum,_cgetnum); +__weak_alias(cgetset,_cgetset); +__weak_alias(cgetstr,_cgetstr); +__weak_alias(cgetustr,_cgetustr); +#endif + #define BFRAG 1024 #define BSIZE 1024 #define ESC ('[' & 037) /* ASCII ESC */ @@ -66,7 +85,7 @@ static char *toprec; /* Additional recor 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 getent __P((char **, size_t *, char **, int, char *, int, char *)); static int nfcmp __P((char *, char *)); /* @@ -91,7 +110,7 @@ cgetset(ent) return (-1); } gottoprec = 0; - (void)strcpy(toprec, ent); + (void)strcpy(toprec, ent); /* XXX: strcpy is safe */ return (0); } @@ -112,7 +131,7 @@ cgetcap(buf, cap, type) char *buf, *cap; int type; { - register char *bp, *cp; + char *bp, *cp; bp = buf; for (;;) { @@ -163,7 +182,7 @@ int cgetent(buf, db_array, name) char **buf, **db_array, *name; { - u_int dummy; + size_t dummy; return (getent(buf, &dummy, db_array, -1, name, 0, NULL)); } @@ -189,14 +208,14 @@ 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; + size_t *len; int fd, depth; { DB *capdbp; - DBT key, data; - register char *r_end, *rp, **db_p; - int myfd, eof, foundit, retval; - char *record; + 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]; @@ -215,8 +234,7 @@ getent(cap, len, db_array, fd, name, dep errno = ENOMEM; return (-2); } - (void)strcpy(record, toprec); - myfd = 0; + (void)strcpy(record, toprec); /* XXX: strcpy is safe */ db_p = db_array; rp = record + topreclen + 1; r_end = rp + BFRAG; @@ -243,28 +261,34 @@ getent(cap, len, db_array, fd, name, dep */ if (fd >= 0) { - (void)lseek(fd, (off_t)0, L_SET); - myfd = 0; + (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)) != NULL) { free(record); retval = cdbget(capdbp, &record, name); - if (capdbp->close(capdbp) < 0) + if (retval < 0) { + /* no record available */ + (void)capdbp->close(capdbp); + return (retval); + } + /* save the data; close frees it */ + clen = strlen(record); + cbuf = malloc(clen + 1); + memcpy(cbuf, record, clen + 1); + if (capdbp->close(capdbp) < 0) { + free(cbuf); return (-2); - *len = strlen(record); - *cap = malloc(*len + 1); - memmove(*cap, record, *len + 1); + } + *len = clen; + *cap = cbuf; return (retval); } else { fd = open(*db_p, O_RDONLY, 0); if (fd < 0) { /* No error on unfound file. */ - if (errno == ENOENT) - continue; - free(record); - return (-2); + continue; } myfd = 1; } @@ -274,8 +298,8 @@ getent(cap, len, db_array, fd, name, dep */ { char buf[BUFSIZ]; - register char *b_end, *bp; - register int c; + char *b_end, *bp; + int c; /* * Loop invariants: @@ -385,9 +409,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; @@ -494,7 +517,7 @@ tc_exp: { * Insert tc'ed record into our record. */ s = tcstart + newilen; - bcopy(tcend, s, rp - tcend); + bcopy(tcend, s, (size_t)(rp - tcend)); bcopy(newicap, tcstart, newilen); rp += diff; free(icap); @@ -533,8 +556,6 @@ cdbget(capdbp, bp, name) char **bp, *name; { DBT key, data; - char *buf; - int st; key.data = name; key.size = strlen(name); @@ -568,7 +589,7 @@ int cgetmatch(buf, name) char *buf, *name; { - register char *np, *bp; + char *np, *bp; /* * Start search at beginning of record. @@ -638,13 +659,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; @@ -658,7 +679,7 @@ cgetnext(bp, db_array) gottoprec = 1; line = toprec; } else { - line = fgetline(pfp, &len); + line = fgetln(pfp, &len); if (line == NULL && pfp) { (void)fclose(pfp); if (ferror(pfp)) { @@ -675,20 +696,21 @@ cgetnext(bp, db_array) } else continue; } - } - if (len == 0) { + } else + line[len - 1] = '\0'; + if (len == 1) { slash = 0; continue; } if (isspace(*line) || *line == ':' || *line == '#' || slash) { - if (line[len - 1] == '\\') + if (line[len - 2] == '\\') slash = 1; else slash = 0; continue; } - if (line[len - 1] == '\\') + if (line[len - 2] == '\\') slash = 1; else slash = 0; @@ -698,7 +720,6 @@ cgetnext(bp, db_array) /* * Line points to a name line. */ - i = 0; done = 0; np = nbuf; for (;;) { @@ -716,18 +737,19 @@ cgetnext(bp, db_array) *np = '\0'; break; } else { /* name field extends beyond the line */ - line = fgetline(pfp, &len); + line = fgetln(pfp, &len); if (line == NULL && pfp) { (void)fclose(pfp); if (ferror(pfp)) { (void)cgetclose(); return (-1); } - } + } else + line[len - 1] = '\0'; } } rp = buf; - for(cp = nbuf; *cp != NULL; cp++) + for(cp = nbuf; *cp != '\0'; cp++) if (*cp == '|' || *cp == ':') break; else @@ -765,8 +787,8 @@ cgetstr(buf, cap, str) char *buf, *cap; char **str; { - register u_int m_room; - register char *bp, *mp; + u_int m_room; + char *bp, *mp; int len; char *mem; @@ -805,7 +827,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 */ @@ -889,8 +911,8 @@ int cgetustr(buf, cap, str) char *buf, *cap, **str; { - register u_int m_room; - register char *bp, *mp; + u_int m_room; + char *bp, *mp; int len; char *mem; @@ -959,9 +981,9 @@ cgetnum(buf, cap, num) char *buf, *cap; long *num; { - register long n; - register int base, digit; - register char *bp; + long n; + int base, digit; + char *bp; /* * Find numeric capability cap