Blame strerror_override.c

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