aboutsummaryrefslogtreecommitdiff
path: root/src/backend/port/win32/error.c
blob: 6a8901a642f4e08de6c3ee01549cf46f7f3b6677 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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;
}