1 /*-------------------------------------------------------------------------
2  *
3  * win32error.c
4  *	  Map win32 error codes to errno values
5  *
6  * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
7  *
8  * IDENTIFICATION
9  *	  src/port/win32error.c
10  *
11  *-------------------------------------------------------------------------
12  */
13 
14 #ifndef FRONTEND
15 #include "postgres.h"
16 #else
17 #include "postgres_fe.h"
18 #endif
19 
20 static const struct
21 {
22 	DWORD		winerr;
23 	int			doserr;
24 }	doserrors[] =
25 
26 {
27 	{
28 		ERROR_INVALID_FUNCTION, EINVAL
29 	},
30 	{
31 		ERROR_FILE_NOT_FOUND, ENOENT
32 	},
33 	{
34 		ERROR_PATH_NOT_FOUND, ENOENT
35 	},
36 	{
37 		ERROR_TOO_MANY_OPEN_FILES, EMFILE
38 	},
39 	{
40 		ERROR_ACCESS_DENIED, EACCES
41 	},
42 	{
43 		ERROR_INVALID_HANDLE, EBADF
44 	},
45 	{
46 		ERROR_ARENA_TRASHED, ENOMEM
47 	},
48 	{
49 		ERROR_NOT_ENOUGH_MEMORY, ENOMEM
50 	},
51 	{
52 		ERROR_INVALID_BLOCK, ENOMEM
53 	},
54 	{
55 		ERROR_BAD_ENVIRONMENT, E2BIG
56 	},
57 	{
58 		ERROR_BAD_FORMAT, ENOEXEC
59 	},
60 	{
61 		ERROR_INVALID_ACCESS, EINVAL
62 	},
63 	{
64 		ERROR_INVALID_DATA, EINVAL
65 	},
66 	{
67 		ERROR_INVALID_DRIVE, ENOENT
68 	},
69 	{
70 		ERROR_CURRENT_DIRECTORY, EACCES
71 	},
72 	{
73 		ERROR_NOT_SAME_DEVICE, EXDEV
74 	},
75 	{
76 		ERROR_NO_MORE_FILES, ENOENT
77 	},
78 	{
79 		ERROR_LOCK_VIOLATION, EACCES
80 	},
81 	{
82 		ERROR_SHARING_VIOLATION, EACCES
83 	},
84 	{
85 		ERROR_BAD_NETPATH, ENOENT
86 	},
87 	{
88 		ERROR_NETWORK_ACCESS_DENIED, EACCES
89 	},
90 	{
91 		ERROR_BAD_NET_NAME, ENOENT
92 	},
93 	{
94 		ERROR_FILE_EXISTS, EEXIST
95 	},
96 	{
97 		ERROR_CANNOT_MAKE, EACCES
98 	},
99 	{
100 		ERROR_FAIL_I24, EACCES
101 	},
102 	{
103 		ERROR_INVALID_PARAMETER, EINVAL
104 	},
105 	{
106 		ERROR_NO_PROC_SLOTS, EAGAIN
107 	},
108 	{
109 		ERROR_DRIVE_LOCKED, EACCES
110 	},
111 	{
112 		ERROR_BROKEN_PIPE, EPIPE
113 	},
114 	{
115 		ERROR_DISK_FULL, ENOSPC
116 	},
117 	{
118 		ERROR_INVALID_TARGET_HANDLE, EBADF
119 	},
120 	{
121 		ERROR_INVALID_HANDLE, EINVAL
122 	},
123 	{
124 		ERROR_WAIT_NO_CHILDREN, ECHILD
125 	},
126 	{
127 		ERROR_CHILD_NOT_COMPLETE, ECHILD
128 	},
129 	{
130 		ERROR_DIRECT_ACCESS_HANDLE, EBADF
131 	},
132 	{
133 		ERROR_NEGATIVE_SEEK, EINVAL
134 	},
135 	{
136 		ERROR_SEEK_ON_DEVICE, EACCES
137 	},
138 	{
139 		ERROR_DIR_NOT_EMPTY, ENOTEMPTY
140 	},
141 	{
142 		ERROR_NOT_LOCKED, EACCES
143 	},
144 	{
145 		ERROR_BAD_PATHNAME, ENOENT
146 	},
147 	{
148 		ERROR_MAX_THRDS_REACHED, EAGAIN
149 	},
150 	{
151 		ERROR_LOCK_FAILED, EACCES
152 	},
153 	{
154 		ERROR_ALREADY_EXISTS, EEXIST
155 	},
156 	{
157 		ERROR_FILENAME_EXCED_RANGE, ENOENT
158 	},
159 	{
160 		ERROR_NESTING_NOT_ALLOWED, EAGAIN
161 	},
162 	{
163 		ERROR_NOT_ENOUGH_QUOTA, ENOMEM
164 	}
165 };
166 
167 void
_dosmaperr(unsigned long e)168 _dosmaperr(unsigned long e)
169 {
170 	int			i;
171 
172 	if (e == 0)
173 	{
174 		errno = 0;
175 		return;
176 	}
177 
178 	for (i = 0; i < lengthof(doserrors); i++)
179 	{
180 		if (doserrors[i].winerr == e)
181 		{
182 			int			doserr = doserrors[i].doserr;
183 
184 #ifndef FRONTEND
185 			ereport(DEBUG5,
186 					(errmsg_internal("mapped win32 error code %lu to %d",
187 									 e, doserr)));
188 #elif FRONTEND_DEBUG
189 			fprintf(stderr, "mapped win32 error code %lu to %d", e, doserr);
190 #endif
191 			errno = doserr;
192 			return;
193 		}
194 	}
195 
196 #ifndef FRONTEND
197 	ereport(LOG,
198 			(errmsg_internal("unrecognized win32 error code: %lu",
199 							 e)));
200 #else
201 	fprintf(stderr, "unrecognized win32 error code: %lu", e);
202 #endif
203 
204 	errno = EINVAL;
205 	return;
206 }
207