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;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.