1 /**
2  * Copyright (c) 2023-2024 Marcin Niestroj
3  * Copyright (c) 2025 Nordic Semiconductor ASA
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include "nsi_errno.h"
9 #include "nsi_utils.h"
10 
11 struct nsi_errno_mid_map {
12 	/** Embedded/host error code */
13 	int err;
14 	/** NSI_errno middleground error code */
15 	int mid_err;
16 };
17 
18 #define ERR(_name) {_name, NSI_ERRNO_MID_##_name}
19 
20 static const struct nsi_errno_mid_map map[] = {
21 	ERR(EPERM),
22 	ERR(ENOENT),
23 	ERR(ESRCH),
24 	ERR(EINTR),
25 	ERR(EIO),
26 	ERR(ENXIO),
27 	ERR(E2BIG),
28 	ERR(ENOEXEC),
29 	ERR(EBADF),
30 	ERR(ECHILD),
31 	ERR(EAGAIN),
32 	ERR(ENOMEM),
33 	ERR(EACCES),
34 	ERR(EFAULT),
35 	ERR(ENOTBLK),
36 	ERR(EBUSY),
37 	ERR(EEXIST),
38 	ERR(EXDEV),
39 	ERR(ENODEV),
40 	ERR(ENOTDIR),
41 	ERR(EISDIR),
42 	ERR(EINVAL),
43 	ERR(ENFILE),
44 	ERR(EMFILE),
45 	ERR(ENOTTY),
46 	ERR(ETXTBSY),
47 	ERR(EFBIG),
48 	ERR(ENOSPC),
49 	ERR(ESPIPE),
50 	ERR(EROFS),
51 	ERR(EMLINK),
52 	ERR(EPIPE),
53 	ERR(EDOM),
54 	ERR(ERANGE),
55 	ERR(ENOMSG),
56 	ERR(EDEADLK),
57 	ERR(ENOLCK),
58 	ERR(ENOSTR),
59 	ERR(ENODATA),
60 	ERR(ETIME),
61 	ERR(ENOSR),
62 	ERR(EPROTO),
63 	ERR(EBADMSG),
64 	ERR(ENOSYS),
65 	ERR(ENOTEMPTY),
66 	ERR(ENAMETOOLONG),
67 	ERR(ELOOP),
68 	ERR(EOPNOTSUPP),
69 	ERR(EPFNOSUPPORT),
70 	ERR(ECONNRESET),
71 	ERR(ENOBUFS),
72 	ERR(EAFNOSUPPORT),
73 	ERR(EPROTOTYPE),
74 	ERR(ENOTSOCK),
75 	ERR(ENOPROTOOPT),
76 	ERR(ESHUTDOWN),
77 	ERR(ECONNREFUSED),
78 	ERR(EADDRINUSE),
79 	ERR(ECONNABORTED),
80 	ERR(ENETUNREACH),
81 	ERR(ENETDOWN),
82 	ERR(ETIMEDOUT),
83 	ERR(EHOSTDOWN),
84 	ERR(EHOSTUNREACH),
85 	ERR(EINPROGRESS),
86 	ERR(EALREADY),
87 	ERR(EDESTADDRREQ),
88 	ERR(EMSGSIZE),
89 	ERR(EPROTONOSUPPORT),
90 	ERR(ESOCKTNOSUPPORT),
91 	ERR(EADDRNOTAVAIL),
92 	ERR(ENETRESET),
93 	ERR(EISCONN),
94 	ERR(ENOTCONN),
95 	ERR(ETOOMANYREFS),
96 	ERR(ENOTSUP),
97 	ERR(EILSEQ),
98 	ERR(EOVERFLOW),
99 	ERR(ECANCELED),
100 };
101 
nsi_errno_to_mid(int err)102 int nsi_errno_to_mid(int err)
103 {
104 	if (err == 0) {
105 		return err;
106 	}
107 
108 	for (int i = 0; i < NSI_ARRAY_SIZE(map); i++) {
109 		if (map[i].err == err) {
110 			return map[i].mid_err;
111 		}
112 	}
113 
114 	return err;
115 }
116 
nsi_errno_from_mid(int err)117 int nsi_errno_from_mid(int err)
118 {
119 	if (err == 0) {
120 		return err;
121 	}
122 
123 	for (int i = 0; i < NSI_ARRAY_SIZE(map); i++) {
124 		if (map[i].mid_err == err) {
125 			return map[i].err;
126 		}
127 	}
128 
129 	return err;
130 }
131 
132 #if defined(NSI_RUNNER_BUILD)
nsi_get_errno_in_mid(void)133 int nsi_get_errno_in_mid(void)
134 {
135 	return nsi_errno_to_mid(errno);
136 }
137 #endif
138 
nsi_host_get_errno(void)139 int nsi_host_get_errno(void)
140 {
141 	return nsi_errno_from_mid(nsi_get_errno_in_mid());
142 }
143