On 16 July 2012 11:14, Jing Huang <jing.huang....@gmail.com> wrote: > This patch makes do_setsockopt() support SOL_RAW ICMP_FILTER socket option. > > Signed-off-by: Jing Huang <jing.huang....@gmail.com> > --- > linux-user/syscall.c | 20 ++++++++++++++++++++ > 1 files changed, 20 insertions(+), 0 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 28c8ba5..fc8690d 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -60,6 +60,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base,
> #include <netinet/ip.h> > #include <netinet/tcp.h> > #include <linux/wireless.h> > +#include <linux/icmp.h> > #include "qemu-common.h" > #ifdef TARGET_GPROF > #include <sys/gmon.h> > @@ -1442,6 +1443,25 @@ static abi_long do_setsockopt(int sockfd, int level, > int optname, > goto unimplemented; > } > break; > + case SOL_RAW: > + switch (optname) { > + case ICMP_FILTER: > + /*struct icmp_filter takes an u32 value*/ Please add spaces after the "/*" and before the "*/". > + optname = ICMP_FILTER; Pointless assignment, as Dunrong says. > + if (optlen < sizeof(uint32_t)) { > + return -TARGET_EINVAL; > + } > + > + if (get_user_u32(val, optval_addr)) { > + return -TARGET_EFAULT; > + } > + ret = get_errno(setsockopt(sockfd, level, optname, > + (char *)&val, sizeof(val))); Agreed with Dunrong, this is a pointless cast; setsockopt() takes a void* for the optval pointer. (Compare posix spec and see the other calls to setsockopt in this function. The prototype of the internal kernel function implementing setsockopt is not relevant because that is not the API that the kernel exposes to userspace.) > + break; > + default: > + goto unimplemented; > + } > + break; > case TARGET_SOL_SOCKET: > switch (optname) { > /* Options with 'int' argument. */ > -- > 1.7.8.6 > -- PMM