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