unix_errors.c (16063B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "primpl.h" 7 #if defined(_PR_POLL_AVAILABLE) 8 # include <poll.h> 9 #endif 10 #include <errno.h> 11 12 void _MD_unix_map_default_error(int err) { 13 PRErrorCode prError; 14 15 switch (err) { 16 case EACCES: 17 prError = PR_NO_ACCESS_RIGHTS_ERROR; 18 break; 19 case EADDRINUSE: 20 prError = PR_ADDRESS_IN_USE_ERROR; 21 break; 22 case EADDRNOTAVAIL: 23 prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; 24 break; 25 case EAFNOSUPPORT: 26 prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; 27 break; 28 case EAGAIN: 29 prError = PR_WOULD_BLOCK_ERROR; 30 break; 31 /* 32 * On QNX and Neutrino, EALREADY is defined as EBUSY. 33 */ 34 #if EALREADY != EBUSY 35 case EALREADY: 36 prError = PR_ALREADY_INITIATED_ERROR; 37 break; 38 #endif 39 case EBADF: 40 prError = PR_BAD_DESCRIPTOR_ERROR; 41 break; 42 #ifdef EBADMSG 43 case EBADMSG: 44 prError = PR_IO_ERROR; 45 break; 46 #endif 47 case EBUSY: 48 prError = PR_FILESYSTEM_MOUNTED_ERROR; 49 break; 50 case ECONNABORTED: 51 prError = PR_CONNECT_ABORTED_ERROR; 52 break; 53 case ECONNREFUSED: 54 prError = PR_CONNECT_REFUSED_ERROR; 55 break; 56 case ECONNRESET: 57 prError = PR_CONNECT_RESET_ERROR; 58 break; 59 case EDEADLK: 60 prError = PR_DEADLOCK_ERROR; 61 break; 62 #ifdef EDIRCORRUPTED 63 case EDIRCORRUPTED: 64 prError = PR_DIRECTORY_CORRUPTED_ERROR; 65 break; 66 #endif 67 #ifdef EDQUOT 68 case EDQUOT: 69 prError = PR_NO_DEVICE_SPACE_ERROR; 70 break; 71 #endif 72 case EEXIST: 73 prError = PR_FILE_EXISTS_ERROR; 74 break; 75 case EFAULT: 76 prError = PR_ACCESS_FAULT_ERROR; 77 break; 78 case EFBIG: 79 prError = PR_FILE_TOO_BIG_ERROR; 80 break; 81 case EHOSTUNREACH: 82 case EHOSTDOWN: 83 prError = PR_HOST_UNREACHABLE_ERROR; 84 break; 85 case EINPROGRESS: 86 prError = PR_IN_PROGRESS_ERROR; 87 break; 88 case EINTR: 89 prError = PR_PENDING_INTERRUPT_ERROR; 90 break; 91 case EINVAL: 92 prError = PR_INVALID_ARGUMENT_ERROR; 93 break; 94 case EIO: 95 prError = PR_IO_ERROR; 96 break; 97 case EISCONN: 98 prError = PR_IS_CONNECTED_ERROR; 99 break; 100 case EISDIR: 101 prError = PR_IS_DIRECTORY_ERROR; 102 break; 103 case ELOOP: 104 prError = PR_LOOP_ERROR; 105 break; 106 case EMFILE: 107 prError = PR_PROC_DESC_TABLE_FULL_ERROR; 108 break; 109 case EMLINK: 110 prError = PR_MAX_DIRECTORY_ENTRIES_ERROR; 111 break; 112 case EMSGSIZE: 113 prError = PR_INVALID_ARGUMENT_ERROR; 114 break; 115 #ifdef EMULTIHOP 116 case EMULTIHOP: 117 prError = PR_REMOTE_FILE_ERROR; 118 break; 119 #endif 120 case ENAMETOOLONG: 121 prError = PR_NAME_TOO_LONG_ERROR; 122 break; 123 case ENETUNREACH: 124 prError = PR_NETWORK_UNREACHABLE_ERROR; 125 break; 126 case ENFILE: 127 prError = PR_SYS_DESC_TABLE_FULL_ERROR; 128 break; 129 /* 130 * On SCO OpenServer 5, ENOBUFS is defined as ENOSR. 131 */ 132 #if defined(ENOBUFS) && (ENOBUFS != ENOSR) 133 case ENOBUFS: 134 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 135 break; 136 #endif 137 case ENODEV: 138 prError = PR_FILE_NOT_FOUND_ERROR; 139 break; 140 case ENOENT: 141 prError = PR_FILE_NOT_FOUND_ERROR; 142 break; 143 case ENOLCK: 144 prError = PR_FILE_IS_LOCKED_ERROR; 145 break; 146 #ifdef ENOLINK 147 case ENOLINK: 148 prError = PR_REMOTE_FILE_ERROR; 149 break; 150 #endif 151 case ENOMEM: 152 prError = PR_OUT_OF_MEMORY_ERROR; 153 break; 154 case ENOPROTOOPT: 155 prError = PR_INVALID_ARGUMENT_ERROR; 156 break; 157 case ENOSPC: 158 prError = PR_NO_DEVICE_SPACE_ERROR; 159 break; 160 #ifdef ENOSR 161 case ENOSR: 162 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 163 break; 164 #endif 165 case ENOSYS: 166 prError = PR_NOT_IMPLEMENTED_ERROR; 167 break; 168 case ENOTCONN: 169 prError = PR_NOT_CONNECTED_ERROR; 170 break; 171 case ENOTDIR: 172 prError = PR_NOT_DIRECTORY_ERROR; 173 break; 174 case ENOTSOCK: 175 prError = PR_NOT_SOCKET_ERROR; 176 break; 177 case ENXIO: 178 prError = PR_FILE_NOT_FOUND_ERROR; 179 break; 180 case EOPNOTSUPP: 181 prError = PR_NOT_TCP_SOCKET_ERROR; 182 break; 183 #ifdef EOVERFLOW 184 case EOVERFLOW: 185 prError = PR_BUFFER_OVERFLOW_ERROR; 186 break; 187 #endif 188 case EPERM: 189 prError = PR_NO_ACCESS_RIGHTS_ERROR; 190 break; 191 case EPIPE: 192 prError = PR_CONNECT_RESET_ERROR; 193 break; 194 #ifdef EPROTO 195 case EPROTO: 196 prError = PR_IO_ERROR; 197 break; 198 #endif 199 case EPROTONOSUPPORT: 200 prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR; 201 break; 202 case EPROTOTYPE: 203 prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; 204 break; 205 case ERANGE: 206 prError = PR_INVALID_METHOD_ERROR; 207 break; 208 case EROFS: 209 prError = PR_READ_ONLY_FILESYSTEM_ERROR; 210 break; 211 case ESPIPE: 212 prError = PR_INVALID_METHOD_ERROR; 213 break; 214 case ETIMEDOUT: 215 prError = PR_IO_TIMEOUT_ERROR; 216 break; 217 #if EWOULDBLOCK != EAGAIN 218 case EWOULDBLOCK: 219 prError = PR_WOULD_BLOCK_ERROR; 220 break; 221 #endif 222 case EXDEV: 223 prError = PR_NOT_SAME_DEVICE_ERROR; 224 break; 225 default: 226 prError = PR_UNKNOWN_ERROR; 227 break; 228 } 229 PR_SetError(prError, err); 230 } 231 232 void _MD_unix_map_opendir_error(int err) { _MD_unix_map_default_error(err); } 233 234 void _MD_unix_map_closedir_error(int err) { 235 PRErrorCode prError; 236 237 switch (err) { 238 case EINVAL: 239 prError = PR_BAD_DESCRIPTOR_ERROR; 240 break; 241 default: 242 _MD_unix_map_default_error(err); 243 return; 244 } 245 PR_SetError(prError, err); 246 } 247 248 void _MD_unix_readdir_error(int err) { 249 PRErrorCode prError; 250 251 switch (err) { 252 case 0: 253 case ENOENT: 254 prError = PR_NO_MORE_FILES_ERROR; 255 break; 256 #ifdef EOVERFLOW 257 case EOVERFLOW: 258 prError = PR_IO_ERROR; 259 break; 260 #endif 261 case EINVAL: 262 prError = PR_IO_ERROR; 263 break; 264 case ENXIO: 265 prError = PR_IO_ERROR; 266 break; 267 default: 268 _MD_unix_map_default_error(err); 269 return; 270 } 271 PR_SetError(prError, err); 272 } 273 274 void _MD_unix_map_unlink_error(int err) { 275 PRErrorCode prError; 276 277 switch (err) { 278 case EPERM: 279 prError = PR_IS_DIRECTORY_ERROR; 280 break; 281 default: 282 _MD_unix_map_default_error(err); 283 return; 284 } 285 PR_SetError(prError, err); 286 } 287 288 void _MD_unix_map_stat_error(int err) { 289 PRErrorCode prError; 290 291 switch (err) { 292 case ETIMEDOUT: 293 prError = PR_REMOTE_FILE_ERROR; 294 break; 295 default: 296 _MD_unix_map_default_error(err); 297 return; 298 } 299 PR_SetError(prError, err); 300 } 301 302 void _MD_unix_map_fstat_error(int err) { 303 PRErrorCode prError; 304 305 switch (err) { 306 case ETIMEDOUT: 307 prError = PR_REMOTE_FILE_ERROR; 308 break; 309 default: 310 _MD_unix_map_default_error(err); 311 return; 312 } 313 PR_SetError(prError, err); 314 } 315 316 void _MD_unix_map_rename_error(int err) { 317 PRErrorCode prError; 318 319 switch (err) { 320 case EEXIST: 321 prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 322 break; 323 default: 324 _MD_unix_map_default_error(err); 325 return; 326 } 327 PR_SetError(prError, err); 328 } 329 330 void _MD_unix_map_access_error(int err) { 331 PRErrorCode prError; 332 333 switch (err) { 334 case ETIMEDOUT: 335 prError = PR_REMOTE_FILE_ERROR; 336 break; 337 default: 338 _MD_unix_map_default_error(err); 339 return; 340 } 341 PR_SetError(prError, err); 342 } 343 344 void _MD_unix_map_mkdir_error(int err) { _MD_unix_map_default_error(err); } 345 346 void _MD_unix_map_rmdir_error(int err) { 347 PRErrorCode prError; 348 349 switch (err) { 350 /* 351 * On AIX 4.3, ENOTEMPTY is defined as EEXIST. 352 */ 353 #if ENOTEMPTY != EEXIST 354 case ENOTEMPTY: 355 prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 356 break; 357 #endif 358 case EEXIST: 359 prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 360 break; 361 case EINVAL: 362 prError = PR_DIRECTORY_NOT_EMPTY_ERROR; 363 break; 364 case ETIMEDOUT: 365 prError = PR_REMOTE_FILE_ERROR; 366 break; 367 default: 368 _MD_unix_map_default_error(err); 369 return; 370 } 371 PR_SetError(prError, err); 372 } 373 374 void _MD_unix_map_read_error(int err) { 375 PRErrorCode prError; 376 377 switch (err) { 378 case EINVAL: 379 prError = PR_INVALID_METHOD_ERROR; 380 break; 381 case ENXIO: 382 prError = PR_INVALID_ARGUMENT_ERROR; 383 break; 384 default: 385 _MD_unix_map_default_error(err); 386 return; 387 } 388 PR_SetError(prError, err); 389 } 390 391 void _MD_unix_map_write_error(int err) { 392 PRErrorCode prError; 393 394 switch (err) { 395 case EINVAL: 396 prError = PR_INVALID_METHOD_ERROR; 397 break; 398 case ENXIO: 399 prError = PR_INVALID_METHOD_ERROR; 400 break; 401 case ETIMEDOUT: 402 prError = PR_REMOTE_FILE_ERROR; 403 break; 404 default: 405 _MD_unix_map_default_error(err); 406 return; 407 } 408 PR_SetError(prError, err); 409 } 410 411 void _MD_unix_map_lseek_error(int err) { _MD_unix_map_default_error(err); } 412 413 void _MD_unix_map_fsync_error(int err) { 414 PRErrorCode prError; 415 416 switch (err) { 417 case ETIMEDOUT: 418 prError = PR_REMOTE_FILE_ERROR; 419 break; 420 case EINVAL: 421 prError = PR_INVALID_METHOD_ERROR; 422 break; 423 default: 424 _MD_unix_map_default_error(err); 425 return; 426 } 427 PR_SetError(prError, err); 428 } 429 430 void _MD_unix_map_close_error(int err) { 431 PRErrorCode prError; 432 433 switch (err) { 434 case ETIMEDOUT: 435 prError = PR_REMOTE_FILE_ERROR; 436 break; 437 default: 438 _MD_unix_map_default_error(err); 439 return; 440 } 441 PR_SetError(prError, err); 442 } 443 444 void _MD_unix_map_socket_error(int err) { 445 PRErrorCode prError; 446 447 switch (err) { 448 case ENOMEM: 449 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 450 break; 451 default: 452 _MD_unix_map_default_error(err); 453 return; 454 } 455 PR_SetError(prError, err); 456 } 457 458 void _MD_unix_map_socketavailable_error(int err) { 459 PR_SetError(PR_BAD_DESCRIPTOR_ERROR, err); 460 } 461 462 void _MD_unix_map_recv_error(int err) { _MD_unix_map_default_error(err); } 463 464 void _MD_unix_map_recvfrom_error(int err) { _MD_unix_map_default_error(err); } 465 466 void _MD_unix_map_send_error(int err) { _MD_unix_map_default_error(err); } 467 468 void _MD_unix_map_sendto_error(int err) { _MD_unix_map_default_error(err); } 469 470 void _MD_unix_map_writev_error(int err) { _MD_unix_map_default_error(err); } 471 472 void _MD_unix_map_accept_error(int err) { 473 PRErrorCode prError; 474 475 switch (err) { 476 case ENODEV: 477 prError = PR_NOT_TCP_SOCKET_ERROR; 478 break; 479 default: 480 _MD_unix_map_default_error(err); 481 return; 482 } 483 PR_SetError(prError, err); 484 } 485 486 void _MD_unix_map_connect_error(int err) { 487 PRErrorCode prError; 488 489 switch (err) { 490 case ENXIO: 491 prError = PR_IO_ERROR; 492 break; 493 default: 494 _MD_unix_map_default_error(err); 495 return; 496 } 497 PR_SetError(prError, err); 498 } 499 500 void _MD_unix_map_bind_error(int err) { 501 PRErrorCode prError; 502 503 switch (err) { 504 case EINVAL: 505 prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR; 506 break; 507 default: 508 _MD_unix_map_default_error(err); 509 return; 510 } 511 PR_SetError(prError, err); 512 } 513 514 void _MD_unix_map_listen_error(int err) { _MD_unix_map_default_error(err); } 515 516 void _MD_unix_map_shutdown_error(int err) { _MD_unix_map_default_error(err); } 517 518 void _MD_unix_map_socketpair_error(int err) { 519 PRErrorCode prError; 520 521 switch (err) { 522 case ENOMEM: 523 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 524 break; 525 default: 526 _MD_unix_map_default_error(err); 527 return; 528 } 529 PR_SetError(prError, err); 530 } 531 532 void _MD_unix_map_getsockname_error(int err) { 533 PRErrorCode prError; 534 535 switch (err) { 536 case ENOMEM: 537 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 538 break; 539 default: 540 _MD_unix_map_default_error(err); 541 return; 542 } 543 PR_SetError(prError, err); 544 } 545 546 void _MD_unix_map_getpeername_error(int err) { 547 PRErrorCode prError; 548 549 switch (err) { 550 case ENOMEM: 551 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 552 break; 553 default: 554 _MD_unix_map_default_error(err); 555 return; 556 } 557 PR_SetError(prError, err); 558 } 559 560 void _MD_unix_map_getsockopt_error(int err) { 561 PRErrorCode prError; 562 563 switch (err) { 564 case EINVAL: 565 prError = PR_BUFFER_OVERFLOW_ERROR; 566 break; 567 case ENOMEM: 568 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 569 break; 570 default: 571 _MD_unix_map_default_error(err); 572 return; 573 } 574 PR_SetError(prError, err); 575 } 576 577 void _MD_unix_map_setsockopt_error(int err) { 578 PRErrorCode prError; 579 580 switch (err) { 581 case EINVAL: 582 prError = PR_BUFFER_OVERFLOW_ERROR; 583 break; 584 case ENOMEM: 585 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 586 break; 587 default: 588 _MD_unix_map_default_error(err); 589 return; 590 } 591 PR_SetError(prError, err); 592 } 593 594 void _MD_unix_map_open_error(int err) { 595 PRErrorCode prError; 596 597 switch (err) { 598 case EAGAIN: 599 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 600 break; 601 case EBUSY: 602 prError = PR_IO_ERROR; 603 break; 604 case ENODEV: 605 prError = PR_FILE_NOT_FOUND_ERROR; 606 break; 607 case ENOMEM: 608 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 609 break; 610 #ifdef EOVERFLOW 611 case EOVERFLOW: 612 prError = PR_FILE_TOO_BIG_ERROR; 613 break; 614 #endif 615 case ETIMEDOUT: 616 prError = PR_REMOTE_FILE_ERROR; 617 break; 618 default: 619 _MD_unix_map_default_error(err); 620 return; 621 } 622 PR_SetError(prError, err); 623 } 624 625 void _MD_unix_map_mmap_error(int err) { 626 PRErrorCode prError; 627 628 switch (err) { 629 case EAGAIN: 630 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 631 break; 632 case EMFILE: 633 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 634 break; 635 case ENODEV: 636 prError = PR_OPERATION_NOT_SUPPORTED_ERROR; 637 break; 638 case ENXIO: 639 prError = PR_INVALID_ARGUMENT_ERROR; 640 break; 641 default: 642 _MD_unix_map_default_error(err); 643 return; 644 } 645 PR_SetError(prError, err); 646 } 647 648 void _MD_unix_map_gethostname_error(int err) { 649 _MD_unix_map_default_error(err); 650 } 651 652 void _MD_unix_map_select_error(int err) { _MD_unix_map_default_error(err); } 653 654 #if defined(_PR_POLL_AVAILABLE) || defined(_PR_NEED_FAKE_POLL) 655 void _MD_unix_map_poll_error(int err) { 656 PRErrorCode prError; 657 658 switch (err) { 659 case EAGAIN: 660 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 661 break; 662 default: 663 _MD_unix_map_default_error(err); 664 return; 665 } 666 PR_SetError(prError, err); 667 } 668 669 void _MD_unix_map_poll_revents_error(int err) { 670 if (err & POLLNVAL) { 671 PR_SetError(PR_BAD_DESCRIPTOR_ERROR, EBADF); 672 } else if (err & POLLHUP) { 673 PR_SetError(PR_CONNECT_RESET_ERROR, EPIPE); 674 } else if (err & POLLERR) { 675 PR_SetError(PR_IO_ERROR, EIO); 676 } else { 677 PR_SetError(PR_UNKNOWN_ERROR, err); 678 } 679 } 680 #endif /* _PR_POLL_AVAILABLE || _PR_NEED_FAKE_POLL */ 681 682 void _MD_unix_map_flock_error(int err) { 683 PRErrorCode prError; 684 685 switch (err) { 686 case EINVAL: 687 prError = PR_BAD_DESCRIPTOR_ERROR; 688 break; 689 case EWOULDBLOCK: 690 prError = PR_FILE_IS_LOCKED_ERROR; 691 break; 692 default: 693 _MD_unix_map_default_error(err); 694 return; 695 } 696 PR_SetError(prError, err); 697 } 698 699 void _MD_unix_map_lockf_error(int err) { 700 PRErrorCode prError; 701 702 switch (err) { 703 case EACCES: 704 prError = PR_FILE_IS_LOCKED_ERROR; 705 break; 706 case EDEADLK: 707 prError = PR_INSUFFICIENT_RESOURCES_ERROR; 708 break; 709 default: 710 _MD_unix_map_default_error(err); 711 return; 712 } 713 PR_SetError(prError, err); 714 } 715 716 #ifdef AIX 717 void _MD_aix_map_sendfile_error(int err) { _MD_unix_map_default_error(err); } 718 #endif /* AIX */ 719 720 #ifdef HPUX11 721 void _MD_hpux_map_sendfile_error(int err) { _MD_unix_map_default_error(err); } 722 #endif /* HPUX11 */ 723 724 #ifdef SOLARIS 725 void _MD_solaris_map_sendfile_error(int err) { 726 PRErrorCode prError; 727 728 switch (err) { 729 /* 730 * Solaris defines a 0 return value for sendfile to mean end-of-file. 731 */ 732 case 0: 733 prError = PR_END_OF_FILE_ERROR; 734 break; 735 736 default: 737 _MD_unix_map_default_error(err); 738 return; 739 } 740 PR_SetError(prError, err); 741 } 742 #endif /* SOLARIS */ 743 744 #ifdef LINUX 745 void _MD_linux_map_sendfile_error(int err) { _MD_unix_map_default_error(err); } 746 #endif /* LINUX */