/*****************************************************************************\ ** ** ** PBX4Linux ** ** ** **---------------------------------------------------------------------------** ** Copyright: Andreas Eversberg ** ** ** ** Macros to do save string operations to avoid buffer overflows. ** ** ** \*****************************************************************************/ /* save strcpy/strncpy */ #define SCPY(dst, src) scpy(dst, src, sizeof(dst)) extern __inline__ void scpy(char *dst, char *src, unsigned int siz) { strncpy(dst, src, siz); dst[siz-1] = '\0'; } /* save strcat/strncat */ #define SCAT(dst, src) scat(dst, src, sizeof(dst)) extern __inline__ void scat(char *dst, char *src, unsigned int siz) { strncat(dst, src, siz); dst[siz-1] = '\0'; } /* save concat of a byte */ #define SCCAT(dst, src) sccat(dst, src, sizeof(dst)) extern __inline__ void sccat(char *dst, char chr, unsigned int siz) { if (strlen(dst) < siz-1) { dst[strlen(dst)+1] = '\0'; dst[strlen(dst)] = chr; } } /* save sprintf/snprintf */ #define SPRINT(dst, fmt, arg...) sprint(dst, sizeof(dst), fmt, ## arg) extern __inline__ void sprint(char *dst, unsigned int siz, char *fmt, ...) { va_list args; va_start(args, fmt); vsnprintf(dst, siz, fmt, args); dst[siz-1] = '\0'; va_end(args); } /* unsave */ #define UCPY strcpy #define UNCPY strncpy #define UCAT strcat #define UNCAT strncat #define UPRINT sprintf #define UNPRINT snprintf #define VUNPRINT vsnprintf