Changeset 5544:16ca0566b0e9 in roaraudio
- Timestamp:
- 06/17/12 10:36:37 (11 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
r5534 r5544 5 5 (Closes: #176) 6 6 * Done more hardending work. 7 * Improved error handling (including on win32) (Closes: #235) 7 8 8 9 v. 1.0beta2 - Wed Jun 06 2012 19:56 CEST -
include/libroar/error.h
r5539 r5544 40 40 41 41 struct roar_message; 42 43 enum roar_error_type { 44 ROAR_ERROR_TYPE_ROARAUDIO = 0, 45 ROAR_ERROR_TYPE_ERRNO, 46 ROAR_ERROR_TYPE_WINSOCK, 47 ROAR_ERROR_TYPE_HERROR, 48 ROAR_ERROR_TYPE_YIFF, 49 ROAR_ERROR_TYPE_APPLICATION, 50 ROAR_ERROR_TYPE_HTTP 51 }; 42 52 43 53 /* … … 113 123 void roar_err_to_errno(void); 114 124 125 // Convert error codes between diffrent representations. 126 // returnes the error or ROAR_ERROR_NONE on success so it does not alter global error state. 127 int roar_err_convert(int * out, const enum roar_error_type outtype, const int in, const enum roar_error_type intype); 128 129 // Outputs a default error for the given type. 130 // returnes the error or ROAR_ERROR_NONE on success so it does not alter global error state. 131 int roar_err_get_default_error(int * out, const enum roar_error_type type); 132 115 133 // Resets the stored state to 'no error' state. This can be used 116 134 // to init the state. -
libroar/error.c
r5540 r5544 216 216 } else if ( !roar_err_is_errno_clear() ) { 217 217 roar_err_from_errno(); 218 #ifdef ROAR_TARGET_WIN32 219 } else { 220 roar_err_convert(err, ROAR_ERROR_TYPE_ROARAUDIO, WSAGetLastError(), ROAR_ERROR_TYPE_WINSOCK); 221 roar_err_to_errno(); 222 #endif 218 223 } 219 224 } … … 227 232 } 228 233 229 void roar_err_from_errno(void) {234 static int __errno_to_roar(int error) { 230 235 int _roar_errno = ROAR_ERROR_NONE; 231 236 232 switch (err no) {237 switch (error) { 233 238 #ifdef EACCES 234 239 case EACCES: _roar_errno = ROAR_ERROR_PERM; break; … … 455 460 } 456 461 457 roar_err_set(_roar_errno); 458 } 459 460 void roar_err_to_errno(void) { 461 int * err = roar_errno2(); 462 switch (*err) { 462 return _roar_errno; 463 } 464 465 void roar_err_from_errno(void) { 466 roar_err_set(__errno_to_roar(errno)); 467 } 468 469 static int __roar_to_errno(int error) { 470 switch (error) { 463 471 case ROAR_ERROR_NONE: 464 r oar_err_clear_errno();472 return CLEAN_ERRNO; 465 473 break; 466 474 #ifdef EPERM 467 475 case ROAR_ERROR_PERM: 468 errno =EPERM;476 return EPERM; 469 477 break; 470 478 #endif 471 479 #ifdef ENOENT 472 480 case ROAR_ERROR_NOENT: 473 errno =ENOENT;481 return ENOENT; 474 482 break; 475 483 #endif 476 484 #ifdef EBADMSG 477 485 case ROAR_ERROR_BADMSG: 478 errno =EBADMSG;486 return EBADMSG; 479 487 break; 480 488 #endif 481 489 #ifdef EBUSY 482 490 case ROAR_ERROR_BUSY: 483 errno =EBUSY;491 return EBUSY; 484 492 break; 485 493 #endif 486 494 #ifdef ECONNREFUSED 487 495 case ROAR_ERROR_CONNREFUSED: 488 errno =ECONNREFUSED;496 return ECONNREFUSED; 489 497 break; 490 498 #endif 491 499 #ifdef ENOSYS 492 500 case ROAR_ERROR_NOSYS: 493 errno =ENOSYS;501 return ENOSYS; 494 502 break; 495 503 #endif 496 504 #ifdef ENOTSUP 497 505 case ROAR_ERROR_NOTSUP: 498 errno =ENOTSUP;506 return ENOTSUP; 499 507 break; 500 508 #endif 501 509 #ifdef EPIPE 502 510 case ROAR_ERROR_PIPE: 503 errno =EPIPE;511 return EPIPE; 504 512 break; 505 513 #endif 506 514 #ifdef EPROTO 507 515 case ROAR_ERROR_PROTO: 508 errno =EPROTO;516 return EPROTO; 509 517 break; 510 518 #endif 511 519 #ifdef ERANGE 512 520 case ROAR_ERROR_RANGE: 513 errno =ERANGE;521 return ERANGE; 514 522 break; 515 523 #endif 516 524 #ifdef EMSGSIZE 517 525 case ROAR_ERROR_MSGSIZE: 518 errno =EMSGSIZE;526 return EMSGSIZE; 519 527 break; 520 528 #endif 521 529 #ifdef ENOMEM 522 530 case ROAR_ERROR_NOMEM: 523 errno =ENOMEM;531 return ENOMEM; 524 532 break; 525 533 #endif 526 534 #ifdef EINVAL 527 535 case ROAR_ERROR_INVAL: 528 errno =EINVAL;536 return EINVAL; 529 537 break; 530 538 #endif 531 539 #ifdef EALREADY 532 540 case ROAR_ERROR_ALREADY: 533 errno =EALREADY;541 return EALREADY; 534 542 break; 535 543 #endif 536 544 #ifdef EBADRQC 537 545 case ROAR_ERROR_BADRQC: 538 errno =EBADRQC;546 return EBADRQC; 539 547 break; 540 548 #endif 541 549 #ifdef EDOM 542 550 case ROAR_ERROR_DOM: 543 errno =EDOM;551 return EDOM; 544 552 break; 545 553 #endif 546 554 #ifdef EEXIST 547 555 case ROAR_ERROR_EXIST: 548 errno =EEXIST;556 return EEXIST; 549 557 break; 550 558 #endif 551 559 #ifdef EFAULT 552 560 case ROAR_ERROR_FAULT: 553 errno =EFAULT;561 return EFAULT; 554 562 break; 555 563 #endif … … 557 565 case ROAR_ERROR_RIO: 558 566 #ifdef EREMOTEIO 559 errno =EREMOTEIO;567 return EREMOTEIO; 560 568 #else 561 errno =EIO;569 return EIO; 562 570 #endif 563 571 break; … … 569 577 case ROAR_ERROR_LOSTSYNC: 570 578 case ROAR_ERROR_NOHORSE: 571 errno =EIO;579 return EIO; 572 580 break; 573 581 #endif 574 582 #ifdef EKEYEXPIRED 575 583 case ROAR_ERROR_KEYEXPIRED: 576 errno =EKEYEXPIRED;584 return EKEYEXPIRED; 577 585 break; 578 586 #endif 579 587 #ifdef EKEYREJECTED 580 588 case ROAR_ERROR_KEYREJECTED: 581 errno =EKEYREJECTED;589 return EKEYREJECTED; 582 590 break; 583 591 #endif 584 592 #ifdef ELOOP 585 593 case ROAR_ERROR_LOOP: 586 errno =ELOOP;594 return ELOOP; 587 595 break; 588 596 #endif 589 597 #ifdef EMFILE 590 598 case ROAR_ERROR_MFILE: 591 errno =EMFILE;599 return EMFILE; 592 600 break; 593 601 #endif 594 602 #ifdef ENAMETOOLONG 595 603 case ROAR_ERROR_NAMETOOLONG: 596 errno =ENAMETOOLONG;604 return ENAMETOOLONG; 597 605 break; 598 606 #endif 599 607 #ifdef ENODATA 600 608 case ROAR_ERROR_NODATA: 601 errno =ENODATA;609 return ENODATA; 602 610 break; 603 611 #endif … … 605 613 case ROAR_ERROR_NODEV: 606 614 case ROAR_ERROR_NODRV: 607 errno =ENODEV;615 return ENODEV; 608 616 break; 609 617 #endif 610 618 #ifdef ENOSPC 611 619 case ROAR_ERROR_NOSPC: 612 errno =ENOSPC;620 return ENOSPC; 613 621 break; 614 622 #endif 615 623 #ifdef EINVAL 616 624 case ROAR_ERROR_TYPEMM: 617 errno =EINVAL;625 return EINVAL; 618 626 break; 619 627 #endif 620 628 #ifdef ENOSYS 621 629 case ROAR_ERROR_NORSYS: 622 errno =ENOSYS;630 return ENOSYS; 623 631 break; 624 632 #endif 625 633 #ifdef ENOTCONN 626 634 case ROAR_ERROR_NOTCONN: 627 errno =ENOTCONN;635 return ENOTCONN; 628 636 break; 629 637 #endif 630 638 #ifdef EPROTONOSUPPORT 631 639 case ROAR_ERROR_PROTONOSUP: 632 errno =EPROTONOSUPPORT;640 return EPROTONOSUPPORT; 633 641 break; 634 642 #endif 635 643 #ifdef EROFS 636 644 case ROAR_ERROR_RO: 637 errno =EROFS;645 return EROFS; 638 646 break; 639 647 #endif 640 648 #ifdef ETIMEDOUT 641 649 case ROAR_ERROR_TIMEDOUT: 642 errno =ETIMEDOUT;650 return ETIMEDOUT; 643 651 break; 644 652 #endif 645 653 #ifdef EAGAIN 646 654 case ROAR_ERROR_AGAIN: 647 errno =EAGAIN;655 return EAGAIN; 648 656 break; 649 657 #endif 650 658 #ifdef ENETDOWN 651 659 case ROAR_ERROR_LINKDOWN: 652 errno =ENETDOWN;660 return ENETDOWN; 653 661 break; 654 662 #endif 655 663 #ifdef EINTR 656 664 case ROAR_ERROR_INTERRUPTED: 657 errno =EINTR;665 return EINTR; 658 666 break; 659 667 #endif 660 668 #ifdef EDQUOT 661 669 case ROAR_ERROR_QUOTA: 662 errno =EDQUOT;670 return EDQUOT; 663 671 break; 664 672 #endif 665 673 #ifdef ELIBBAD 666 674 case ROAR_ERROR_BADLIB: 667 errno =ELIBBAD;675 return ELIBBAD; 668 676 break; 669 677 #endif 670 678 #ifdef ENOMEDIUM 671 679 case ROAR_ERROR_NOMEDIUM: 672 errno =ENOMEDIUM;680 return ENOMEDIUM; 673 681 break; 674 682 #endif 675 683 #ifdef ENOTUNIQ 676 684 case ROAR_ERROR_NOTUNIQ: 677 errno =ENOTUNIQ;685 return ENOTUNIQ; 678 686 break; 679 687 #endif 680 688 #ifdef EILSEQ 681 689 case ROAR_ERROR_ILLSEQ: 682 errno =EILSEQ;690 return EILSEQ; 683 691 break; 684 692 #endif 685 693 #ifdef EADDRINUSE 686 694 case ROAR_ERROR_ADDRINUSE: 687 errno =EADDRINUSE;695 return EADDRINUSE; 688 696 break; 689 697 #endif … … 691 699 case ROAR_ERROR_BADSEEK: 692 700 case ROAR_ERROR_NOSEEK: 693 errno =ESPIPE;701 return ESPIPE; 694 702 break; 695 703 #endif 696 704 #ifdef ECHERNOBYL 697 705 case ROAR_ERROR_CHERNOBYL: 698 errno =ECHERNOBYL;706 return ECHERNOBYL; 699 707 break; 700 708 #endif 701 709 #ifdef ECRAY 702 710 case ROAR_ERROR_CAUSALITY: 703 errno =ECRAY;711 return ECRAY; 704 712 break; 705 713 #endif 706 714 #ifdef ENOHORSE 707 715 case ROAR_ERROR_NOHORSE: 708 errno =ENOHORSE;716 return ENOHORSE; 709 717 break; 710 718 #endif 711 719 #ifdef ETXTBSY 712 720 case ROAR_ERROR_TEXTBUSY: 713 errno =ETXTBSY;721 return ETXTBSY; 714 722 break; 715 723 #endif 716 724 #ifdef ENOTEMPTY 717 725 case ROAR_ERROR_NOTEMPTY: 718 errno =ENOTEMPTY;726 return ENOTEMPTY; 719 727 break; 720 728 #endif 721 729 #ifdef EHOSTUNREACH 722 730 case ROAR_ERROR_NODEUNREACH: 723 errno =EHOSTUNREACH;731 return EHOSTUNREACH; 724 732 break; 725 733 #endif 726 734 #ifdef EIDRM 727 735 case ROAR_ERROR_IDREMOVED: 728 errno =EIDRM;736 return EIDRM; 729 737 break; 730 738 #endif 731 739 #ifdef EINPROGRESS 732 740 case ROAR_ERROR_INPROGRESS: 733 errno =EINPROGRESS;741 return EINPROGRESS; 734 742 break; 735 743 #endif 736 744 #ifdef ECHILD 737 745 case ROAR_ERROR_NOCHILD: 738 errno =ECHILD;746 return ECHILD; 739 747 break; 740 748 #endif 741 749 #ifdef ENETUNREACH 742 750 case ROAR_ERROR_NETUNREACH: 743 errno =ENETUNREACH;751 return ENETUNREACH; 744 752 break; 745 753 #endif 746 754 #ifdef ECANCELED 747 755 case ROAR_ERROR_CANCELED: 748 errno =ECANCELED;756 return ECANCELED; 749 757 break; 750 758 #endif 751 759 #ifdef EISDIR 752 760 case ROAR_ERROR_ISDIR: 753 errno =EISDIR;761 return EISDIR; 754 762 break; 755 763 #endif 756 764 #ifdef ENOTDOR 757 765 case ROAR_ERROR_NOTDIR: 758 errno =ENOTDIR;766 return ENOTDIR; 759 767 break; 760 768 #endif 761 769 #ifdef ENOEXEC 762 770 case ROAR_ERROR_BADEXEC: 763 errno =ENOEXEC;771 return ENOEXEC; 764 772 break; 765 773 #endif 766 774 #ifdef EISCONN 767 775 case ROAR_ERROR_ISCONN: 768 errno =EISCONN;776 return EISCONN; 769 777 break; 770 778 #endif 771 779 #ifdef EDEADLK 772 780 case ROAR_ERROR_DEADLOCK: 773 errno =EDEADLK;781 return EDEADLK; 774 782 break; 775 783 #endif 776 784 #ifdef ECONNRESET 777 785 case ROAR_ERROR_CONNRST: 778 errno =ECONNRESET;786 return ECONNRESET; 779 787 break; 780 788 #endif 781 789 #ifdef EBADF 782 790 case ROAR_ERROR_BADFH: 783 errno =EBADF;791 return EBADF; 784 792 break; 785 793 #endif 786 794 #ifdef ENOTSOCK 787 795 case ROAR_ERROR_NOTSOCK: 788 errno =ENOTSOCK;796 return ENOTSOCK; 789 797 break; 790 798 #endif 791 799 #ifdef E2BIG 792 800 case ROAR_ERROR_TOOMANYARGS: 793 errno =E2BIG;801 return E2BIG; 794 802 break; 795 803 #endif 796 804 #ifdef EFBIG 797 805 case ROAR_ERROR_TOOLARGE: 798 errno =EFBIG;806 return EFBIG; 799 807 break; 800 808 #endif 801 809 #ifdef EDESTADDRREQ 802 810 case ROAR_ERROR_DESTADDRREQ: 803 errno =EDESTADDRREQ;811 return EDESTADDRREQ; 804 812 break; 805 813 #endif 806 814 #ifdef EAFNOSUPPORT 807 815 case ROAR_ERROR_AFNOTSUP: 808 errno =EAFNOSUPPORT;816 return EAFNOSUPPORT; 809 817 break; 810 818 #endif … … 812 820 #ifdef ENOPOWER 813 821 case ROAR_ERROR_NOPOWER: 814 errno =ENOPOWER;822 return ENOPOWER; 815 823 break; 816 824 #endif 817 825 #ifdef EUSER 818 826 case ROAR_ERROR_USER: 819 errno =EUSER;827 return EUSER; 820 828 break; 821 829 #endif … … 823 831 #ifdef ENFILE 824 832 case ROAR_ERROR_NFILE: 825 errno =ENFILE;833 return ENFILE; 826 834 break; 827 835 #endif 828 836 #ifdef ESTALE 829 837 case ROAR_ERROR_STALE: 830 errno =ESTALE;838 return ESTALE; 831 839 break; 832 840 #endif 833 841 #ifdef EXDEV 834 842 case ROAR_ERROR_XDEVLINK: 835 errno =EXDEV;843 return EXDEV; 836 844 break; 837 845 #endif 838 846 #ifdef EMLINK 839 847 case ROAR_ERROR_MLINK: 840 errno =EMLINK;848 return EMLINK; 841 849 break; 842 850 #endif 843 851 #ifdef ENONET 844 852 case ROAR_ERROR_NONET: 845 errno =ENONET;853 return ENONET; 846 854 break; 847 855 #endif 848 856 #ifdef ENETRESET 849 857 case ROAR_ERROR_CONNRSTNET: 850 errno =ENETRESET;858 return ENETRESET; 851 859 break; 852 860 #endif 853 861 #ifdef ECONNABORTED 854 862 case ROAR_ERROR_CONNABORTED: 855 errno =ECONNABORTED;863 return ECONNABORTED; 856 864 break; 857 865 #endif … … 859 867 default: 860 868 #ifdef EINVAL 861 errno =EINVAL;869 return EINVAL; 862 870 #else 863 errno = -1; // just guess 864 #endif 865 break; 866 } 871 return -1; // just guess 872 #endif 873 break; 874 } 875 } 876 877 void roar_err_to_errno(void) { 878 errno = __roar_to_errno(roar_error); 879 } 880 881 static const struct error_table_entry { 882 const enum roar_error_type type; 883 const int error; 884 const int roarerror; 885 } __libroar_error_table[] = { 886 {ROAR_ERROR_TYPE_HTTP, 200, ROAR_ERROR_NONE}, 887 {ROAR_ERROR_TYPE_HTTP, 301, ROAR_ERROR_MOVEDPERM}, 888 {ROAR_ERROR_TYPE_HTTP, 303, ROAR_ERROR_SEEOTHER}, 889 {ROAR_ERROR_TYPE_HTTP, 305, ROAR_ERROR_USEPROXY}, 890 {ROAR_ERROR_TYPE_HTTP, 307, ROAR_ERROR_MOVEDTEMP}, 891 {ROAR_ERROR_TYPE_HTTP, 400, ROAR_ERROR_INVAL}, 892 {ROAR_ERROR_TYPE_HTTP, 403, ROAR_ERROR_PERM}, 893 {ROAR_ERROR_TYPE_HTTP, 404, ROAR_ERROR_NOENT}, 894 {ROAR_ERROR_TYPE_HTTP, 408, ROAR_ERROR_TIMEDOUT}, 895 {ROAR_ERROR_TYPE_HTTP, 410, ROAR_ERROR_GONE}, 896 {ROAR_ERROR_TYPE_HTTP, 423, ROAR_ERROR_BUSY}, 897 {ROAR_ERROR_TYPE_HTTP, 426, ROAR_ERROR_SWITCHPROTO}, 898 {ROAR_ERROR_TYPE_HTTP, 501, ROAR_ERROR_NOSYS}, 899 {ROAR_ERROR_TYPE_HTTP, 504, ROAR_ERROR_TIMEDOUT}, 900 {ROAR_ERROR_TYPE_HTTP, 505, ROAR_ERROR_NSVERSION}, 901 {ROAR_ERROR_TYPE_HTTP, 507, ROAR_ERROR_NOSPC}, 902 #ifdef NETDB_SUCCESS 903 {ROAR_ERROR_TYPE_HERROR, NETDB_SUCCESS, ROAR_ERROR_NONE}, 904 #endif 905 #ifdef HOST_NOT_FOUND 906 {ROAR_ERROR_TYPE_HERROR, HOST_NOT_FOUND, ROAR_ERROR_NOENT}, 907 #endif 908 #ifdef TRY_AGAIN 909 {ROAR_ERROR_TYPE_HERROR, TRY_AGAIN, ROAR_ERROR_AGAIN}, 910 #endif 911 #ifdef NO_RECOVERY 912 // {ROAR_ERROR_TYPE_HERROR, NO_RECOVERY, ROAR_ERROR_???}, 913 #endif 914 #ifdef NO_DATA 915 {ROAR_ERROR_TYPE_HERROR, NO_DATA, ROAR_ERROR_NODATA}, 916 #endif 917 #ifdef NO_ADDRESS 918 {ROAR_ERROR_TYPE_HERROR, NO_ADDRESS, ROAR_ERROR_NOENT}, 919 #endif 920 #ifdef ROAR_TARGET_WIN32 921 {ROAR_ERROR_TYPE_WINSOCK, WSA_INVALID_HANDLE, ROAR_ERROR_BADFH}, 922 {ROAR_ERROR_TYPE_WINSOCK, WSA_NOT_ENOUGH_MEMORY, ROAR_ERROR_NOMEM}, 923 {ROAR_ERROR_TYPE_WINSOCK, WSA_INVALID_PARAMETER, ROAR_ERROR_INVAL}, 924 {ROAR_ERROR_TYPE_WINSOCK, WSA_OPERATION_ABORTED, ROAR_ERROR_INTERRUPTED}, 925 // {ROAR_ERROR_TYPE_WINSOCK, WSA_IO_INCOMPLETE, ROAR_ERROR_???}, 926 // {ROAR_ERROR_TYPE_WINSOCK, WSA_IO_PENDING, ROAR_ERROR_???}, 927 {ROAR_ERROR_TYPE_WINSOCK, WSAEINTR, ROAR_ERROR_INTERRUPTED}, 928 {ROAR_ERROR_TYPE_WINSOCK, WSAEBADF, ROAR_ERROR_BADFH}, 929 {ROAR_ERROR_TYPE_WINSOCK, WSAEACCES, ROAR_ERROR_PERM}, 930 {ROAR_ERROR_TYPE_WINSOCK, WSAEFAULT, ROAR_ERROR_FAULT}, 931 {ROAR_ERROR_TYPE_WINSOCK, WSAEINVAL, ROAR_ERROR_INVAL}, 932 {ROAR_ERROR_TYPE_WINSOCK, WSAEMFILE, ROAR_ERROR_MFILE}, 933 {ROAR_ERROR_TYPE_WINSOCK, WSAEWOULDBLOCK, ROAR_ERROR_AGAIN}, 934 {ROAR_ERROR_TYPE_WINSOCK, WSAEINPROGRESS, ROAR_ERROR_INPROGRESS}, 935 {ROAR_ERROR_TYPE_WINSOCK, WSAEALREADY, ROAR_ERROR_ALREADY}, 936 {ROAR_ERROR_TYPE_WINSOCK, WSAENOTSOCK, ROAR_ERROR_NOTSOCK}, 937 {ROAR_ERROR_TYPE_WINSOCK, WSAEDESTADDRREQ, ROAR_ERROR_DESTADDRREQ}, 938 {ROAR_ERROR_TYPE_WINSOCK, WSAEMSGSIZE, ROAR_ERROR_MSGSIZE}, 939 // {ROAR_ERROR_TYPE_WINSOCK, WSAEPROTOTYPE, ROAR_ERROR_???}, 940 // {ROAR_ERROR_TYPE_WINSOCK, WSAENOPROTOOPT, ROAR_ERROR_???}, 941 {ROAR_ERROR_TYPE_WINSOCK, WSAEPROTONOSUPPORT, ROAR_ERROR_PROTONOSUP}, 942 {ROAR_ERROR_TYPE_WINSOCK, WSAESOCKTNOSUPPORT, ROAR_ERROR_PROTONOSUP}, 943 {ROAR_ERROR_TYPE_WINSOCK, WSAEOPNOTSUPP, ROAR_ERROR_NOTSUP}, 944 {ROAR_ERROR_TYPE_WINSOCK, WSAEPFNOSUPPORT, ROAR_ERROR_AFNOTSUP}, 945 {ROAR_ERROR_TYPE_WINSOCK, WSAEAFNOSUPPORT, ROAR_ERROR_AFNOTSUP}, 946 {ROAR_ERROR_TYPE_WINSOCK, WSAEADDRINUSE, ROAR_ERROR_ADDRINUSE}, 947 // {ROAR_ERROR_TYPE_WINSOCK, WSAEADDRNOTAVAIL, ROAR_ERROR_???}, 948 // {ROAR_ERROR_TYPE_WINSOCK, WSAENETDOWN, ROAR_ERROR_???}, 949 {ROAR_ERROR_TYPE_WINSOCK, WSAENETUNREACH, ROAR_ERROR_NETUNREACH}, 950 // {ROAR_ERROR_TYPE_WINSOCK, WSAENETRESET, ROAR_ERROR_???}, 951 // {ROAR_ERROR_TYPE_WINSOCK, WSAECONNABORTED, ROAR_ERROR_???}, 952 // {ROAR_ERROR_TYPE_WINSOCK, WSAECONNRESET, ROAR_ERROR_???}, 953 // {ROAR_ERROR_TYPE_WINSOCK, WSAENOBUFS, ROAR_ERROR_???}, 954 {ROAR_ERROR_TYPE_WINSOCK, WSAEISCONN, ROAR_ERROR_ISCONN}, 955 {ROAR_ERROR_TYPE_WINSOCK, WSAENOTCONN, ROAR_ERROR_NOTCONN}, 956 // {ROAR_ERROR_TYPE_WINSOCK, WSAESHUTDOWN, ROAR_ERROR_???}, 957 // {ROAR_ERROR_TYPE_WINSOCK, WSAETOOMANYREFS, ROAR_ERROR_???}, 958 {ROAR_ERROR_TYPE_WINSOCK, WSAETIMEDOUT, ROAR_ERROR_TIMEDOUT}, 959 {ROAR_ERROR_TYPE_WINSOCK, WSAECONNREFUSED, ROAR_ERROR_CONNREFUSED}, 960 {ROAR_ERROR_TYPE_WINSOCK, WSAELOOP, ROAR_ERROR_LOOP}, 961 {ROAR_ERROR_TYPE_WINSOCK, WSAENAMETOOLONG, ROAR_ERROR_NAMETOOLONG}, 962 // {ROAR_ERROR_TYPE_WINSOCK, WSAEHOSTDOWN, ROAR_ERROR_???}, 963 {ROAR_ERROR_TYPE_WINSOCK, WSAEHOSTUNREACH, ROAR_ERROR_NODEUNREACH}, 964 {ROAR_ERROR_TYPE_WINSOCK, WSAENOTEMPTY, ROAR_ERROR_NOTEMPTY}, 965 // {ROAR_ERROR_TYPE_WINSOCK, WSAEPROCLIM, ROAR_ERROR_???}, 966 // {ROAR_ERROR_TYPE_WINSOCK, WSAEUSERS, ROAR_ERROR_???}, 967 // {ROAR_ERROR_TYPE_WINSOCK, WSAEDQUOT, ROAR_ERROR_???}, 968 {ROAR_ERROR_TYPE_WINSOCK, WSAESTALE, ROAR_ERROR_STALE}, 969 // {ROAR_ERROR_TYPE_WINSOCK, WSAEREMOTE, ROAR_ERROR_???}, 970 // {ROAR_ERROR_TYPE_WINSOCK, WSASYSNOTREADY, ROAR_ERROR_???}, 971 {ROAR_ERROR_TYPE_WINSOCK, WSAVERNOTSUPPORTED, ROAR_ERROR_NSVERSION}, 972 // {ROAR_ERROR_TYPE_WINSOCK, WSANOTINITIALISED, ROAR_ERROR_???}, 973 // {ROAR_ERROR_TYPE_WINSOCK, WSAEDISCON, ROAR_ERROR_???}, 974 // {ROAR_ERROR_TYPE_WINSOCK, WSAENOMORE, ROAR_ERROR_???}, 975 // {ROAR_ERROR_TYPE_WINSOCK, WSAECANCELLED, ROAR_ERROR_???}, 976 // {ROAR_ERROR_TYPE_WINSOCK, WSAEINVALIDPROCTABLE, ROAR_ERROR_???}, 977 // {ROAR_ERROR_TYPE_WINSOCK, WSAEINVALIDPROVIDER, ROAR_ERROR_???}, 978 // {ROAR_ERROR_TYPE_WINSOCK, WSAEPROVIDERFAILEDINIT, ROAR_ERROR_???}, 979 // {ROAR_ERROR_TYPE_WINSOCK, WSASYSCALLFAILURE, ROAR_ERROR_???}, 980 {ROAR_ERROR_TYPE_WINSOCK, WSASERVICE_NOT_FOUND, ROAR_ERROR_NOENT}, 981 {ROAR_ERROR_TYPE_WINSOCK, WSATYPE_NOT_FOUND, ROAR_ERROR_NOENT}, 982 {ROAR_ERROR_TYPE_WINSOCK, WSA_E_NO_MORE, ROAR_ERROR_NOENT}, 983 // {ROAR_ERROR_TYPE_WINSOCK, WSA_E_CANCELLED, ROAR_ERROR_???}, 984 // {ROAR_ERROR_TYPE_WINSOCK, WSAEREFUSED, ROAR_ERROR_???}, 985 {ROAR_ERROR_TYPE_WINSOCK, WSAHOST_NOT_FOUND, ROAR_ERROR_NOENT}, 986 {ROAR_ERROR_TYPE_WINSOCK, WSATRY_AGAIN, ROAR_ERROR_AGAIN}, 987 // {ROAR_ERROR_TYPE_WINSOCK, WSANO_RECOVERY, ROAR_ERROR_???}, 988 {ROAR_ERROR_TYPE_WINSOCK, WSANO_DATA, ROAR_ERROR_NODATA}, 989 #if 0 990 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_RECEIVERS, ROAR_ERROR_???}, 991 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_SENDERS, ROAR_ERROR_???}, 992 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_NO_SENDERS, ROAR_ERROR_???}, 993 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_NO_RECEIVERS, ROAR_ERROR_???}, 994 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_REQUEST_CONFIRMED, ROAR_ERROR_???}, 995 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_ADMISSION_FAILURE, ROAR_ERROR_???}, 996 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_POLICY_FAILURE, ROAR_ERROR_???}, 997 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_BAD_STYLE, ROAR_ERROR_???}, 998 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_BAD_OBJECT, ROAR_ERROR_???}, 999 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_TRAFFIC_CTRL_ERROR, ROAR_ERROR_???}, 1000 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_GENERIC_ERROR, ROAR_ERROR_???}, 1001 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_ESERVICETYPE, ROAR_ERROR_???}, 1002 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EFLOWSPEC, ROAR_ERROR_???}, 1003 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EPROVSPECBUF, ROAR_ERROR_???}, 1004 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EFILTERSTYLE, ROAR_ERROR_???}, 1005 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EFILTERTYPE, ROAR_ERROR_???}, 1006 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EFILTERCOUNT, ROAR_ERROR_???}, 1007 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EOBJLENGTH, ROAR_ERROR_???}, 1008 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EFLOWCOUNT, ROAR_ERROR_???}, 1009 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EUNKOWNPSOBJ, ROAR_ERROR_???}, 1010 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EPOLICYOBJ, ROAR_ERROR_???}, 1011 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EFLOWDESC, ROAR_ERROR_???}, 1012 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EPSFLOWSPEC, ROAR_ERROR_???}, 1013 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_EPSFILTERSPEC, ROAR_ERROR_???}, 1014 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_ESDMODEOBJ, ROAR_ERROR_???}, 1015 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_ESHAPERATEOBJ, ROAR_ERROR_???}, 1016 {ROAR_ERROR_TYPE_WINSOCK, WSA_QOS_RESERVED_PETYPE, ROAR_ERROR_???}, 1017 #endif 1018 #endif 1019 }; 1020 1021 static int roar_err_convert_table_lookup(const struct error_table_entry ** match, 1022 const int error, 1023 const enum roar_error_type type, 1024 const int to_roar) { 1025 size_t i; 1026 1027 // we have the following loop to times as an inner if() would cost more cycles 1028 // than the outer if we currently have. 1029 1030 if ( to_roar ) { 1031 for (i = 0; i < (sizeof(__libroar_error_table)/sizeof(*__libroar_error_table)); i++) { 1032 if ( __libroar_error_table[i].type == type && __libroar_error_table[i].error == error) { 1033 *match = &(__libroar_error_table[i]); 1034 return ROAR_ERROR_NONE; 1035 } 1036 } 1037 } else { 1038 for (i = 0; i < (sizeof(__libroar_error_table)/sizeof(*__libroar_error_table)); i++) { 1039 if ( __libroar_error_table[i].type == type && __libroar_error_table[i].roarerror == error) { 1040 *match = &(__libroar_error_table[i]); 1041 return ROAR_ERROR_NONE; 1042 } 1043 } 1044 } 1045 1046 return ROAR_ERROR_NOENT; 1047 } 1048 1049 // Convert error codes between diffrent representations. 1050 // returnes the error or ROAR_ERROR_NONE on success so it does not alter global error state. 1051 int roar_err_convert(int * out, const enum roar_error_type outtype, const int in, const enum roar_error_type intype) { 1052 const struct error_table_entry * tablematch; 1053 int tmp; 1054 int ret; 1055 1056 if ( out == NULL ) 1057 return ROAR_ERROR_FAULT; 1058 1059 if ( outtype == intype ) { 1060 *out = in; 1061 return ROAR_ERROR_NONE; 1062 } 1063 1064 // if not to/from roar, use roar as temp type so we do only need to code two kinds of translators (not any->any). 1065 if ( intype != ROAR_ERROR_TYPE_ROARAUDIO && outtype != ROAR_ERROR_TYPE_ROARAUDIO ) { 1066 ret = roar_err_convert(&tmp, ROAR_ERROR_TYPE_ROARAUDIO, in, intype); 1067 if ( ret != ROAR_ERROR_NONE ) 1068 return ret; 1069 1070 return roar_err_convert(out, outtype, tmp, ROAR_ERROR_TYPE_ROARAUDIO); 1071 } 1072 1073 // from here we can asume that if intype != ROAR_ERROR_TYPE_ROARAUDIO outtype is ROAR_ERROR_TYPE_ROARAUDIO 1074 // and the other way around. 1075 1076 if ( intype == ROAR_ERROR_TYPE_ROARAUDIO ) { 1077 ret = roar_err_convert_table_lookup(&tablematch, in, outtype, 0); 1078 } else { 1079 ret = roar_err_convert_table_lookup(&tablematch, in, intype, 1); 1080 } 1081 1082 if ( ret == ROAR_ERROR_NONE ) { 1083 *out = intype == ROAR_ERROR_TYPE_ROARAUDIO ? tablematch->error : tablematch->roarerror; 1084 return ROAR_ERROR_NONE; 1085 } 1086 1087 if ( intype == ROAR_ERROR_TYPE_ROARAUDIO && outtype == ROAR_ERROR_TYPE_ERRNO ) { 1088 // the __roar_to_errno() function always succeeds. 1089 *out = __roar_to_errno(in); 1090 return ROAR_ERROR_NONE; 1091 } 1092 1093 if ( outtype == ROAR_ERROR_TYPE_ROARAUDIO && intype == ROAR_ERROR_TYPE_ERRNO ) { 1094 // the __errno_to_roar() function always succeeds. 1095 *out = __errno_to_roar(in); 1096 return ROAR_ERROR_NONE; 1097 } 1098 1099 roar_err_get_default_error(out, outtype); 1100 return ROAR_ERROR_NOENT; 1101 } 1102 1103 // Outputs a default error for the given type. 1104 // returnes the error or ROAR_ERROR_NONE on success so it does not alter global error state. 1105 int roar_err_get_default_error(int * out, const enum roar_error_type type) { 1106 int is_set = 0; 1107 1108 if ( out == NULL ) 1109 return ROAR_ERROR_FAULT; 1110 1111 switch (type) { 1112 case ROAR_ERROR_TYPE_ROARAUDIO: is_set = 1; *out = ROAR_ERROR_UNKNOWN; break; 1113 #ifdef EINVAL 1114 case ROAR_ERROR_TYPE_ERRNO: is_set = 1; *out = EINVAL; break; 1115 #endif 1116 #ifdef NO_RECOVERY 1117 case ROAR_ERROR_TYPE_HERROR: is_set = 1; *out = NO_RECOVERY; break; 1118 #endif 1119 #ifdef __YIFF__ 1120 case ROAR_ERROR_TYPE_YIFF: is_set = 1; *out = YIFF_ERRNO_UNKNOWN; break; 1121 #endif 1122 case ROAR_ERROR_TYPE_HTTP: is_set = 1; *out = 500; break; 1123 #ifndef DEBUG 1124 // enable compiler warnings in DEBUG mode. 1125 default: 1126 break; 1127 #endif 1128 } 1129 1130 if ( is_set ) { 1131 return ROAR_ERROR_NONE; 1132 } 1133 1134 *out = -1; // some default so we do not leave it uninited. 1135 return ROAR_ERROR_NOENT; 867 1136 } 868 1137 -
libroar/vio_proto.c
r5460 r5544 502 502 int oeflen = 4; 503 503 int aligned = 1; 504 int error; 504 505 505 506 ROAR_DBG("roar_vio_open_proto_http(calls=%p, dst=%p, host='%s', file='%s') = ?", calls, dst, host, file); … … 563 564 ROAR_DBG("roar_vio_open_proto_http(*) = -1 // status=%i", status); 564 565 roar_buffer_free(bufbuf); 565 switch (status) { 566 // 3xx-Redirects: 567 case 301: roar_err_set(ROAR_ERROR_MOVEDPERM); break; 568 case 303: roar_err_set(ROAR_ERROR_SEEOTHER); break; 569 case 305: roar_err_set(ROAR_ERROR_USEPROXY); break; 570 case 307: roar_err_set(ROAR_ERROR_MOVEDTEMP); break; 571 // 4xx-Client errors: 572 case 400: roar_err_set(ROAR_ERROR_INVAL); break; 573 case 403: roar_err_set(ROAR_ERROR_PERM); break; 574 case 404: roar_err_set(ROAR_ERROR_NOENT); break; 575 case 408: roar_err_set(ROAR_ERROR_TIMEDOUT); break; 576 case 410: roar_err_set(ROAR_ERROR_GONE); break; 577 case 423: roar_err_set(ROAR_ERROR_BUSY); break; 578 case 426: roar_err_set(ROAR_ERROR_SWITCHPROTO); break; 579 // 5xx-Server errors: 580 case 501: roar_err_set(ROAR_ERROR_NOSYS); break; 581 case 504: roar_err_set(ROAR_ERROR_TIMEDOUT); break; 582 case 505: roar_err_set(ROAR_ERROR_NSVERSION); break; 583 case 507: roar_err_set(ROAR_ERROR_NOSPC); break; 584 // default case: 585 default: 586 roar_err_set(ROAR_ERROR_UNKNOWN); 587 break; 566 if ( roar_err_convert(&error, ROAR_ERROR_TYPE_ROARAUDIO, status, ROAR_ERROR_TYPE_HTTP) != ROAR_ERROR_NONE ) { 567 roar_err_set(ROAR_ERROR_UNKNOWN); 568 } else { 569 roar_err_set(error); 588 570 } 589 571 return -1;
Note: See TracChangeset
for help on using the changeset viewer.