From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:32862) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1StKum-000496-Gt for qemu-devel@nongnu.org; Mon, 23 Jul 2012 11:51:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1StKui-0007HG-DS for qemu-devel@nongnu.org; Mon, 23 Jul 2012 11:51:20 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:64394) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1StKui-0007H3-6s for qemu-devel@nongnu.org; Mon, 23 Jul 2012 11:51:16 -0400 Received: by pbbro12 with SMTP id ro12so10933218pbb.4 for ; Mon, 23 Jul 2012 08:51:15 -0700 (PDT) From: Jing Huang Date: Mon, 23 Jul 2012 23:52:07 +0000 Message-Id: <1343087527-13582-1-git-send-email-jing.huang.pku@gmail.com> In-Reply-To: References: Subject: [Qemu-devel] [PATCH V4 3/3] linux-user: make host_to_target_cmsg support SO_TIMESTAMP cmsg_type List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, riku.voipio@iki.fi Signed-off-by: Jing Huang --- linux-user/syscall.c | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 9b498d0..ce70459 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1348,16 +1348,28 @@ static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh, target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type); target_cmsg->cmsg_len = tswapal(TARGET_CMSG_LEN(len)); - if (cmsg->cmsg_level != TARGET_SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) { - gemu_log("Unsupported ancillary data: %d/%d\n", cmsg->cmsg_level, cmsg->cmsg_type); - memcpy(target_data, data, len); - } else { + if ((cmsg->cmsg_level == TARGET_SOL_SOCKET) && + (cmsg->cmsg_type == SCM_RIGHTS)) { int *fd = (int *)data; int *target_fd = (int *)target_data; int i, numfds = len / sizeof(int); for (i = 0; i < numfds; i++) target_fd[i] = tswap32(fd[i]); + } else if ((cmsg->cmsg_level == TARGET_SOL_SOCKET) && + (cmsg->cmsg_type == SO_TIMESTAMP) && + (len == sizeof(struct timeval))) { + /* copy struct timeval to target */ + struct timeval *tv = (struct timeval *)data; + struct target_timeval *target_tv = + (struct target_timeval *)target_data; + + tv->tv_sec = tswapl(target_tv->tv_sec); + tv->tv_usec = tswapl(target_tv->tv_usec); + } else { + gemu_log("Unsupported ancillary data: %d/%d\n", + cmsg->cmsg_level, cmsg->cmsg_type); + memcpy(target_data, data, len); } cmsg = CMSG_NXTHDR(msgh, cmsg); -- 1.7.8.6