[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2] linux-user/syscall.c: Add SO_RCVTIMEO and SO_SND
From: |
chengang |
Subject: |
[Qemu-devel] [PATCH v2] linux-user/syscall.c: Add SO_RCVTIMEO and SO_SNDTIMEO for getsockopt |
Date: |
Mon, 11 Jan 2016 16:54:06 +0800 |
From: Chen Gang <address@hidden>
Implement them according to the other features implementations.
Signed-off-by: Chen Gang <address@hidden>
---
linux-user/syscall.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 44485f2..4c68800 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -1687,6 +1687,7 @@ static abi_long do_getsockopt(int sockfd, int level, int
optname,
abi_long ret;
int len, val;
socklen_t lv;
+ struct timeval tv;
switch(level) {
case TARGET_SOL_SOCKET:
@@ -1694,10 +1695,32 @@ static abi_long do_getsockopt(int sockfd, int level,
int optname,
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:
goto unimplemented;
+ case TARGET_SO_RCVTIMEO:
+ optname = SO_RCVTIMEO;
+ goto time_case;
+ case TARGET_SO_SNDTIMEO:
+ optname = SO_SNDTIMEO;
+ time_case:
+ if (get_user_u32(len, optlen)) {
+ return -TARGET_EFAULT;
+ }
+ if (len < sizeof(struct target_timeval)) {
+ return -TARGET_EINVAL;
+ }
+ lv = sizeof(tv);
+ ret = get_errno(getsockopt(sockfd, level, optname, &tv, &lv));
+ if (ret < 0) {
+ return ret;
+ }
+ if (copy_to_user_timeval(optval_addr, &tv)) {
+ return -TARGET_EFAULT;
+ }
+ if (put_user_u32(sizeof(struct target_timeval), optlen)) {
+ return -TARGET_EFAULT;
+ }
+ break;
case TARGET_SO_PEERCRED: {
struct ucred cr;
socklen_t crlen;
--
1.9.1
- [Qemu-devel] [PATCH v2] linux-user/syscall.c: Add SO_RCVTIMEO and SO_SNDTIMEO for getsockopt,
chengang <=