mirror of
https://github.com/postgres/postgres.git
synced 2025-06-04 00:02:37 -04:00
>>> I understand your disliking of non-posix stuff. OTOH,
>>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 Hagander
This commit is contained in:
parent
fe90fb4d37
commit
704ff0b2f2
@ -4,7 +4,7 @@
|
||||
# Makefile for port/win32
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $PostgreSQL: pgsql/src/backend/port/win32/Makefile,v 1.5 2004/06/24 21:02:42 tgl Exp $
|
||||
# $PostgreSQL: pgsql/src/backend/port/win32/Makefile,v 1.6 2004/08/29 00:38:03 momjian Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
@ -12,7 +12,7 @@ subdir = src/backend/port/win32
|
||||
top_builddir = ../../../..
|
||||
include $(top_builddir)/src/Makefile.global
|
||||
|
||||
OBJS = sema.o shmem.o timer.o socket.o signal.o security.o
|
||||
OBJS = sema.o shmem.o timer.o socket.o signal.o security.o error.o
|
||||
|
||||
all: SUBSYS.o
|
||||
|
||||
|
92
src/backend/port/win32/error.c
Normal file
92
src/backend/port/win32/error.c
Normal file
@ -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;
|
||||
}
|
@ -6,7 +6,7 @@
|
||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/port/win32/shmem.c,v 1.5 2004/04/19 17:42:58 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/port/win32/shmem.c,v 1.6 2004/08/29 00:38:03 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -40,7 +40,7 @@ shmat(int memId, void *shmaddr, int flag)
|
||||
if (lpmem == NULL)
|
||||
{
|
||||
lpmem = (void *) -1;
|
||||
errno = GetLastError();
|
||||
_dosmaperr(GetLastError());
|
||||
}
|
||||
|
||||
return lpmem;
|
||||
@ -123,6 +123,7 @@ shmget(int memKey, int size, int flag)
|
||||
else if (!hmap)
|
||||
{
|
||||
/* Unable to get shared memory */
|
||||
_dosmaperr(GetLastError());
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.5 2004/08/09 20:28:48 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.6 2004/08/29 00:38:03 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -706,6 +706,7 @@ pipeThread(void *arg)
|
||||
if (error == ERROR_HANDLE_EOF ||
|
||||
error == ERROR_BROKEN_PIPE)
|
||||
break;
|
||||
_dosmaperr(error);
|
||||
ereport(LOG,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("could not read from logger pipe: %m")));
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.27 2004/07/23 01:58:36 momjian Exp $ */
|
||||
/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.28 2004/08/29 00:38:03 momjian Exp $ */
|
||||
|
||||
/* undefine and redefine after #include */
|
||||
#undef mkdir
|
||||
@ -147,6 +147,9 @@ extern int pgwin32_is_admin(void);
|
||||
extern int pgwin32_is_service(void);
|
||||
#endif
|
||||
|
||||
/* in backend/port/win32/error.c */
|
||||
void _dosmaperr(unsigned long);
|
||||
|
||||
|
||||
#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
|
||||
#define WIFEXITED(w) (((w) & 0xff) == 0)
|
||||
@ -222,3 +225,4 @@ int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue
|
||||
#define ECONNREFUSED WSAECONNREFUSED
|
||||
#define EBADFD WSAENOTSOCK
|
||||
#define EOPNOTSUPP WSAEOPNOTSUPP
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user