From 6e3cb58fa21727929b4b983522ba3b9b0ba66f9d Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Sat, 25 Apr 2009 23:31:18 +0200 Subject: linux-user: Added IP_(UN)BLOCK_SOURCE/IP_(ADD|DROP)_SOURCE_MEMBERSHIP flags to setsockopt linux-user: Added IP_(UN)BLOCK_SOURCE/IP_(ADD|DROP)_SOURCE_MEMBERSHIP flags to setsockopt Signed-off-by: Lionel Landwerlin Signed-off-by: Riku Voipio --- linux-user/syscall.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'linux-user/syscall.c') diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 76481261b1..674942cdf4 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1137,6 +1137,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: @@ -1186,6 +1187,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; } -- cgit 1.4.1