Install json_object_private.h file
[platform/upstream/json-c.git] / strerror_override.c
1 #define STRERROR_OVERRIDE_IMPL 1
2 #include "strerror_override.h"
3
4 /*
5  * Override strerror() to get consistent output across platforms.
6  */
7
8 static struct {
9         int errno_value;
10         const char *errno_str;
11 } errno_list[] = {
12 #define STRINGIFY(x) #x
13 #define ENTRY(x) {x, &STRINGIFY(undef_ ## x)[6]}
14         ENTRY(EPERM),
15         ENTRY(ENOENT),
16         ENTRY(ESRCH),
17         ENTRY(EINTR),
18         ENTRY(EIO),
19         ENTRY(ENXIO),
20         ENTRY(E2BIG),
21         ENTRY(ENOEXEC),
22         ENTRY(EBADF),
23         ENTRY(ECHILD),
24         ENTRY(EDEADLK),
25         ENTRY(ENOMEM),
26         ENTRY(EACCES),
27         ENTRY(EFAULT),
28 #ifdef ENOTBLK
29         ENTRY(ENOTBLK),
30 #endif
31         ENTRY(EBUSY),
32         ENTRY(EEXIST),
33         ENTRY(EXDEV),
34         ENTRY(ENODEV),
35         ENTRY(ENOTDIR),
36         ENTRY(EISDIR),
37         ENTRY(EINVAL),
38         ENTRY(ENFILE),
39         ENTRY(EMFILE),
40         ENTRY(ENOTTY),
41 #ifdef ETXTBSY
42         ENTRY(ETXTBSY),
43 #endif
44         ENTRY(EFBIG),
45         ENTRY(ENOSPC),
46         ENTRY(ESPIPE),
47         ENTRY(EROFS),
48         ENTRY(EMLINK),
49         ENTRY(EPIPE),
50         ENTRY(EDOM),
51         ENTRY(ERANGE),
52         ENTRY(EAGAIN),
53         { 0, (char *)0 }
54 };
55
56 // Enabled during tests
57 int _json_c_strerror_enable = 0;
58
59 #define PREFIX "ERRNO="
60 static char errno_buf[128] = PREFIX;
61 char *_json_c_strerror(int errno_in)
62 {
63         int start_idx;
64         char digbuf[20];
65         int ii, jj;
66
67         if (!_json_c_strerror_enable)
68                 return strerror(errno_in);
69
70         // Avoid standard functions, so we don't need to include any
71         // headers, or guess at signatures.
72
73         for (ii = 0; errno_list[ii].errno_str != (char *)0; ii++)
74         {
75                 const char *errno_str = errno_list[ii].errno_str;
76                 if (errno_list[ii].errno_value != errno_in)
77                         continue;
78
79                 for (start_idx = sizeof(PREFIX) - 1, jj = 0; errno_str[jj] != '\0'; jj++, start_idx++)
80                 {
81                         errno_buf[start_idx] = errno_str[jj];
82                 }
83                 errno_buf[start_idx] = '\0';
84                 return errno_buf;
85         }
86
87         // It's not one of the known errno values, return the numeric value.
88         for (ii = 0; errno_in > 10; errno_in /= 10, ii++)
89         {
90                 digbuf[ii] = "0123456789"[(errno_in % 10)];
91         }
92         digbuf[ii] = "0123456789"[(errno_in % 10)];
93
94         // Reverse the digits
95         for (start_idx = sizeof(PREFIX) - 1 ; ii >= 0; ii--, start_idx++)
96         {
97                 errno_buf[start_idx] = digbuf[ii];
98         }
99         return errno_buf;
100 }
101