Annotation of embedaddon/quagga/lib/str.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * zebra string function
                      3:  *
                      4:  * XXX This version of snprintf does not check bounds!
                      5:  */
                      6: 
                      7: /*
                      8:  The implementations of strlcpy and strlcat are copied from rsync (GPL):
                      9:     Copyright (C) Andrew Tridgell 1998
                     10:     Copyright (C) 2002 by Martin Pool
                     11: 
                     12:  Note that these are not terribly efficient, since they make more than one
                     13:  pass over the argument strings.  At some point, they should be optimized.
                     14:  
                     15:  The implementation of strndup is copied from glibc-2.3.5:
                     16:     Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
                     17: */
                     18: 
                     19: 
                     20: #include <zebra.h>
                     21: 
                     22: #ifndef HAVE_SNPRINTF
                     23: /*
                     24:  * snprint() is a real basic wrapper around the standard sprintf()
                     25:  * without any bounds checking
                     26:  */
                     27: int
                     28: snprintf(char *str, size_t size, const char *format, ...)
                     29: {
                     30:   va_list args;
                     31: 
                     32:   va_start (args, format);
                     33: 
                     34:   return vsprintf (str, format, args);
                     35: }
                     36: #endif
                     37: 
                     38: #ifndef HAVE_STRLCPY
                     39: /**
                     40:  * Like strncpy but does not 0 fill the buffer and always null 
                     41:  * terminates.
                     42:  *
                     43:  * @param bufsize is the size of the destination buffer.
                     44:  *
                     45:  * @return index of the terminating byte.
                     46:  **/
                     47: size_t
                     48: strlcpy(char *d, const char *s, size_t bufsize)
                     49: {
                     50:        size_t len = strlen(s);
                     51:        size_t ret = len;
                     52:        if (bufsize > 0) {
                     53:                if (len >= bufsize)
                     54:                        len = bufsize-1;
                     55:                memcpy(d, s, len);
                     56:                d[len] = 0;
                     57:        }
                     58:        return ret;
                     59: }
                     60: #endif
                     61: 
                     62: #ifndef HAVE_STRLCAT
                     63: /**
                     64:  * Like strncat() but does not 0 fill the buffer and always null 
                     65:  * terminates.
                     66:  *
                     67:  * @param bufsize length of the buffer, which should be one more than
                     68:  * the maximum resulting string length.
                     69:  **/
                     70: size_t
                     71: strlcat(char *d, const char *s, size_t bufsize)
                     72: {
                     73:        size_t len1 = strlen(d);
                     74:        size_t len2 = strlen(s);
                     75:        size_t ret = len1 + len2;
                     76: 
                     77:        if (len1 < bufsize - 1) {
                     78:                if (len2 >= bufsize - len1)
                     79:                        len2 = bufsize - len1 - 1;
                     80:                memcpy(d+len1, s, len2);
                     81:                d[len1+len2] = 0;
                     82:        }
                     83:        return ret;
                     84: }
                     85: #endif
                     86: 
                     87: #ifndef HAVE_STRNLEN
                     88: size_t
                     89: strnlen(const char *s, size_t maxlen)
                     90: {
                     91:   const char *p;
                     92:   return (p = (const char *)memchr(s, '\0', maxlen)) ? (size_t)(p-s) : maxlen;
                     93: }
                     94: #endif
                     95: 
                     96: #ifndef HAVE_STRNDUP
                     97: char *
                     98: strndup (const char *s, size_t maxlen)
                     99: {
                    100:     size_t len = strnlen (s, maxlen);
                    101:     char *new = (char *) malloc (len + 1);
                    102: 
                    103:     if (new == NULL)
                    104:       return NULL;
                    105: 
                    106:     new[len] = '\0';
                    107:     return (char *) memcpy (new, s, len);
                    108: }
                    109: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>