6 /************************************************************************
7 * Based on: lib/string/lib_strerror.c
9 * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
10 * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in
20 * the documentation and/or other materials provided with the
22 * 3. Neither the name NuttX nor the names of its contributors may be
23 * used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
29 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
30 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
32 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
33 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
34 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
36 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
39 ************************************************************************/
47 /* This table maps all error numbers to descriptive strings.
48 * The only assumption that the code makes with regard to this
49 * this table is that it is order by error number.
51 * The size of this table is quite large. Its size can be
52 * reduced by eliminating some of the more obscure error
56 struct errno_strmap_s g_errnomap
[] =
59 { ENOENT
, ENOENT_STR
},
65 { ENOEXEC
, ENOEXEC_STR
},
67 { ECHILD
, ECHILD_STR
},
68 { EAGAIN
, EAGAIN_STR
},
69 { ENOMEM
, ENOMEM_STR
},
70 { EACCES
, EACCES_STR
},
71 { EFAULT
, EFAULT_STR
},
72 { ENOTBLK
, ENOTBLK_STR
},
74 { EEXIST
, EEXIST_STR
},
76 { ENODEV
, ENODEV_STR
},
77 { ENOTDIR
, ENOTDIR_STR
},
78 { EISDIR
, EISDIR_STR
},
79 { EINVAL
, EINVAL_STR
},
80 { ENFILE
, ENFILE_STR
},
81 { EMFILE
, EMFILE_STR
},
82 { ENOTTY
, ENOTTY_STR
},
83 { ETXTBSY
, ETXTBSY_STR
},
85 { ENOSPC
, ENOSPC_STR
},
86 { ESPIPE
, ESPIPE_STR
},
88 { EMLINK
, EMLINK_STR
},
91 { ERANGE
, ERANGE_STR
},
92 { EDEADLK
, EDEADLK_STR
},
93 { ENAMETOOLONG
, ENAMETOOLONG_STR
},
94 { ENOLCK
, ENOLCK_STR
},
95 { ENOSYS
, ENOSYS_STR
},
96 { ENOTEMPTY
, ENOTEMPTY_STR
},
98 { ENOMSG
, ENOMSG_STR
},
100 { ECHRNG
, ECHRNG_STR
},
101 { EL2NSYNC
, EL2NSYNC_STR
},
102 { EL3HLT
, EL3HLT_STR
},
103 { EL3RST
, EL3RST_STR
},
104 { ELNRNG
, ELNRNG_STR
},
105 { EUNATCH
, EUNATCH_STR
},
106 { ENOCSI
, ENOCSI_STR
},
107 { EL2HLT
, EL2HLT_STR
},
108 { EBADE
, EBADE_STR
},
109 { EBADR
, EBADR_STR
},
110 { EXFULL
, EXFULL_STR
},
111 { ENOANO
, ENOANO_STR
},
112 { EBADRQC
, EBADRQC_STR
},
113 { EBADSLT
, EBADSLT_STR
},
114 { EBFONT
, EBFONT_STR
},
115 { ENOSTR
, ENOSTR_STR
},
116 { ENODATA
, ENODATA_STR
},
117 { ETIME
, ETIME_STR
},
118 { ENOSR
, ENOSR_STR
},
119 { ENONET
, ENONET_STR
},
120 { ENOPKG
, ENOPKG_STR
},
121 { EREMOTE
, EREMOTE_STR
},
122 { ENOLINK
, ENOLINK_STR
},
124 { ESRMNT
, ESRMNT_STR
},
125 { ECOMM
, ECOMM_STR
},
126 { EPROTO
, EPROTO_STR
},
127 { EMULTIHOP
, EMULTIHOP_STR
},
128 { EDOTDOT
, EDOTDOT_STR
},
129 { EBADMSG
, EBADMSG_STR
},
130 { EOVERFLOW
, EOVERFLOW_STR
},
131 { ENOTUNIQ
, ENOTUNIQ_STR
},
132 { EBADFD
, EBADFD_STR
},
133 { EREMCHG
, EREMCHG_STR
},
134 { ELIBACC
, ELIBACC_STR
},
135 { ELIBBAD
, ELIBBAD_STR
},
136 { ELIBSCN
, ELIBSCN_STR
},
137 { ELIBMAX
, ELIBMAX_STR
},
138 { ELIBEXEC
, ELIBEXEC_STR
},
139 { EILSEQ
, EILSEQ_STR
},
140 { ERESTART
, ERESTART_STR
},
141 { ESTRPIPE
, ESTRPIPE_STR
},
142 { EUSERS
, EUSERS_STR
},
143 { ENOTSOCK
, ENOTSOCK_STR
},
144 { EDESTADDRREQ
, EDESTADDRREQ_STR
},
145 { EMSGSIZE
, EMSGSIZE_STR
},
146 { EPROTOTYPE
, EPROTOTYPE_STR
},
147 { ENOPROTOOPT
, ENOPROTOOPT_STR
},
148 { EPROTONOSUPPORT
, EPROTONOSUPPORT_STR
},
149 { ESOCKTNOSUPPORT
, ESOCKTNOSUPPORT_STR
},
150 { EOPNOTSUPP
, EOPNOTSUPP_STR
},
151 { EPFNOSUPPORT
, EPFNOSUPPORT_STR
},
152 { EAFNOSUPPORT
, EAFNOSUPPORT_STR
},
153 { EADDRINUSE
, EADDRINUSE_STR
},
154 { EADDRNOTAVAIL
, EADDRNOTAVAIL_STR
},
155 { ENETDOWN
, ENETDOWN_STR
},
156 { ENETUNREACH
, ENETUNREACH_STR
},
157 { ENETRESET
, ENETRESET_STR
},
158 { ECONNABORTED
, ECONNABORTED_STR
},
159 { ECONNRESET
, ECONNRESET_STR
},
160 { ENOBUFS
, ENOBUFS_STR
},
161 { EISCONN
, EISCONN_STR
},
162 { ENOTCONN
, ENOTCONN_STR
},
163 { ESHUTDOWN
, ESHUTDOWN_STR
},
164 { ETOOMANYREFS
, ETOOMANYREFS_STR
},
165 { ETIMEDOUT
, ETIMEDOUT_STR
},
166 { ECONNREFUSED
, ECONNREFUSED_STR
},
167 { EHOSTDOWN
, EHOSTDOWN_STR
},
168 { EHOSTUNREACH
, EHOSTUNREACH_STR
},
169 { EALREADY
, EALREADY_STR
},
170 { EINPROGRESS
, EINPROGRESS_STR
},
171 { ESTALE
, ESTALE_STR
},
172 { EUCLEAN
, EUCLEAN_STR
},
173 { ENOTNAM
, ENOTNAM_STR
},
174 { ENAVAIL
, ENAVAIL_STR
},
175 { EISNAM
, EISNAM_STR
},
176 { EREMOTEIO
, EREMOTEIO_STR
},
177 { EDQUOT
, EDQUOT_STR
},
178 { ENOMEDIUM
, ENOMEDIUM_STR
},
179 { EMEDIUMTYPE
, EMEDIUMTYPE_STR
}
182 #define NERRNO_STRS (sizeof(g_errnomap) / sizeof(struct errno_strmap_s))
184 char *strerror(int errnum
)
187 int ndxhi
= NERRNO_STRS
- 1;
192 ndxmid
= (ndxlow
+ ndxhi
) >> 1;
193 if (errnum
> g_errnomap
[ndxmid
].errnum
)
197 else if (errnum
< g_errnomap
[ndxmid
].errnum
)
203 return g_errnomap
[ndxmid
].str
;
206 while (ndxlow
<= ndxhi
);
207 return "Unknown error";