1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/nsprpub/pr/src/md/unix/unix_errors.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,829 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "primpl.h" 1.10 +#if defined(_PR_POLL_AVAILABLE) 1.11 +#include <poll.h> 1.12 +#endif 1.13 +#include <errno.h> 1.14 + 1.15 +void _MD_unix_map_default_error(int err) 1.16 +{ 1.17 + PRErrorCode prError; 1.18 + 1.19 + switch (err ) { 1.20 + case EACCES: 1.21 + prError = PR_NO_ACCESS_RIGHTS_ERROR; 1.22 + break; 1.23 + case EADDRINUSE: 1.24 + prError = PR_ADDRESS_IN_USE_ERROR; 1.25 + break; 1.26 + case EADDRNOTAVAIL: 1.27 + prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; 1.28 + break; 1.29 + case EAFNOSUPPORT: 1.30 + prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; 1.31 + break; 1.32 + case EAGAIN: 1.33 + prError = PR_WOULD_BLOCK_ERROR; 1.34 + break; 1.35 + /* 1.36 + * On QNX and Neutrino, EALREADY is defined as EBUSY. 1.37 + */ 1.38 +#if EALREADY != EBUSY 1.39 + case EALREADY: 1.40 + prError = PR_ALREADY_INITIATED_ERROR; 1.41 + break; 1.42 +#endif 1.43 + case EBADF: 1.44 + prError = PR_BAD_DESCRIPTOR_ERROR; 1.45 + break; 1.46 +#ifdef EBADMSG 1.47 + case EBADMSG: 1.48 + prError = PR_IO_ERROR; 1.49 + break; 1.50 +#endif 1.51 + case EBUSY: 1.52 + prError = PR_FILESYSTEM_MOUNTED_ERROR; 1.53 + break; 1.54 + case ECONNABORTED: 1.55 + prError = PR_CONNECT_ABORTED_ERROR; 1.56 + break; 1.57 + case ECONNREFUSED: 1.58 + prError = PR_CONNECT_REFUSED_ERROR; 1.59 + break; 1.60 + case ECONNRESET: 1.61 + prError = PR_CONNECT_RESET_ERROR; 1.62 + break; 1.63 + case EDEADLK: 1.64 + prError = PR_DEADLOCK_ERROR; 1.65 + break; 1.66 +#ifdef EDIRCORRUPTED 1.67 + case EDIRCORRUPTED: 1.68 + prError = PR_DIRECTORY_CORRUPTED_ERROR; 1.69 + break; 1.70 +#endif 1.71 +#ifdef EDQUOT 1.72 + case EDQUOT: 1.73 + prError = PR_NO_DEVICE_SPACE_ERROR; 1.74 + break; 1.75 +#endif 1.76 + case EEXIST: 1.77 + prError = PR_FILE_EXISTS_ERROR; 1.78 + break; 1.79 + case EFAULT: 1.80 + prError = PR_ACCESS_FAULT_ERROR; 1.81 + break; 1.82 + case EFBIG: 1.83 + prError = PR_FILE_TOO_BIG_ERROR; 1.84 + break; 1.85 + case EHOSTUNREACH: 1.86 + case EHOSTDOWN: 1.87 + prError = PR_HOST_UNREACHABLE_ERROR; 1.88 + break; 1.89 + case EINPROGRESS: 1.90 + prError = PR_IN_PROGRESS_ERROR; 1.91 + break; 1.92 + case EINTR: 1.93 + prError = PR_PENDING_INTERRUPT_ERROR; 1.94 + break; 1.95 + case EINVAL: 1.96 + prError = PR_INVALID_ARGUMENT_ERROR; 1.97 + break; 1.98 + case EIO: 1.99 + prError = PR_IO_ERROR; 1.100 + break; 1.101 + case EISCONN: 1.102 + prError = PR_IS_CONNECTED_ERROR; 1.103 + break; 1.104 + case EISDIR: 1.105 + prError = PR_IS_DIRECTORY_ERROR; 1.106 + break; 1.107 + case ELOOP: 1.108 + prError = PR_LOOP_ERROR; 1.109 + break; 1.110 + case EMFILE: 1.111 + prError = PR_PROC_DESC_TABLE_FULL_ERROR; 1.112 + break; 1.113 + case EMLINK: 1.114 + prError = PR_MAX_DIRECTORY_ENTRIES_ERROR; 1.115 + break; 1.116 + case EMSGSIZE: 1.117 + prError = PR_INVALID_ARGUMENT_ERROR; 1.118 + break; 1.119 +#ifdef EMULTIHOP 1.120 + case EMULTIHOP: 1.121 + prError = PR_REMOTE_FILE_ERROR; 1.122 + break; 1.123 +#endif 1.124 + case ENAMETOOLONG: 1.125 + prError = PR_NAME_TOO_LONG_ERROR; 1.126 + break; 1.127 + case ENETUNREACH: 1.128 + prError = PR_NETWORK_UNREACHABLE_ERROR; 1.129 + break; 1.130 + case ENFILE: 1.131 + prError = PR_SYS_DESC_TABLE_FULL_ERROR; 1.132 + break; 1.133 + /* 1.134 + * On SCO OpenServer 5, ENOBUFS is defined as ENOSR. 1.135 + */ 1.136 +#if defined(ENOBUFS) && (ENOBUFS != ENOSR) 1.137 + case ENOBUFS: 1.138 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.139 + break; 1.140 +#endif 1.141 + case ENODEV: 1.142 + prError = PR_FILE_NOT_FOUND_ERROR; 1.143 + break; 1.144 + case ENOENT: 1.145 + prError = PR_FILE_NOT_FOUND_ERROR; 1.146 + break; 1.147 + case ENOLCK: 1.148 + prError = PR_FILE_IS_LOCKED_ERROR; 1.149 + break; 1.150 +#ifdef ENOLINK 1.151 + case ENOLINK: 1.152 + prError = PR_REMOTE_FILE_ERROR; 1.153 + break; 1.154 +#endif 1.155 + case ENOMEM: 1.156 + prError = PR_OUT_OF_MEMORY_ERROR; 1.157 + break; 1.158 + case ENOPROTOOPT: 1.159 + prError = PR_INVALID_ARGUMENT_ERROR; 1.160 + break; 1.161 + case ENOSPC: 1.162 + prError = PR_NO_DEVICE_SPACE_ERROR; 1.163 + break; 1.164 +#ifdef ENOSR 1.165 + case ENOSR: 1.166 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.167 + break; 1.168 +#endif 1.169 + case ENOSYS: 1.170 + prError = PR_NOT_IMPLEMENTED_ERROR; 1.171 + break; 1.172 + case ENOTCONN: 1.173 + prError = PR_NOT_CONNECTED_ERROR; 1.174 + break; 1.175 + case ENOTDIR: 1.176 + prError = PR_NOT_DIRECTORY_ERROR; 1.177 + break; 1.178 + case ENOTSOCK: 1.179 + prError = PR_NOT_SOCKET_ERROR; 1.180 + break; 1.181 + case ENXIO: 1.182 + prError = PR_FILE_NOT_FOUND_ERROR; 1.183 + break; 1.184 + case EOPNOTSUPP: 1.185 + prError = PR_NOT_TCP_SOCKET_ERROR; 1.186 + break; 1.187 +#ifdef EOVERFLOW 1.188 + case EOVERFLOW: 1.189 + prError = PR_BUFFER_OVERFLOW_ERROR; 1.190 + break; 1.191 +#endif 1.192 + case EPERM: 1.193 + prError = PR_NO_ACCESS_RIGHTS_ERROR; 1.194 + break; 1.195 + case EPIPE: 1.196 + prError = PR_CONNECT_RESET_ERROR; 1.197 + break; 1.198 +#ifdef EPROTO 1.199 + case EPROTO: 1.200 + prError = PR_IO_ERROR; 1.201 + break; 1.202 +#endif 1.203 + case EPROTONOSUPPORT: 1.204 + prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR; 1.205 + break; 1.206 + case EPROTOTYPE: 1.207 + prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; 1.208 + break; 1.209 + case ERANGE: 1.210 + prError = PR_INVALID_METHOD_ERROR; 1.211 + break; 1.212 + case EROFS: 1.213 + prError = PR_READ_ONLY_FILESYSTEM_ERROR; 1.214 + break; 1.215 + case ESPIPE: 1.216 + prError = PR_INVALID_METHOD_ERROR; 1.217 + break; 1.218 + case ETIMEDOUT: 1.219 + prError = PR_IO_TIMEOUT_ERROR; 1.220 + break; 1.221 +#if EWOULDBLOCK != EAGAIN 1.222 + case EWOULDBLOCK: 1.223 + prError = PR_WOULD_BLOCK_ERROR; 1.224 + break; 1.225 +#endif 1.226 + case EXDEV: 1.227 + prError = PR_NOT_SAME_DEVICE_ERROR; 1.228 + break; 1.229 + default: 1.230 + prError = PR_UNKNOWN_ERROR; 1.231 + break; 1.232 + } 1.233 + PR_SetError(prError, err); 1.234 +} 1.235 + 1.236 +void _MD_unix_map_opendir_error(int err) 1.237 +{ 1.238 + _MD_unix_map_default_error(err); 1.239 +} 1.240 + 1.241 +void _MD_unix_map_closedir_error(int err) 1.242 +{ 1.243 + PRErrorCode prError; 1.244 + 1.245 + switch (err) { 1.246 + case EINVAL: 1.247 + prError = PR_BAD_DESCRIPTOR_ERROR; 1.248 + break; 1.249 + default: 1.250 + _MD_unix_map_default_error(err); 1.251 + return; 1.252 + } 1.253 + PR_SetError(prError, err); 1.254 +} 1.255 + 1.256 +void _MD_unix_readdir_error(int err) 1.257 +{ 1.258 + PRErrorCode prError; 1.259 + 1.260 + switch (err) { 1.261 + case 0: 1.262 + case ENOENT: 1.263 + prError = PR_NO_MORE_FILES_ERROR; 1.264 + break; 1.265 +#ifdef EOVERFLOW 1.266 + case EOVERFLOW: 1.267 + prError = PR_IO_ERROR; 1.268 + break; 1.269 +#endif 1.270 + case EINVAL: 1.271 + prError = PR_IO_ERROR; 1.272 + break; 1.273 + case ENXIO: 1.274 + prError = PR_IO_ERROR; 1.275 + break; 1.276 + default: 1.277 + _MD_unix_map_default_error(err); 1.278 + return; 1.279 + } 1.280 + PR_SetError(prError, err); 1.281 +} 1.282 + 1.283 +void _MD_unix_map_unlink_error(int err) 1.284 +{ 1.285 + PRErrorCode prError; 1.286 + 1.287 + switch (err) { 1.288 + case EPERM: 1.289 + prError = PR_IS_DIRECTORY_ERROR; 1.290 + break; 1.291 + default: 1.292 + _MD_unix_map_default_error(err); 1.293 + return; 1.294 + } 1.295 + PR_SetError(prError, err); 1.296 +} 1.297 + 1.298 +void _MD_unix_map_stat_error(int err) 1.299 +{ 1.300 + PRErrorCode prError; 1.301 + 1.302 + switch (err) { 1.303 + case ETIMEDOUT: 1.304 + prError = PR_REMOTE_FILE_ERROR; 1.305 + break; 1.306 + default: 1.307 + _MD_unix_map_default_error(err); 1.308 + return; 1.309 + } 1.310 + PR_SetError(prError, err); 1.311 +} 1.312 + 1.313 +void _MD_unix_map_fstat_error(int err) 1.314 +{ 1.315 + PRErrorCode prError; 1.316 + 1.317 + switch (err) { 1.318 + case ETIMEDOUT: 1.319 + prError = PR_REMOTE_FILE_ERROR; 1.320 + break; 1.321 + default: 1.322 + _MD_unix_map_default_error(err); 1.323 + return; 1.324 + } 1.325 + PR_SetError(prError, err); 1.326 +} 1.327 + 1.328 +void _MD_unix_map_rename_error(int err) 1.329 +{ 1.330 + PRErrorCode prError; 1.331 + 1.332 + switch (err) { 1.333 + case EEXIST: 1.334 + prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 1.335 + break; 1.336 + default: 1.337 + _MD_unix_map_default_error(err); 1.338 + return; 1.339 + } 1.340 + PR_SetError(prError, err); 1.341 +} 1.342 + 1.343 +void _MD_unix_map_access_error(int err) 1.344 +{ 1.345 + PRErrorCode prError; 1.346 + 1.347 + switch (err) { 1.348 + case ETIMEDOUT: 1.349 + prError = PR_REMOTE_FILE_ERROR; 1.350 + break; 1.351 + default: 1.352 + _MD_unix_map_default_error(err); 1.353 + return; 1.354 + } 1.355 + PR_SetError(prError, err); 1.356 +} 1.357 + 1.358 +void _MD_unix_map_mkdir_error(int err) 1.359 +{ 1.360 + _MD_unix_map_default_error(err); 1.361 +} 1.362 + 1.363 +void _MD_unix_map_rmdir_error(int err) 1.364 +{ 1.365 + PRErrorCode prError; 1.366 + 1.367 + switch (err) { 1.368 + /* 1.369 + * On AIX 4.3, ENOTEMPTY is defined as EEXIST. 1.370 + */ 1.371 +#if ENOTEMPTY != EEXIST 1.372 + case ENOTEMPTY: 1.373 + prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 1.374 + break; 1.375 +#endif 1.376 + case EEXIST: 1.377 + prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 1.378 + break; 1.379 + case EINVAL: 1.380 + prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 1.381 + break; 1.382 + case ETIMEDOUT: 1.383 + prError = PR_REMOTE_FILE_ERROR; 1.384 + break; 1.385 + default: 1.386 + _MD_unix_map_default_error(err); 1.387 + return; 1.388 + } 1.389 + PR_SetError(prError, err); 1.390 +} 1.391 + 1.392 +void _MD_unix_map_read_error(int err) 1.393 +{ 1.394 + PRErrorCode prError; 1.395 + 1.396 + switch (err) { 1.397 + case EINVAL: 1.398 + prError = PR_INVALID_METHOD_ERROR; 1.399 + break; 1.400 + case ENXIO: 1.401 + prError = PR_INVALID_ARGUMENT_ERROR; 1.402 + break; 1.403 + default: 1.404 + _MD_unix_map_default_error(err); 1.405 + return; 1.406 + } 1.407 + PR_SetError(prError, err); 1.408 +} 1.409 + 1.410 +void _MD_unix_map_write_error(int err) 1.411 +{ 1.412 + PRErrorCode prError; 1.413 + 1.414 + switch (err) { 1.415 + case EINVAL: 1.416 + prError = PR_INVALID_METHOD_ERROR; 1.417 + break; 1.418 + case ENXIO: 1.419 + prError = PR_INVALID_METHOD_ERROR; 1.420 + break; 1.421 + case ETIMEDOUT: 1.422 + prError = PR_REMOTE_FILE_ERROR; 1.423 + break; 1.424 + default: 1.425 + _MD_unix_map_default_error(err); 1.426 + return; 1.427 + } 1.428 + PR_SetError(prError, err); 1.429 +} 1.430 + 1.431 +void _MD_unix_map_lseek_error(int err) 1.432 +{ 1.433 + _MD_unix_map_default_error(err); 1.434 +} 1.435 + 1.436 +void _MD_unix_map_fsync_error(int err) 1.437 +{ 1.438 + PRErrorCode prError; 1.439 + 1.440 + switch (err) { 1.441 + case ETIMEDOUT: 1.442 + prError = PR_REMOTE_FILE_ERROR; 1.443 + break; 1.444 + case EINVAL: 1.445 + prError = PR_INVALID_METHOD_ERROR; 1.446 + break; 1.447 + default: 1.448 + _MD_unix_map_default_error(err); 1.449 + return; 1.450 + } 1.451 + PR_SetError(prError, err); 1.452 +} 1.453 + 1.454 +void _MD_unix_map_close_error(int err) 1.455 +{ 1.456 + PRErrorCode prError; 1.457 + 1.458 + switch (err) { 1.459 + case ETIMEDOUT: 1.460 + prError = PR_REMOTE_FILE_ERROR; 1.461 + break; 1.462 + default: 1.463 + _MD_unix_map_default_error(err); 1.464 + return; 1.465 + } 1.466 + PR_SetError(prError, err); 1.467 +} 1.468 + 1.469 +void _MD_unix_map_socket_error(int err) 1.470 +{ 1.471 + PRErrorCode prError; 1.472 + 1.473 + switch (err) { 1.474 + case ENOMEM: 1.475 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.476 + break; 1.477 + default: 1.478 + _MD_unix_map_default_error(err); 1.479 + return; 1.480 + } 1.481 + PR_SetError(prError, err); 1.482 +} 1.483 + 1.484 +void _MD_unix_map_socketavailable_error(int err) 1.485 +{ 1.486 + PR_SetError(PR_BAD_DESCRIPTOR_ERROR, err); 1.487 +} 1.488 + 1.489 +void _MD_unix_map_recv_error(int err) 1.490 +{ 1.491 + _MD_unix_map_default_error(err); 1.492 +} 1.493 + 1.494 +void _MD_unix_map_recvfrom_error(int err) 1.495 +{ 1.496 + _MD_unix_map_default_error(err); 1.497 +} 1.498 + 1.499 +void _MD_unix_map_send_error(int err) 1.500 +{ 1.501 + _MD_unix_map_default_error(err); 1.502 +} 1.503 + 1.504 +void _MD_unix_map_sendto_error(int err) 1.505 +{ 1.506 + _MD_unix_map_default_error(err); 1.507 +} 1.508 + 1.509 +void _MD_unix_map_writev_error(int err) 1.510 +{ 1.511 + _MD_unix_map_default_error(err); 1.512 +} 1.513 + 1.514 +void _MD_unix_map_accept_error(int err) 1.515 +{ 1.516 + PRErrorCode prError; 1.517 + 1.518 + switch (err) { 1.519 + case ENODEV: 1.520 + prError = PR_NOT_TCP_SOCKET_ERROR; 1.521 + break; 1.522 + default: 1.523 + _MD_unix_map_default_error(err); 1.524 + return; 1.525 + } 1.526 + PR_SetError(prError, err); 1.527 +} 1.528 + 1.529 +void _MD_unix_map_connect_error(int err) 1.530 +{ 1.531 + PRErrorCode prError; 1.532 + 1.533 + switch (err) { 1.534 +#if defined(UNIXWARE) 1.535 + /* 1.536 + * On some platforms, if we connect to a port on the local host 1.537 + * (the loopback address) that no process is listening on, we get 1.538 + * EIO instead of ECONNREFUSED. 1.539 + */ 1.540 + case EIO: 1.541 + prError = PR_CONNECT_REFUSED_ERROR; 1.542 + break; 1.543 +#endif 1.544 + case ENXIO: 1.545 + prError = PR_IO_ERROR; 1.546 + break; 1.547 + default: 1.548 + _MD_unix_map_default_error(err); 1.549 + return; 1.550 + } 1.551 + PR_SetError(prError, err); 1.552 +} 1.553 + 1.554 +void _MD_unix_map_bind_error(int err) 1.555 +{ 1.556 + PRErrorCode prError; 1.557 + 1.558 + switch (err) { 1.559 + case EINVAL: 1.560 + prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR; 1.561 + break; 1.562 + default: 1.563 + _MD_unix_map_default_error(err); 1.564 + return; 1.565 + } 1.566 + PR_SetError(prError, err); 1.567 +} 1.568 + 1.569 +void _MD_unix_map_listen_error(int err) 1.570 +{ 1.571 + _MD_unix_map_default_error(err); 1.572 +} 1.573 + 1.574 +void _MD_unix_map_shutdown_error(int err) 1.575 +{ 1.576 + _MD_unix_map_default_error(err); 1.577 +} 1.578 + 1.579 +void _MD_unix_map_socketpair_error(int err) 1.580 +{ 1.581 + PRErrorCode prError; 1.582 + 1.583 + switch (err) { 1.584 + case ENOMEM: 1.585 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.586 + break; 1.587 + default: 1.588 + _MD_unix_map_default_error(err); 1.589 + return; 1.590 + } 1.591 + PR_SetError(prError, err); 1.592 +} 1.593 + 1.594 +void _MD_unix_map_getsockname_error(int err) 1.595 +{ 1.596 + PRErrorCode prError; 1.597 + 1.598 + switch (err) { 1.599 + case ENOMEM: 1.600 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.601 + break; 1.602 + default: 1.603 + _MD_unix_map_default_error(err); 1.604 + return; 1.605 + } 1.606 + PR_SetError(prError, err); 1.607 +} 1.608 + 1.609 +void _MD_unix_map_getpeername_error(int err) 1.610 +{ 1.611 + PRErrorCode prError; 1.612 + 1.613 + switch (err) { 1.614 + case ENOMEM: 1.615 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.616 + break; 1.617 + default: 1.618 + _MD_unix_map_default_error(err); 1.619 + return; 1.620 + } 1.621 + PR_SetError(prError, err); 1.622 +} 1.623 + 1.624 +void _MD_unix_map_getsockopt_error(int err) 1.625 +{ 1.626 + PRErrorCode prError; 1.627 + 1.628 + switch (err) { 1.629 + case EINVAL: 1.630 + prError = PR_BUFFER_OVERFLOW_ERROR; 1.631 + break; 1.632 + case ENOMEM: 1.633 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.634 + break; 1.635 + default: 1.636 + _MD_unix_map_default_error(err); 1.637 + return; 1.638 + } 1.639 + PR_SetError(prError, err); 1.640 +} 1.641 + 1.642 +void _MD_unix_map_setsockopt_error(int err) 1.643 +{ 1.644 + PRErrorCode prError; 1.645 + 1.646 + switch (err) { 1.647 + case EINVAL: 1.648 + prError = PR_BUFFER_OVERFLOW_ERROR; 1.649 + break; 1.650 + case ENOMEM: 1.651 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.652 + break; 1.653 + default: 1.654 + _MD_unix_map_default_error(err); 1.655 + return; 1.656 + } 1.657 + PR_SetError(prError, err); 1.658 +} 1.659 + 1.660 +void _MD_unix_map_open_error(int err) 1.661 +{ 1.662 + PRErrorCode prError; 1.663 + 1.664 + switch (err) { 1.665 + case EAGAIN: 1.666 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.667 + break; 1.668 + case EBUSY: 1.669 + prError = PR_IO_ERROR; 1.670 + break; 1.671 + case ENODEV: 1.672 + prError = PR_FILE_NOT_FOUND_ERROR; 1.673 + break; 1.674 + case ENOMEM: 1.675 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.676 + break; 1.677 +#ifdef EOVERFLOW 1.678 + case EOVERFLOW: 1.679 + prError = PR_FILE_TOO_BIG_ERROR; 1.680 + break; 1.681 +#endif 1.682 + case ETIMEDOUT: 1.683 + prError = PR_REMOTE_FILE_ERROR; 1.684 + break; 1.685 + default: 1.686 + _MD_unix_map_default_error(err); 1.687 + return; 1.688 + } 1.689 + PR_SetError(prError, err); 1.690 +} 1.691 + 1.692 +void _MD_unix_map_mmap_error(int err) 1.693 +{ 1.694 + PRErrorCode prError; 1.695 + 1.696 + switch (err) { 1.697 + case EAGAIN: 1.698 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.699 + break; 1.700 + case EMFILE: 1.701 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.702 + break; 1.703 + case ENODEV: 1.704 + prError = PR_OPERATION_NOT_SUPPORTED_ERROR; 1.705 + break; 1.706 + case ENXIO: 1.707 + prError = PR_INVALID_ARGUMENT_ERROR; 1.708 + break; 1.709 + default: 1.710 + _MD_unix_map_default_error(err); 1.711 + return; 1.712 + } 1.713 + PR_SetError(prError, err); 1.714 +} 1.715 + 1.716 +void _MD_unix_map_gethostname_error(int err) 1.717 +{ 1.718 + _MD_unix_map_default_error(err); 1.719 +} 1.720 + 1.721 +void _MD_unix_map_select_error(int err) 1.722 +{ 1.723 + _MD_unix_map_default_error(err); 1.724 +} 1.725 + 1.726 +#if defined(_PR_POLL_AVAILABLE) || defined(_PR_NEED_FAKE_POLL) 1.727 +void _MD_unix_map_poll_error(int err) 1.728 +{ 1.729 + PRErrorCode prError; 1.730 + 1.731 + switch (err) { 1.732 + case EAGAIN: 1.733 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.734 + break; 1.735 + default: 1.736 + _MD_unix_map_default_error(err); 1.737 + return; 1.738 + } 1.739 + PR_SetError(prError, err); 1.740 +} 1.741 + 1.742 +void _MD_unix_map_poll_revents_error(int err) 1.743 +{ 1.744 + if (err & POLLNVAL) 1.745 + PR_SetError(PR_BAD_DESCRIPTOR_ERROR, EBADF); 1.746 + else if (err & POLLHUP) 1.747 + PR_SetError(PR_CONNECT_RESET_ERROR, EPIPE); 1.748 + else if (err & POLLERR) 1.749 + PR_SetError(PR_IO_ERROR, EIO); 1.750 + else 1.751 + PR_SetError(PR_UNKNOWN_ERROR, err); 1.752 +} 1.753 +#endif /* _PR_POLL_AVAILABLE || _PR_NEED_FAKE_POLL */ 1.754 + 1.755 + 1.756 +void _MD_unix_map_flock_error(int err) 1.757 +{ 1.758 + PRErrorCode prError; 1.759 + 1.760 + switch (err) { 1.761 + case EINVAL: 1.762 + prError = PR_BAD_DESCRIPTOR_ERROR; 1.763 + break; 1.764 + case EWOULDBLOCK: 1.765 + prError = PR_FILE_IS_LOCKED_ERROR; 1.766 + break; 1.767 + default: 1.768 + _MD_unix_map_default_error(err); 1.769 + return; 1.770 + } 1.771 + PR_SetError(prError, err); 1.772 +} 1.773 + 1.774 +void _MD_unix_map_lockf_error(int err) 1.775 +{ 1.776 + PRErrorCode prError; 1.777 + 1.778 + switch (err) { 1.779 + case EACCES: 1.780 + prError = PR_FILE_IS_LOCKED_ERROR; 1.781 + break; 1.782 + case EDEADLK: 1.783 + prError = PR_INSUFFICIENT_RESOURCES_ERROR; 1.784 + break; 1.785 + default: 1.786 + _MD_unix_map_default_error(err); 1.787 + return; 1.788 + } 1.789 + PR_SetError(prError, err); 1.790 +} 1.791 + 1.792 +#ifdef AIX 1.793 +void _MD_aix_map_sendfile_error(int err) 1.794 +{ 1.795 + _MD_unix_map_default_error(err); 1.796 +} 1.797 +#endif /* AIX */ 1.798 + 1.799 +#ifdef HPUX11 1.800 +void _MD_hpux_map_sendfile_error(int err) 1.801 +{ 1.802 + _MD_unix_map_default_error(err); 1.803 +} 1.804 +#endif /* HPUX11 */ 1.805 + 1.806 +#ifdef SOLARIS 1.807 +void _MD_solaris_map_sendfile_error(int err) 1.808 +{ 1.809 + PRErrorCode prError; 1.810 + 1.811 + switch (err) { 1.812 + /* 1.813 + * Solaris defines a 0 return value for sendfile to mean end-of-file. 1.814 + */ 1.815 + case 0: 1.816 + prError = PR_END_OF_FILE_ERROR; 1.817 + break; 1.818 + 1.819 + default: 1.820 + _MD_unix_map_default_error(err) ; 1.821 + return; 1.822 + } 1.823 + PR_SetError(prError, err); 1.824 +} 1.825 +#endif /* SOLARIS */ 1.826 + 1.827 +#ifdef LINUX 1.828 +void _MD_linux_map_sendfile_error(int err) 1.829 +{ 1.830 + _MD_unix_map_default_error(err) ; 1.831 +} 1.832 +#endif /* LINUX */