strerror.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * C++ stream style string formatter and printer used in KUnit for outputting
  4. * KUnit messages.
  5. *
  6. * Copyright (C) 2019, Google LLC.
  7. * Author: Mike Krinkin <[email protected]>
  8. */
  9. #include <linux/errno.h>
  10. #include <linux/kernel.h>
  11. #include <linux/stddef.h>
  12. #include <linux/string.h>
  13. #include <kunit/strerror.h>
  14. #define SUCCESS 0
  15. #define MAKE_ERROR(errno) [errno] = #errno
  16. static const char * const errmap[] = {
  17. MAKE_ERROR(SUCCESS),
  18. MAKE_ERROR(EPERM),
  19. MAKE_ERROR(ENOENT),
  20. MAKE_ERROR(ESRCH),
  21. MAKE_ERROR(EINTR),
  22. MAKE_ERROR(EIO),
  23. MAKE_ERROR(ENXIO),
  24. MAKE_ERROR(E2BIG),
  25. MAKE_ERROR(ENOEXEC),
  26. MAKE_ERROR(EBADF),
  27. MAKE_ERROR(ECHILD),
  28. MAKE_ERROR(EAGAIN),
  29. MAKE_ERROR(ENOMEM),
  30. MAKE_ERROR(EACCES),
  31. MAKE_ERROR(EFAULT),
  32. MAKE_ERROR(ENOTBLK),
  33. MAKE_ERROR(EBUSY),
  34. MAKE_ERROR(EEXIST),
  35. MAKE_ERROR(EXDEV),
  36. MAKE_ERROR(ENODEV),
  37. MAKE_ERROR(ENOTDIR),
  38. MAKE_ERROR(EISDIR),
  39. MAKE_ERROR(EINVAL),
  40. MAKE_ERROR(ENFILE),
  41. MAKE_ERROR(EMFILE),
  42. MAKE_ERROR(ENOTTY),
  43. MAKE_ERROR(ETXTBSY),
  44. MAKE_ERROR(EFBIG),
  45. MAKE_ERROR(ENOSPC),
  46. MAKE_ERROR(ESPIPE),
  47. MAKE_ERROR(EROFS),
  48. MAKE_ERROR(EMLINK),
  49. MAKE_ERROR(EPIPE),
  50. MAKE_ERROR(EDOM),
  51. MAKE_ERROR(ERANGE),
  52. MAKE_ERROR(EDEADLK),
  53. MAKE_ERROR(ENAMETOOLONG),
  54. MAKE_ERROR(ENOLCK),
  55. MAKE_ERROR(ENOSYS),
  56. MAKE_ERROR(ENOTEMPTY),
  57. MAKE_ERROR(ELOOP),
  58. MAKE_ERROR(ENOMSG),
  59. MAKE_ERROR(EIDRM),
  60. MAKE_ERROR(ECHRNG),
  61. MAKE_ERROR(EL2NSYNC),
  62. MAKE_ERROR(EL3HLT),
  63. MAKE_ERROR(EL3RST),
  64. MAKE_ERROR(ELNRNG),
  65. MAKE_ERROR(EUNATCH),
  66. MAKE_ERROR(ENOCSI),
  67. MAKE_ERROR(EL2HLT),
  68. MAKE_ERROR(EBADE),
  69. MAKE_ERROR(EBADR),
  70. MAKE_ERROR(EXFULL),
  71. MAKE_ERROR(ENOANO),
  72. MAKE_ERROR(EBADRQC),
  73. MAKE_ERROR(EBADSLT),
  74. MAKE_ERROR(EBFONT),
  75. MAKE_ERROR(ENOSTR),
  76. MAKE_ERROR(ENODATA),
  77. MAKE_ERROR(ETIME),
  78. MAKE_ERROR(ENOSR),
  79. MAKE_ERROR(ENONET),
  80. MAKE_ERROR(ENOPKG),
  81. MAKE_ERROR(EREMOTE),
  82. MAKE_ERROR(ENOLINK),
  83. MAKE_ERROR(EADV),
  84. MAKE_ERROR(ESRMNT),
  85. MAKE_ERROR(ECOMM),
  86. MAKE_ERROR(EPROTO),
  87. MAKE_ERROR(EMULTIHOP),
  88. MAKE_ERROR(EDOTDOT),
  89. MAKE_ERROR(EBADMSG),
  90. MAKE_ERROR(EOVERFLOW),
  91. MAKE_ERROR(ENOTUNIQ),
  92. MAKE_ERROR(EBADFD),
  93. MAKE_ERROR(EREMCHG),
  94. MAKE_ERROR(ELIBACC),
  95. MAKE_ERROR(ELIBBAD),
  96. MAKE_ERROR(ELIBSCN),
  97. MAKE_ERROR(ELIBMAX),
  98. MAKE_ERROR(ELIBEXEC),
  99. MAKE_ERROR(EILSEQ),
  100. MAKE_ERROR(ERESTART),
  101. MAKE_ERROR(ESTRPIPE),
  102. MAKE_ERROR(EUSERS),
  103. MAKE_ERROR(ENOTSOCK),
  104. MAKE_ERROR(EDESTADDRREQ),
  105. MAKE_ERROR(EMSGSIZE),
  106. MAKE_ERROR(EPROTOTYPE),
  107. MAKE_ERROR(ENOPROTOOPT),
  108. MAKE_ERROR(EPROTONOSUPPORT),
  109. MAKE_ERROR(ESOCKTNOSUPPORT),
  110. MAKE_ERROR(EOPNOTSUPP),
  111. MAKE_ERROR(EPFNOSUPPORT),
  112. MAKE_ERROR(EAFNOSUPPORT),
  113. MAKE_ERROR(EADDRINUSE),
  114. MAKE_ERROR(EADDRNOTAVAIL),
  115. MAKE_ERROR(ENETDOWN),
  116. MAKE_ERROR(ENETUNREACH),
  117. MAKE_ERROR(ENETRESET),
  118. MAKE_ERROR(ECONNABORTED),
  119. MAKE_ERROR(ECONNRESET),
  120. MAKE_ERROR(ENOBUFS),
  121. MAKE_ERROR(EISCONN),
  122. MAKE_ERROR(ENOTCONN),
  123. MAKE_ERROR(ESHUTDOWN),
  124. MAKE_ERROR(ETOOMANYREFS),
  125. MAKE_ERROR(ETIMEDOUT),
  126. MAKE_ERROR(ECONNREFUSED),
  127. MAKE_ERROR(EHOSTDOWN),
  128. MAKE_ERROR(EHOSTUNREACH),
  129. MAKE_ERROR(EALREADY),
  130. MAKE_ERROR(EINPROGRESS),
  131. MAKE_ERROR(ESTALE),
  132. MAKE_ERROR(EUCLEAN),
  133. MAKE_ERROR(ENOTNAM),
  134. MAKE_ERROR(ENAVAIL),
  135. MAKE_ERROR(EISNAM),
  136. MAKE_ERROR(EREMOTEIO),
  137. MAKE_ERROR(EDQUOT),
  138. MAKE_ERROR(ENOMEDIUM),
  139. MAKE_ERROR(EMEDIUMTYPE),
  140. MAKE_ERROR(ECANCELED),
  141. MAKE_ERROR(ENOKEY),
  142. MAKE_ERROR(EKEYEXPIRED),
  143. MAKE_ERROR(EKEYREVOKED),
  144. MAKE_ERROR(EKEYREJECTED),
  145. MAKE_ERROR(EOWNERDEAD),
  146. MAKE_ERROR(ENOTRECOVERABLE),
  147. MAKE_ERROR(ERFKILL),
  148. MAKE_ERROR(EHWPOISON)
  149. };
  150. const char *strerror_str(int errno)
  151. {
  152. if (errno < 0 || errno >= ARRAY_SIZE(errmap))
  153. return NULL;
  154. return errmap[errno];
  155. }
  156. const char *strerror_r(int errno, char *buf, size_t buflen)
  157. {
  158. const char *err = strerror_str(errno);
  159. if (!buflen)
  160. return NULL;
  161. // GNU version of strerror_r() may sometimes return a pointer to a
  162. // static string, this implementation doesn't do it mostly to keep
  163. // the behavior consistent and predicatble.
  164. buf[buflen - 1] = '\0';
  165. if (err)
  166. return strncpy(buf, err, buflen - 1);
  167. snprintf(buf, buflen - 1, "%d (unknown error)", errno);
  168. return buf;
  169. }
  170. EXPORT_SYMBOL_GPL(strerror_r);