diff --git a/include/re_fmt.h b/include/re_fmt.h index 8c80bdd..8fe2b73 100644 --- a/include/re_fmt.h +++ b/include/re_fmt.h @@ -107,6 +107,8 @@ void str_ncpy(char *dst, const char *src, size_t n); int str_dup(char **dst, const char *src); int str_casecmp(const char *s1, const char *s2); size_t str_len(const char *s); +const char *str_error(int errnum, char *buf, size_t sz); + /** * Check if string is set diff --git a/src/fmt/mod.mk b/src/fmt/mod.mk index b362c29..92b5650 100644 --- a/src/fmt/mod.mk +++ b/src/fmt/mod.mk @@ -11,4 +11,5 @@ SRCS += fmt/print.c SRCS += fmt/prm.c SRCS += fmt/regex.c SRCS += fmt/str.c +SRCS += fmt/str_error.c SRCS += fmt/time.c diff --git a/src/fmt/print.c b/src/fmt/print.c index 26b869b..a7936e7 100644 --- a/src/fmt/print.c +++ b/src/fmt/print.c @@ -3,8 +3,6 @@ * * Copyright (C) 2010 Creytiv.com */ -#define _GNU_SOURCE 1 -#define __EXTENSIONS__ 1 #include #include #include @@ -315,11 +313,9 @@ int re_vhprintf(const char *fmt, va_list ap, re_vprintf_h *vph, void *arg) break; case 'm': - (void)strerror_r(va_arg(ap, int), addr, sizeof(addr)); - addr[sizeof(addr)-1] = '\0'; - - err |= write_padded(addr, strlen(addr), pad, ' ', - plr, NULL, vph, arg); + str = str_error(va_arg(ap, int), addr, sizeof(addr)); + err |= write_padded(str, str_len(str), pad, + ' ', plr, NULL, vph, arg); break; case 'p': diff --git a/src/fmt/str_error.c b/src/fmt/str_error.c new file mode 100644 index 0000000..c417052 --- /dev/null +++ b/src/fmt/str_error.c @@ -0,0 +1,39 @@ +/** + * @file str_error.c System error messages + * + * Copyright (C) 2010 Creytiv.com + */ +#define _GNU_SOURCE 1 +#define __EXTENSIONS__ 1 +#include +#include +#include + + +/** + * Look up an error message string corresponding to an error number. + * + * @param errnum Error Code + * @param buf Buffer for storing error message + * @param sz Buffer size + * + * @return Error message string + */ +const char *str_error(int errnum, char *buf, size_t sz) +{ + const char *s; + + if (!buf || !sz) + return NULL; + + buf[0] = '\0'; +#ifdef LINUX + s = strerror_r(errnum, buf, sz); +#else + (void)strerror_r(errnum, buf, sz); + s = buf; +#endif + buf[sz - 1] = '\0'; + + return s; +}