Blame strerror_override.c

Packit ea8578
#define STRERROR_OVERRIDE_IMPL 1
Packit ea8578
#include "strerror_override.h"
Packit ea8578
Packit ea8578
/*
Packit ea8578
 * Override strerror() to get consistent output across platforms.
Packit ea8578
 */
Packit ea8578
Packit ea8578
static struct {
Packit ea8578
	int errno_value;
Packit ea8578
	const char *errno_str;
Packit ea8578
} errno_list[] = {
Packit ea8578
#define STRINGIFY(x) #x
Packit ea8578
#define ENTRY(x) {x, &STRINGIFY(undef_ ## x)[6]}
Packit ea8578
	ENTRY(EPERM),
Packit ea8578
	ENTRY(ENOENT),
Packit ea8578
	ENTRY(ESRCH),
Packit ea8578
	ENTRY(EINTR),
Packit ea8578
	ENTRY(EIO),
Packit ea8578
	ENTRY(ENXIO),
Packit ea8578
	ENTRY(E2BIG),
Packit ea8578
	ENTRY(ENOEXEC),
Packit ea8578
	ENTRY(EBADF),
Packit ea8578
	ENTRY(ECHILD),
Packit ea8578
	ENTRY(EDEADLK),
Packit ea8578
	ENTRY(ENOMEM),
Packit ea8578
	ENTRY(EACCES),
Packit ea8578
	ENTRY(EFAULT),
Packit ea8578
#ifdef ENOTBLK
Packit ea8578
	ENTRY(ENOTBLK),
Packit ea8578
#endif
Packit ea8578
	ENTRY(EBUSY),
Packit ea8578
	ENTRY(EEXIST),
Packit ea8578
	ENTRY(EXDEV),
Packit ea8578
	ENTRY(ENODEV),
Packit ea8578
	ENTRY(ENOTDIR),
Packit ea8578
	ENTRY(EISDIR),
Packit ea8578
	ENTRY(EINVAL),
Packit ea8578
	ENTRY(ENFILE),
Packit ea8578
	ENTRY(EMFILE),
Packit ea8578
	ENTRY(ENOTTY),
Packit ea8578
#ifdef ETXTBSY
Packit ea8578
	ENTRY(ETXTBSY),
Packit ea8578
#endif
Packit ea8578
	ENTRY(EFBIG),
Packit ea8578
	ENTRY(ENOSPC),
Packit ea8578
	ENTRY(ESPIPE),
Packit ea8578
	ENTRY(EROFS),
Packit ea8578
	ENTRY(EMLINK),
Packit ea8578
	ENTRY(EPIPE),
Packit ea8578
	ENTRY(EDOM),
Packit ea8578
	ENTRY(ERANGE),
Packit ea8578
	ENTRY(EAGAIN),
Packit ea8578
	{ 0, (char *)0 }
Packit ea8578
};
Packit ea8578
Packit ea8578
// Enabled during tests
Packit ea8578
int _json_c_strerror_enable = 0;
Packit ea8578
Packit ea8578
#define PREFIX "ERRNO="
Packit ea8578
static char errno_buf[128] = PREFIX;
Packit ea8578
char *_json_c_strerror(int errno_in)
Packit ea8578
{
Packit ea8578
	int start_idx;
Packit ea8578
	char digbuf[20];
Packit ea8578
	int ii, jj;
Packit ea8578
Packit ea8578
	if (!_json_c_strerror_enable)
Packit ea8578
		return strerror(errno_in);
Packit ea8578
Packit ea8578
	// Avoid standard functions, so we don't need to include any
Packit ea8578
	// headers, or guess at signatures.
Packit ea8578
Packit ea8578
	for (ii = 0; errno_list[ii].errno_str != (char *)0; ii++)
Packit ea8578
	{
Packit ea8578
		const char *errno_str = errno_list[ii].errno_str;
Packit ea8578
		if (errno_list[ii].errno_value != errno_in)
Packit ea8578
			continue;
Packit ea8578
Packit ea8578
		for (start_idx = sizeof(PREFIX) - 1, jj = 0; errno_str[jj] != '\0'; jj++, start_idx++)
Packit ea8578
		{
Packit ea8578
			errno_buf[start_idx] = errno_str[jj];
Packit ea8578
		}
Packit ea8578
		errno_buf[start_idx] = '\0';
Packit ea8578
		return errno_buf;
Packit ea8578
	}
Packit ea8578
Packit ea8578
	// It's not one of the known errno values, return the numeric value.
Packit ea8578
	for (ii = 0; errno_in > 10; errno_in /= 10, ii++)
Packit ea8578
	{
Packit ea8578
		digbuf[ii] = "0123456789"[(errno_in % 10)];
Packit ea8578
	}
Packit ea8578
	digbuf[ii] = "0123456789"[(errno_in % 10)];
Packit ea8578
Packit ea8578
	// Reverse the digits
Packit ea8578
	for (start_idx = sizeof(PREFIX) - 1 ; ii >= 0; ii--, start_idx++)
Packit ea8578
	{
Packit ea8578
		errno_buf[start_idx] = digbuf[ii];
Packit ea8578
	}
Packit ea8578
	return errno_buf;
Packit ea8578
}
Packit ea8578