Annotation of embedaddon/quagga/lib/str.c, revision 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>