xref: /haiku/src/build/libroot/errors.cpp (revision d3d8b26997fac34a84981e6d2b649521de2cc45a)
1 
2 
3 #define BUILDING_HAIKU_ERROR_MAPPER 1
4 #include <BeOSBuildCompatibility.h>
5 
6 #include <errno.h>
7 #include <string.h>
8 
9 #include <map>
10 
11 using namespace std;
12 
13 static map<int, int> sToHaikuErrorMap;
14 static map<int, int> sToHostErrorMap;
15 static bool sErrorMapsInitialized = false;
16 
17 // init_error_map
18 static void
19 init_error_map()
20 {
21 	if (sErrorMapsInitialized)
22 		return;
23 
24 	#define ADD_ERROR(error) \
25 		sToHaikuErrorMap[error] = HAIKU_##error; \
26 		sToHostErrorMap[HAIKU_##error] = error;
27 
28 	ADD_ERROR(E2BIG);
29 	ADD_ERROR(ECHILD);
30 	ADD_ERROR(EDEADLK);
31 	ADD_ERROR(EFBIG);
32 	ADD_ERROR(EMLINK);
33 	ADD_ERROR(ENFILE);
34 	ADD_ERROR(ENODEV);
35 	ADD_ERROR(ENOLCK);
36 	ADD_ERROR(ENOSYS);
37 	ADD_ERROR(ENOTTY);
38 	ADD_ERROR(ENXIO);
39 	ADD_ERROR(ESPIPE);
40 	ADD_ERROR(ESRCH);
41 	#ifdef EFPOS
42 		ADD_ERROR(EFPOS);
43 	#endif
44 	#ifdef ESIGPARM
45 		ADD_ERROR(ESIGPARM);
46 	#endif
47 	ADD_ERROR(EDOM);
48 	ADD_ERROR(ERANGE);
49 	ADD_ERROR(EPROTOTYPE);
50 	ADD_ERROR(EPROTONOSUPPORT);
51 	ADD_ERROR(EPFNOSUPPORT);
52 	ADD_ERROR(EAFNOSUPPORT);
53 	ADD_ERROR(EADDRINUSE);
54 	ADD_ERROR(EADDRNOTAVAIL);
55 	ADD_ERROR(ENETDOWN);
56 	ADD_ERROR(ENETUNREACH);
57 	ADD_ERROR(ENETRESET);
58 	ADD_ERROR(ECONNABORTED);
59 	ADD_ERROR(ECONNRESET);
60 	ADD_ERROR(EISCONN);
61 	ADD_ERROR(ENOTCONN);
62 	ADD_ERROR(ESHUTDOWN);
63 	ADD_ERROR(ECONNREFUSED);
64 	ADD_ERROR(EHOSTUNREACH);
65 	ADD_ERROR(ENOPROTOOPT);
66 	ADD_ERROR(ENOBUFS);
67 	ADD_ERROR(EINPROGRESS);
68 	ADD_ERROR(EALREADY);
69 	ADD_ERROR(EILSEQ);
70 	ADD_ERROR(ENOMSG);
71 	ADD_ERROR(ESTALE);
72 	ADD_ERROR(EOVERFLOW);
73 	ADD_ERROR(EMSGSIZE);
74 	ADD_ERROR(EOPNOTSUPP);
75 	ADD_ERROR(ENOTSOCK);
76 	ADD_ERROR(EHOSTDOWN);
77 	ADD_ERROR(EBADMSG);
78 	ADD_ERROR(ECANCELED);
79 	ADD_ERROR(EDESTADDRREQ);
80 	ADD_ERROR(EDQUOT);
81 	ADD_ERROR(EIDRM);
82 	ADD_ERROR(EMULTIHOP);
83 	ADD_ERROR(ENODATA);
84 	ADD_ERROR(ENOLINK);
85 	ADD_ERROR(ENOSR);
86 	ADD_ERROR(ENOSTR);
87 	ADD_ERROR(ENOTSUP);
88 	ADD_ERROR(EPROTO);
89 	ADD_ERROR(ETIME);
90 	ADD_ERROR(ETXTBSY);
91 	ADD_ERROR(ENOMEM);
92 	ADD_ERROR(EACCES);
93 	ADD_ERROR(EINTR);
94 	ADD_ERROR(EIO);
95 	ADD_ERROR(EBUSY);
96 	ADD_ERROR(EFAULT);
97 	ADD_ERROR(ETIMEDOUT);
98 	ADD_ERROR(EAGAIN);
99 	ADD_ERROR(EWOULDBLOCK);
100 	ADD_ERROR(EBADF);
101 	ADD_ERROR(EEXIST);
102 	ADD_ERROR(EINVAL);
103 	ADD_ERROR(ENAMETOOLONG);
104 	ADD_ERROR(ENOENT);
105 	ADD_ERROR(EPERM);
106 	ADD_ERROR(ENOTDIR);
107 	ADD_ERROR(EISDIR);
108 	ADD_ERROR(ENOTEMPTY);
109 	ADD_ERROR(ENOSPC);
110 	ADD_ERROR(EROFS);
111 	ADD_ERROR(EMFILE);
112 	ADD_ERROR(EXDEV);
113 	ADD_ERROR(ELOOP);
114 	ADD_ERROR(ENOEXEC);
115 	ADD_ERROR(EPIPE);
116 
117 	sErrorMapsInitialized = true;
118 }
119 
120 // to_host_error
121 static int
122 to_host_error(int error)
123 {
124 	init_error_map();
125 
126 	map<int, int>::iterator it = sToHostErrorMap.find(error);
127 	return (it != sToHostErrorMap.end() ? it->second : error);
128 }
129 
130 // to_haiku_error
131 static int
132 to_haiku_error(int error)
133 {
134 	init_error_map();
135 
136 	map<int, int>::iterator it = sToHaikuErrorMap.find(error);
137 	if (it != sToHaikuErrorMap.end())
138 		return it->second;
139 
140 	return (error > 0 ? -error : error);
141 }
142 
143 // _haiku_build_strerror
144 char *
145 _haiku_build_strerror(int errnum)
146 {
147 	return strerror(to_host_error(errnum));
148 }
149 
150 // _haiku_build_errno
151 int *
152 _haiku_build_errno()
153 {
154 	static int localErrno = 0;
155 	localErrno = to_haiku_error(errno);
156 	return &localErrno;
157 }
158 
159