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 	{0, 0},
22 	ERR(EPERM),
23 	ERR(ENOENT),
24 	ERR(ESRCH),
25 	ERR(EINTR),
26 	ERR(EIO),
27 	ERR(ENXIO),
28 	ERR(E2BIG),
29 	ERR(ENOEXEC),
30 	ERR(EBADF),
31 	ERR(ECHILD),
32 	ERR(EAGAIN),
33 	ERR(ENOMEM),
34 	ERR(EACCES),
35 	ERR(EFAULT),
36 	ERR(ENOTBLK),
37 	ERR(EBUSY),
38 	ERR(EEXIST),
39 	ERR(EXDEV),
40 	ERR(ENODEV),
41 	ERR(ENOTDIR),
42 	ERR(EISDIR),
43 	ERR(EINVAL),
44 	ERR(ENFILE),
45 	ERR(EMFILE),
46 	ERR(ENOTTY),
47 	ERR(ETXTBSY),
48 	ERR(EFBIG),
49 	ERR(ENOSPC),
50 	ERR(ESPIPE),
51 	ERR(EROFS),
52 	ERR(EMLINK),
53 	ERR(EPIPE),
54 	ERR(EDOM),
55 	ERR(ERANGE),
56 	ERR(ENOMSG),
57 	ERR(EDEADLK),
58 	ERR(ENOLCK),
59 	ERR(ENOSTR),
60 	ERR(ENODATA),
61 	ERR(ETIME),
62 	ERR(ENOSR),
63 	ERR(EPROTO),
64 	ERR(EBADMSG),
65 	ERR(ENOSYS),
66 	ERR(ENOTEMPTY),
67 	ERR(ENAMETOOLONG),
68 	ERR(ELOOP),
69 	ERR(EOPNOTSUPP),
70 	ERR(EPFNOSUPPORT),
71 	ERR(ECONNRESET),
72 	ERR(ENOBUFS),
73 	ERR(EAFNOSUPPORT),
74 	ERR(EPROTOTYPE),
75 	ERR(ENOTSOCK),
76 	ERR(ENOPROTOOPT),
77 	ERR(ESHUTDOWN),
78 	ERR(ECONNREFUSED),
79 	ERR(EADDRINUSE),
80 	ERR(ECONNABORTED),
81 	ERR(ENETUNREACH),
82 	ERR(ENETDOWN),
83 	ERR(ETIMEDOUT),
84 	ERR(EHOSTDOWN),
85 	ERR(EHOSTUNREACH),
86 	ERR(EINPROGRESS),
87 	ERR(EALREADY),
88 	ERR(EDESTADDRREQ),
89 	ERR(EMSGSIZE),
90 	ERR(EPROTONOSUPPORT),
91 	ERR(ESOCKTNOSUPPORT),
92 	ERR(EADDRNOTAVAIL),
93 	ERR(ENETRESET),
94 	ERR(EISCONN),
95 	ERR(ENOTCONN),
96 	ERR(ETOOMANYREFS),
97 	ERR(ENOTSUP),
98 	ERR(EILSEQ),
99 	ERR(EOVERFLOW),
100 	ERR(ECANCELED),
101 };
102 
nsi_errno_to_mid(int err)103 int nsi_errno_to_mid(int err)
104 {
105 	for (int i = 0; i < NSI_ARRAY_SIZE(map); i++) {
106 		if (map[i].err == err) {
107 			return map[i].mid_err;
108 		}
109 	}
110 
111 	return err;
112 }
113 
nsi_errno_from_mid(int err)114 int nsi_errno_from_mid(int err)
115 {
116 	for (int i = 0; i < NSI_ARRAY_SIZE(map); i++) {
117 		if (map[i].mid_err == err) {
118 			return map[i].err;
119 		}
120 	}
121 
122 	return err;
123 }
124 
125 #if defined(NSI_RUNNER_BUILD)
nsi_get_errno_in_mid(void)126 int nsi_get_errno_in_mid(void)
127 {
128 	return nsi_errno_to_mid(errno);
129 }
130 #endif
131 
nsi_host_get_errno(void)132 int nsi_host_get_errno(void)
133 {
134 	return nsi_errno_from_mid(nsi_get_errno_in_mid());
135 }
136