diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index 226e230cee89e803f51dbad6abaf13c8096c28f2..5668b316e499188c82bece0a41e46a533512ba85 100755 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -9,18 +9,20 @@ * the GNU General Public License */ -#ifndef _ASTERISK_UTIL_H -#define _ASTERISK_UTIL_H +#ifndef _ASTERISK_UTILS_H +#define _ASTERISK_UTILS_H #ifdef SOLARIS #include <solaris-compat/compat.h> #endif + #include <netinet/in.h> #include <netdb.h> #include <pthread.h> -#include "asterisk/lock.h" #include <limits.h> +#include "asterisk/lock.h" + /* Note: It is very important to use only unsigned variables to hold bit flags, as otherwise you can fall prey to the compiler's @@ -166,10 +168,33 @@ struct ast_realloca { #define AST_STACKSIZE 256 * 1024 #define ast_pthread_create(a,b,c,d) ast_pthread_create_stack(a,b,c,d,0) +extern int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize); + #ifdef __linux__ #define ast_strcasestr strcasestr #else extern char *ast_strcasestr(const char *, const char *); #endif /* __linux__ */ -extern int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize); + +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) +#define __builtin_expect(exp, c) (exp) #endif + +/*! + \brief Size-limited null-terminating string copy. + \param dst The destination buffer. + \param src The source string + \param size The size of the destination buffer + + This is similar to \a strncpy, with two important differences: + - the destination buffer will \b always be null-terminated + - the destination buffer is not filled with zeros past the copied string length + These differences make it slightly more efficient, and safer to use since it will + not leave the destination buffer unterminated. There is no need to pass an artificially + reduced buffer size to this function (unlike \a strncpy), and the buffer does not need + to be initialized to zeroes prior to calling this function. + No return value. +*/ +void ast_copy_string(char *dst, const char *src, size_t size); + +#endif /* _ASTERISK_UTILS_H */ diff --git a/utils.c b/utils.c index 742b4872e1656d41b06f7d87a0f6e34dbfd8cbe0..b73e4fcdbc2a96758fde7bb0e5551175b34ee237 100755 --- a/utils.c +++ b/utils.c @@ -418,6 +418,15 @@ int ast_wait_for_input(int fd, int ms) return poll(pfd, 1, ms); } +void ast_copy_string(char *dst, const char *src, size_t size) +{ + while (*src && size--) + *dst++ = *src++; + if (__builtin_expect(!size, 0)) + dst--; + *dst = '\0'; +} + /* Case-insensitive substring matching */ #ifndef LINUX static char *upper(const char *orig, char *buf, int bufsize)