diff --git a/src/configure.in b/src/configure.in index 90b97deb215186c084d74164318c5239014c4421..b68c937692fe88cd0c0a87299050a5e748aceccc 100644 --- a/src/configure.in +++ b/src/configure.in @@ -4546,7 +4546,6 @@ AC_CHECK_FUNCS( \ thread_info \ host_get_clock_service \ posix_memalign \ - _dosmaperr \ ) # SunOS 4 realloc() returns NULL when reallocing NULL. diff --git a/src/fdlib.c b/src/fdlib.c index 13625aa2db3c0335c0f0ce18d161f839b4d03fb8..6c79260c7e8f50ebdd0c8bcfc45cb7e1e37f3280 100644 --- a/src/fdlib.c +++ b/src/fdlib.c @@ -99,15 +99,20 @@ static inline void libc_free(void *ptr); #define libc_free(PTR) free(PTR) #endif -#if defined(_MSC_VER) && (_MSC_VER < 1600) -/* _dosmaperr is internal but still exported in the dll interface. */ -__declspec(dllimport) void __cdecl _dosmaperr(unsigned long); -#else -/* msvcr100.dll seems to not implement _dosmaperr()... */ +/* Provide and use our own implementation of _dosmaperr(), + * as it isn't provided by all CRT runtimes; eg both MinGW + * and msvcr100.dll seem to not implement _dosmaperr()... + */ #undef _dosmaperr #define _dosmaperr pike_dosmaperr -/* Mapping of Windows error codes to POSIX error codes. */ +/* Mapping of Windows error codes to POSIX error codes. + * + * This table was generated by correlating the behavior of + * _dosmaperr() with the <WinError.h> and <errno.h> header files. + * + * Entries not in the table map to EINVAL. + */ static const unsigned long pike_doserrtab[][2] = { { ERROR_INVALID_FUNCTION, EINVAL, }, /* 1 */ { ERROR_FILE_NOT_FOUND, ENOENT, }, /* 2 */ @@ -126,7 +131,22 @@ static const unsigned long pike_doserrtab[][2] = { { ERROR_CURRENT_DIRECTORY, EACCES, }, /* 16 */ { ERROR_NOT_SAME_DEVICE, EXDEV, }, /* 17 */ { ERROR_NO_MORE_FILES, ENOENT, }, /* 18 */ + { ERROR_WRITE_PROTECT, EACCES, }, /* 19 */ + { ERROR_BAD_UNIT, EACCES, }, /* 20 */ + { ERROR_NOT_READY, EACCES, }, /* 21 */ + { ERROR_BAD_COMMAND, EACCES }, /* 22 */ + { ERROR_CRC, EACCES }, /* 23 */ + { ERROR_BAD_LENGTH, EACCES }, /* 24 */ + { ERROR_NOT_DOS_DISK, EACCES }, /* 26 */ + { ERROR_SECTOR_NOT_FOUND, EACCES }, /* 27 */ + { ERROR_OUT_OF_PAPER, EACCES }, /* 28 */ + { ERROR_WRITE_FAULT, EACCES }, /* 29 */ + { ERROR_READ_FAULT, EACCES }, /* 30 */ + { ERROR_GEN_FAILURE, EACCES }, /* 31 */ + { ERROR_SHARING_VIOLATION, EACCES }, /* 32 */ { ERROR_LOCK_VIOLATION, EACCES, }, /* 33 */ + { ERROR_WRONG_DISK, EACCES }, /* 34 */ + { ERROR_SHARING_BUFFER_EXCEEDED, EACCES }, /* 36 */ { ERROR_BAD_NETPATH, ENOENT, }, /* 53 */ { ERROR_NETWORK_ACCESS_DENIED, EACCES, }, /* 65 */ { ERROR_BAD_NET_NAME, ENOENT, }, /* 67 */ @@ -151,6 +171,21 @@ static const unsigned long pike_doserrtab[][2] = { { ERROR_MAX_THRDS_REACHED, EAGAIN, }, /* 164 */ { ERROR_LOCK_FAILED, EACCES, }, /* 167 */ { ERROR_ALREADY_EXISTS, EEXIST, }, /* 183 */ + { ERROR_INVALID_STARTING_CODESEG, ENOEXEC }, /* 188 */ + { ERROR_INVALID_STACKSEG, ENOEXEC }, /* 189 */ + { ERROR_INVALID_MODULETYPE, ENOEXEC }, /* 190 */ + { ERROR_INVALID_EXE_SIGNATURE, ENOEXEC }, /* 191 */ + { ERROR_EXE_MARKED_INVALID, ENOEXEC }, /* 192 */ + { ERROR_BAD_EXE_FORMAT, ENOEXEC }, /* 193 */ + { ERROR_ITERATED_DATA_EXCEEDS_64k, ENOEXEC }, /* 194 */ + { ERROR_INVALID_MINALLOCSIZE, ENOEXEC }, /* 195 */ + { ERROR_DYNLINK_FROM_INVALID_RING, ENOEXEC }, /* 196 */ + { ERROR_IOPL_NOT_ENABLED, ENOEXEC }, /* 197 */ + { ERROR_INVALID_SEGDPL, ENOEXEC }, /* 198 */ + { ERROR_AUTODATASEG_EXCEEDS_64k, ENOEXEC }, /* 199 */ + { ERROR_RING2SEG_MUST_BE_MOVABLE, ENOEXEC }, /* 200 */ + { ERROR_RELOC_CHAIN_XEEDS_SEGLIM, ENOEXEC }, /* 201 */ + { ERROR_INFLOOP_IN_RELOC_CHAIN, ENOEXEC }, /* 202 */ { ERROR_FILENAME_EXCED_RANGE, ENOENT, }, /* 206 */ { ERROR_NESTING_NOT_ALLOWED, EAGAIN, }, /* 215 */ { ERROR_NOT_ENOUGH_QUOTA, ENOMEM, }, /* 1816 */ @@ -178,8 +213,6 @@ static inline void _dosmaperr(unsigned long err) errno = EINVAL; } -#endif - PMOD_EXPORT void set_errno_from_win32_error (unsigned long err) { FDDEBUG(fprintf(stderr, "Win32Error: %ld\n", err)); diff --git a/src/port.c b/src/port.c index bc62b35b15cd90eb4344182a85136bdc0bfb1d76..494e252e69bde66d3a2afc81ea0bcfa87c6d0920 100644 --- a/src/port.c +++ b/src/port.c @@ -596,105 +596,3 @@ long long gethrtime() #endif /* OWN_GETHRTIME_RDTSC */ #endif /* OWN_GETHRTIME */ - -#ifdef __MINGW32__ -struct errmapping { - const int winerr; - const int doserr; -}; - -/* Auto generated from winerror.h and errno.h using the windows - internal function _dosmaperr. */ - -static const struct errmapping errmap[] = { - { ERROR_FILE_NOT_FOUND, ENOENT }, - { ERROR_PATH_NOT_FOUND, ENOENT }, - { ERROR_TOO_MANY_OPEN_FILES, EMFILE }, - { ERROR_ACCESS_DENIED, EACCES }, - { ERROR_INVALID_HANDLE, EBADF }, - { ERROR_ARENA_TRASHED, ENOMEM }, - { ERROR_NOT_ENOUGH_MEMORY, ENOMEM }, - { ERROR_INVALID_BLOCK, ENOMEM }, - { ERROR_BAD_ENVIRONMENT, E2BIG }, - { ERROR_BAD_FORMAT, ENOEXEC }, - { ERROR_INVALID_DRIVE, ENOENT }, - { ERROR_CURRENT_DIRECTORY, EACCES }, - { ERROR_NOT_SAME_DEVICE, EXDEV }, - { ERROR_NO_MORE_FILES, ENOENT }, - { ERROR_WRITE_PROTECT, EACCES }, - { ERROR_BAD_UNIT, EACCES }, - { ERROR_NOT_READY, EACCES }, - { ERROR_BAD_COMMAND, EACCES }, - { ERROR_CRC, EACCES }, - { ERROR_BAD_LENGTH, EACCES }, - { ERROR_SEEK, EACCES }, - { ERROR_NOT_DOS_DISK, EACCES }, - { ERROR_SECTOR_NOT_FOUND, EACCES }, - { ERROR_OUT_OF_PAPER, EACCES }, - { ERROR_WRITE_FAULT, EACCES }, - { ERROR_READ_FAULT, EACCES }, - { ERROR_GEN_FAILURE, EACCES }, - { ERROR_SHARING_VIOLATION, EACCES }, - { ERROR_LOCK_VIOLATION, EACCES }, - { ERROR_WRONG_DISK, EACCES }, - { ERROR_SHARING_BUFFER_EXCEEDED, EACCES }, - { ERROR_BAD_NETPATH, ENOENT }, - { ERROR_NETWORK_ACCESS_DENIED, EACCES }, - { ERROR_BAD_NET_NAME, ENOENT }, - { ERROR_FILE_EXISTS, EEXIST }, - { ERROR_CANNOT_MAKE, EACCES }, - { ERROR_FAIL_I24, EACCES }, - { ERROR_NO_PROC_SLOTS, EAGAIN }, - { ERROR_DRIVE_LOCKED, EACCES }, - { ERROR_BROKEN_PIPE, EPIPE }, - { ERROR_DISK_FULL, ENOSPC }, - { ERROR_INVALID_TARGET_HANDLE, EBADF }, - { ERROR_WAIT_NO_CHILDREN, ECHILD }, - { ERROR_CHILD_NOT_COMPLETE, ECHILD }, - { ERROR_DIRECT_ACCESS_HANDLE, EBADF }, - { ERROR_SEEK_ON_DEVICE, EACCES }, - { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, - { ERROR_NOT_LOCKED, EACCES }, - { ERROR_BAD_PATHNAME, ENOENT }, - { ERROR_MAX_THRDS_REACHED, EAGAIN }, - { ERROR_LOCK_FAILED, EACCES }, - { ERROR_ALREADY_EXISTS, EEXIST }, - { ERROR_INVALID_STARTING_CODESEG, ENOEXEC }, - { ERROR_INVALID_STACKSEG, ENOEXEC }, - { ERROR_INVALID_MODULETYPE, ENOEXEC }, - { ERROR_INVALID_EXE_SIGNATURE, ENOEXEC }, - { ERROR_EXE_MARKED_INVALID, ENOEXEC }, - { ERROR_BAD_EXE_FORMAT, ENOEXEC }, - { ERROR_ITERATED_DATA_EXCEEDS_64k, ENOEXEC }, - { ERROR_INVALID_MINALLOCSIZE, ENOEXEC }, - { ERROR_DYNLINK_FROM_INVALID_RING, ENOEXEC }, - { ERROR_IOPL_NOT_ENABLED, ENOEXEC }, - { ERROR_INVALID_SEGDPL, ENOEXEC }, - { ERROR_AUTODATASEG_EXCEEDS_64k, ENOEXEC }, - { ERROR_RING2SEG_MUST_BE_MOVABLE, ENOEXEC }, - { ERROR_RELOC_CHAIN_XEEDS_SEGLIM, ENOEXEC }, - { ERROR_INFLOOP_IN_RELOC_CHAIN, ENOEXEC }, - { ERROR_FILENAME_EXCED_RANGE, ENOENT }, - { ERROR_NESTING_NOT_ALLOWED, EAGAIN }, - { ERROR_NOT_ENOUGH_QUOTA, ENOMEM } -}; - -void _dosmaperr(int err) { - unsigned int i; - - if( err == 0 ) - { - errno = 0; - return; - } - - for(i=0; i<NELEM(errmap); i++) - if( errmap[i].winerr == err) - { - errno = errmap[i].doserr; - return; - } - - /* FIXME: Set generic error? */ -} -#endif diff --git a/src/port.h b/src/port.h index b1013024b5c81d938ea05f1a791ec974592b7733..eb7563846c769804384914aa7854f1c29e6eaf2c 100644 --- a/src/port.h +++ b/src/port.h @@ -358,12 +358,6 @@ long long gethrtime(void); #endif /* DOUBLE_IS_IEEE_LITTLE */ #endif /* DOUBLE_IS_IEEE_BIG */ -#ifdef __MINGW32__ -#ifndef HAVE__DOSMAPERR -void _dosmaperr(int x); -#endif -#endif - #ifdef __clang__ #define PIKE_CLANG_FEATURE(x) __has_feature(x) #define PIKE_CLANG_BUILTIN(x) __has_builtin(x)