1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ssl/unix_err.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,517 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* 1.6 + * This file essentially replicates NSPR's source for the functions that 1.7 + * map system-specific error codes to NSPR error codes. We would use 1.8 + * NSPR's functions, instead of duplicating them, but they're private. 1.9 + * As long as SSL's server session cache code must do platform native I/O 1.10 + * to accomplish its job, and NSPR's error mapping functions remain private, 1.11 + * this code will continue to need to be replicated. 1.12 + * 1.13 + * This Source Code Form is subject to the terms of the Mozilla Public 1.14 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.15 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.16 + 1.17 +#if 0 1.18 +#include "primpl.h" 1.19 +#else 1.20 +#define _PR_POLL_AVAILABLE 1 1.21 +#include "prerror.h" 1.22 +#endif 1.23 + 1.24 +#if defined (__bsdi__) || defined(NTO) || defined(DARWIN) || defined(BEOS) 1.25 +#undef _PR_POLL_AVAILABLE 1.26 +#endif 1.27 + 1.28 +#if defined(_PR_POLL_AVAILABLE) 1.29 +#include <poll.h> 1.30 +#endif 1.31 +#include <errno.h> 1.32 + 1.33 +/* forward declarations. */ 1.34 +void nss_MD_unix_map_default_error(int err); 1.35 + 1.36 +void nss_MD_unix_map_opendir_error(int err) 1.37 +{ 1.38 + nss_MD_unix_map_default_error(err); 1.39 +} 1.40 + 1.41 +void nss_MD_unix_map_closedir_error(int err) 1.42 +{ 1.43 + PRErrorCode prError; 1.44 + switch (err) { 1.45 + case EINVAL: prError = PR_BAD_DESCRIPTOR_ERROR; break; 1.46 + default: nss_MD_unix_map_default_error(err); return; 1.47 + } 1.48 + PR_SetError(prError, err); 1.49 +} 1.50 + 1.51 +void nss_MD_unix_readdir_error(int err) 1.52 +{ 1.53 + PRErrorCode prError; 1.54 + 1.55 + switch (err) { 1.56 + case ENOENT: prError = PR_NO_MORE_FILES_ERROR; break; 1.57 +#ifdef EOVERFLOW 1.58 + case EOVERFLOW: prError = PR_IO_ERROR; break; 1.59 +#endif 1.60 + case EINVAL: prError = PR_IO_ERROR; break; 1.61 + case ENXIO: prError = PR_IO_ERROR; break; 1.62 + default: nss_MD_unix_map_default_error(err); return; 1.63 + } 1.64 + PR_SetError(prError, err); 1.65 +} 1.66 + 1.67 +void nss_MD_unix_map_unlink_error(int err) 1.68 +{ 1.69 + PRErrorCode prError; 1.70 + switch (err) { 1.71 + case EPERM: prError = PR_IS_DIRECTORY_ERROR; break; 1.72 + default: nss_MD_unix_map_default_error(err); return; 1.73 + } 1.74 + PR_SetError(prError, err); 1.75 +} 1.76 + 1.77 +void nss_MD_unix_map_stat_error(int err) 1.78 +{ 1.79 + PRErrorCode prError; 1.80 + switch (err) { 1.81 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.82 + default: nss_MD_unix_map_default_error(err); return; 1.83 + } 1.84 + PR_SetError(prError, err); 1.85 +} 1.86 + 1.87 +void nss_MD_unix_map_fstat_error(int err) 1.88 +{ 1.89 + PRErrorCode prError; 1.90 + switch (err) { 1.91 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.92 + default: nss_MD_unix_map_default_error(err); return; 1.93 + } 1.94 + PR_SetError(prError, err); 1.95 +} 1.96 + 1.97 +void nss_MD_unix_map_rename_error(int err) 1.98 +{ 1.99 + PRErrorCode prError; 1.100 + switch (err) { 1.101 + case EEXIST: prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break; 1.102 + default: nss_MD_unix_map_default_error(err); return; 1.103 + } 1.104 + PR_SetError(prError, err); 1.105 +} 1.106 + 1.107 +void nss_MD_unix_map_access_error(int err) 1.108 +{ 1.109 + PRErrorCode prError; 1.110 + switch (err) { 1.111 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.112 + default: nss_MD_unix_map_default_error(err); return; 1.113 + } 1.114 + PR_SetError(prError, err); 1.115 +} 1.116 + 1.117 +void nss_MD_unix_map_mkdir_error(int err) 1.118 +{ 1.119 + nss_MD_unix_map_default_error(err); 1.120 +} 1.121 + 1.122 +void nss_MD_unix_map_rmdir_error(int err) 1.123 +{ 1.124 + PRErrorCode prError; 1.125 + 1.126 + switch (err) { 1.127 + case EEXIST: prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break; 1.128 + case EINVAL: prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break; 1.129 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.130 + default: nss_MD_unix_map_default_error(err); return; 1.131 + } 1.132 + PR_SetError(prError, err); 1.133 +} 1.134 + 1.135 +void nss_MD_unix_map_read_error(int err) 1.136 +{ 1.137 + PRErrorCode prError; 1.138 + switch (err) { 1.139 + case EINVAL: prError = PR_INVALID_METHOD_ERROR; break; 1.140 + case ENXIO: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.141 + default: nss_MD_unix_map_default_error(err); return; 1.142 + } 1.143 + PR_SetError(prError, err); 1.144 +} 1.145 + 1.146 +void nss_MD_unix_map_write_error(int err) 1.147 +{ 1.148 + PRErrorCode prError; 1.149 + switch (err) { 1.150 + case EINVAL: prError = PR_INVALID_METHOD_ERROR; break; 1.151 + case ENXIO: prError = PR_INVALID_METHOD_ERROR; break; 1.152 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.153 + default: nss_MD_unix_map_default_error(err); return; 1.154 + } 1.155 + PR_SetError(prError, err); 1.156 +} 1.157 + 1.158 +void nss_MD_unix_map_lseek_error(int err) 1.159 +{ 1.160 + nss_MD_unix_map_default_error(err); 1.161 +} 1.162 + 1.163 +void nss_MD_unix_map_fsync_error(int err) 1.164 +{ 1.165 + PRErrorCode prError; 1.166 + switch (err) { 1.167 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.168 + case EINVAL: prError = PR_INVALID_METHOD_ERROR; break; 1.169 + default: nss_MD_unix_map_default_error(err); return; 1.170 + } 1.171 + PR_SetError(prError, err); 1.172 +} 1.173 + 1.174 +void nss_MD_unix_map_close_error(int err) 1.175 +{ 1.176 + PRErrorCode prError; 1.177 + switch (err) { 1.178 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.179 + default: nss_MD_unix_map_default_error(err); return; 1.180 + } 1.181 + PR_SetError(prError, err); 1.182 +} 1.183 + 1.184 +void nss_MD_unix_map_socket_error(int err) 1.185 +{ 1.186 + PRErrorCode prError; 1.187 + switch (err) { 1.188 + case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.189 + default: nss_MD_unix_map_default_error(err); return; 1.190 + } 1.191 + PR_SetError(prError, err); 1.192 +} 1.193 + 1.194 +void nss_MD_unix_map_socketavailable_error(int err) 1.195 +{ 1.196 + PR_SetError(PR_BAD_DESCRIPTOR_ERROR, err); 1.197 +} 1.198 + 1.199 +void nss_MD_unix_map_recv_error(int err) 1.200 +{ 1.201 + nss_MD_unix_map_default_error(err); 1.202 +} 1.203 + 1.204 +void nss_MD_unix_map_recvfrom_error(int err) 1.205 +{ 1.206 + nss_MD_unix_map_default_error(err); 1.207 +} 1.208 + 1.209 +void nss_MD_unix_map_send_error(int err) 1.210 +{ 1.211 + nss_MD_unix_map_default_error(err); 1.212 +} 1.213 + 1.214 +void nss_MD_unix_map_sendto_error(int err) 1.215 +{ 1.216 + nss_MD_unix_map_default_error(err); 1.217 +} 1.218 + 1.219 +void nss_MD_unix_map_writev_error(int err) 1.220 +{ 1.221 + nss_MD_unix_map_default_error(err); 1.222 +} 1.223 + 1.224 +void nss_MD_unix_map_accept_error(int err) 1.225 +{ 1.226 + PRErrorCode prError; 1.227 + switch (err) { 1.228 + case ENODEV: prError = PR_NOT_TCP_SOCKET_ERROR; break; 1.229 + default: nss_MD_unix_map_default_error(err); return; 1.230 + } 1.231 + PR_SetError(prError, err); 1.232 +} 1.233 + 1.234 +void nss_MD_unix_map_connect_error(int err) 1.235 +{ 1.236 + PRErrorCode prError; 1.237 + switch (err) { 1.238 + case EACCES: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.239 +#if defined(UNIXWARE) || defined(SNI) || defined(NEC) 1.240 + /* 1.241 + * On some platforms, if we connect to a port on the local host 1.242 + * (the loopback address) that no process is listening on, we get 1.243 + * EIO instead of ECONNREFUSED. 1.244 + */ 1.245 + case EIO: prError = PR_CONNECT_REFUSED_ERROR; break; 1.246 +#endif 1.247 + case ELOOP: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.248 + case ENOENT: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.249 + case ENXIO: prError = PR_IO_ERROR; break; 1.250 + default: nss_MD_unix_map_default_error(err); return; 1.251 + } 1.252 + PR_SetError(prError, err); 1.253 +} 1.254 + 1.255 +void nss_MD_unix_map_bind_error(int err) 1.256 +{ 1.257 + PRErrorCode prError; 1.258 + switch (err) { 1.259 + case EINVAL: prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR; break; 1.260 + /* 1.261 + * UNIX domain sockets are not supported in NSPR 1.262 + */ 1.263 + case EIO: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.264 + case EISDIR: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.265 + case ELOOP: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.266 + case ENOENT: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.267 + case ENOTDIR: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.268 + case EROFS: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.269 + default: nss_MD_unix_map_default_error(err); return; 1.270 + } 1.271 + PR_SetError(prError, err); 1.272 +} 1.273 + 1.274 +void nss_MD_unix_map_listen_error(int err) 1.275 +{ 1.276 + nss_MD_unix_map_default_error(err); 1.277 +} 1.278 + 1.279 +void nss_MD_unix_map_shutdown_error(int err) 1.280 +{ 1.281 + nss_MD_unix_map_default_error(err); 1.282 +} 1.283 + 1.284 +void nss_MD_unix_map_socketpair_error(int err) 1.285 +{ 1.286 + PRErrorCode prError; 1.287 + switch (err) { 1.288 + case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.289 + default: nss_MD_unix_map_default_error(err); return; 1.290 + } 1.291 + PR_SetError(prError, err); 1.292 +} 1.293 + 1.294 +void nss_MD_unix_map_getsockname_error(int err) 1.295 +{ 1.296 + PRErrorCode prError; 1.297 + switch (err) { 1.298 + case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.299 + default: nss_MD_unix_map_default_error(err); return; 1.300 + } 1.301 + PR_SetError(prError, err); 1.302 +} 1.303 + 1.304 +void nss_MD_unix_map_getpeername_error(int err) 1.305 +{ 1.306 + PRErrorCode prError; 1.307 + 1.308 + switch (err) { 1.309 + case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.310 + default: nss_MD_unix_map_default_error(err); return; 1.311 + } 1.312 + PR_SetError(prError, err); 1.313 +} 1.314 + 1.315 +void nss_MD_unix_map_getsockopt_error(int err) 1.316 +{ 1.317 + PRErrorCode prError; 1.318 + switch (err) { 1.319 + case EINVAL: prError = PR_BUFFER_OVERFLOW_ERROR; break; 1.320 + case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.321 + default: nss_MD_unix_map_default_error(err); return; 1.322 + } 1.323 + PR_SetError(prError, err); 1.324 +} 1.325 + 1.326 +void nss_MD_unix_map_setsockopt_error(int err) 1.327 +{ 1.328 + PRErrorCode prError; 1.329 + switch (err) { 1.330 + case EINVAL: prError = PR_BUFFER_OVERFLOW_ERROR; break; 1.331 + case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.332 + default: nss_MD_unix_map_default_error(err); return; 1.333 + } 1.334 + PR_SetError(prError, err); 1.335 +} 1.336 + 1.337 +void nss_MD_unix_map_open_error(int err) 1.338 +{ 1.339 + PRErrorCode prError; 1.340 + switch (err) { 1.341 + case EAGAIN: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.342 + case EBUSY: prError = PR_IO_ERROR; break; 1.343 + case ENODEV: prError = PR_FILE_NOT_FOUND_ERROR; break; 1.344 + case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.345 + case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break; 1.346 + default: nss_MD_unix_map_default_error(err); return; 1.347 + } 1.348 + PR_SetError(prError, err); 1.349 +} 1.350 + 1.351 +void nss_MD_unix_map_mmap_error(int err) 1.352 +{ 1.353 + PRErrorCode prError; 1.354 + switch (err) { 1.355 + case EAGAIN: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.356 + case EMFILE: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.357 + case ENODEV: prError = PR_OPERATION_NOT_SUPPORTED_ERROR; break; 1.358 + case ENXIO: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.359 + default: nss_MD_unix_map_default_error(err); return; 1.360 + } 1.361 + PR_SetError(prError, err); 1.362 +} 1.363 + 1.364 +void nss_MD_unix_map_gethostname_error(int err) 1.365 +{ 1.366 + nss_MD_unix_map_default_error(err); 1.367 +} 1.368 + 1.369 +void nss_MD_unix_map_select_error(int err) 1.370 +{ 1.371 + nss_MD_unix_map_default_error(err); 1.372 +} 1.373 + 1.374 +#ifdef _PR_POLL_AVAILABLE 1.375 +void nss_MD_unix_map_poll_error(int err) 1.376 +{ 1.377 + PRErrorCode prError; 1.378 + 1.379 + switch (err) { 1.380 + case EAGAIN: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.381 + default: nss_MD_unix_map_default_error(err); return; 1.382 + } 1.383 + PR_SetError(prError, err); 1.384 +} 1.385 + 1.386 +void nss_MD_unix_map_poll_revents_error(int err) 1.387 +{ 1.388 + if (err & POLLNVAL) 1.389 + PR_SetError(PR_BAD_DESCRIPTOR_ERROR, EBADF); 1.390 + else if (err & POLLHUP) 1.391 + PR_SetError(PR_CONNECT_RESET_ERROR, EPIPE); 1.392 + else if (err & POLLERR) 1.393 + PR_SetError(PR_IO_ERROR, EIO); 1.394 + else 1.395 + PR_SetError(PR_UNKNOWN_ERROR, err); 1.396 +} 1.397 +#endif /* _PR_POLL_AVAILABLE */ 1.398 + 1.399 + 1.400 +void nss_MD_unix_map_flock_error(int err) 1.401 +{ 1.402 + PRErrorCode prError; 1.403 + switch (err) { 1.404 + case EINVAL: prError = PR_BAD_DESCRIPTOR_ERROR; break; 1.405 + case EWOULDBLOCK: prError = PR_FILE_IS_LOCKED_ERROR; break; 1.406 + default: nss_MD_unix_map_default_error(err); return; 1.407 + } 1.408 + PR_SetError(prError, err); 1.409 +} 1.410 + 1.411 +void nss_MD_unix_map_lockf_error(int err) 1.412 +{ 1.413 + PRErrorCode prError; 1.414 + switch (err) { 1.415 + case EACCES: prError = PR_FILE_IS_LOCKED_ERROR; break; 1.416 + case EDEADLK: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.417 + default: nss_MD_unix_map_default_error(err); return; 1.418 + } 1.419 + PR_SetError(prError, err); 1.420 +} 1.421 + 1.422 +#ifdef HPUX11 1.423 +void nss_MD_hpux_map_sendfile_error(int err) 1.424 +{ 1.425 + nss_MD_unix_map_default_error(err); 1.426 +} 1.427 +#endif /* HPUX11 */ 1.428 + 1.429 + 1.430 +void nss_MD_unix_map_default_error(int err) 1.431 +{ 1.432 + PRErrorCode prError; 1.433 + switch (err ) { 1.434 + case EACCES: prError = PR_NO_ACCESS_RIGHTS_ERROR; break; 1.435 + case EADDRINUSE: prError = PR_ADDRESS_IN_USE_ERROR; break; 1.436 + case EADDRNOTAVAIL: prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; break; 1.437 + case EAFNOSUPPORT: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.438 + case EAGAIN: prError = PR_WOULD_BLOCK_ERROR; break; 1.439 + /* 1.440 + * On QNX and Neutrino, EALREADY is defined as EBUSY. 1.441 + */ 1.442 +#if EALREADY != EBUSY 1.443 + case EALREADY: prError = PR_ALREADY_INITIATED_ERROR; break; 1.444 +#endif 1.445 + case EBADF: prError = PR_BAD_DESCRIPTOR_ERROR; break; 1.446 +#ifdef EBADMSG 1.447 + case EBADMSG: prError = PR_IO_ERROR; break; 1.448 +#endif 1.449 + case EBUSY: prError = PR_FILESYSTEM_MOUNTED_ERROR; break; 1.450 + case ECONNREFUSED: prError = PR_CONNECT_REFUSED_ERROR; break; 1.451 + case ECONNRESET: prError = PR_CONNECT_RESET_ERROR; break; 1.452 + case EDEADLK: prError = PR_DEADLOCK_ERROR; break; 1.453 +#ifdef EDIRCORRUPTED 1.454 + case EDIRCORRUPTED: prError = PR_DIRECTORY_CORRUPTED_ERROR; break; 1.455 +#endif 1.456 +#ifdef EDQUOT 1.457 + case EDQUOT: prError = PR_NO_DEVICE_SPACE_ERROR; break; 1.458 +#endif 1.459 + case EEXIST: prError = PR_FILE_EXISTS_ERROR; break; 1.460 + case EFAULT: prError = PR_ACCESS_FAULT_ERROR; break; 1.461 + case EFBIG: prError = PR_FILE_TOO_BIG_ERROR; break; 1.462 + case EINPROGRESS: prError = PR_IN_PROGRESS_ERROR; break; 1.463 + case EINTR: prError = PR_PENDING_INTERRUPT_ERROR; break; 1.464 + case EINVAL: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.465 + case EIO: prError = PR_IO_ERROR; break; 1.466 + case EISCONN: prError = PR_IS_CONNECTED_ERROR; break; 1.467 + case EISDIR: prError = PR_IS_DIRECTORY_ERROR; break; 1.468 + case ELOOP: prError = PR_LOOP_ERROR; break; 1.469 + case EMFILE: prError = PR_PROC_DESC_TABLE_FULL_ERROR; break; 1.470 + case EMLINK: prError = PR_MAX_DIRECTORY_ENTRIES_ERROR; break; 1.471 + case EMSGSIZE: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.472 +#ifdef EMULTIHOP 1.473 + case EMULTIHOP: prError = PR_REMOTE_FILE_ERROR; break; 1.474 +#endif 1.475 + case ENAMETOOLONG: prError = PR_NAME_TOO_LONG_ERROR; break; 1.476 + case ENETUNREACH: prError = PR_NETWORK_UNREACHABLE_ERROR; break; 1.477 + case ENFILE: prError = PR_SYS_DESC_TABLE_FULL_ERROR; break; 1.478 +#if !defined(SCO) 1.479 + case ENOBUFS: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.480 +#endif 1.481 + case ENODEV: prError = PR_FILE_NOT_FOUND_ERROR; break; 1.482 + case ENOENT: prError = PR_FILE_NOT_FOUND_ERROR; break; 1.483 + case ENOLCK: prError = PR_FILE_IS_LOCKED_ERROR; break; 1.484 +#ifdef ENOLINK 1.485 + case ENOLINK: prError = PR_REMOTE_FILE_ERROR; break; 1.486 +#endif 1.487 + case ENOMEM: prError = PR_OUT_OF_MEMORY_ERROR; break; 1.488 + case ENOPROTOOPT: prError = PR_INVALID_ARGUMENT_ERROR; break; 1.489 + case ENOSPC: prError = PR_NO_DEVICE_SPACE_ERROR; break; 1.490 +#ifdef ENOSR 1.491 + case ENOSR: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break; 1.492 +#endif 1.493 + case ENOTCONN: prError = PR_NOT_CONNECTED_ERROR; break; 1.494 + case ENOTDIR: prError = PR_NOT_DIRECTORY_ERROR; break; 1.495 + case ENOTSOCK: prError = PR_NOT_SOCKET_ERROR; break; 1.496 + case ENXIO: prError = PR_FILE_NOT_FOUND_ERROR; break; 1.497 + case EOPNOTSUPP: prError = PR_NOT_TCP_SOCKET_ERROR; break; 1.498 +#ifdef EOVERFLOW 1.499 + case EOVERFLOW: prError = PR_BUFFER_OVERFLOW_ERROR; break; 1.500 +#endif 1.501 + case EPERM: prError = PR_NO_ACCESS_RIGHTS_ERROR; break; 1.502 + case EPIPE: prError = PR_CONNECT_RESET_ERROR; break; 1.503 +#ifdef EPROTO 1.504 + case EPROTO: prError = PR_IO_ERROR; break; 1.505 +#endif 1.506 + case EPROTONOSUPPORT: prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR; break; 1.507 + case EPROTOTYPE: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; 1.508 + case ERANGE: prError = PR_INVALID_METHOD_ERROR; break; 1.509 + case EROFS: prError = PR_READ_ONLY_FILESYSTEM_ERROR; break; 1.510 + case ESPIPE: prError = PR_INVALID_METHOD_ERROR; break; 1.511 + case ETIMEDOUT: prError = PR_IO_TIMEOUT_ERROR; break; 1.512 +#if EWOULDBLOCK != EAGAIN 1.513 + case EWOULDBLOCK: prError = PR_WOULD_BLOCK_ERROR; break; 1.514 +#endif 1.515 + case EXDEV: prError = PR_NOT_SAME_DEVICE_ERROR; break; 1.516 + 1.517 + default: prError = PR_UNKNOWN_ERROR; break; 1.518 + } 1.519 + PR_SetError(prError, err); 1.520 +}