From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LxpSz-0003yl-MA for qemu-devel@nongnu.org; Sat, 25 Apr 2009 17:31:21 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LxpSv-0003xM-3u for qemu-devel@nongnu.org; Sat, 25 Apr 2009 17:31:21 -0400 Received: from [199.232.76.173] (port=39354 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LxpSv-0003xH-0s for qemu-devel@nongnu.org; Sat, 25 Apr 2009 17:31:17 -0400 Received: from mail.corp.accelance.fr ([213.162.48.15]:57015) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LxpSu-0003Y1-Hx for qemu-devel@nongnu.org; Sat, 25 Apr 2009 17:31:16 -0400 Received: from [192.168.0.5] (potipota.net [88.168.176.51]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.corp.accelance.fr (Postfix) with ESMTP id 7E2415AB64C for ; Sat, 25 Apr 2009 23:29:29 +0200 (CEST) From: Lionel Landwerlin Content-Type: text/plain Date: Sat, 25 Apr 2009 23:31:18 +0200 Message-Id: <1240695078.21332.2.camel@coalu.atr> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] linux-user: Added IP_(UN)BLOCK_SOURCE/IP_(ADD|DROP)_SOURCE_MEMBERSHIP flags to setsockopt Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org linux-user: Added IP_(UN)BLOCK_SOURCE/IP_(ADD|DROP)_SOURCE_MEMBERSHIP flags to setsockopt Signed-off-by: Lionel Landwerlin --- linux-user/syscall.c | 13 +++++++++++++ linux-user/syscall_defs.h | 7 +++++++ 2 files changed, 20 insertions(+), 0 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 42f1089..898c962 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1138,6 +1138,7 @@ static abi_long do_setsockopt(int sockfd, int level, int optname, abi_long ret; int val; struct ip_mreqn *ip_mreq; + struct ip_mreq_source *ip_mreq_source; switch(level) { case SOL_TCP: @@ -1187,6 +1188,18 @@ static abi_long do_setsockopt(int sockfd, int level, int optname, ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq, optlen)); break; + case IP_BLOCK_SOURCE: + case IP_UNBLOCK_SOURCE: + case IP_ADD_SOURCE_MEMBERSHIP: + case IP_DROP_SOURCE_MEMBERSHIP: + if (optlen != sizeof (struct target_ip_mreq_source)) + return -TARGET_EINVAL; + + ip_mreq_source = lock_user(VERIFY_READ, optval_addr, optlen, 1); + ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq_source, optlen)); + unlock_user (ip_mreq_source, optval_addr, 0); + break; + default: goto unimplemented; } diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 3284710..f940d16 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -119,6 +119,13 @@ struct target_ip_mreqn { abi_long imr_ifindex; }; +struct target_ip_mreq_source { + /* big endian */ + uint32_t imr_multiaddr; + uint32_t imr_interface; + uint32_t imr_sourceaddr; +}; + struct target_timeval { abi_long tv_sec; abi_long tv_usec; -- 1.6.2.4 -- Lionel Landwerlin