Commit 1be9e1dc569eb3817441baf60d26648c5dcef12d
1 parent
ec2db7de
Remove do_socketcallwrapper.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2215 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
129 additions
and
92 deletions
linux-user/syscall.c
... | ... | @@ -837,6 +837,113 @@ static long do_sendrecvmsg(int fd, target_ulong target_msg, |
837 | 837 | return ret; |
838 | 838 | } |
839 | 839 | |
840 | +static long do_accept(int fd, target_ulong target_addr, | |
841 | + target_ulong target_addrlen) | |
842 | +{ | |
843 | + socklen_t addrlen = tget32(target_addrlen); | |
844 | + void *addr = alloca(target_addrlen); | |
845 | + long ret; | |
846 | + | |
847 | + ret = get_errno(accept(fd, addr, &addrlen)); | |
848 | + if (!is_error(ret)) { | |
849 | + host_to_target_sockaddr(target_addr, addr, addrlen); | |
850 | + tput32(target_addrlen, addrlen); | |
851 | + } | |
852 | + return ret; | |
853 | +} | |
854 | + | |
855 | +static long do_getpeername(int fd, target_ulong target_addr, | |
856 | + target_ulong target_addrlen) | |
857 | +{ | |
858 | + socklen_t addrlen = tget32(target_addrlen); | |
859 | + void *addr = alloca(target_addrlen); | |
860 | + long ret; | |
861 | + | |
862 | + ret = get_errno(getpeername(fd, addr, &addrlen)); | |
863 | + if (!is_error(ret)) { | |
864 | + host_to_target_sockaddr(target_addr, addr, addrlen); | |
865 | + tput32(target_addrlen, addrlen); | |
866 | + } | |
867 | + return ret; | |
868 | +} | |
869 | + | |
870 | +static long do_getsockname(int fd, target_ulong target_addr, | |
871 | + target_ulong target_addrlen) | |
872 | +{ | |
873 | + socklen_t addrlen = tget32(target_addrlen); | |
874 | + void *addr = alloca(target_addrlen); | |
875 | + long ret; | |
876 | + | |
877 | + ret = get_errno(getsockname(fd, addr, &addrlen)); | |
878 | + if (!is_error(ret)) { | |
879 | + host_to_target_sockaddr(target_addr, addr, addrlen); | |
880 | + tput32(target_addrlen, addrlen); | |
881 | + } | |
882 | + return ret; | |
883 | +} | |
884 | + | |
885 | +static long do_socketpair(int domain, int type, int protocol, | |
886 | + target_ulong target_tab) | |
887 | +{ | |
888 | + int tab[2]; | |
889 | + long ret; | |
890 | + | |
891 | + ret = get_errno(socketpair(domain, type, protocol, tab)); | |
892 | + if (!is_error(ret)) { | |
893 | + tput32(target_tab, tab[0]); | |
894 | + tput32(target_tab + 4, tab[1]); | |
895 | + } | |
896 | + return ret; | |
897 | +} | |
898 | + | |
899 | +static long do_sendto(int fd, target_ulong msg, size_t len, int flags, | |
900 | + target_ulong target_addr, socklen_t addrlen) | |
901 | +{ | |
902 | + void *addr; | |
903 | + void *host_msg; | |
904 | + long ret; | |
905 | + | |
906 | + host_msg = lock_user(msg, len, 1); | |
907 | + if (target_addr) { | |
908 | + addr = alloca(addrlen); | |
909 | + target_to_host_sockaddr(addr, target_addr, addrlen); | |
910 | + ret = get_errno(sendto(fd, host_msg, len, flags, addr, addrlen)); | |
911 | + } else { | |
912 | + ret = get_errno(send(fd, host_msg, len, flags)); | |
913 | + } | |
914 | + unlock_user(host_msg, msg, 0); | |
915 | + return ret; | |
916 | +} | |
917 | + | |
918 | +static long do_recvfrom(int fd, target_ulong msg, size_t len, int flags, | |
919 | + target_ulong target_addr, target_ulong target_addrlen) | |
920 | +{ | |
921 | + socklen_t addrlen; | |
922 | + void *addr; | |
923 | + void *host_msg; | |
924 | + long ret; | |
925 | + | |
926 | + host_msg = lock_user(msg, len, 0); | |
927 | + if (target_addr) { | |
928 | + addrlen = tget32(target_addrlen); | |
929 | + addr = alloca(addrlen); | |
930 | + ret = get_errno(recvfrom(fd, host_msg, len, flags, addr, &addrlen)); | |
931 | + } else { | |
932 | + addr = NULL; /* To keep compiler quiet. */ | |
933 | + ret = get_errno(recv(fd, host_msg, len, flags)); | |
934 | + } | |
935 | + if (!is_error(ret)) { | |
936 | + if (target_addr) { | |
937 | + host_to_target_sockaddr(target_addr, addr, addrlen); | |
938 | + tput32(target_addrlen, addrlen); | |
939 | + } | |
940 | + unlock_user(host_msg, msg, len); | |
941 | + } else { | |
942 | + unlock_user(host_msg, msg, 0); | |
943 | + } | |
944 | + return ret; | |
945 | +} | |
946 | + | |
840 | 947 | static long do_socketcall(int num, target_ulong vptr) |
841 | 948 | { |
842 | 949 | long ret; |
... | ... | @@ -879,14 +986,7 @@ static long do_socketcall(int num, target_ulong vptr) |
879 | 986 | int sockfd = tgetl(vptr); |
880 | 987 | target_ulong target_addr = tgetl(vptr + n); |
881 | 988 | target_ulong target_addrlen = tgetl(vptr + 2 * n); |
882 | - socklen_t addrlen = tget32(target_addrlen); | |
883 | - void *addr = alloca(addrlen); | |
884 | - | |
885 | - ret = get_errno(accept(sockfd, addr, &addrlen)); | |
886 | - if (!is_error(ret)) { | |
887 | - host_to_target_sockaddr(target_addr, addr, addrlen); | |
888 | - tput32(target_addrlen, addrlen); | |
889 | - } | |
989 | + ret = do_accept(sockfd, target_addr, target_addrlen); | |
890 | 990 | } |
891 | 991 | break; |
892 | 992 | case SOCKOP_getsockname: |
... | ... | @@ -894,14 +994,7 @@ static long do_socketcall(int num, target_ulong vptr) |
894 | 994 | int sockfd = tgetl(vptr); |
895 | 995 | target_ulong target_addr = tgetl(vptr + n); |
896 | 996 | target_ulong target_addrlen = tgetl(vptr + 2 * n); |
897 | - socklen_t addrlen = tget32(target_addrlen); | |
898 | - void *addr = alloca(addrlen); | |
899 | - | |
900 | - ret = get_errno(getsockname(sockfd, addr, &addrlen)); | |
901 | - if (!is_error(ret)) { | |
902 | - host_to_target_sockaddr(target_addr, addr, addrlen); | |
903 | - tput32(target_addrlen, addrlen); | |
904 | - } | |
997 | + ret = do_getsockname(sockfd, target_addr, target_addrlen); | |
905 | 998 | } |
906 | 999 | break; |
907 | 1000 | case SOCKOP_getpeername: |
... | ... | @@ -909,14 +1002,7 @@ static long do_socketcall(int num, target_ulong vptr) |
909 | 1002 | int sockfd = tgetl(vptr); |
910 | 1003 | target_ulong target_addr = tgetl(vptr + n); |
911 | 1004 | target_ulong target_addrlen = tgetl(vptr + 2 * n); |
912 | - socklen_t addrlen = tget32(target_addrlen); | |
913 | - void *addr = alloca(addrlen); | |
914 | - | |
915 | - ret = get_errno(getpeername(sockfd, addr, &addrlen)); | |
916 | - if (!is_error(ret)) { | |
917 | - host_to_target_sockaddr(target_addr, addr, addrlen); | |
918 | - tput32(target_addrlen, addrlen); | |
919 | - } | |
1005 | + ret = do_getpeername(sockfd, target_addr, target_addrlen); | |
920 | 1006 | } |
921 | 1007 | break; |
922 | 1008 | case SOCKOP_socketpair: |
... | ... | @@ -924,14 +1010,8 @@ static long do_socketcall(int num, target_ulong vptr) |
924 | 1010 | int domain = tgetl(vptr); |
925 | 1011 | int type = tgetl(vptr + n); |
926 | 1012 | int protocol = tgetl(vptr + 2 * n); |
927 | - target_ulong target_tab = tgetl(vptr + 3 * n); | |
928 | - int tab[2]; | |
929 | - | |
930 | - ret = get_errno(socketpair(domain, type, protocol, tab)); | |
931 | - if (!is_error(ret)) { | |
932 | - tput32(target_tab, tab[0]); | |
933 | - tput32(target_tab + 4, tab[1]); | |
934 | - } | |
1013 | + target_ulong tab = tgetl(vptr + 3 * n); | |
1014 | + ret = do_socketpair(domain, type, protocol, tab); | |
935 | 1015 | } |
936 | 1016 | break; |
937 | 1017 | case SOCKOP_send: |
... | ... | @@ -940,11 +1020,7 @@ static long do_socketcall(int num, target_ulong vptr) |
940 | 1020 | target_ulong msg = tgetl(vptr + n); |
941 | 1021 | size_t len = tgetl(vptr + 2 * n); |
942 | 1022 | int flags = tgetl(vptr + 3 * n); |
943 | - void *host_msg; | |
944 | - | |
945 | - host_msg = lock_user(msg, len, 1); | |
946 | - ret = get_errno(send(sockfd, host_msg, len, flags)); | |
947 | - unlock_user(host_msg, msg, 0); | |
1023 | + ret = do_sendto(sockfd, msg, len, flags, 0, 0); | |
948 | 1024 | } |
949 | 1025 | break; |
950 | 1026 | case SOCKOP_recv: |
... | ... | @@ -953,11 +1029,7 @@ static long do_socketcall(int num, target_ulong vptr) |
953 | 1029 | target_ulong msg = tgetl(vptr + n); |
954 | 1030 | size_t len = tgetl(vptr + 2 * n); |
955 | 1031 | int flags = tgetl(vptr + 3 * n); |
956 | - void *host_msg; | |
957 | - | |
958 | - host_msg = lock_user(msg, len, 0); | |
959 | - ret = get_errno(recv(sockfd, host_msg, len, flags)); | |
960 | - unlock_user(host_msg, msg, ret); | |
1032 | + ret = do_recvfrom(sockfd, msg, len, flags, 0, 0); | |
961 | 1033 | } |
962 | 1034 | break; |
963 | 1035 | case SOCKOP_sendto: |
... | ... | @@ -966,15 +1038,9 @@ static long do_socketcall(int num, target_ulong vptr) |
966 | 1038 | target_ulong msg = tgetl(vptr + n); |
967 | 1039 | size_t len = tgetl(vptr + 2 * n); |
968 | 1040 | int flags = tgetl(vptr + 3 * n); |
969 | - target_ulong target_addr = tgetl(vptr + 4 * n); | |
1041 | + target_ulong addr = tgetl(vptr + 4 * n); | |
970 | 1042 | socklen_t addrlen = tgetl(vptr + 5 * n); |
971 | - void *addr = alloca(addrlen); | |
972 | - void *host_msg; | |
973 | - | |
974 | - host_msg = lock_user(msg, len, 1); | |
975 | - target_to_host_sockaddr(addr, target_addr, addrlen); | |
976 | - ret = get_errno(sendto(sockfd, host_msg, len, flags, addr, addrlen)); | |
977 | - unlock_user(host_msg, msg, 0); | |
1043 | + ret = do_sendto(sockfd, msg, len, flags, addr, addrlen); | |
978 | 1044 | } |
979 | 1045 | break; |
980 | 1046 | case SOCKOP_recvfrom: |
... | ... | @@ -983,21 +1049,9 @@ static long do_socketcall(int num, target_ulong vptr) |
983 | 1049 | target_ulong msg = tgetl(vptr + n); |
984 | 1050 | size_t len = tgetl(vptr + 2 * n); |
985 | 1051 | int flags = tgetl(vptr + 3 * n); |
986 | - target_ulong target_addr = tgetl(vptr + 4 * n); | |
987 | - target_ulong target_addrlen = tgetl(vptr + 5 * n); | |
988 | - socklen_t addrlen = tget32(target_addrlen); | |
989 | - void *addr = alloca(addrlen); | |
990 | - void *host_msg; | |
991 | - | |
992 | - host_msg = lock_user(msg, len, 0); | |
993 | - ret = get_errno(recvfrom(sockfd, host_msg, len, flags, addr, &addrlen)); | |
994 | - if (!is_error(ret)) { | |
995 | - host_to_target_sockaddr(target_addr, addr, addrlen); | |
996 | - tput32(target_addrlen, addrlen); | |
997 | - unlock_user(host_msg, msg, len); | |
998 | - } else { | |
999 | - unlock_user(host_msg, msg, 0); | |
1000 | - } | |
1052 | + target_ulong addr = tgetl(vptr + 4 * n); | |
1053 | + target_ulong addrlen = tgetl(vptr + 5 * n); | |
1054 | + ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen); | |
1001 | 1055 | } |
1002 | 1056 | break; |
1003 | 1057 | case SOCKOP_shutdown: |
... | ... | @@ -1053,23 +1107,6 @@ static long do_socketcall(int num, target_ulong vptr) |
1053 | 1107 | return ret; |
1054 | 1108 | } |
1055 | 1109 | |
1056 | -/* XXX: suppress this function and call directly the related socket | |
1057 | - functions */ | |
1058 | -static long do_socketcallwrapper(int num, long arg1, long arg2, long arg3, | |
1059 | - long arg4, long arg5, long arg6) | |
1060 | -{ | |
1061 | - target_long args[6]; | |
1062 | - | |
1063 | - tputl(args, arg1); | |
1064 | - tputl(args+1, arg2); | |
1065 | - tputl(args+2, arg3); | |
1066 | - tputl(args+3, arg4); | |
1067 | - tputl(args+4, arg5); | |
1068 | - tputl(args+5, arg6); | |
1069 | - | |
1070 | - return do_socketcall(num, (target_ulong) args); | |
1071 | -} | |
1072 | - | |
1073 | 1110 | #define N_SHM_REGIONS 32 |
1074 | 1111 | |
1075 | 1112 | static struct shm_region { |
... | ... | @@ -2755,7 +2792,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
2755 | 2792 | |
2756 | 2793 | #ifdef TARGET_NR_accept |
2757 | 2794 | case TARGET_NR_accept: |
2758 | - ret = do_socketcallwrapper(SOCKOP_accept, arg1, arg2, arg3, arg4, arg5, arg6); | |
2795 | + ret = do_accept(arg1, arg2, arg3); | |
2759 | 2796 | break; |
2760 | 2797 | #endif |
2761 | 2798 | #ifdef TARGET_NR_bind |
... | ... | @@ -2770,12 +2807,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
2770 | 2807 | #endif |
2771 | 2808 | #ifdef TARGET_NR_getpeername |
2772 | 2809 | case TARGET_NR_getpeername: |
2773 | - ret = do_socketcallwrapper(SOCKOP_getpeername, arg1, arg2, arg3, arg4, arg5, arg6); | |
2810 | + ret = do_getpeername(arg1, arg2, arg3); | |
2774 | 2811 | break; |
2775 | 2812 | #endif |
2776 | 2813 | #ifdef TARGET_NR_getsockname |
2777 | 2814 | case TARGET_NR_getsockname: |
2778 | - ret = do_socketcallwrapper(SOCKOP_getsockname, arg1, arg2, arg3, arg4, arg5, arg6); | |
2815 | + ret = do_getsockname(arg1, arg2, arg3); | |
2779 | 2816 | break; |
2780 | 2817 | #endif |
2781 | 2818 | #ifdef TARGET_NR_getsockopt |
... | ... | @@ -2785,17 +2822,17 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
2785 | 2822 | #endif |
2786 | 2823 | #ifdef TARGET_NR_listen |
2787 | 2824 | case TARGET_NR_listen: |
2788 | - ret = do_socketcallwrapper(SOCKOP_listen, arg1, arg2, arg3, arg4, arg5, arg6); | |
2825 | + ret = get_errno(listen(arg1, arg2)); | |
2789 | 2826 | break; |
2790 | 2827 | #endif |
2791 | 2828 | #ifdef TARGET_NR_recv |
2792 | 2829 | case TARGET_NR_recv: |
2793 | - ret = do_socketcallwrapper(SOCKOP_recv, arg1, arg2, arg3, arg4, arg5, arg6); | |
2830 | + ret = do_recvfrom(arg1, arg1, arg3, arg4, 0, 0); | |
2794 | 2831 | break; |
2795 | 2832 | #endif |
2796 | 2833 | #ifdef TARGET_NR_recvfrom |
2797 | 2834 | case TARGET_NR_recvfrom: |
2798 | - ret = do_socketcallwrapper(SOCKOP_recvfrom, arg1, arg2, arg3, arg4, arg5, arg6); | |
2835 | + ret = do_recvfrom(arg1, arg1, arg3, arg4, arg5, arg6); | |
2799 | 2836 | break; |
2800 | 2837 | #endif |
2801 | 2838 | #ifdef TARGET_NR_recvmsg |
... | ... | @@ -2805,7 +2842,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
2805 | 2842 | #endif |
2806 | 2843 | #ifdef TARGET_NR_send |
2807 | 2844 | case TARGET_NR_send: |
2808 | - ret = do_socketcallwrapper(SOCKOP_send, arg1, arg2, arg3, arg4, arg5, arg6); | |
2845 | + ret = do_sendto(arg1, arg2, arg3, arg4, 0, 0); | |
2809 | 2846 | break; |
2810 | 2847 | #endif |
2811 | 2848 | #ifdef TARGET_NR_sendmsg |
... | ... | @@ -2815,12 +2852,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
2815 | 2852 | #endif |
2816 | 2853 | #ifdef TARGET_NR_sendto |
2817 | 2854 | case TARGET_NR_sendto: |
2818 | - ret = do_socketcallwrapper(SOCKOP_sendto, arg1, arg2, arg3, arg4, arg5, arg6); | |
2855 | + ret = do_sendto(arg1, arg2, arg3, arg4, arg5, arg6); | |
2819 | 2856 | break; |
2820 | 2857 | #endif |
2821 | 2858 | #ifdef TARGET_NR_shutdown |
2822 | 2859 | case TARGET_NR_shutdown: |
2823 | - ret = do_socketcallwrapper(SOCKOP_shutdown, arg1, arg2, arg3, arg4, arg5, arg6); | |
2860 | + ret = get_errno(shutdown(arg1, arg2)); | |
2824 | 2861 | break; |
2825 | 2862 | #endif |
2826 | 2863 | #ifdef TARGET_NR_socket |
... | ... | @@ -2830,7 +2867,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
2830 | 2867 | #endif |
2831 | 2868 | #ifdef TARGET_NR_socketpair |
2832 | 2869 | case TARGET_NR_socketpair: |
2833 | - ret = do_socketcallwrapper(SOCKOP_socketpair, arg1, arg2, arg3, arg4, arg5, arg6); | |
2870 | + ret = do_socketpair(arg1, arg2, arg3, arg4); | |
2834 | 2871 | break; |
2835 | 2872 | #endif |
2836 | 2873 | #ifdef TARGET_NR_setsockopt | ... | ... |