From patchwork Fri Feb 8 14:35:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 14700 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id A53B923F99 for ; Fri, 8 Feb 2013 14:35:08 +0000 (UTC) Received: from mail-vb0-f44.google.com (mail-vb0-f44.google.com [209.85.212.44]) by fiordland.canonical.com (Postfix) with ESMTP id 6F1F8A190B2 for ; Fri, 8 Feb 2013 14:35:08 +0000 (UTC) Received: by mail-vb0-f44.google.com with SMTP id fr13so2336741vbb.31 for ; Fri, 08 Feb 2013 06:35:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:x-forwarded-to:x-forwarded-for:delivered-to:x-received :received-spf:from:to:cc:subject:date:message-id:x-mailer :x-gm-message-state; bh=G3krRrqv7h18J0Zz0u7vUEYmGKGhZmO7o+WSQUnVZmU=; b=N/THVzv0vAWIaVuZq8n4LGAuPI1WXnEekl4E5Xu/0juFp+aSuPYHgona7Ttc/EBVcn VrjX6wvlFWK2inY7ytUl4HtSRdfFeSkkCW5HSATxtXnC7VYsFg7PT61mbJluH1PjBNwY z0afiFjLKntmQu5FiOdDsgJBIICVoS2+/ohQwI08+4qd/gUKyus2jW2QMYd9hI/MEj9h r+7eZ13Q3wSaYkTkgfcVxk8M6PianFJS5ehdfadA4jbMbVstW3fZPtco0ZWVpuoGCGUR y7O354IXtnuLG810sq33uk2RkrqEcJkugB6jO6HpN0e5DI/K0vFrXrIoFn/XmtW/hFth G93g== X-Received: by 10.52.27.50 with SMTP id q18mr6133038vdg.20.1360334107955; Fri, 08 Feb 2013 06:35:07 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.58.252.8 with SMTP id zo8csp148873vec; Fri, 8 Feb 2013 06:35:06 -0800 (PST) X-Received: by 10.180.83.227 with SMTP id t3mr3029089wiy.2.1360334105818; Fri, 08 Feb 2013 06:35:05 -0800 (PST) Received: from mnementh.archaic.org.uk (1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.1.0.0.b.8.0.1.0.0.2.ip6.arpa. [2001:8b0:1d0::1]) by mx.google.com with ESMTPS id ea3si3306828wib.108.2013.02.08.06.35.05 (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 08 Feb 2013 06:35:05 -0800 (PST) Received-SPF: neutral (google.com: 2001:8b0:1d0::1 is neither permitted nor denied by best guess record for domain of pm215@archaic.org.uk) client-ip=2001:8b0:1d0::1; Authentication-Results: mx.google.com; spf=neutral (google.com: 2001:8b0:1d0::1 is neither permitted nor denied by best guess record for domain of pm215@archaic.org.uk) smtp.mail=pm215@archaic.org.uk Received: from pm215 by mnementh.archaic.org.uk with local (Exim 4.72) (envelope-from ) id 1U3p2e-0000XX-4t; Fri, 08 Feb 2013 14:35:04 +0000 From: Peter Maydell To: qemu-devel@nongnu.org Cc: patches@linaro.org, Riku Voipio Subject: [PATCH] linux-user: Implement accept4 Date: Fri, 8 Feb 2013 14:35:04 +0000 Message-Id: <1360334104-2052-1-git-send-email-peter.maydell@linaro.org> X-Mailer: git-send-email 1.7.2.5 X-Gm-Message-State: ALoCoQnvXjqNiNiznXbGiOr6A3Jq51/4DF3vmntk9Bbb9JMTQubXShrHKZHlc3VAP26N9TnFIA/c Implement the accept4 syscall (which is identical to accept but has an additional flags argument). Signed-off-by: Peter Maydell Reviewed-by: Richard Henderson --- Passes all the LTP accept and accept4 tests... linux-user/syscall.c | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index cd0389b..fcdccfa 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -2001,16 +2001,30 @@ out2: return ret; } -/* do_accept() Must return target values and target errnos. */ -static abi_long do_accept(int fd, abi_ulong target_addr, - abi_ulong target_addrlen_addr) +/* If we don't have a system accept4() then just call accept. + * The callsites to do_accept4() will ensure that they don't + * pass a non-zero flags argument in this config. + */ +#ifndef CONFIG_ACCEPT4 +static inline int accept4(int sockfd, struct sockaddr *addr, + socklen_t *addrlen, int flags) +{ + assert(flags == 0); + return accept(sockfd, addr, addrlen); +} +#endif + +/* do_accept4() Must return target values and target errnos. */ +static abi_long do_accept4(int fd, abi_ulong target_addr, + abi_ulong target_addrlen_addr, int flags) { socklen_t addrlen; void *addr; abi_long ret; - if (target_addr == 0) - return get_errno(accept(fd, NULL, NULL)); + if (target_addr == 0) { + return get_errno(accept4(fd, NULL, NULL, flags)); + } /* linux returns EINVAL if addrlen pointer is invalid */ if (get_user_u32(addrlen, target_addrlen_addr)) @@ -2025,7 +2039,7 @@ static abi_long do_accept(int fd, abi_ulong target_addr, addr = alloca(addrlen); - ret = get_errno(accept(fd, addr, &addrlen)); + ret = get_errno(accept4(fd, addr, &addrlen, flags)); if (!is_error(ret)) { host_to_target_sockaddr(target_addr, addr, addrlen); if (put_user_u32(addrlen, target_addrlen_addr)) @@ -2251,7 +2265,7 @@ static abi_long do_socketcall(int num, abi_ulong vptr) || get_user_ual(target_addrlen, vptr + 2 * n)) return -TARGET_EFAULT; - ret = do_accept(sockfd, target_addr, target_addrlen); + ret = do_accept4(sockfd, target_addr, target_addrlen, 0); } break; case SOCKOP_getsockname: @@ -6671,7 +6685,16 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, #endif #ifdef TARGET_NR_accept case TARGET_NR_accept: - ret = do_accept(arg1, arg2, arg3); + ret = do_accept4(arg1, arg2, arg3, 0); + break; +#endif +#ifdef TARGET_NR_accept4 + case TARGET_NR_accept4: +#ifdef CONFIG_ACCEPT4 + ret = do_accept4(arg1, arg2, arg3, arg4); +#else + goto unimplemented; +#endif break; #endif #ifdef TARGET_NR_bind