// SPDX-License-Identifier: GPL-2.01#undef _GNU_SOURCE2#include <string.h>3#include <stdio.h>4#include <linux/string.h>56/*7* The tools so far have been using the strerror_r() GNU variant, that returns8* a string, be it the buffer passed or something else.9*10* But that, besides being tricky in cases where we expect that the function11* using strerror_r() returns the error formatted in a provided buffer (we have12* to check if it returned something else and copy that instead), breaks the13* build on systems not using glibc, like Alpine Linux, where musl libc is14* used.15*16* So, introduce yet another wrapper, str_error_r(), that has the GNU17* interface, but uses the portable XSI variant of strerror_r(), so that users18* rest asured that the provided buffer is used and it is what is returned.19*/20char *str_error_r(int errnum, char *buf, size_t buflen)21{22int err = strerror_r(errnum, buf, buflen);23if (err)24snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, [buf], %zd)=%d", errnum, buflen, err);25return buf;26}272829