4 #include "utils/mono-lazy-init.h"
6 static mono_lazy_init_t error_key_once = MONO_LAZY_INIT_STATUS_NOT_INITIALIZED;
8 static pthread_key_t error_key;
14 ret = pthread_key_create (&error_key, NULL);
19 mono_w32error_get_last (void)
21 mono_lazy_initialize (&error_key_once, error_key_init);
22 return GPOINTER_TO_UINT (pthread_getspecific (error_key));
26 mono_w32error_set_last (guint32 error)
29 mono_lazy_initialize (&error_key_once, error_key_init);
30 ret = pthread_setspecific (error_key, GUINT_TO_POINTER (error));
35 mono_w32error_unix_to_win32 (guint32 error)
37 /* mapping ideas borrowed from wine. they may need some work */
42 case EROFS: return ERROR_ACCESS_DENIED;
43 case EAGAIN: return ERROR_SHARING_VIOLATION;
44 case EBUSY: return ERROR_LOCK_VIOLATION;
45 case EEXIST: return ERROR_FILE_EXISTS;
47 case ESPIPE: return ERROR_SEEK;
48 case EISDIR: return ERROR_CANNOT_MAKE;
50 case EMFILE: return ERROR_TOO_MANY_OPEN_FILES;
52 case ENOTDIR: return ERROR_FILE_NOT_FOUND;
53 case ENOSPC: return ERROR_HANDLE_DISK_FULL;
54 case ENOTEMPTY: return ERROR_DIR_NOT_EMPTY;
55 case ENOEXEC: return ERROR_BAD_FORMAT;
56 case ENAMETOOLONG: return ERROR_FILENAME_EXCED_RANGE;
58 case EINPROGRESS: return ERROR_IO_PENDING;
60 case ENOSYS: return ERROR_NOT_SUPPORTED;
61 case EBADF: return ERROR_INVALID_HANDLE;
62 case EIO: return ERROR_INVALID_HANDLE;
63 case EINTR: return ERROR_IO_PENDING; /* best match I could find */
64 case EPIPE: return ERROR_WRITE_FAULT;
66 g_error ("%s: unknown error (%d) \"%s\"", error, g_strerror (error));