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

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: 
1.1.1.2 ! misho      19: /* 
        !            20:  * This file is part of Quagga.
        !            21:  *
        !            22:  * Quagga is free software; you can redistribute it and/or modify it
        !            23:  * under the terms of the GNU General Public License as published by the
        !            24:  * Free Software Foundation; either version 2, or (at your option) any
        !            25:  * later version.
        !            26:  *
        !            27:  * Quagga is distributed in the hope that it will be useful, but
        !            28:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            29:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            30:  * General Public License for more details.
        !            31:  *
        !            32:  * You should have received a copy of the GNU General Public License
        !            33:  * along with Quagga; see the file COPYING.  If not, write to the Free
        !            34:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
        !            35:  * 02111-1307, USA.  
        !            36:  */
1.1       misho      37: 
                     38: #include <zebra.h>
                     39: 
                     40: #ifndef HAVE_SNPRINTF
                     41: /*
                     42:  * snprint() is a real basic wrapper around the standard sprintf()
                     43:  * without any bounds checking
                     44:  */
                     45: int
                     46: snprintf(char *str, size_t size, const char *format, ...)
                     47: {
                     48:   va_list args;
                     49: 
                     50:   va_start (args, format);
                     51: 
                     52:   return vsprintf (str, format, args);
                     53: }
                     54: #endif
                     55: 
                     56: #ifndef HAVE_STRLCPY
                     57: /**
                     58:  * Like strncpy but does not 0 fill the buffer and always null 
                     59:  * terminates.
                     60:  *
                     61:  * @param bufsize is the size of the destination buffer.
                     62:  *
                     63:  * @return index of the terminating byte.
                     64:  **/
                     65: size_t
                     66: strlcpy(char *d, const char *s, size_t bufsize)
                     67: {
                     68:        size_t len = strlen(s);
                     69:        size_t ret = len;
                     70:        if (bufsize > 0) {
                     71:                if (len >= bufsize)
                     72:                        len = bufsize-1;
                     73:                memcpy(d, s, len);
                     74:                d[len] = 0;
                     75:        }
                     76:        return ret;
                     77: }
                     78: #endif
                     79: 
                     80: #ifndef HAVE_STRLCAT
                     81: /**
                     82:  * Like strncat() but does not 0 fill the buffer and always null 
                     83:  * terminates.
                     84:  *
                     85:  * @param bufsize length of the buffer, which should be one more than
                     86:  * the maximum resulting string length.
                     87:  **/
                     88: size_t
                     89: strlcat(char *d, const char *s, size_t bufsize)
                     90: {
                     91:        size_t len1 = strlen(d);
                     92:        size_t len2 = strlen(s);
                     93:        size_t ret = len1 + len2;
                     94: 
                     95:        if (len1 < bufsize - 1) {
                     96:                if (len2 >= bufsize - len1)
                     97:                        len2 = bufsize - len1 - 1;
                     98:                memcpy(d+len1, s, len2);
                     99:                d[len1+len2] = 0;
                    100:        }
                    101:        return ret;
                    102: }
                    103: #endif
                    104: 
                    105: #ifndef HAVE_STRNLEN
                    106: size_t
                    107: strnlen(const char *s, size_t maxlen)
                    108: {
                    109:   const char *p;
                    110:   return (p = (const char *)memchr(s, '\0', maxlen)) ? (size_t)(p-s) : maxlen;
                    111: }
                    112: #endif
                    113: 
                    114: #ifndef HAVE_STRNDUP
                    115: char *
                    116: strndup (const char *s, size_t maxlen)
                    117: {
                    118:     size_t len = strnlen (s, maxlen);
                    119:     char *new = (char *) malloc (len + 1);
                    120: 
                    121:     if (new == NULL)
                    122:       return NULL;
                    123: 
                    124:     new[len] = '\0';
                    125:     return (char *) memcpy (new, s, len);
                    126: }
                    127: #endif

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