Commit 1be9e1dc569eb3817441baf60d26648c5dcef12d

Authored by pbrook
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,6 +837,113 @@ static long do_sendrecvmsg(int fd, target_ulong target_msg,
837 return ret; 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 static long do_socketcall(int num, target_ulong vptr) 947 static long do_socketcall(int num, target_ulong vptr)
841 { 948 {
842 long ret; 949 long ret;
@@ -879,14 +986,7 @@ static long do_socketcall(int num, target_ulong vptr) @@ -879,14 +986,7 @@ static long do_socketcall(int num, target_ulong vptr)
879 int sockfd = tgetl(vptr); 986 int sockfd = tgetl(vptr);
880 target_ulong target_addr = tgetl(vptr + n); 987 target_ulong target_addr = tgetl(vptr + n);
881 target_ulong target_addrlen = tgetl(vptr + 2 * n); 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 break; 991 break;
892 case SOCKOP_getsockname: 992 case SOCKOP_getsockname:
@@ -894,14 +994,7 @@ static long do_socketcall(int num, target_ulong vptr) @@ -894,14 +994,7 @@ static long do_socketcall(int num, target_ulong vptr)
894 int sockfd = tgetl(vptr); 994 int sockfd = tgetl(vptr);
895 target_ulong target_addr = tgetl(vptr + n); 995 target_ulong target_addr = tgetl(vptr + n);
896 target_ulong target_addrlen = tgetl(vptr + 2 * n); 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 break; 999 break;
907 case SOCKOP_getpeername: 1000 case SOCKOP_getpeername:
@@ -909,14 +1002,7 @@ static long do_socketcall(int num, target_ulong vptr) @@ -909,14 +1002,7 @@ static long do_socketcall(int num, target_ulong vptr)
909 int sockfd = tgetl(vptr); 1002 int sockfd = tgetl(vptr);
910 target_ulong target_addr = tgetl(vptr + n); 1003 target_ulong target_addr = tgetl(vptr + n);
911 target_ulong target_addrlen = tgetl(vptr + 2 * n); 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 break; 1007 break;
922 case SOCKOP_socketpair: 1008 case SOCKOP_socketpair:
@@ -924,14 +1010,8 @@ static long do_socketcall(int num, target_ulong vptr) @@ -924,14 +1010,8 @@ static long do_socketcall(int num, target_ulong vptr)
924 int domain = tgetl(vptr); 1010 int domain = tgetl(vptr);
925 int type = tgetl(vptr + n); 1011 int type = tgetl(vptr + n);
926 int protocol = tgetl(vptr + 2 * n); 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 break; 1016 break;
937 case SOCKOP_send: 1017 case SOCKOP_send:
@@ -940,11 +1020,7 @@ static long do_socketcall(int num, target_ulong vptr) @@ -940,11 +1020,7 @@ static long do_socketcall(int num, target_ulong vptr)
940 target_ulong msg = tgetl(vptr + n); 1020 target_ulong msg = tgetl(vptr + n);
941 size_t len = tgetl(vptr + 2 * n); 1021 size_t len = tgetl(vptr + 2 * n);
942 int flags = tgetl(vptr + 3 * n); 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 break; 1025 break;
950 case SOCKOP_recv: 1026 case SOCKOP_recv:
@@ -953,11 +1029,7 @@ static long do_socketcall(int num, target_ulong vptr) @@ -953,11 +1029,7 @@ static long do_socketcall(int num, target_ulong vptr)
953 target_ulong msg = tgetl(vptr + n); 1029 target_ulong msg = tgetl(vptr + n);
954 size_t len = tgetl(vptr + 2 * n); 1030 size_t len = tgetl(vptr + 2 * n);
955 int flags = tgetl(vptr + 3 * n); 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 break; 1034 break;
963 case SOCKOP_sendto: 1035 case SOCKOP_sendto:
@@ -966,15 +1038,9 @@ static long do_socketcall(int num, target_ulong vptr) @@ -966,15 +1038,9 @@ static long do_socketcall(int num, target_ulong vptr)
966 target_ulong msg = tgetl(vptr + n); 1038 target_ulong msg = tgetl(vptr + n);
967 size_t len = tgetl(vptr + 2 * n); 1039 size_t len = tgetl(vptr + 2 * n);
968 int flags = tgetl(vptr + 3 * n); 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 socklen_t addrlen = tgetl(vptr + 5 * n); 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 break; 1045 break;
980 case SOCKOP_recvfrom: 1046 case SOCKOP_recvfrom:
@@ -983,21 +1049,9 @@ static long do_socketcall(int num, target_ulong vptr) @@ -983,21 +1049,9 @@ static long do_socketcall(int num, target_ulong vptr)
983 target_ulong msg = tgetl(vptr + n); 1049 target_ulong msg = tgetl(vptr + n);
984 size_t len = tgetl(vptr + 2 * n); 1050 size_t len = tgetl(vptr + 2 * n);
985 int flags = tgetl(vptr + 3 * n); 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 break; 1056 break;
1003 case SOCKOP_shutdown: 1057 case SOCKOP_shutdown:
@@ -1053,23 +1107,6 @@ static long do_socketcall(int num, target_ulong vptr) @@ -1053,23 +1107,6 @@ static long do_socketcall(int num, target_ulong vptr)
1053 return ret; 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 #define N_SHM_REGIONS 32 1110 #define N_SHM_REGIONS 32
1074 1111
1075 static struct shm_region { 1112 static struct shm_region {
@@ -2755,7 +2792,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -2755,7 +2792,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2755 2792
2756 #ifdef TARGET_NR_accept 2793 #ifdef TARGET_NR_accept
2757 case TARGET_NR_accept: 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 break; 2796 break;
2760 #endif 2797 #endif
2761 #ifdef TARGET_NR_bind 2798 #ifdef TARGET_NR_bind
@@ -2770,12 +2807,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -2770,12 +2807,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2770 #endif 2807 #endif
2771 #ifdef TARGET_NR_getpeername 2808 #ifdef TARGET_NR_getpeername
2772 case TARGET_NR_getpeername: 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 break; 2811 break;
2775 #endif 2812 #endif
2776 #ifdef TARGET_NR_getsockname 2813 #ifdef TARGET_NR_getsockname
2777 case TARGET_NR_getsockname: 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 break; 2816 break;
2780 #endif 2817 #endif
2781 #ifdef TARGET_NR_getsockopt 2818 #ifdef TARGET_NR_getsockopt
@@ -2785,17 +2822,17 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -2785,17 +2822,17 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2785 #endif 2822 #endif
2786 #ifdef TARGET_NR_listen 2823 #ifdef TARGET_NR_listen
2787 case TARGET_NR_listen: 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 break; 2826 break;
2790 #endif 2827 #endif
2791 #ifdef TARGET_NR_recv 2828 #ifdef TARGET_NR_recv
2792 case TARGET_NR_recv: 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 break; 2831 break;
2795 #endif 2832 #endif
2796 #ifdef TARGET_NR_recvfrom 2833 #ifdef TARGET_NR_recvfrom
2797 case TARGET_NR_recvfrom: 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 break; 2836 break;
2800 #endif 2837 #endif
2801 #ifdef TARGET_NR_recvmsg 2838 #ifdef TARGET_NR_recvmsg
@@ -2805,7 +2842,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -2805,7 +2842,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2805 #endif 2842 #endif
2806 #ifdef TARGET_NR_send 2843 #ifdef TARGET_NR_send
2807 case TARGET_NR_send: 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 break; 2846 break;
2810 #endif 2847 #endif
2811 #ifdef TARGET_NR_sendmsg 2848 #ifdef TARGET_NR_sendmsg
@@ -2815,12 +2852,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -2815,12 +2852,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2815 #endif 2852 #endif
2816 #ifdef TARGET_NR_sendto 2853 #ifdef TARGET_NR_sendto
2817 case TARGET_NR_sendto: 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 break; 2856 break;
2820 #endif 2857 #endif
2821 #ifdef TARGET_NR_shutdown 2858 #ifdef TARGET_NR_shutdown
2822 case TARGET_NR_shutdown: 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 break; 2861 break;
2825 #endif 2862 #endif
2826 #ifdef TARGET_NR_socket 2863 #ifdef TARGET_NR_socket
@@ -2830,7 +2867,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -2830,7 +2867,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
2830 #endif 2867 #endif
2831 #ifdef TARGET_NR_socketpair 2868 #ifdef TARGET_NR_socketpair
2832 case TARGET_NR_socketpair: 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 break; 2871 break;
2835 #endif 2872 #endif
2836 #ifdef TARGET_NR_setsockopt 2873 #ifdef TARGET_NR_setsockopt