You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

strerror_override.c 1.8 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <errno.h>
  2. /*
  3. * Override strerror() to get consistent output across platforms.
  4. */
  5. static struct {
  6. int errno_value;
  7. const char *errno_str;
  8. } errno_list[] = {
  9. #define STRINGIFY(x) #x
  10. #define ENTRY(x) {x, &STRINGIFY(undef_ ## x)[6]}
  11. ENTRY(EPERM),
  12. ENTRY(ENOENT),
  13. ENTRY(ESRCH),
  14. ENTRY(EINTR),
  15. ENTRY(EIO),
  16. ENTRY(ENXIO),
  17. ENTRY(E2BIG),
  18. ENTRY(ENOEXEC),
  19. ENTRY(EBADF),
  20. ENTRY(ECHILD),
  21. ENTRY(EDEADLK),
  22. ENTRY(ENOMEM),
  23. ENTRY(EACCES),
  24. ENTRY(EFAULT),
  25. #ifdef ENOTBLK
  26. ENTRY(ENOTBLK),
  27. #endif
  28. ENTRY(EBUSY),
  29. ENTRY(EEXIST),
  30. ENTRY(EXDEV),
  31. ENTRY(ENODEV),
  32. ENTRY(ENOTDIR),
  33. ENTRY(EISDIR),
  34. ENTRY(EINVAL),
  35. ENTRY(ENFILE),
  36. ENTRY(EMFILE),
  37. ENTRY(ENOTTY),
  38. #ifdef ETXTBSY
  39. ENTRY(ETXTBSY),
  40. #endif
  41. ENTRY(EFBIG),
  42. ENTRY(ENOSPC),
  43. ENTRY(ESPIPE),
  44. ENTRY(EROFS),
  45. ENTRY(EMLINK),
  46. ENTRY(EPIPE),
  47. ENTRY(EDOM),
  48. ENTRY(ERANGE),
  49. ENTRY(EAGAIN),
  50. { 0, (char *)0 }
  51. };
  52. #define PREFIX "ERRNO="
  53. static char errno_buf[128] = PREFIX;
  54. char *strerror(int errno_in)
  55. {
  56. int start_idx;
  57. char digbuf[20];
  58. int ii, jj;
  59. // Avoid standard functions, so we don't need to include any
  60. // headers, or guess at signatures.
  61. for (ii = 0; errno_list[ii].errno_str != (char *)0; ii++)
  62. {
  63. const char *errno_str = errno_list[ii].errno_str;
  64. if (errno_list[ii].errno_value != errno_in)
  65. continue;
  66. for (start_idx = sizeof(PREFIX) - 1, jj = 0; errno_str[jj] != '\0'; jj++, start_idx++)
  67. {
  68. errno_buf[start_idx] = errno_str[jj];
  69. }
  70. errno_buf[start_idx] = '\0';
  71. return errno_buf;
  72. }
  73. // It's not one of the known errno values, return the numeric value.
  74. for (ii = 0; errno_in > 10; errno_in /= 10, ii++)
  75. {
  76. digbuf[ii] = "0123456789"[(errno_in % 10)];
  77. }
  78. digbuf[ii] = "0123456789"[(errno_in % 10)];
  79. // Reverse the digits
  80. for (start_idx = sizeof(PREFIX) - 1 ; ii >= 0; ii--, start_idx++)
  81. {
  82. errno_buf[start_idx] = digbuf[ii];
  83. }
  84. return errno_buf;
  85. }