Re: REPOST: InitDB Failure on install
"Magnus Hagander" <[email protected]>
| Newsgroups | gmane.comp.db.postgresql.devel.win32 |
|---|---|
| Message-ID | <[email protected]> |
>>> 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 ---------------------------(end of broadcast)--------------------------- TIP 7: don't forget to increase your free space map settings
win32error.patch
(application/octet-stream, 2.6 KB)
Index: src/backend/port/win32/Makefile
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/port/win32/Makefile,v
retrieving revision 1.5
diff -c -r1.5 Makefile
*** src/backend/port/win32/Makefile 24 Jun 2004 21:02:42 -0000 1.5
--- src/backend/port/win32/Makefile 23 Aug 2004 19:09:44 -0000
***************
*** 12,18 ****
top_builddir = ../../../..
include $(top_builddir)/src/Makefile.global
! OBJS = sema.o shmem.o timer.o socket.o signal.o security.o
all: SUBSYS.o
--- 12,18 ----
top_builddir = ../../../..
include $(top_builddir)/src/Makefile.global
! OBJS = sema.o shmem.o timer.o socket.o signal.o security.o error.o
all: SUBSYS.o
Index: src/backend/port/win32/shmem.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/port/win32/shmem.c,v
retrieving revision 1.5
diff -c -r1.5 shmem.c
*** src/backend/port/win32/shmem.c 19 Apr 2004 17:42:58 -0000 1.5
--- src/backend/port/win32/shmem.c 23 Aug 2004 18:40:29 -0000
***************
*** 40,46 ****
if (lpmem == NULL)
{
lpmem = (void *) -1;
! errno = GetLastError();
}
return lpmem;
--- 40,46 ----
if (lpmem == NULL)
{
lpmem = (void *) -1;
! _dosmaperr(GetLastError());
}
return lpmem;
***************
*** 123,128 ****
--- 123,129 ----
else if (!hmap)
{
/* Unable to get shared memory */
+ _dosmaperr(GetLastError());
return -1;
}
Index: src/backend/postmaster/syslogger.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/syslogger.c,v
retrieving revision 1.5
diff -c -r1.5 syslogger.c
*** src/backend/postmaster/syslogger.c 9 Aug 2004 20:28:48 -0000 1.5
--- src/backend/postmaster/syslogger.c 23 Aug 2004 18:41:09 -0000
***************
*** 706,711 ****
--- 706,712 ----
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")));
Index: src/include/port/win32.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/port/win32.h,v
retrieving revision 1.27
diff -c -r1.27 win32.h
*** src/include/port/win32.h 23 Jul 2004 01:58:36 -0000 1.27
--- src/include/port/win32.h 23 Aug 2004 19:38:21 -0000
***************
*** 222,224 ****
--- 222,231 ----
#define ECONNREFUSED WSAECONNREFUSED
#define EBADFD WSAENOTSOCK
#define EOPNOTSUPP WSAEOPNOTSUPP
+
+
+ /*
+ * In backend/port/win32/error.c
+ */
+ void _dosmaperr(unsigned long);
error.c
(application/octet-stream, 2.9 KB)
/*-------------------------------------------------------------------------
*
* error.c
* Map win32 error codes to errno values
*
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
*
* IDENTIFICATION
* $PostgreSQL$
*
*-------------------------------------------------------------------------
*/
#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;
}