xref: /illumos-gate/usr/src/lib/libldap5/sources/ldap/prldap/ldappr-error.c (revision 45ede40b2394db7967e59f19288fae9b62efd4aa)
1 #pragma ident	"%Z%%M%	%I%	%E% SMI"
2 
3 /*
4  * The contents of this file are subject to the Netscape Public
5  * License Version 1.1 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.mozilla.org/NPL/
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * The Original Code is Mozilla Communicator client code, released
15  * March 31, 1998.
16  *
17  * The Initial Developer of the Original Code is Netscape
18  * Communications Corporation. Portions created by Netscape are
19  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
20  * Rights Reserved.
21  *
22  * Contributor(s):
23  */
24 
25 /*
26  * Utilities for manageing the relationship between NSPR errors and
27  * OS (errno-style) errors.
28  *
29  * The overall strategy used is to map NSPR errors into OS errors.
30  */
31 
32 #include "ldappr-int.h"
33 
34 
35 void
36 prldap_set_system_errno( int oserrno )
37 {
38     PR_SetError( PR_UNKNOWN_ERROR, oserrno );
39 }
40 
41 
42 int
43 prldap_get_system_errno( void )
44 {
45     return( PR_GetOSError());
46 }
47 
48 /*
49  * Retrieve the NSPR error number, convert to a system error code, and return
50  * the result.
51  */
52 struct prldap_errormap_entry {
53     PRInt32	erm_nspr;	/* NSPR error code */
54     int		erm_system;	/* corresponding system error code */
55 };
56 
57 /* XXX: not sure if this extra mapping for Windows is good or correct */
58 #ifdef _WINDOWS
59 #ifndef ENOTSUP
60 #define ENOTSUP		-1
61 #endif
62 #ifndef ETIMEDOUT
63 #define ETIMEDOUT	WSAETIMEDOUT
64 #endif
65 #ifndef EADDRNOTAVAIL
66 #define EADDRNOTAVAIL	WSAEADDRNOTAVAIL
67 #endif
68 #ifndef EAFNOSUPPORT
69 #define EAFNOSUPPORT	WSAEAFNOSUPPORT
70 #endif
71 #ifndef EISCONN
72 #define EISCONN		WSAEISCONN
73 #endif
74 #ifndef EADDRINUSE
75 #define EADDRINUSE	WSAEADDRINUSE
76 #endif
77 #ifndef ECONNREFUSED
78 #define ECONNREFUSED	WSAECONNREFUSED
79 #endif
80 #ifndef EHOSTUNREACH
81 #define EHOSTUNREACH	WSAEHOSTUNREACH
82 #endif
83 #ifndef ENOTCONN
84 #define ENOTCONN	WSAENOTCONN
85 #endif
86 #ifndef ENOTSOCK
87 #define ENOTSOCK	WSAENOTSOCK
88 #endif
89 #ifndef EPROTOTYPE
90 #define EPROTOTYPE	WSAEPROTOTYPE
91 #endif
92 #ifndef EOPNOTSUPP
93 #define EOPNOTSUPP	WSAEOPNOTSUPP
94 #endif
95 #ifndef EPROTONOSUPPORT
96 #define EPROTONOSUPPORT	WSAEPROTONOSUPPORT
97 #endif
98 #ifndef EOVERFLOW
99 #define EOVERFLOW	-1
100 #endif
101 #ifndef ECONNRESET
102 #define ECONNRESET	WSAECONNRESET
103 #endif
104 #ifndef ELOOP
105 #define ELOOP		WSAELOOP
106 #endif
107 #ifndef ENOTBLK
108 #define ENOTBLK		-1
109 #endif
110 #ifndef ETXTBSY
111 #define ETXTBSY		-1
112 #endif
113 #ifndef ENETDOWN
114 #define ENETDOWN	WSAENETDOWN
115 #endif
116 #ifndef ESHUTDOWN
117 #define ESHUTDOWN	WSAESHUTDOWN
118 #endif
119 #ifndef ECONNABORTED
120 #define ECONNABORTED	WSAECONNABORTED
121 #endif
122 #endif /* _WINDOWS */
123 
124 /* XXX: need to verify that the -1 entries are correct (no mapping) */
125 static struct prldap_errormap_entry prldap_errormap[] = {
126     {  PR_OUT_OF_MEMORY_ERROR, ENOMEM },
127     {  PR_BAD_DESCRIPTOR_ERROR, EBADF },
128     {  PR_WOULD_BLOCK_ERROR, EAGAIN },
129     {  PR_ACCESS_FAULT_ERROR, EFAULT },
130     {  PR_INVALID_METHOD_ERROR, EINVAL },	/* XXX: correct mapping ? */
131     {  PR_ILLEGAL_ACCESS_ERROR, EACCES },	/* XXX: correct mapping ? */
132     {  PR_UNKNOWN_ERROR, -1 },
133     {  PR_PENDING_INTERRUPT_ERROR, -1 },
134     {  PR_NOT_IMPLEMENTED_ERROR, ENOTSUP },
135     {  PR_IO_ERROR, EIO },
136     {  PR_IO_TIMEOUT_ERROR, ETIMEDOUT },	/* XXX: correct mapping ? */
137     {  PR_IO_PENDING_ERROR, -1 },
138     {  PR_DIRECTORY_OPEN_ERROR, ENOTDIR },
139     {  PR_INVALID_ARGUMENT_ERROR, EINVAL },
140     {  PR_ADDRESS_NOT_AVAILABLE_ERROR, EADDRNOTAVAIL },
141     {  PR_ADDRESS_NOT_SUPPORTED_ERROR, EAFNOSUPPORT },
142     {  PR_IS_CONNECTED_ERROR, EISCONN },
143     {  PR_BAD_ADDRESS_ERROR, EFAULT },		/* XXX: correct mapping ? */
144     {  PR_ADDRESS_IN_USE_ERROR, EADDRINUSE },
145     {  PR_CONNECT_REFUSED_ERROR, ECONNREFUSED },
146     {  PR_NETWORK_UNREACHABLE_ERROR, EHOSTUNREACH },
147     {  PR_CONNECT_TIMEOUT_ERROR, ETIMEDOUT },
148     {  PR_NOT_CONNECTED_ERROR, ENOTCONN },
149     {  PR_LOAD_LIBRARY_ERROR, -1 },
150     {  PR_UNLOAD_LIBRARY_ERROR, -1 },
151     {  PR_FIND_SYMBOL_ERROR, -1 },
152     {  PR_INSUFFICIENT_RESOURCES_ERROR, -1 },
153     {  PR_DIRECTORY_LOOKUP_ERROR, -1 },
154     {  PR_TPD_RANGE_ERROR, -1 },
155     {  PR_PROC_DESC_TABLE_FULL_ERROR, -1 },
156     {  PR_SYS_DESC_TABLE_FULL_ERROR, -1 },
157     {  PR_NOT_SOCKET_ERROR, ENOTSOCK },
158     {  PR_NOT_TCP_SOCKET_ERROR, EPROTOTYPE },
159     {  PR_SOCKET_ADDRESS_IS_BOUND_ERROR, -1 },
160     {  PR_NO_ACCESS_RIGHTS_ERROR, EACCES },	/* XXX: correct mapping ? */
161     {  PR_OPERATION_NOT_SUPPORTED_ERROR, EOPNOTSUPP },
162     {  PR_PROTOCOL_NOT_SUPPORTED_ERROR, EPROTONOSUPPORT },
163     {  PR_REMOTE_FILE_ERROR, -1 },
164 #if defined(OSF1)
165     {  PR_BUFFER_OVERFLOW_ERROR, -1 },
166 #else
167     {  PR_BUFFER_OVERFLOW_ERROR, EOVERFLOW },
168 #endif /* OSF1 */
169     {  PR_CONNECT_RESET_ERROR, ECONNRESET },
170     {  PR_RANGE_ERROR, ERANGE },
171     {  PR_DEADLOCK_ERROR, EDEADLK },
172 #if defined(HPUX11) || defined(AIX4_3) || defined(OSF1)
173     {  PR_FILE_IS_LOCKED_ERROR, -1 },	/* XXX: correct mapping ? */
174 #else
175     {  PR_FILE_IS_LOCKED_ERROR, EDEADLOCK },	/* XXX: correct mapping ? */
176 #endif /* HPUX11 */
177     {  PR_FILE_TOO_BIG_ERROR, EFBIG },
178     {  PR_NO_DEVICE_SPACE_ERROR, ENOSPC },
179     {  PR_PIPE_ERROR, EPIPE },
180     {  PR_NO_SEEK_DEVICE_ERROR, ESPIPE },
181     {  PR_IS_DIRECTORY_ERROR, EISDIR },
182     {  PR_LOOP_ERROR, ELOOP },
183     {  PR_NAME_TOO_LONG_ERROR, ENAMETOOLONG },
184     {  PR_FILE_NOT_FOUND_ERROR, ENOENT },
185     {  PR_NOT_DIRECTORY_ERROR, ENOTDIR },
186     {  PR_READ_ONLY_FILESYSTEM_ERROR, EROFS },
187     {  PR_DIRECTORY_NOT_EMPTY_ERROR, ENOTEMPTY },
188     {  PR_FILESYSTEM_MOUNTED_ERROR, EBUSY },
189     {  PR_NOT_SAME_DEVICE_ERROR, EXDEV },
190     {  PR_DIRECTORY_CORRUPTED_ERROR, -1 },
191     {  PR_FILE_EXISTS_ERROR, EEXIST },
192     {  PR_MAX_DIRECTORY_ENTRIES_ERROR, -1 },
193     {  PR_INVALID_DEVICE_STATE_ERROR, ENOTBLK }, /* XXX: correct mapping ? */
194     {  PR_DEVICE_IS_LOCKED_ERROR, -2 },
195     {  PR_NO_MORE_FILES_ERROR, ENFILE },
196     {  PR_END_OF_FILE_ERROR, -1 },
197     {  PR_FILE_SEEK_ERROR, ESPIPE },		/* XXX: correct mapping ? */
198     {  PR_FILE_IS_BUSY_ERROR, ETXTBSY },
199     {  PR_OPERATION_ABORTED_ERROR, -1 },
200     {  PR_IN_PROGRESS_ERROR, -1 },
201     {  PR_ALREADY_INITIATED_ERROR, -1 },
202     {  PR_GROUP_EMPTY_ERROR, -1 },
203     {  PR_INVALID_STATE_ERROR, -1 },
204     {  PR_NETWORK_DOWN_ERROR, ENETDOWN },
205     {  PR_SOCKET_SHUTDOWN_ERROR, ESHUTDOWN },
206     {  PR_CONNECT_ABORTED_ERROR, ECONNABORTED },
207     {  PR_HOST_UNREACHABLE_ERROR, EHOSTUNREACH },
208     {  PR_MAX_ERROR, -1 },
209 };
210 
211 
212 int
213 prldap_prerr2errno( void )
214 {
215     int		oserr, i;
216     PRInt32	nsprerr;
217 
218     nsprerr = PR_GetError();
219 
220     oserr = -1;		/* unknown */
221     for ( i = 0; prldap_errormap[i].erm_nspr != PR_MAX_ERROR; ++i ) {
222 	if ( prldap_errormap[i].erm_nspr == nsprerr ) {
223 	    oserr = prldap_errormap[i].erm_system;
224 	    break;
225 	}
226     }
227 
228     return( oserr );
229 }
230