mirror of https://github.com/postgres/postgres
>>GetLastError will >>> give much more details than errno. >> >>How much more, really? That mapping table gave me the impression that >>the win32 error codes aren't all that much more detailed than errno... > >The mapping table is not complete. My winerror.h from the SDK >lists 2209 >error codes, whereas errno.h lists 42... > >I still don't think we'll get that much more stuff. Right now, >the Win32 >code paths that actually use the more advanced functions already write >out the error number in case something happens. We can keep doing that >for the other paths (ereport the error *number* when the mapping does >not have a match). The map to errno will catch almost all cases, I >think. And in the corner cases we can do with just the number, and use >"net helpmsg" to get the actual message when checking... Here's an attempt on this. new file goes in backend/port/win32. Magnus HaganderREL8_0_STABLE
parent
fe90fb4d37
commit
704ff0b2f2
@ -0,0 +1,92 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* error.c |
||||
* Map win32 error codes to errno values |
||||
* |
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group |
||||
* |
||||
* IDENTIFICATION |
||||
* $PostgreSQL: pgsql/src/backend/port/win32/error.c,v 1.1 2004/08/29 00:38:03 momjian Exp $ |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
#include "postgres.h" |
||||
|
||||
static struct { DWORD winerr; int doserr;} doserrors[] = |
||||
{ |
||||
{ ERROR_INVALID_FUNCTION, EINVAL }, |
||||
{ 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_ACCESS, EINVAL }, |
||||
{ ERROR_INVALID_DATA, EINVAL }, |
||||
{ ERROR_INVALID_DRIVE, ENOENT }, |
||||
{ ERROR_CURRENT_DIRECTORY, EACCES }, |
||||
{ ERROR_NOT_SAME_DEVICE, EXDEV }, |
||||
{ ERROR_NO_MORE_FILES, ENOENT }, |
||||
{ ERROR_LOCK_VIOLATION, 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_INVALID_PARAMETER, EINVAL }, |
||||
{ ERROR_NO_PROC_SLOTS, EAGAIN }, |
||||
{ ERROR_DRIVE_LOCKED, EACCES }, |
||||
{ ERROR_BROKEN_PIPE, EPIPE }, |
||||
{ ERROR_DISK_FULL, ENOSPC }, |
||||
{ ERROR_INVALID_TARGET_HANDLE, EBADF }, |
||||
{ ERROR_INVALID_HANDLE, EINVAL }, |
||||
{ ERROR_WAIT_NO_CHILDREN, ECHILD }, |
||||
{ ERROR_CHILD_NOT_COMPLETE, ECHILD }, |
||||
{ ERROR_DIRECT_ACCESS_HANDLE, EBADF }, |
||||
{ ERROR_NEGATIVE_SEEK, EINVAL }, |
||||
{ 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_FILENAME_EXCED_RANGE, ENOENT }, |
||||
{ ERROR_NESTING_NOT_ALLOWED, EAGAIN }, |
||||
{ ERROR_NOT_ENOUGH_QUOTA, ENOMEM } |
||||
}; |
||||
|
||||
void _dosmaperr(unsigned long e) |
||||
{ |
||||
int i; |
||||
|
||||
if (e == 0) |
||||
{ |
||||
errno = 0; |
||||
return; |
||||
} |
||||
|
||||
for (i=0; i<sizeof(doserrors)/sizeof(doserrors[0]); i++) |
||||
{ |
||||
if (doserrors[i].winerr == e) |
||||
{ |
||||
errno = doserrors[i].doserr; |
||||
ereport(DEBUG5, |
||||
(errmsg_internal("Mapped win32 error code %i to %i", |
||||
(int)e, errno))); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
ereport(DEBUG4, |
||||
(errmsg_internal("Unknown win32 error code: %i", |
||||
(int)e))); |
||||
errno = EINVAL; |
||||
return; |
||||
} |
||||
Loading…
Reference in new issue