On 16 July 2012 11:15, Jing Huang <jing.huang....@gmail.com> wrote: > This patch excludes SO_TIMESTAMP cmsg_type from unsuppoted ancillary data.
"unsupported". > > Signed-off-by: Jing Huang <jing.huang....@gmail.com> > --- > linux-user/syscall.c | 4 +++- > 1 files changed, 3 insertions(+), 1 deletions(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index fc8690d..9fce57c 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -1349,7 +1349,9 @@ 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) { > + if (cmsg->cmsg_level != TARGET_SOL_SOCKET || > + (cmsg->cmsg_type != SCM_RIGHTS && > + cmsg->cmsg_type != SO_TIMESTAMP)) { > gemu_log("Unsupported ancillary data: %d/%d\n", > cmsg->cmsg_level, cmsg->cmsg_type); > memcpy(target_data, data, len); > } else { This is kind of ugly -- it causes us to process a SO_TIMESTAMP payload (which is a 'struct timeval') in the same way as an SCM_RIGHTS payload (which is an array of file descriptors). This happens to work because a struct timeval is a pair of 32 bit integers, and so "tswap32() all the words in the data" works, but it looks pretty weird. If you want to do it this way you need at least an explanatory comment and really the variables 'fd', 'target_fd', 'numfds' would need to change to something more generic and less fd-specific. -- PMM