std-aux: extract and add _nm_strerror_r() helper
We have nm_strerror_native_r(), which is the wrapper around strerror_r() that we want to use in glib components (it also will ensure that the string is valid UTF-8). However, it's not usable from non-glib components. Move the part that abstracts strerror_r() out to libnm-std-aux as _nm_strerror_r(). The purpose is that non-glib componenent can use the thread-safe wrapper around strerror_r().
This commit is contained in:

committed by
Beniamino Galvani

parent
b53f929f40
commit
59251cae45
@@ -6,6 +6,7 @@
|
|||||||
#include "libnm-glib-aux/nm-default-glib-i18n-lib.h"
|
#include "libnm-glib-aux/nm-default-glib-i18n-lib.h"
|
||||||
|
|
||||||
#include "nm-errno.h"
|
#include "nm-errno.h"
|
||||||
|
#include "libnm-std-aux/nm-std-utils.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
@@ -100,26 +101,10 @@ nm_strerror(int nmerr)
|
|||||||
const char *
|
const char *
|
||||||
nm_strerror_native_r(int errsv, char *buf, gsize buf_size)
|
nm_strerror_native_r(int errsv, char *buf, gsize buf_size)
|
||||||
{
|
{
|
||||||
char *buf2;
|
NM_AUTO_PROTECT_ERRNO(errsv2);
|
||||||
|
const char *buf2;
|
||||||
|
|
||||||
nm_assert(buf);
|
buf2 = _nm_strerror_r(errsv, buf, buf_size);
|
||||||
nm_assert(buf_size > 0);
|
|
||||||
|
|
||||||
#if (!defined(__GLIBC__) && !defined(__UCLIBC__)) || ((_POSIX_C_SOURCE >= 200112L) && !_GNU_SOURCE)
|
|
||||||
/* XSI-compliant */
|
|
||||||
{
|
|
||||||
int errno_saved = errno;
|
|
||||||
|
|
||||||
if (strerror_r(errsv, buf, buf_size) != 0) {
|
|
||||||
g_snprintf(buf, buf_size, "Unspecified errno %d", errsv);
|
|
||||||
errno = errno_saved;
|
|
||||||
}
|
|
||||||
buf2 = buf;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* GNU-specific */
|
|
||||||
buf2 = strerror_r(errsv, buf, buf_size);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* like g_strerror(), ensure that the error message is UTF-8. */
|
/* like g_strerror(), ensure that the error message is UTF-8. */
|
||||||
if (!g_get_charset(NULL) && !g_utf8_validate(buf2, -1, NULL)) {
|
if (!g_get_charset(NULL) && !g_utf8_validate(buf2, -1, NULL)) {
|
||||||
|
@@ -92,3 +92,43 @@ out_huge:
|
|||||||
}
|
}
|
||||||
return SIZE_MAX;
|
return SIZE_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _nm_strerror_r:
|
||||||
|
* @errsv: the errno passed to strerror_r()
|
||||||
|
* @buf: the string buffer, must be non-null
|
||||||
|
* @buf_size: the size of the buffer, must be positive.
|
||||||
|
*
|
||||||
|
* A wrapper around strerror_r(). Does little else, aside clearing up the
|
||||||
|
* confusion about the different versions of the function.
|
||||||
|
*
|
||||||
|
* errno is preserved.
|
||||||
|
*
|
||||||
|
* Returns: the error string. This is either a static strong or @buf. It
|
||||||
|
* is not guaranteed to be @buf.
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
_nm_strerror_r(int errsv, char *buf, size_t buf_size)
|
||||||
|
{
|
||||||
|
NM_AUTO_PROTECT_ERRNO(errsv2);
|
||||||
|
char *buf2;
|
||||||
|
|
||||||
|
nm_assert(buf);
|
||||||
|
nm_assert(buf_size > 0);
|
||||||
|
|
||||||
|
#if (!defined(__GLIBC__) && !defined(__UCLIBC__)) || ((_POSIX_C_SOURCE >= 200112L) && !_GNU_SOURCE)
|
||||||
|
/* XSI-compliant */
|
||||||
|
if (strerror_r(errsv, buf, buf_size) != 0) {
|
||||||
|
snprintf(buf, buf_size, "Unspecified errno %d", errsv);
|
||||||
|
}
|
||||||
|
buf2 = buf;
|
||||||
|
#else
|
||||||
|
/* GNU-specific */
|
||||||
|
buf2 = strerror_r(errsv, buf, buf_size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
nm_assert(buf2);
|
||||||
|
return buf2;
|
||||||
|
}
|
||||||
|
@@ -35,4 +35,6 @@
|
|||||||
|
|
||||||
size_t nm_utils_get_next_realloc_size(bool true_realloc, size_t requested);
|
size_t nm_utils_get_next_realloc_size(bool true_realloc, size_t requested);
|
||||||
|
|
||||||
|
const char *_nm_strerror_r(int errsv, char *buf, size_t buf_size);
|
||||||
|
|
||||||
#endif /* __NM_STD_UTILS_H__ */
|
#endif /* __NM_STD_UTILS_H__ */
|
||||||
|
Reference in New Issue
Block a user