os_errno.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999, 2000
  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.5 2000/11/30 00:58:43 ubell 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. /*
  55.  * It's possible that errno was set after the error.
  56.  * The caller must take care to set it to 0 before
  57.  * any system operation.
  58.  */
  59. if (__os_get_errno() != 0)
  60. return (__os_get_errno());
  61. last_error = GetLastError();
  62. /*
  63.  * Take our best guess at translating some of the Windows error
  64.  * codes.  We really care about only a few of these.
  65.  */
  66. switch (last_error) {
  67. case ERROR_FILE_NOT_FOUND:
  68. case ERROR_INVALID_DRIVE:
  69. case ERROR_PATH_NOT_FOUND:
  70. ret = ENOENT;
  71. break;
  72. case ERROR_NO_MORE_FILES:
  73. case ERROR_TOO_MANY_OPEN_FILES:
  74. ret = EMFILE;
  75. break;
  76. case ERROR_ACCESS_DENIED:
  77. ret = EPERM;
  78. break;
  79. case ERROR_INVALID_HANDLE:
  80. ret = EBADF;
  81. break;
  82. case ERROR_NOT_ENOUGH_MEMORY:
  83. ret = ENOMEM;
  84. break;
  85. case ERROR_DISK_FULL:
  86. ret = ENOSPC;
  87. case ERROR_ARENA_TRASHED:
  88. case ERROR_BAD_COMMAND:
  89. case ERROR_BAD_ENVIRONMENT:
  90. case ERROR_BAD_FORMAT:
  91. case ERROR_GEN_FAILURE:
  92. case ERROR_INVALID_ACCESS:
  93. case ERROR_INVALID_BLOCK:
  94. case ERROR_INVALID_DATA:
  95. case ERROR_READ_FAULT:
  96. case ERROR_WRITE_FAULT:
  97. ret = EFAULT;
  98. break;
  99. case ERROR_FILE_EXISTS:
  100. ret = EEXIST;
  101. break;
  102. case ERROR_NOT_SAME_DEVICE:
  103. ret = EXDEV;
  104. break;
  105. case ERROR_WRITE_PROTECT:
  106. ret = EACCES;
  107. break;
  108. case ERROR_NOT_READY:
  109. ret = EBUSY;
  110. break;
  111. case ERROR_LOCK_VIOLATION:
  112. case ERROR_SHARING_VIOLATION:
  113. ret = EBUSY;
  114. break;
  115. case 0:
  116. ret = EFAULT;
  117. break;
  118. default:
  119. ret = EIO; /* Generic error. */
  120. break;
  121. }
  122. return (ret);
  123. }