Remove do_socketcallwrapper.

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2215 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
pbrook 2006-11-19 15:26:04 +00:00
parent ec2db7de7a
commit 1be9e1dc56
1 changed files with 129 additions and 92 deletions

View File

@ -837,6 +837,113 @@ static long do_sendrecvmsg(int fd, target_ulong target_msg,
return ret;
}
static long do_accept(int fd, target_ulong target_addr,
target_ulong target_addrlen)
{
socklen_t addrlen = tget32(target_addrlen);
void *addr = alloca(target_addrlen);
long ret;
ret = get_errno(accept(fd, addr, &addrlen));
if (!is_error(ret)) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
}
return ret;
}
static long do_getpeername(int fd, target_ulong target_addr,
target_ulong target_addrlen)
{
socklen_t addrlen = tget32(target_addrlen);
void *addr = alloca(target_addrlen);
long ret;
ret = get_errno(getpeername(fd, addr, &addrlen));
if (!is_error(ret)) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
}
return ret;
}
static long do_getsockname(int fd, target_ulong target_addr,
target_ulong target_addrlen)
{
socklen_t addrlen = tget32(target_addrlen);
void *addr = alloca(target_addrlen);
long ret;
ret = get_errno(getsockname(fd, addr, &addrlen));
if (!is_error(ret)) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
}
return ret;
}
static long do_socketpair(int domain, int type, int protocol,
target_ulong target_tab)
{
int tab[2];
long ret;
ret = get_errno(socketpair(domain, type, protocol, tab));
if (!is_error(ret)) {
tput32(target_tab, tab[0]);
tput32(target_tab + 4, tab[1]);
}
return ret;
}
static long do_sendto(int fd, target_ulong msg, size_t len, int flags,
target_ulong target_addr, socklen_t addrlen)
{
void *addr;
void *host_msg;
long ret;
host_msg = lock_user(msg, len, 1);
if (target_addr) {
addr = alloca(addrlen);
target_to_host_sockaddr(addr, target_addr, addrlen);
ret = get_errno(sendto(fd, host_msg, len, flags, addr, addrlen));
} else {
ret = get_errno(send(fd, host_msg, len, flags));
}
unlock_user(host_msg, msg, 0);
return ret;
}
static long do_recvfrom(int fd, target_ulong msg, size_t len, int flags,
target_ulong target_addr, target_ulong target_addrlen)
{
socklen_t addrlen;
void *addr;
void *host_msg;
long ret;
host_msg = lock_user(msg, len, 0);
if (target_addr) {
addrlen = tget32(target_addrlen);
addr = alloca(addrlen);
ret = get_errno(recvfrom(fd, host_msg, len, flags, addr, &addrlen));
} else {
addr = NULL; /* To keep compiler quiet. */
ret = get_errno(recv(fd, host_msg, len, flags));
}
if (!is_error(ret)) {
if (target_addr) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
}
unlock_user(host_msg, msg, len);
} else {
unlock_user(host_msg, msg, 0);
}
return ret;
}
static long do_socketcall(int num, target_ulong vptr)
{
long ret;
@ -879,14 +986,7 @@ static long do_socketcall(int num, target_ulong vptr)
int sockfd = tgetl(vptr);
target_ulong target_addr = tgetl(vptr + n);
target_ulong target_addrlen = tgetl(vptr + 2 * n);
socklen_t addrlen = tget32(target_addrlen);
void *addr = alloca(addrlen);
ret = get_errno(accept(sockfd, addr, &addrlen));
if (!is_error(ret)) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
}
ret = do_accept(sockfd, target_addr, target_addrlen);
}
break;
case SOCKOP_getsockname:
@ -894,14 +994,7 @@ static long do_socketcall(int num, target_ulong vptr)
int sockfd = tgetl(vptr);
target_ulong target_addr = tgetl(vptr + n);
target_ulong target_addrlen = tgetl(vptr + 2 * n);
socklen_t addrlen = tget32(target_addrlen);
void *addr = alloca(addrlen);
ret = get_errno(getsockname(sockfd, addr, &addrlen));
if (!is_error(ret)) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
}
ret = do_getsockname(sockfd, target_addr, target_addrlen);
}
break;
case SOCKOP_getpeername:
@ -909,14 +1002,7 @@ static long do_socketcall(int num, target_ulong vptr)
int sockfd = tgetl(vptr);
target_ulong target_addr = tgetl(vptr + n);
target_ulong target_addrlen = tgetl(vptr + 2 * n);
socklen_t addrlen = tget32(target_addrlen);
void *addr = alloca(addrlen);
ret = get_errno(getpeername(sockfd, addr, &addrlen));
if (!is_error(ret)) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
}
ret = do_getpeername(sockfd, target_addr, target_addrlen);
}
break;
case SOCKOP_socketpair:
@ -924,14 +1010,8 @@ static long do_socketcall(int num, target_ulong vptr)
int domain = tgetl(vptr);
int type = tgetl(vptr + n);
int protocol = tgetl(vptr + 2 * n);
target_ulong target_tab = tgetl(vptr + 3 * n);
int tab[2];
ret = get_errno(socketpair(domain, type, protocol, tab));
if (!is_error(ret)) {
tput32(target_tab, tab[0]);
tput32(target_tab + 4, tab[1]);
}
target_ulong tab = tgetl(vptr + 3 * n);
ret = do_socketpair(domain, type, protocol, tab);
}
break;
case SOCKOP_send:
@ -940,11 +1020,7 @@ static long do_socketcall(int num, target_ulong vptr)
target_ulong msg = tgetl(vptr + n);
size_t len = tgetl(vptr + 2 * n);
int flags = tgetl(vptr + 3 * n);
void *host_msg;
host_msg = lock_user(msg, len, 1);
ret = get_errno(send(sockfd, host_msg, len, flags));
unlock_user(host_msg, msg, 0);
ret = do_sendto(sockfd, msg, len, flags, 0, 0);
}
break;
case SOCKOP_recv:
@ -953,11 +1029,7 @@ static long do_socketcall(int num, target_ulong vptr)
target_ulong msg = tgetl(vptr + n);
size_t len = tgetl(vptr + 2 * n);
int flags = tgetl(vptr + 3 * n);
void *host_msg;
host_msg = lock_user(msg, len, 0);
ret = get_errno(recv(sockfd, host_msg, len, flags));
unlock_user(host_msg, msg, ret);
ret = do_recvfrom(sockfd, msg, len, flags, 0, 0);
}
break;
case SOCKOP_sendto:
@ -966,15 +1038,9 @@ static long do_socketcall(int num, target_ulong vptr)
target_ulong msg = tgetl(vptr + n);
size_t len = tgetl(vptr + 2 * n);
int flags = tgetl(vptr + 3 * n);
target_ulong target_addr = tgetl(vptr + 4 * n);
target_ulong addr = tgetl(vptr + 4 * n);
socklen_t addrlen = tgetl(vptr + 5 * n);
void *addr = alloca(addrlen);
void *host_msg;
host_msg = lock_user(msg, len, 1);
target_to_host_sockaddr(addr, target_addr, addrlen);
ret = get_errno(sendto(sockfd, host_msg, len, flags, addr, addrlen));
unlock_user(host_msg, msg, 0);
ret = do_sendto(sockfd, msg, len, flags, addr, addrlen);
}
break;
case SOCKOP_recvfrom:
@ -983,21 +1049,9 @@ static long do_socketcall(int num, target_ulong vptr)
target_ulong msg = tgetl(vptr + n);
size_t len = tgetl(vptr + 2 * n);
int flags = tgetl(vptr + 3 * n);
target_ulong target_addr = tgetl(vptr + 4 * n);
target_ulong target_addrlen = tgetl(vptr + 5 * n);
socklen_t addrlen = tget32(target_addrlen);
void *addr = alloca(addrlen);
void *host_msg;
host_msg = lock_user(msg, len, 0);
ret = get_errno(recvfrom(sockfd, host_msg, len, flags, addr, &addrlen));
if (!is_error(ret)) {
host_to_target_sockaddr(target_addr, addr, addrlen);
tput32(target_addrlen, addrlen);
unlock_user(host_msg, msg, len);
} else {
unlock_user(host_msg, msg, 0);
}
target_ulong addr = tgetl(vptr + 4 * n);
target_ulong addrlen = tgetl(vptr + 5 * n);
ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen);
}
break;
case SOCKOP_shutdown:
@ -1053,23 +1107,6 @@ static long do_socketcall(int num, target_ulong vptr)
return ret;
}
/* XXX: suppress this function and call directly the related socket
functions */
static long do_socketcallwrapper(int num, long arg1, long arg2, long arg3,
long arg4, long arg5, long arg6)
{
target_long args[6];
tputl(args, arg1);
tputl(args+1, arg2);
tputl(args+2, arg3);
tputl(args+3, arg4);
tputl(args+4, arg5);
tputl(args+5, arg6);
return do_socketcall(num, (target_ulong) args);
}
#define N_SHM_REGIONS 32
static struct shm_region {
@ -2755,7 +2792,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#ifdef TARGET_NR_accept
case TARGET_NR_accept:
ret = do_socketcallwrapper(SOCKOP_accept, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_accept(arg1, arg2, arg3);
break;
#endif
#ifdef TARGET_NR_bind
@ -2770,12 +2807,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#endif
#ifdef TARGET_NR_getpeername
case TARGET_NR_getpeername:
ret = do_socketcallwrapper(SOCKOP_getpeername, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_getpeername(arg1, arg2, arg3);
break;
#endif
#ifdef TARGET_NR_getsockname
case TARGET_NR_getsockname:
ret = do_socketcallwrapper(SOCKOP_getsockname, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_getsockname(arg1, arg2, arg3);
break;
#endif
#ifdef TARGET_NR_getsockopt
@ -2785,17 +2822,17 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#endif
#ifdef TARGET_NR_listen
case TARGET_NR_listen:
ret = do_socketcallwrapper(SOCKOP_listen, arg1, arg2, arg3, arg4, arg5, arg6);
ret = get_errno(listen(arg1, arg2));
break;
#endif
#ifdef TARGET_NR_recv
case TARGET_NR_recv:
ret = do_socketcallwrapper(SOCKOP_recv, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_recvfrom(arg1, arg1, arg3, arg4, 0, 0);
break;
#endif
#ifdef TARGET_NR_recvfrom
case TARGET_NR_recvfrom:
ret = do_socketcallwrapper(SOCKOP_recvfrom, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_recvfrom(arg1, arg1, arg3, arg4, arg5, arg6);
break;
#endif
#ifdef TARGET_NR_recvmsg
@ -2805,7 +2842,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#endif
#ifdef TARGET_NR_send
case TARGET_NR_send:
ret = do_socketcallwrapper(SOCKOP_send, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_sendto(arg1, arg2, arg3, arg4, 0, 0);
break;
#endif
#ifdef TARGET_NR_sendmsg
@ -2815,12 +2852,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#endif
#ifdef TARGET_NR_sendto
case TARGET_NR_sendto:
ret = do_socketcallwrapper(SOCKOP_sendto, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_sendto(arg1, arg2, arg3, arg4, arg5, arg6);
break;
#endif
#ifdef TARGET_NR_shutdown
case TARGET_NR_shutdown:
ret = do_socketcallwrapper(SOCKOP_shutdown, arg1, arg2, arg3, arg4, arg5, arg6);
ret = get_errno(shutdown(arg1, arg2));
break;
#endif
#ifdef TARGET_NR_socket
@ -2830,7 +2867,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#endif
#ifdef TARGET_NR_socketpair
case TARGET_NR_socketpair:
ret = do_socketcallwrapper(SOCKOP_socketpair, arg1, arg2, arg3, arg4, arg5, arg6);
ret = do_socketpair(arg1, arg2, arg3, arg4);
break;
#endif
#ifdef TARGET_NR_setsockopt