mirror of https://gitee.com/openkylin/qemu.git
Add getsockopt for settable SOL_IPV6 options
Signed-off-by: Tom Deseyn <tom.deseyn@gmail.com> Message-Id: <20181213130611.7496-1-tom.deseyn@gmail.com> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
147923b1a9
commit
bd8ed48549
|
@ -2352,6 +2352,45 @@ static abi_long do_getsockopt(int sockfd, int level, int optname,
|
|||
break;
|
||||
}
|
||||
break;
|
||||
case SOL_IPV6:
|
||||
switch (optname) {
|
||||
case IPV6_MTU_DISCOVER:
|
||||
case IPV6_MTU:
|
||||
case IPV6_V6ONLY:
|
||||
case IPV6_RECVPKTINFO:
|
||||
case IPV6_UNICAST_HOPS:
|
||||
case IPV6_MULTICAST_HOPS:
|
||||
case IPV6_MULTICAST_LOOP:
|
||||
case IPV6_RECVERR:
|
||||
case IPV6_RECVHOPLIMIT:
|
||||
case IPV6_2292HOPLIMIT:
|
||||
case IPV6_CHECKSUM:
|
||||
if (get_user_u32(len, optlen))
|
||||
return -TARGET_EFAULT;
|
||||
if (len < 0)
|
||||
return -TARGET_EINVAL;
|
||||
lv = sizeof(lv);
|
||||
ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
|
||||
len = 1;
|
||||
if (put_user_u32(len, optlen)
|
||||
|| put_user_u8(val, optval_addr))
|
||||
return -TARGET_EFAULT;
|
||||
} else {
|
||||
if (len > sizeof(int))
|
||||
len = sizeof(int);
|
||||
if (put_user_u32(len, optlen)
|
||||
|| put_user_u32(val, optval_addr))
|
||||
return -TARGET_EFAULT;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ret = -TARGET_ENOPROTOOPT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
unimplemented:
|
||||
gemu_log("getsockopt level=%d optname=%d not yet supported\n",
|
||||
|
|
Loading…
Reference in New Issue