diff --git a/evutil.c b/evutil.c index e6bf625e..77aef40d 100644 --- a/evutil.c +++ b/evutil.c @@ -52,6 +52,7 @@ #if defined WIN32 && !defined(HAVE_GETTIMEOFDAY_H) #include #endif +#include #include "evutil.h" #include "log.h" @@ -214,3 +215,31 @@ evutil_gettimeofday(struct timeval *tv, struct timezone *tz) return 0; } #endif + +int +evutil_snprintf(char *buf, size_t buflen, const char *format, ...) +{ + int r; + va_list ap; + va_start(ap, format); + r = evutil_vsnprintf(buf, buflen, format, ap); + va_end(ap); + return r; +} + +int +evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap) +{ +#ifdef _MSC_VER + int r = _vsnprintf(buf, buflen, format, ap); + buf[buflen-1] = '\0'; + if (r >= 0) + return r; + else + return _vscprintf(format, ap); +#else + int r = vsnprintf(buf, buflen, format, ap); + buf[buflen-1] = '\0'; + return r; +#endif +} diff --git a/evutil.h b/evutil.h index c80a7135..28a30258 100644 --- a/evutil.h +++ b/evutil.h @@ -170,6 +170,13 @@ ev_int64_t evutil_strtoll(const char *s, char **endptr, int base); int evutil_gettimeofday(struct timeval *tv, struct timezone *tz); #endif +int evutil_snprintf(char *buf, size_t buflen, const char *format, ...) +#ifdef __GNUC__ + __attribute__((format(printf, 3, 4))) +#endif + ; +int evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap); + #ifdef __cplusplus } #endif diff --git a/log.c b/log.c index 07783e51..45db8a91 100644 --- a/log.c +++ b/log.c @@ -60,42 +60,12 @@ #include "event.h" #include "log.h" +#include "evutil.h" static void _warn_helper(int severity, int log_errno, const char *fmt, va_list ap); static void event_log(int severity, const char *msg); -static int -event_vsnprintf(char *str, size_t size, const char *format, va_list args) -{ - int r; - if (size == 0) - return -1; -#ifdef WIN32 - r = _vsnprintf(str, size, format, args); -#else - r = vsnprintf(str, size, format, args); -#endif - str[size-1] = '\0'; - if (r < 0 || ((size_t)r) >= size) { - /* different platforms behave differently on overflow; - * handle both kinds. */ - return -1; - } - return r; -} - -static int -event_snprintf(char *str, size_t size, const char *format, ...) -{ - va_list ap; - int r; - va_start(ap, format); - r = event_vsnprintf(str, size, format, ap); - va_end(ap); - return r; -} - void event_err(int eval, const char *fmt, ...) { @@ -172,7 +142,7 @@ _warn_helper(int severity, int log_errno, const char *fmt, va_list ap) if (log_errno >= 0) { len = strlen(buf); if (len < sizeof(buf) - 3) { - event_snprintf(buf + len, sizeof(buf) - len, ": %s", + evutil_snprintf(buf + len, sizeof(buf) - len, ": %s", strerror(log_errno)); } }