--- linux-user/syscall.c 1 Mar 2005 22:32:06 -0000 1.58 +++ linux-user/syscall.c 18 Mar 2005 10:17:09 -0000 @@ -47,6 +47,7 @@ //#include #include #include +#include #define termios host_termios #define winsize host_winsize @@ -427,12 +428,17 @@ static long do_select(long n, return ret; } -static inline void target_to_host_sockaddr(struct sockaddr *addr, - struct target_sockaddr *target_addr, - socklen_t len) +static inline socklen_t target_to_host_sockaddr(struct sockaddr *addr, + struct target_sockaddr *target_addr, + socklen_t len) { memcpy(addr, target_addr, len); addr->sa_family = tswap16(target_addr->sa_family); + + if (addr->sa_family == AF_UNIX) + return sizeof (struct sockaddr_un); + + return len; } static inline void host_to_target_sockaddr(struct target_sockaddr *target_addr, @@ -668,7 +679,7 @@ static long do_socketcall(int num, int32 socklen_t addrlen = tswap32(vptr[2]); void *addr = alloca(addrlen); - target_to_host_sockaddr(addr, target_addr, addrlen); + addrlen = target_to_host_sockaddr(addr, target_addr, addrlen); ret = get_errno(bind(sockfd, addr, addrlen)); } break; @@ -679,7 +690,7 @@ static long do_socketcall(int num, int32 socklen_t addrlen = tswap32(vptr[2]); void *addr = alloca(addrlen); - target_to_host_sockaddr(addr, target_addr, addrlen); + addrlen = target_to_host_sockaddr(addr, target_addr, addrlen); ret = get_errno(connect(sockfd, addr, addrlen)); } break; @@ -781,7 +792,7 @@ static long do_socketcall(int num, int32 socklen_t addrlen = tswap32(vptr[5]); void *addr = alloca(addrlen); - target_to_host_sockaddr(addr, target_addr, addrlen); + addrlen = target_to_host_sockaddr(addr, target_addr, addrlen); ret = get_errno(sendto(sockfd, msg, len, flags, addr, addrlen)); } break;