[BACK]Return to getcap.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / gen

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/gen/getcap.c between version 1.9 and 1.44

version 1.9, 1995/02/25 13:41:26 version 1.44, 2006/03/19 02:25:12
Line 15 
Line 15 
  * 2. Redistributions in binary form must reproduce the above copyright   * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the   *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.   *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software   * 3. Neither the name of the University nor the names of its contributors
  *    must display the following acknowledgement:  
  *      This product includes software developed by the University of  
  *      California, Berkeley and its contributors.  
  * 4. Neither the name of the University nor the names of its contributors  
  *    may be used to endorse or promote products derived from this software   *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.   *    without specific prior written permission.
  *   *
Line 36 
Line 32 
  * SUCH DAMAGE.   * SUCH DAMAGE.
  */   */
   
   #if HAVE_NBTOOL_CONFIG_H
   #include "nbtool_config.h"
   #endif
   
   #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)  #if defined(LIBC_SCCS) && !defined(lint)
 #if 0  #if 0
 static char sccsid[] = "@(#)getcap.c    8.3 (Berkeley) 3/25/94";  static char sccsid[] = "@(#)getcap.c    8.3 (Berkeley) 3/25/94";
 #else  #else
 static char rcsid[] = "$NetBSD$";  __RCSID("$NetBSD$");
 #endif  #endif
 #endif /* LIBC_SCCS and not lint */  #endif /* LIBC_SCCS and not lint */
   
   #ifndef SMALL
   #include "namespace.h"
   #endif
 #include <sys/types.h>  #include <sys/types.h>
   #include <sys/param.h>
   
   #include <assert.h>
 #include <ctype.h>  #include <ctype.h>
   #ifndef SMALL
 #include <db.h>  #include <db.h>
   #endif
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <limits.h>  #include <limits.h>
Line 56  static char rcsid[] = "$NetBSD$";
Line 64  static char rcsid[] = "$NetBSD$";
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
   
   #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 BFRAG           1024
 #define BSIZE           1024  #define BSIZE           1024
 #define ESC             ('[' & 037)     /* ASCII ESC */  #define ESC             ('[' & 037)     /* ASCII ESC */
Line 70  static size_t  topreclen; /* toprec leng
Line 91  static size_t  topreclen; /* toprec leng
 static char     *toprec;        /* Additional record specified by cgetset() */  static char     *toprec;        /* Additional record specified by cgetset() */
 static int       gottoprec;     /* Flag indicating retrieval of toprecord */  static int       gottoprec;     /* Flag indicating retrieval of toprecord */
   
 static int      cdbget __P((DB *, char **, char *));  #ifndef SMALL
 static int      getent __P((char **, u_int *, char **, int, char *, int, char *));  static int      cdbget(DB *, char **, const char *);
 static int      nfcmp __P((char *, char *));  #endif
   static int      getent(char **, size_t *, const char * const *, int,
       const char *, int, char *);
   static int      nfcmp(char *, char *);
   
 /*  /*
  * Cgetset() allows the addition of a user specified buffer to be added   * Cgetset() allows the addition of a user specified buffer to be added
Line 80  static int nfcmp __P((char *, char *));
Line 104  static int nfcmp __P((char *, char *));
  * virtual database. 0 is returned on success, -1 on failure.   * virtual database. 0 is returned on success, -1 on failure.
  */   */
 int  int
 cgetset(ent)  cgetset(const char *ent)
         char *ent;  
 {  {
           const char *source, *check;
           char *dest;
   
         if (ent == NULL) {          if (ent == NULL) {
                 if (toprec)                  if (toprec)
                         free(toprec);                          free(toprec);
Line 96  cgetset(ent)
Line 122  cgetset(ent)
                 return (-1);                  return (-1);
         }          }
         gottoprec = 0;          gottoprec = 0;
         (void)strcpy(toprec, ent);  
           source=ent;
           dest=toprec;
           while (*source) { /* Strip whitespace */
                   *dest++ = *source++; /* Do not check first field */
                   while (*source == ':') {
                           check=source+1;
                           while (*check && (isspace((unsigned char)*check) ||
                               (*check=='\\' && isspace((unsigned char)check[1]))))
                                   ++check;
                           if( *check == ':' )
                                   source=check;
                           else
                                   break;
   
                   }
           }
           *dest=0;
   
         return (0);          return (0);
 }  }
   
Line 114  cgetset(ent)
Line 158  cgetset(ent)
  */   */
 char *  char *
 cgetcap(buf, cap, type)  cgetcap(buf, cap, type)
         char *buf, *cap;          char *buf;
           const char *cap;
         int type;          int type;
 {  {
         register char *bp, *cp;          char *bp;
           const char *cp;
   
           _DIAGASSERT(buf != NULL);
           _DIAGASSERT(cap != NULL);
   
         bp = buf;          bp = buf;
         for (;;) {          for (;;) {
Line 165  cgetcap(buf, cap, type)
Line 214  cgetcap(buf, cap, type)
  * reference loop is detected.   * reference loop is detected.
  */   */
 int  int
 cgetent(buf, db_array, name)  cgetent(char **buf, const char * const *db_array, const char *name)
         char **buf, **db_array, *name;  
 {  {
         u_int dummy;          size_t dummy;
   
           _DIAGASSERT(buf != NULL);
           _DIAGASSERT(db_array != NULL);
           _DIAGASSERT(name != NULL);
   
         return (getent(buf, &dummy, db_array, -1, name, 0, NULL));          return (getent(buf, &dummy, db_array, -1, name, 0, NULL));
 }  }
Line 192  cgetent(buf, db_array, name)
Line 244  cgetent(buf, db_array, name)
  *        MAX_RECURSION.   *        MAX_RECURSION.
  */   */
 static int  static int
 getent(cap, len, db_array, fd, name, depth, nfield)  getent(char **cap, size_t *len, const char * const *db_array, int fd,
         char **cap, **db_array, *name, *nfield;      const char *name, int depth, char *nfield)
         u_int *len;  
         int fd, depth;  
 {  {
   #ifndef SMALL
         DB *capdbp;          DB *capdbp;
         DBT key, data;          char pbuf[MAXPATHLEN];
         register char *r_end, *rp, **db_p;          char *cbuf;
         int myfd, eof, foundit, retval, clen;          int retval;
         char *record, *cbuf;          size_t clen;
   #endif
           char *record, *newrecord;
           char *r_end, *rp = NULL;        /* pacify gcc */
           const char * const *db_p;
           int myfd = 0, eof, foundit;
         int tc_not_resolved;          int tc_not_resolved;
         char pbuf[_POSIX_PATH_MAX];  
   
           _DIAGASSERT(cap != NULL);
           _DIAGASSERT(len != NULL);
           _DIAGASSERT(db_array != NULL);
           /* fd may be -1 */
           _DIAGASSERT(name != NULL);
           /* nfield may be NULL */
   
         /*          /*
          * Return with ``loop detected'' error if we've recursed more than           * Return with ``loop detected'' error if we've recursed more than
          * MAX_RECURSION times.           * MAX_RECURSION times.
Line 220  getent(cap, len, db_array, fd, name, dep
Line 282  getent(cap, len, db_array, fd, name, dep
                         errno = ENOMEM;                          errno = ENOMEM;
                         return (-2);                          return (-2);
                 }                  }
                 (void)strcpy(record, toprec);                  (void)strcpy(record, toprec);   /* XXX: strcpy is safe */
                 myfd = 0;  
                 db_p = db_array;                  db_p = db_array;
                 rp = record + topreclen + 1;                  rp = record + topreclen + 1;
                 r_end = rp + BFRAG;                  r_end = rp + BFRAG;
Line 248  getent(cap, len, db_array, fd, name, dep
Line 309  getent(cap, len, db_array, fd, name, dep
                  */                   */
   
                 if (fd >= 0) {                  if (fd >= 0) {
                         (void)lseek(fd, (off_t)0, L_SET);                          (void)lseek(fd, (off_t)0, SEEK_SET);
                         myfd = 0;  
                 } else {                  } else {
   #ifndef SMALL
                         (void)snprintf(pbuf, sizeof(pbuf), "%s.db", *db_p);                          (void)snprintf(pbuf, sizeof(pbuf), "%s.db", *db_p);
                         if ((capdbp = dbopen(pbuf, O_RDONLY, 0, DB_HASH, 0))                          if ((capdbp = dbopen(pbuf, O_RDONLY, 0, DB_HASH, 0))
                              != NULL) {                               != NULL) {
Line 264  getent(cap, len, db_array, fd, name, dep
Line 325  getent(cap, len, db_array, fd, name, dep
                                 /* save the data; close frees it */                                  /* save the data; close frees it */
                                 clen = strlen(record);                                  clen = strlen(record);
                                 cbuf = malloc(clen + 1);                                  cbuf = malloc(clen + 1);
                                 memcpy(cbuf, record, clen + 1);                                  memmove(cbuf, record, clen + 1);
                                 if (capdbp->close(capdbp) < 0) {                                  if (capdbp->close(capdbp) < 0) {
                                           int serrno = errno;
   
                                         free(cbuf);                                          free(cbuf);
                                           errno = serrno;
                                         return (-2);                                          return (-2);
                                 }                                  }
                                 *len = clen;                                  *len = clen;
                                 *cap = cbuf;                                  *cap = cbuf;
                                 return (retval);                                  return (retval);
                         } else {                          } else
   #endif
                           {
                                 fd = open(*db_p, O_RDONLY, 0);                                  fd = open(*db_p, O_RDONLY, 0);
                                 if (fd < 0) {                                  if (fd < 0) {
                                         /* No error on unfound file. */                                          /* No error on unfound file. */
                                         if (errno == ENOENT)                                          continue;
                                                 continue;  
                                         free(record);  
                                         return (-2);  
                                 }                                  }
                                 myfd = 1;                                  myfd = 1;
                         }                          }
Line 289  getent(cap, len, db_array, fd, name, dep
Line 352  getent(cap, len, db_array, fd, name, dep
                  */                   */
                 {                  {
                 char buf[BUFSIZ];                  char buf[BUFSIZ];
                 register char *b_end, *bp;                  char *b_end, *bp, *cp;
                 register int c;                  int c, slash;
   
                 /*                  /*
                  * Loop invariants:                   * Loop invariants:
Line 299  getent(cap, len, db_array, fd, name, dep
Line 362  getent(cap, len, db_array, fd, name, dep
                  *      Rp always points just past last character in record.                   *      Rp always points just past last character in record.
                  *      B_end always points just past last character in buf.                   *      B_end always points just past last character in buf.
                  *      Bp always points at next character in buf.                   *      Bp always points at next character in buf.
                    *      Cp remembers where the last colon was.
                  */                   */
                 b_end = buf;                  b_end = buf;
                 bp = buf;                  bp = buf;
                   cp = 0;
                   slash = 0;
                 for (;;) {                  for (;;) {
   
                         /*                          /*
Line 318  getent(cap, len, db_array, fd, name, dep
Line 384  getent(cap, len, db_array, fd, name, dep
                                                 if (myfd)                                                  if (myfd)
                                                         (void)close(fd);                                                          (void)close(fd);
                                                 if (n < 0) {                                                  if (n < 0) {
                                                           int serrno = errno;
   
                                                         free(record);                                                          free(record);
                                                           errno = serrno;
                                                         return (-2);                                                          return (-2);
                                                 } else {                                                  } else {
                                                         fd = -1;                                                          fd = -1;
Line 332  getent(cap, len, db_array, fd, name, dep
Line 401  getent(cap, len, db_array, fd, name, dep
   
                                 c = *bp++;                                  c = *bp++;
                                 if (c == '\n') {                                  if (c == '\n') {
                                         if (rp > record && *(rp-1) == '\\') {                                          if (slash) {
                                                   slash = 0;
                                                 rp--;                                                  rp--;
                                                 continue;                                                  continue;
                                         } else                                          } else
                                                 break;                                                  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;                                  *rp++ = c;
   
                                 /*                                  /*
Line 351  getent(cap, len, db_array, fd, name, dep
Line 445  getent(cap, len, db_array, fd, name, dep
   
                                         pos = rp - record;                                          pos = rp - record;
                                         newsize = r_end - record + BFRAG;                                          newsize = r_end - record + BFRAG;
                                         record = realloc(record, newsize);                                          newrecord = realloc(record, newsize);
                                         if (record == NULL) {                                          if (newrecord == NULL) {
                                                 errno = ENOMEM;                                                  free(record);
                                                 if (myfd)                                                  if (myfd)
                                                         (void)close(fd);                                                          (void)close(fd);
                                                   errno = ENOMEM;
                                                 return (-2);                                                  return (-2);
                                         }                                          }
                                           record = newrecord;
                                         r_end = record + newsize;                                          r_end = record + newsize;
                                         rp = record + pos;                                          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';                          *rp++ = '\0';
   
                         /*                          /*
Line 400  getent(cap, len, db_array, fd, name, dep
Line 499  getent(cap, len, db_array, fd, name, dep
          * references in it ...           * references in it ...
          */           */
 tc_exp: {  tc_exp: {
                 register char *newicap, *s;                  char *newicap, *s;
                 register int newilen;                  size_t ilen, newilen;
                 u_int ilen;  
                 int diff, iret, tclen;                  int diff, iret, tclen;
                 char *icap, *scan, *tc, *tcstart, *tcend;                  char *icap, *scan, *tc, *tcstart, *tcend;
   
Line 491  tc_exp: {
Line 589  tc_exp: {
                                 newsize = r_end - record + diff + BFRAG;                                  newsize = r_end - record + diff + BFRAG;
                                 tcpos = tcstart - record;                                  tcpos = tcstart - record;
                                 tcposend = tcend - record;                                  tcposend = tcend - record;
                                 record = realloc(record, newsize);                                  newrecord = realloc(record, newsize);
                                 if (record == NULL) {                                  if (newrecord == NULL) {
                                         errno = ENOMEM;                                          free(record);
                                         if (myfd)                                          if (myfd)
                                                 (void)close(fd);                                                  (void)close(fd);
                                         free(icap);                                          free(icap);
                                           errno = ENOMEM;
                                         return (-2);                                          return (-2);
                                 }                                  }
                                   record = newrecord;
                                 r_end = record + newsize;                                  r_end = record + newsize;
                                 rp = record + pos;                                  rp = record + pos;
                                 tcstart = record + tcpos;                                  tcstart = record + tcpos;
Line 509  tc_exp: {
Line 609  tc_exp: {
                          * Insert tc'ed record into our record.                           * Insert tc'ed record into our record.
                          */                           */
                         s = tcstart + newilen;                          s = tcstart + newilen;
                         bcopy(tcend, s, rp - tcend);                          memmove(s, tcend,  (size_t)(rp - tcend));
                         bcopy(newicap, tcstart, newilen);                          memmove(tcstart, newicap, newilen);
                         rp += diff;                          rp += diff;
                         free(icap);                          free(icap);
   
Line 529  tc_exp: {
Line 629  tc_exp: {
         if (myfd)          if (myfd)
                 (void)close(fd);                  (void)close(fd);
         *len = rp - record - 1; /* don't count NUL */          *len = rp - record - 1; /* don't count NUL */
         if (r_end > rp)          if (r_end > rp) {
                 if ((record =                  if ((newrecord =
                      realloc(record, (size_t)(rp - record))) == NULL) {                       realloc(record, (size_t)(rp - record))) == NULL) {
                           free(record);
                         errno = ENOMEM;                          errno = ENOMEM;
                         return (-2);                          return (-2);
                 }                  }
                   record = newrecord;
           }
   
         *cap = record;          *cap = record;
         if (tc_not_resolved)          if (tc_not_resolved)
Line 542  tc_exp: {
Line 645  tc_exp: {
         return (0);          return (0);
 }  }
   
   #ifndef SMALL
 static int  static int
 cdbget(capdbp, bp, name)  cdbget(DB *capdbp, char **bp, const char *name)
         DB *capdbp;  
         char **bp, *name;  
 {  {
         DBT key, data;          DBT key;
         char *buf;          DBT data;
         int st;  
   
         key.data = name;          _DIAGASSERT(capdbp != NULL);
           _DIAGASSERT(bp != NULL);
           _DIAGASSERT(name != NULL);
   
           key.data = __UNCONST(name);
         key.size = strlen(name);          key.size = strlen(name);
   
         for (;;) {          for (;;) {
Line 574  cdbget(capdbp, bp, name)
Line 679  cdbget(capdbp, bp, name)
         *bp = (char *)data.data + 1;          *bp = (char *)data.data + 1;
         return (((char *)(data.data))[0] == TCERR ? 1 : 0);          return (((char *)(data.data))[0] == TCERR ? 1 : 0);
 }  }
   #endif
   
 /*  /*
  * Cgetmatch will return 0 if name is one of the names of the capability   * Cgetmatch will return 0 if name is one of the names of the capability
  * record buf, -1 if not.   * record buf, -1 if not.
  */   */
 int  int
 cgetmatch(buf, name)  cgetmatch(const char *buf, const char *name)
         char *buf, *name;  
 {  {
         register char *np, *bp;          const char *np, *bp;
   
           _DIAGASSERT(buf != NULL);
           _DIAGASSERT(name != NULL);
   
         /*          /*
          * Start search at beginning of record.           * Start search at beginning of record.
Line 595  cgetmatch(buf, name)
Line 703  cgetmatch(buf, name)
                  */                   */
                 np = name;                  np = name;
                 for (;;)                  for (;;)
                         if (*np == '\0')                          if (*np == '\0') {
                                 if (*bp == '|' || *bp == ':' || *bp == '\0')                                  if (*bp == '|' || *bp == ':' || *bp == '\0')
                                         return (0);                                          return (0);
                                 else                                  else
                                         break;                                          break;
                         else                          } else
                                 if (*bp++ != *np++)                                  if (*bp++ != *np++)
                                         break;                                          break;
   
                 /*                  /*
                  * Match failed, skip to next name in record.                   * Match failed, skip to next name in record.
                  */                   */
                 bp--;   /* a '|' or ':' may have stopped the match */                  if (bp > buf)
                           bp--;   /* a '|' or ':' may have stopped the match */
                   else
                           return (-1);
                 for (;;)                  for (;;)
                         if (*bp == '\0' || *bp == ':')                          if (*bp == '\0' || *bp == ':')
                                 return (-1);    /* match failed totally */                                  return (-1);    /* match failed totally */
Line 617  cgetmatch(buf, name)
Line 728  cgetmatch(buf, name)
         }          }
 }  }
   
   
   
   
   
 int  int
 cgetfirst(buf, db_array)  cgetfirst(char **buf, const char * const *db_array)
         char **buf, **db_array;  
 {  {
   
           _DIAGASSERT(buf != NULL);
           _DIAGASSERT(db_array != NULL);
   
         (void)cgetclose();          (void)cgetclose();
         return (cgetnext(buf, db_array));          return (cgetnext(buf, db_array));
 }  }
   
 static FILE *pfp;  static FILE *pfp;
 static int slash;  static int slash;
 static char **dbp;  static const char * const *dbp;
   
 int  int
 cgetclose()  cgetclose(void)
 {  {
         if (pfp != NULL) {          if (pfp != NULL) {
                 (void)fclose(pfp);                  (void)fclose(pfp);
Line 652  cgetclose()
Line 762  cgetclose()
  * upon returning an entry with more remaining, and -1 if an error occurs.   * upon returning an entry with more remaining, and -1 if an error occurs.
  */   */
 int  int
 cgetnext(bp, db_array)  cgetnext(char **bp, const char * const *db_array)
         register char **bp;  
         char **db_array;  
 {  {
         size_t len;          size_t len = 0;
         int status, i, done;          int status, done;
         char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE];          char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE];
         u_int dummy;          size_t dummy;
   
           _DIAGASSERT(bp != NULL);
           _DIAGASSERT(db_array != NULL);
   
         if (dbp == NULL)          if (dbp == NULL)
                 dbp = db_array;                  dbp = db_array;
Line 674  cgetnext(bp, db_array)
Line 785  cgetnext(bp, db_array)
                         line = toprec;                          line = toprec;
                 } else {                  } else {
                         line = fgetln(pfp, &len);                          line = fgetln(pfp, &len);
                         if (line == NULL && pfp) {                          if (line == NULL) {
                                 (void)fclose(pfp);                                  if (pfp == NULL)
                                           return -1;
                                 if (ferror(pfp)) {                                  if (ferror(pfp)) {
                                         (void)cgetclose();                                          (void)cgetclose();
                                         return (-1);                                          return (-1);
                                 } else {                                  } else {
                                           (void)fclose(pfp);
                                           pfp = NULL;
                                         if (*++dbp == NULL) {                                          if (*++dbp == NULL) {
                                                 (void)cgetclose();                                                  (void)cgetclose();
                                                 return (0);                                                  return (0);
Line 696  cgetnext(bp, db_array)
Line 810  cgetnext(bp, db_array)
                                 slash = 0;                                  slash = 0;
                                 continue;                                  continue;
                         }                          }
                         if (isspace(*line) ||                          if (isspace((unsigned char)*line) ||
                             *line == ':' || *line == '#' || slash) {                              *line == ':' || *line == '#' || slash) {
                                 if (line[len - 2] == '\\')                                  if (line[len - 2] == '\\')
                                         slash = 1;                                          slash = 1;
Line 714  cgetnext(bp, db_array)
Line 828  cgetnext(bp, db_array)
                 /*                  /*
                  * Line points to a name line.                   * Line points to a name line.
                  */                   */
                 i = 0;                  if (len > sizeof(nbuf))
                           return -1;
                 done = 0;                  done = 0;
                 np = nbuf;                  np = nbuf;
                 for (;;) {                  for (;;) {
Line 734  cgetnext(bp, db_array)
Line 849  cgetnext(bp, db_array)
                         } else { /* name field extends beyond the line */                          } else { /* name field extends beyond the line */
                                 line = fgetln(pfp, &len);                                  line = fgetln(pfp, &len);
                                 if (line == NULL && pfp) {                                  if (line == NULL && pfp) {
                                         (void)fclose(pfp);  
                                         if (ferror(pfp)) {                                          if (ferror(pfp)) {
                                                 (void)cgetclose();                                                  (void)cgetclose();
                                                 return (-1);                                                  return (-1);
                                         }                                          }
                                           (void)fclose(pfp);
                                           pfp = NULL;
                                           *np = '\0';
                                           break;
                                 } else                                  } else
                                         line[len - 1] = '\0';                                          line[len - 1] = '\0';
                         }                          }
                 }                  }
                   if (len > sizeof(buf))
                           return -1;
                 rp = buf;                  rp = buf;
                 for(cp = nbuf; *cp != NULL; cp++)                  for(cp = nbuf; *cp != '\0'; cp++)
                         if (*cp == '|' || *cp == ':')                          if (*cp == '|' || *cp == ':')
                                 break;                                  break;
                         else                          else
Line 778  cgetnext(bp, db_array)
Line 898  cgetnext(bp, db_array)
  * allocation failure).   * allocation failure).
  */   */
 int  int
 cgetstr(buf, cap, str)  cgetstr(char *buf, const char *cap, char **str)
         char *buf, *cap;  
         char **str;  
 {  {
         register u_int m_room;          u_int m_room;
         register char *bp, *mp;          const char *bp;
           char *mp;
         int len;          int len;
         char *mem;          char *mem, *newmem;
   
           _DIAGASSERT(buf != NULL);
           _DIAGASSERT(cap != NULL);
           _DIAGASSERT(str != NULL);
   
         /*          /*
          * Find string capability cap           * Find string capability cap
Line 822  cgetstr(buf, cap, str)
Line 945  cgetstr(buf, cap, str)
                         if (*bp == ':' || *bp == '\0')                          if (*bp == ':' || *bp == '\0')
                                 break;  /* drop unfinished escape */                                  break;  /* drop unfinished escape */
                         if ('0' <= *bp && *bp <= '7') {                          if ('0' <= *bp && *bp <= '7') {
                                 register int n, i;                                  int n, i;
   
                                 n = 0;                                  n = 0;
                                 i = 3;  /* maximum of three octal digits */                                  i = 3;  /* maximum of three octal digits */
Line 872  cgetstr(buf, cap, str)
Line 995  cgetstr(buf, cap, str)
                 if (m_room == 0) {                  if (m_room == 0) {
                         size_t size = mp - mem;                          size_t size = mp - mem;
   
                         if ((mem = realloc(mem, size + SFRAG)) == NULL)                          if ((newmem = realloc(mem, size + SFRAG)) == NULL) {
                                   free(mem);
                                 return (-2);                                  return (-2);
                           }
                           mem = newmem;
                         m_room = SFRAG;                          m_room = SFRAG;
                         mp = mem + size;                          mp = mem + size;
                 }                  }
Line 885  cgetstr(buf, cap, str)
Line 1011  cgetstr(buf, cap, str)
         /*          /*
          * Give back any extra memory and return value and success.           * Give back any extra memory and return value and success.
          */           */
         if (m_room != 0)          if (m_room != 0) {
                 if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL)                  if ((newmem = realloc(mem, (size_t)(mp - mem))) == NULL) {
                           free(mem);
                         return (-2);                          return (-2);
                   }
                   mem = newmem;
           }
         *str = mem;          *str = mem;
         return (len);          return (len);
 }  }
Line 903  cgetstr(buf, cap, str)
Line 1033  cgetstr(buf, cap, str)
  * error was encountered (storage allocation failure).   * error was encountered (storage allocation failure).
  */   */
 int  int
 cgetustr(buf, cap, str)  cgetustr(char *buf, const char *cap, char **str)
         char *buf, *cap, **str;  
 {  {
         register u_int m_room;          u_int m_room;
         register char *bp, *mp;          const char *bp;
           char *mp;
         int len;          int len;
         char *mem;          char *mem, *newmem;
   
           _DIAGASSERT(buf != NULL);
           _DIAGASSERT(cap != NULL);
           _DIAGASSERT(str != NULL);
   
         /*          /*
          * Find string capability cap           * Find string capability cap
Line 945  cgetustr(buf, cap, str)
Line 1079  cgetustr(buf, cap, str)
                 if (m_room == 0) {                  if (m_room == 0) {
                         size_t size = mp - mem;                          size_t size = mp - mem;
   
                         if ((mem = realloc(mem, size + SFRAG)) == NULL)                          if ((newmem = realloc(mem, size + SFRAG)) == NULL) {
                                   free(mem);
                                 return (-2);                                  return (-2);
                           }
                           mem = newmem;
                         m_room = SFRAG;                          m_room = SFRAG;
                         mp = mem + size;                          mp = mem + size;
                 }                  }
Line 958  cgetustr(buf, cap, str)
Line 1095  cgetustr(buf, cap, str)
         /*          /*
          * Give back any extra memory and return value and success.           * Give back any extra memory and return value and success.
          */           */
         if (m_room != 0)          if (m_room != 0) {
                 if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL)                  if ((newmem = realloc(mem, (size_t)(mp - mem))) == NULL) {
                           free(mem);
                         return (-2);                          return (-2);
                   }
                   mem = newmem;
           }
         *str = mem;          *str = mem;
         return (len);          return (len);
 }  }
Line 972  cgetustr(buf, cap, str)
Line 1113  cgetustr(buf, cap, str)
  * numeric capability couldn't be found.   * numeric capability couldn't be found.
  */   */
 int  int
 cgetnum(buf, cap, num)  cgetnum(char *buf, const char *cap, long *num)
         char *buf, *cap;  
         long *num;  
 {  {
         register long n;          long n;
         register int base, digit;          int base, digit;
         register char *bp;          const char *bp;
   
           _DIAGASSERT(buf != NULL);
           _DIAGASSERT(cap != NULL);
           _DIAGASSERT(num != NULL);
   
         /*          /*
          * Find numeric capability cap           * Find numeric capability cap
Line 1036  cgetnum(buf, cap, num)
Line 1179  cgetnum(buf, cap, num)
  * Compare name field of record.   * Compare name field of record.
  */   */
 static int  static int
 nfcmp(nf, rec)  nfcmp(char *nf, char *rec)
         char *nf, *rec;  
 {  {
         char *cp, tmp;          char *cp, tmp;
         int ret;          int ret;
   
           _DIAGASSERT(nf != NULL);
           _DIAGASSERT(rec != NULL);
   
         for (cp = rec; *cp != ':'; cp++)          for (cp = rec; *cp != ':'; cp++)
                 ;                  ;
   

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.44

CVSweb <webmaster@jp.NetBSD.org>