os_errno.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: os_errno.c,v 11.10 2002/07/12 04:05:00 mjc Exp $";
  10. #endif /* not lint */
  11. #include "db_int.h"
  12. /*
  13.  * __os_get_errno --
  14.  * Return the value of errno.
  15.  */
  16. int
  17. __os_get_errno()
  18. {
  19. /* This routine must be able to return the same value repeatedly. */
  20. return (errno);
  21. }
  22. /*
  23.  * __os_set_errno --
  24.  * Set the value of errno.
  25.  */
  26. void
  27. __os_set_errno(evalue)
  28. int evalue;
  29. {
  30. errno = evalue;
  31. }
  32. /*
  33.  * __os_win32_errno --
  34.  * Return the last Windows error as an errno.
  35.  * We give generic error returns:
  36.  *
  37.  * EFAULT means Win* call failed,
  38.  *   and GetLastError provided no extra info.
  39.  *
  40.  * EIO means error on Win* call.
  41.  *   and we were unable to provide a meaningful errno for this Windows
  42.  *   error.  More information is only available by setting a breakpoint
  43.  *   here.
  44.  *
  45.  * PUBLIC: #if defined(DB_WIN32)
  46.  * PUBLIC: int __os_win32_errno __P((void));
  47.  * PUBLIC: #endif
  48.  */
  49. int
  50. __os_win32_errno(void)
  51. {
  52. DWORD last_error;
  53. int ret;
  54. /* Ignore errno - we used to check it here. */
  55. last_error = GetLastError();
  56. /*
  57.  * Take our best guess at translating some of the Windows error
  58.  * codes.  We really care about only a few of these.
  59.  */
  60. switch (last_error) {
  61. case ERROR_FILE_NOT_FOUND:
  62. case ERROR_INVALID_DRIVE:
  63. case ERROR_PATH_NOT_FOUND:
  64. ret = ENOENT;
  65. break;
  66. case ERROR_NO_MORE_FILES:
  67. case ERROR_TOO_MANY_OPEN_FILES:
  68. ret = EMFILE;
  69. break;
  70. case ERROR_ACCESS_DENIED:
  71. ret = EPERM;
  72. break;
  73. case ERROR_INVALID_HANDLE:
  74. ret = EBADF;
  75. break;
  76. case ERROR_NOT_ENOUGH_MEMORY:
  77. ret = ENOMEM;
  78. break;
  79. case ERROR_DISK_FULL:
  80. ret = ENOSPC;
  81. case ERROR_ARENA_TRASHED:
  82. case ERROR_BAD_COMMAND:
  83. case ERROR_BAD_ENVIRONMENT:
  84. case ERROR_BAD_FORMAT:
  85. case ERROR_GEN_FAILURE:
  86. case ERROR_INVALID_ACCESS:
  87. case ERROR_INVALID_BLOCK:
  88. case ERROR_INVALID_DATA:
  89. case ERROR_READ_FAULT:
  90. case ERROR_WRITE_FAULT:
  91. ret = EFAULT;
  92. break;
  93. case ERROR_FILE_EXISTS:
  94. case ERROR_ALREADY_EXISTS:
  95. ret = EEXIST;
  96. break;
  97. case ERROR_NOT_SAME_DEVICE:
  98. ret = EXDEV;
  99. break;
  100. case ERROR_WRITE_PROTECT:
  101. ret = EACCES;
  102. break;
  103. case ERROR_NOT_READY:
  104. ret = EBUSY;
  105. break;
  106. case ERROR_LOCK_VIOLATION:
  107. case ERROR_SHARING_VIOLATION:
  108. ret = EBUSY;
  109. break;
  110. case ERROR_RETRY:
  111. ret = EINTR;
  112. break;
  113. case 0:
  114. ret = EFAULT;
  115. break;
  116. default:
  117. ret = EIO; /* Generic error. */
  118. break;
  119. }
  120. return (ret);
  121. }