summaryrefslogtreecommitdiffstats
path: root/otherlibs/win32unix/unixsupport.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2001-08-28 14:47:48 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2001-08-28 14:47:48 +0000
commitddd99c7e5d2f0f8e7364e8521fa7e8308999344e (patch)
tree3c0158d035a52c0cf185c08c3288c3c76d6718d0 /otherlibs/win32unix/unixsupport.c
parentc345611817d76ccc3bbd02db1f942774220739f9 (diff)
Chargement dynamique de primitives C
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@3677 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/win32unix/unixsupport.c')
-rw-r--r--otherlibs/win32unix/unixsupport.c151
1 files changed, 112 insertions, 39 deletions
diff --git a/otherlibs/win32unix/unixsupport.c b/otherlibs/win32unix/unixsupport.c
index 69d3106be..ddd5e8526 100644
--- a/otherlibs/win32unix/unixsupport.c
+++ b/otherlibs/win32unix/unixsupport.c
@@ -54,47 +54,120 @@ value win_alloc_handle(HANDLE h)
return res;
}
+/* Mapping of Windows error codes to POSIX error codes */
+
+struct error_entry { unsigned long win_code; int range; int posix_code; };
+
+static struct error_entry win_error_table[] = {
+ { ERROR_INVALID_FUNCTION, 0, EINVAL},
+ { ERROR_FILE_NOT_FOUND, 0, ENOENT},
+ { ERROR_PATH_NOT_FOUND, 0, ENOENT},
+ { ERROR_TOO_MANY_OPEN_FILES, 0, EMFILE},
+ { ERROR_ACCESS_DENIED, 0, EACCES},
+ { ERROR_INVALID_HANDLE, 0, EBADF},
+ { ERROR_ARENA_TRASHED, 0, ENOMEM},
+ { ERROR_NOT_ENOUGH_MEMORY, 0, ENOMEM},
+ { ERROR_INVALID_BLOCK, 0, ENOMEM},
+ { ERROR_BAD_ENVIRONMENT, 0, E2BIG},
+ { ERROR_BAD_FORMAT, 0, ENOEXEC},
+ { ERROR_INVALID_ACCESS, 0, EINVAL},
+ { ERROR_INVALID_DATA, 0, EINVAL},
+ { ERROR_INVALID_DRIVE, 0, ENOENT},
+ { ERROR_CURRENT_DIRECTORY, 0, EACCES},
+ { ERROR_NOT_SAME_DEVICE, 0, EXDEV},
+ { ERROR_NO_MORE_FILES, 0, ENOENT},
+ { ERROR_LOCK_VIOLATION, 0, EACCES},
+ { ERROR_BAD_NETPATH, 0, ENOENT},
+ { ERROR_NETWORK_ACCESS_DENIED, 0, EACCES},
+ { ERROR_BAD_NET_NAME, 0, ENOENT},
+ { ERROR_FILE_EXISTS, 0, EEXIST},
+ { ERROR_CANNOT_MAKE, 0, EACCES},
+ { ERROR_FAIL_I24, 0, EACCES},
+ { ERROR_INVALID_PARAMETER, 0, EINVAL},
+ { ERROR_NO_PROC_SLOTS, 0, EAGAIN},
+ { ERROR_DRIVE_LOCKED, 0, EACCES},
+ { ERROR_BROKEN_PIPE, 0, EPIPE},
+ { ERROR_DISK_FULL, 0, ENOSPC},
+ { ERROR_INVALID_TARGET_HANDLE, 0, EBADF},
+ { ERROR_INVALID_HANDLE, 0, EINVAL},
+ { ERROR_WAIT_NO_CHILDREN, 0, ECHILD},
+ { ERROR_CHILD_NOT_COMPLETE, 0, ECHILD},
+ { ERROR_DIRECT_ACCESS_HANDLE, 0, EBADF},
+ { ERROR_NEGATIVE_SEEK, 0, EINVAL},
+ { ERROR_SEEK_ON_DEVICE, 0, EACCES},
+ { ERROR_DIR_NOT_EMPTY, 0, ENOTEMPTY},
+ { ERROR_NOT_LOCKED, 0, EACCES},
+ { ERROR_BAD_PATHNAME, 0, ENOENT},
+ { ERROR_MAX_THRDS_REACHED, 0, EAGAIN},
+ { ERROR_LOCK_FAILED, 0, EACCES},
+ { ERROR_ALREADY_EXISTS, 0, EEXIST},
+ { ERROR_FILENAME_EXCED_RANGE, 0, ENOENT},
+ { ERROR_NESTING_NOT_ALLOWED, 0, EAGAIN},
+ { ERROR_NOT_ENOUGH_QUOTA, 0, ENOMEM},
+ { ERROR_INVALID_STARTING_CODESEG,
+ ERROR_INFLOOP_IN_RELOC_CHAIN - ERROR_INVALID_STARTING_CODESEG,
+ ENOEXEC },
+ { ERROR_WRITE_PROTECT,
+ ERROR_SHARING_BUFFER_EXCEEDED - ERROR_WRITE_PROTECT,
+ EACCES },
+ { 0, -1, 0 }
+};
+
+void win32_maperr(unsigned long errcode)
+{
+ int i;
+
+ for (i = 0; win_error_table[i].range >= 0; i++) {
+ if (errcode >= win_error_table[i].win_code &&
+ errcode <= win_error_table[i].win_code + win_error_table[i].range) {
+ errno = win_error_table[i].posix_code;
+ return;
+ }
+ }
+ /* Not found: save original error code, negated so that we can
+ recognize it in unix_error_message */
+ errno = -errcode;
+}
+
/* Windows socket errors */
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#define EINPROGRESS WSAEINPROGRESS
-#define EALREADY WSAEALREADY
-#define ENOTSOCK WSAENOTSOCK
-#define EDESTADDRREQ WSAEDESTADDRREQ
-#define EMSGSIZE WSAEMSGSIZE
-#define EPROTOTYPE WSAEPROTOTYPE
-#define ENOPROTOOPT WSAENOPROTOOPT
-#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
-#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
-#define EOPNOTSUPP WSAEOPNOTSUPP
-#define EPFNOSUPPORT WSAEPFNOSUPPORT
-#define EAFNOSUPPORT WSAEAFNOSUPPORT
-#define EADDRINUSE WSAEADDRINUSE
-#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
-#define ENETDOWN WSAENETDOWN
-#define ENETUNREACH WSAENETUNREACH
-#define ENETRESET WSAENETRESET
-#define ECONNABORTED WSAECONNABORTED
-#define ECONNRESET WSAECONNRESET
-#define ENOBUFS WSAENOBUFS
-#define EISCONN WSAEISCONN
-#define ENOTCONN WSAENOTCONN
-#define ESHUTDOWN WSAESHUTDOWN
-#define ETOOMANYREFS WSAETOOMANYREFS
-#define ETIMEDOUT WSAETIMEDOUT
-#define ECONNREFUSED WSAECONNREFUSED
-#define ELOOP WSAELOOP
-#define EHOSTDOWN WSAEHOSTDOWN
-#define EHOSTUNREACH WSAEHOSTUNREACH
-#define EPROCLIM WSAEPROCLIM
-#define EUSERS WSAEUSERS
-#define EDQUOT WSAEDQUOT
-#define ESTALE WSAESTALE
-#define EREMOTE WSAEREMOTE
-
-/* Errors not available under Win32 */
-
-#define EACCESS (-1)
+#define EWOULDBLOCK -WSAEWOULDBLOCK
+#define EINPROGRESS -WSAEINPROGRESS
+#define EALREADY -WSAEALREADY
+#define ENOTSOCK -WSAENOTSOCK
+#define EDESTADDRREQ -WSAEDESTADDRREQ
+#define EMSGSIZE -WSAEMSGSIZE
+#define EPROTOTYPE -WSAEPROTOTYPE
+#define ENOPROTOOPT -WSAENOPROTOOPT
+#define EPROTONOSUPPORT -WSAEPROTONOSUPPORT
+#define ESOCKTNOSUPPORT -WSAESOCKTNOSUPPORT
+#define EOPNOTSUPP -WSAEOPNOTSUPP
+#define EPFNOSUPPORT -WSAEPFNOSUPPORT
+#define EAFNOSUPPORT -WSAEAFNOSUPPORT
+#define EADDRINUSE -WSAEADDRINUSE
+#define EADDRNOTAVAIL -WSAEADDRNOTAVAIL
+#define ENETDOWN -WSAENETDOWN
+#define ENETUNREACH -WSAENETUNREACH
+#define ENETRESET -WSAENETRESET
+#define ECONNABORTED -WSAECONNABORTED
+#define ECONNRESET -WSAECONNRESET
+#define ENOBUFS -WSAENOBUFS
+#define EISCONN -WSAEISCONN
+#define ENOTCONN -WSAENOTCONN
+#define ESHUTDOWN -WSAESHUTDOWN
+#define ETOOMANYREFS -WSAETOOMANYREFS
+#define ETIMEDOUT -WSAETIMEDOUT
+#define ECONNREFUSED -WSAECONNREFUSED
+#define ELOOP -WSAELOOP
+#define EHOSTDOWN -WSAEHOSTDOWN
+#define EHOSTUNREACH -WSAEHOSTUNREACH
+#define EPROCLIM -WSAEPROCLIM
+#define EUSERS -WSAEUSERS
+#define EDQUOT -WSAEDQUOT
+#define ESTALE -WSAESTALE
+#define EREMOTE -WSAEREMOTE
+
+#define EACCESS EACCES
int error_table[] = {
E2BIG, EACCESS, EAGAIN, EBADF, EBUSY, ECHILD, EDEADLK, EDOM,