diff --git a/include/maxscale/log_manager.h b/include/maxscale/log_manager.h index a3a2ea896..329155dc7 100644 --- a/include/maxscale/log_manager.h +++ b/include/maxscale/log_manager.h @@ -196,4 +196,21 @@ enum trailing NULL. If longer, it will be cut. */ }; +/** + * Return a thread specific pointer to a string describing the error + * code passed as argument. The string is obtained using strerror_r. + * + * @param error One of the errno error codes. + * + * @return Thread specific pointer to string describing the error code. + * + * @attention The function is thread safe, but not re-entrant. That is, + * calling it twice with different error codes between two sequence points + * will not work. E.g: + * + * printf("EINVAL = %s, EACCESS = %s", + * mxs_strerror(EINVAL), mxs_strerror(EACCESS)); + */ +const char* mxs_strerror(int error); + MXS_END_DECLS diff --git a/server/core/log_manager.cc b/server/core/log_manager.cc index 053444db5..b106c4fba 100644 --- a/server/core/log_manager.cc +++ b/server/core/log_manager.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -3011,3 +3012,10 @@ int mxs_log_message(int priority, return err; } + +const char* mxs_strerror(int error) +{ + static thread_local char errbuf[MXS_STRERROR_BUFLEN]; + + return strerror_r(error, errbuf, sizeof(errbuf)); +}