| /* | |
| * Win32 kernel functions | |
| * | |
| * Copyright 1995 Martin von Loewis and Cameron Heide | |
| */ | |
| #include <errno.h> | |
| #include "windef.h" | |
| #include "winerror.h" | |
| /* The errno_xlat_table contains the errno-to-Win32 error | |
| * mapping. Since this is a single table, it can't easily | |
| * take into account function-specific differences, so there | |
| * will probably be quite a few points where we don't exactly | |
| * match what NT would return. Then again, neither does | |
| * Windows 95. :-) | |
| */ | |
| typedef struct { | |
| int err; | |
| DWORD win32err; | |
| } ERRNO_XLAT_TABLE; | |
| /* The table looks pretty ugly due to the preprocessor stuff, | |
| * but I honestly have no idea how many of these values are | |
| * portable. I'm not even sure how many of them are even | |
| * used at all. :-) | |
| */ | |
| static ERRNO_XLAT_TABLE errno_xlat_table[] = { | |
| #if defined(EPERM) | |
| { EPERM, ERROR_ACCESS_DENIED }, | |
| #endif | |
| #if defined(ENOENT) | |
| { ENOENT, ERROR_FILE_NOT_FOUND }, | |
| #endif | |
| #if defined(ESRCH) | |
| { ESRCH, ERROR_INVALID_PARAMETER }, | |
| #endif | |
| #if defined(EIO) | |
| { EIO, ERROR_IO_DEVICE }, | |
| #endif | |
| #if defined(ENOEXEC) | |
| { ENOEXEC, ERROR_BAD_FORMAT }, | |
| #endif | |
| #if defined(EBADF) | |
| { EBADF, ERROR_INVALID_HANDLE }, | |
| #endif | |
| #if defined(ENOMEM) | |
| { ENOMEM, ERROR_OUTOFMEMORY }, | |
| #endif | |
| #if defined(EACCES) | |
| { EACCES, ERROR_ACCESS_DENIED }, | |
| #endif | |
| #if defined(EBUSY) | |
| { EBUSY, ERROR_BUSY }, | |
| #endif | |
| #if defined(EEXIST) | |
| { EEXIST, ERROR_FILE_EXISTS }, | |
| #endif | |
| #if defined(ENODEV) | |
| { ENODEV, ERROR_BAD_DEVICE }, | |
| #endif | |
| #if defined(EINVAL) | |
| { EINVAL, ERROR_INVALID_PARAMETER }, | |
| #endif | |
| #if defined(EMFILE) | |
| { EMFILE, ERROR_TOO_MANY_OPEN_FILES }, | |
| #endif | |
| #if defined(ETXTBSY) | |
| { ETXTBSY, ERROR_BUSY, }, | |
| #endif | |
| #if defined(ENOSPC) | |
| { ENOSPC, ERROR_DISK_FULL }, | |
| #endif | |
| #if defined(ESPIPE) | |
| { ESPIPE, ERROR_SEEK_ON_DEVICE }, | |
| #endif | |
| #if defined(EPIPE) | |
| { EPIPE, ERROR_BROKEN_PIPE }, | |
| #endif | |
| #if defined(EDEADLK) | |
| { EDEADLK, ERROR_POSSIBLE_DEADLOCK }, | |
| #endif | |
| #if defined(ENAMETOOLONG) | |
| { ENAMETOOLONG, ERROR_FILENAME_EXCED_RANGE }, | |
| #endif | |
| #if defined(ENOTEMPTY) | |
| { ENOTEMPTY, ERROR_DIR_NOT_EMPTY }, | |
| #endif | |
| { -1, 0 } | |
| }; | |
| DWORD ErrnoToLastError(int errno_num) | |
| { | |
| DWORD rc = ERROR_UNKNOWN; | |
| int i = 0; | |
| while(errno_xlat_table[i].err != -1) | |
| { | |
| if(errno_xlat_table[i].err == errno_num) | |
| { | |
| rc = errno_xlat_table[i].win32err; | |
| break; | |
| } | |
| i++; | |
| } | |
| return rc; | |
| } | |
| int LastErrorToErrno(DWORD lasterror) | |
| { | |
| int rc = 0; /* no error */ | |
| int i = 0; | |
| while(errno_xlat_table[i].err != -1) | |
| { | |
| if(errno_xlat_table[i].win32err == lasterror ) | |
| { | |
| rc = errno_xlat_table[i].err; | |
| break; | |
| } | |
| i++; | |
| } | |
| return rc; | |
| } |