From patchwork Tue Sep 25 08:54:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 974309 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=vivier.eu Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42KFQB20zZz9sBW for ; Tue, 25 Sep 2018 19:00:02 +1000 (AEST) Received: from localhost ([::1]:51723 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4jCJ-0006vR-Mf for incoming@patchwork.ozlabs.org; Tue, 25 Sep 2018 04:59:59 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47534) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4j8F-0003fz-2B for qemu-devel@nongnu.org; Tue, 25 Sep 2018 04:55:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g4j8C-0000Sb-5y for qemu-devel@nongnu.org; Tue, 25 Sep 2018 04:55:46 -0400 Received: from mout.kundenserver.de ([212.227.126.187]:40181) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1g4j8B-0000Rf-Pf for qemu-devel@nongnu.org; Tue, 25 Sep 2018 04:55:44 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue011 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MKsSj-1gKsvX0jAj-00LFiV; Tue, 25 Sep 2018 10:55:06 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Tue, 25 Sep 2018 10:54:29 +0200 Message-Id: <20180925085432.3791-3-laurent@vivier.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180925085432.3791-1-laurent@vivier.eu> References: <20180925085432.3791-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:3nSZTeJ62SVBfAqkE9/oQnNzvX3cASD5VApzFe/fjBiKxVLu11c pMaeZAH5R31n/5di8G1YzpdMBM7rKwNzNWV//RoC5+kXBf9nQbpwbpapqZgx81LtBaguwFO RqHZHFjz5el59gi2AerUF0mnaY91kiYJcHPu+8XkuD3xtim1eE4Letz+xukHoznwEHghWRm N7C9w4jdUypqekO3cv01Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:+trD5SD8FQI=:LRRvNdk2IzjFhseVztOn1E EFi/oifNu5gREnb8IiMmFzhrjJ0R+74Q2lSt3IUs12XiWe7vD68C3VtFbXZMOjHpsfWhHZCTN hpgsJfHDh3IIoX4Q8H86qM5GDhxC56hnd1D34dkcdIsktYjE3C8Xa25Tss4oQ+e8DnmBgjNEJ v8dsOhDTVyBYZ70RPok/r5o4JiTQ1PVlpEweV5K+i5zlZfUB/1SnfhHjGWAtLaZj88pmnMPs1 DWNPHX36wfE2lo3j7u4nZqI0lxdgMh+TBwzHDPvegATyl+OXDXn04BOYexkfwn/nZIKvKYwXe LCN2+tGOsMFQP97sQczjY2M5DE1k+69B3LuOjFNsamqwBudRlgzi6H8iVkDVv0PWUlkjOJtO/ r71GkHtb83dhjHrrc8yoIr5ZdM6SSHAgb3dHRaDo3WP38QTcRF3Ufcu2mDBQQP4+WU1Mh3vju XqpwTeHU71ewmtqTxnS6c73I0uESUy2jl+wpts2f70VGqhZcL5Xze1tdtQp/w78Q25DROFDlo zWLnkJbP+c5IWdWrkQOZr7qsPBKstqaf0m5cGHimW4liyXcbq8sOGh70oMW+QgDHHerp8pAqj 9gS8CMClrXf2BDM7riZyaE98+FH6PIBqDCLd0MOYfwY4rdToFZdD3mHI8/9cGw4nSGMkQl5MH QDms+iAAkkfzy1/2U+Qe+abAnwM4g/VpD6sn/5tM3uRRxVuaypp7Tfpi9CrACtbJ4qqBKppng scx/W2yN+JSuWaAO X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 212.227.126.187 Subject: [Qemu-devel] [PULL 2/5] linux-user: add SO_LINGER to {g, s}etsockopt X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?utf-8?q?Carlo_Marcelo_Arenas_Bel=C3=B3n?= , Riku Voipio , Laurent Vivier Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Carlo Marcelo Arenas Belón Original implementation for setsockopt by Chen Gang[1]; all bugs mine, including removing assignment for optname which hopefully makes the logic easier to follow and moving some variables to make the code more selfcontained. [1] http://patchwork.ozlabs.org/patch/565659/ Signed-off-by: Carlo Marcelo Arenas Belón Co-Authored-By: Chen Gang Reviewed-by: Laurent Vivier Message-Id: <20180824085601.6259-1-carenas@gmail.com> Signed-off-by: Laurent Vivier --- linux-user/syscall.c | 52 ++++++++++++++++++++++++++++++++++++++- linux-user/syscall_defs.h | 5 ++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index e252f8b555..58fb967499 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2032,6 +2032,24 @@ set_timeout: unlock_user (dev_ifname, optval_addr, 0); return ret; } + case TARGET_SO_LINGER: + { + struct linger lg; + struct target_linger *tlg; + + if (optlen != sizeof(struct target_linger)) { + return -TARGET_EINVAL; + } + if (!lock_user_struct(VERIFY_READ, tlg, optval_addr, 1)) { + return -TARGET_EFAULT; + } + __get_user(lg.l_onoff, &tlg->l_onoff); + __get_user(lg.l_linger, &tlg->l_linger); + ret = get_errno(setsockopt(sockfd, SOL_SOCKET, SO_LINGER, + &lg, sizeof(lg))); + unlock_user_struct(tlg, optval_addr, 0); + return ret; + } /* Options with 'int' argument. */ case TARGET_SO_DEBUG: optname = SO_DEBUG; @@ -2123,7 +2141,6 @@ static abi_long do_getsockopt(int sockfd, int level, int optname, level = SOL_SOCKET; switch (optname) { /* These don't just return a single integer */ - case TARGET_SO_LINGER: case TARGET_SO_RCVTIMEO: case TARGET_SO_SNDTIMEO: case TARGET_SO_PEERNAME: @@ -2161,6 +2178,39 @@ static abi_long do_getsockopt(int sockfd, int level, int optname, } break; } + case TARGET_SO_LINGER: + { + struct linger lg; + socklen_t lglen; + struct target_linger *tlg; + + if (get_user_u32(len, optlen)) { + return -TARGET_EFAULT; + } + if (len < 0) { + return -TARGET_EINVAL; + } + + lglen = sizeof(lg); + ret = get_errno(getsockopt(sockfd, level, SO_LINGER, + &lg, &lglen)); + if (ret < 0) { + return ret; + } + if (len > lglen) { + len = lglen; + } + if (!lock_user_struct(VERIFY_WRITE, tlg, optval_addr, 0)) { + return -TARGET_EFAULT; + } + __put_user(lg.l_onoff, &tlg->l_onoff); + __put_user(lg.l_linger, &tlg->l_linger); + unlock_user_struct(tlg, optval_addr, 1); + if (put_user_u32(len, optlen)) { + return -TARGET_EFAULT; + } + break; + } /* Options with 'int' argument. */ case TARGET_SO_DEBUG: optname = SO_DEBUG; diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 40bb60ef4c..18d434d6dc 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -203,6 +203,11 @@ struct target_ip_mreq_source { uint32_t imr_sourceaddr; }; +struct target_linger { + abi_int l_onoff; /* Linger active */ + abi_int l_linger; /* How long to linger for */ +}; + struct target_timeval { abi_long tv_sec; abi_long tv_usec;