Module Name: src Committed By: njoly Date: Wed Jun 17 14:18:51 UTC 2009
Modified Files: src/sys/compat/linux/arch/alpha: syscalls.master src/sys/compat/linux/arch/amd64: syscalls.master src/sys/compat/linux/arch/mips: syscalls.master src/sys/compat/linux/common: linux_socket.c linux_socket.h linux_socketcall.h Log Message: Add a new linux_msghdr structure, as its size differs on 64bit archs. Do the needed conversions in sendmsg/recvmsg syscalls, and adjust their definitions accordingly. To generate a diff of this commit: cvs rdiff -u -r1.69 -r1.70 src/sys/compat/linux/arch/alpha/syscalls.master cvs rdiff -u -r1.31 -r1.32 src/sys/compat/linux/arch/amd64/syscalls.master cvs rdiff -u -r1.35 -r1.36 src/sys/compat/linux/arch/mips/syscalls.master cvs rdiff -u -r1.103 -r1.104 src/sys/compat/linux/common/linux_socket.c cvs rdiff -u -r1.17 -r1.18 src/sys/compat/linux/common/linux_socket.h cvs rdiff -u -r1.15 -r1.16 src/sys/compat/linux/common/linux_socketcall.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/arch/alpha/syscalls.master diff -u src/sys/compat/linux/arch/alpha/syscalls.master:1.69 src/sys/compat/linux/arch/alpha/syscalls.master:1.70 --- src/sys/compat/linux/arch/alpha/syscalls.master:1.69 Mon Jun 8 13:26:57 2009 +++ src/sys/compat/linux/arch/alpha/syscalls.master Wed Jun 17 14:18:51 2009 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.69 2009/06/08 13:26:57 njoly Exp $ + $NetBSD: syscalls.master,v 1.70 2009/06/17 14:18:51 njoly Exp $ ; ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -233,10 +233,10 @@ ;112 ALIAS osf1_sys_sigstack 112 NOARGS { int|compat_43_sys||sigstack(struct sigstack *nss, \ struct sigstack *oss); } -113 STD { ssize_t|linux_sys||recvmsg(int s, struct msghdr *msg, \ - int flags); } +113 STD { ssize_t|linux_sys||recvmsg(int s, \ + struct linux_msghdr *msg, int flags); } 114 STD { ssize_t|linux_sys||sendmsg(int s, \ - const struct msghdr *msg, int flags); } + const struct linux_msghdr *msg, int flags); } 115 UNIMPL 116 NODEF { int|osf1_sys||gettimeofday(struct osf1_timeval *tv, \ struct osf1_timezone *tzp); } Index: src/sys/compat/linux/arch/amd64/syscalls.master diff -u src/sys/compat/linux/arch/amd64/syscalls.master:1.31 src/sys/compat/linux/arch/amd64/syscalls.master:1.32 --- src/sys/compat/linux/arch/amd64/syscalls.master:1.31 Mon Jun 8 13:26:57 2009 +++ src/sys/compat/linux/arch/amd64/syscalls.master Wed Jun 17 14:18:51 2009 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.31 2009/06/08 13:26:57 njoly Exp $ + $NetBSD: syscalls.master,v 1.32 2009/06/17 14:18:51 njoly Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -154,9 +154,9 @@ size_t len, int flags, struct osockaddr *from, \ unsigned int *fromlenaddr); } 46 STD { int|linux_sys||sendmsg(int s, \ - const struct msghdr *msg, int flags); } + const struct linux_msghdr *msg, int flags); } 47 STD { ssize_t|linux_sys||recvmsg(int s, \ - struct msghdr *msg, int flags); } + struct linux_msghdr *msg, int flags); } 48 NOARGS { int|sys||shutdown(int s, int how); } 49 STD { int|linux_sys||bind(int s, \ const struct osockaddr *name, \ Index: src/sys/compat/linux/arch/mips/syscalls.master diff -u src/sys/compat/linux/arch/mips/syscalls.master:1.35 src/sys/compat/linux/arch/mips/syscalls.master:1.36 --- src/sys/compat/linux/arch/mips/syscalls.master:1.35 Mon Jun 8 13:26:57 2009 +++ src/sys/compat/linux/arch/mips/syscalls.master Wed Jun 17 14:18:51 2009 @@ -1,4 +1,4 @@ - $NetBSD: syscalls.master,v 1.35 2009/06/08 13:26:57 njoly Exp $ + $NetBSD: syscalls.master,v 1.36 2009/06/17 14:18:51 njoly Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 @@ -298,12 +298,12 @@ 176 NOARGS { int|linux_sys||recvfrom(int s, void *buf, int len, \ int flags, struct osockaddr *from, \ int *fromlenaddr); } -177 NOARGS { int|linux_sys||recvmsg(int s, struct msghdr *msg, \ - u_int flags); } +177 NOARGS { int|linux_sys||recvmsg(int s, \ + struct linux_msghdr *msg, u_int flags); } 178 NOARGS { int|linux_sys||send(int s, void *buf, int len, \ int flags); } -179 NOARGS { int|linux_sys||sendmsg(int s, struct msghdr *msg, \ - u_int flags); } +179 NOARGS { int|linux_sys||sendmsg(int s, \ + struct linux_msghdr *msg, u_int flags); } 180 NOARGS { int|linux_sys||sendto(int s, void *msg, \ int len, int flags, struct osockaddr *to, \ int tolen); } Index: src/sys/compat/linux/common/linux_socket.c diff -u src/sys/compat/linux/common/linux_socket.c:1.103 src/sys/compat/linux/common/linux_socket.c:1.104 --- src/sys/compat/linux/common/linux_socket.c:1.103 Tue Jun 16 23:17:02 2009 +++ src/sys/compat/linux/common/linux_socket.c Wed Jun 17 14:18:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_socket.c,v 1.103 2009/06/16 23:17:02 njoly Exp $ */ +/* $NetBSD: linux_socket.c,v 1.104 2009/06/17 14:18:51 njoly Exp $ */ /*- * Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.103 2009/06/16 23:17:02 njoly Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_socket.c,v 1.104 2009/06/17 14:18:51 njoly Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -121,6 +121,8 @@ static int linux_sa_put(struct osockaddr *osa); static int linux_to_bsd_msg_flags(int); static int bsd_to_linux_msg_flags(int); +static void linux_to_bsd_msghdr(struct linux_msghdr *, struct msghdr *); +static void bsd_to_linux_msghdr(struct msghdr *, struct linux_msghdr *); static const int linux_to_bsd_domain_[LINUX_AF_MAX] = { AF_UNSPEC, @@ -394,24 +396,50 @@ return do_sys_sendmsg(l, SCARG(uap, s), &msg, bflags, retval); } +static void +linux_to_bsd_msghdr(struct linux_msghdr *lmsg, struct msghdr *bmsg) +{ + bmsg->msg_name = lmsg->msg_name; + bmsg->msg_namelen = lmsg->msg_namelen; + bmsg->msg_iov = lmsg->msg_iov; + bmsg->msg_iovlen = lmsg->msg_iovlen; + bmsg->msg_control = lmsg->msg_control; + bmsg->msg_controllen = lmsg->msg_controllen; + bmsg->msg_flags = lmsg->msg_flags; +} + +static void +bsd_to_linux_msghdr(struct msghdr *bmsg, struct linux_msghdr *lmsg) +{ + lmsg->msg_name = bmsg->msg_name; + lmsg->msg_namelen = bmsg->msg_namelen; + lmsg->msg_iov = bmsg->msg_iov; + lmsg->msg_iovlen = bmsg->msg_iovlen; + lmsg->msg_control = bmsg->msg_control; + lmsg->msg_controllen = bmsg->msg_controllen; + lmsg->msg_flags = bmsg->msg_flags; +} + int linux_sys_sendmsg(struct lwp *l, const struct linux_sys_sendmsg_args *uap, register_t *retval) { /* { syscallarg(int) s; - syscallarg(struct msghdr *) msg; + syscallarg(struct linux_msghdr *) msg; syscallarg(u_int) flags; } */ struct msghdr msg; + struct linux_msghdr lmsg; int error; int bflags; struct mbuf *nam; u_int8_t *control; struct mbuf *ctl_mbuf = NULL; - error = copyin(SCARG(uap, msg), &msg, sizeof(msg)); + error = copyin(SCARG(uap, msg), &lmsg, sizeof(lmsg)); if (error) return error; + linux_to_bsd_msghdr(&lmsg, &msg); msg.msg_flags = MSG_IOVUSRSPACE; @@ -423,7 +451,7 @@ /* Some supported flag */ return EINVAL; - if (msg.msg_name) { + if (lmsg.msg_name) { /* Read in and convert the sockaddr */ error = linux_get_sa(l, SCARG(uap, s), &nam, msg.msg_name, msg.msg_namelen); @@ -436,7 +464,7 @@ /* * Handle cmsg if there is any. */ - if (CMSG_FIRSTHDR(&msg)) { + if (LINUX_CMSG_FIRSTHDR(&lmsg)) { struct linux_cmsghdr l_cmsg, *l_cc; struct cmsghdr *cmsg; ssize_t resid = msg.msg_controllen; @@ -446,7 +474,7 @@ clen = MLEN; control = mtod(ctl_mbuf, void *); - l_cc = LINUX_CMSG_FIRSTHDR(&msg); + l_cc = LINUX_CMSG_FIRSTHDR(&lmsg); do { error = copyin(l_cc, &l_cmsg, sizeof(l_cmsg)); if (error) @@ -688,16 +716,18 @@ { /* { syscallarg(int) s; - syscallarg(struct msghdr *) msg; + syscallarg(struct linux_msghdr *) msg; syscallarg(u_int) flags; } */ struct msghdr msg; + struct linux_msghdr lmsg; int error; struct mbuf *from, *control; - error = copyin(SCARG(uap, msg), &msg, sizeof(msg)); + error = copyin(SCARG(uap, msg), &lmsg, sizeof(lmsg)); if (error) return (error); + linux_to_bsd_msghdr(&lmsg, &msg); msg.msg_flags = linux_to_bsd_msg_flags(SCARG(uap, flags)); if (msg.msg_flags < 0) { @@ -732,7 +762,8 @@ error = EINVAL; else { ktrkuser("msghdr", &msg, sizeof(msg)); - error = copyout(&msg, SCARG(uap, msg), sizeof(msg)); + bsd_to_linux_msghdr(&msg, &lmsg); + error = copyout(&lmsg, SCARG(uap, msg), sizeof(lmsg)); } } Index: src/sys/compat/linux/common/linux_socket.h diff -u src/sys/compat/linux/common/linux_socket.h:1.17 src/sys/compat/linux/common/linux_socket.h:1.18 --- src/sys/compat/linux/common/linux_socket.h:1.17 Tue Jun 16 23:17:02 2009 +++ src/sys/compat/linux/common/linux_socket.h Wed Jun 17 14:18:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_socket.h,v 1.17 2009/06/16 23:17:02 njoly Exp $ */ +/* $NetBSD: linux_socket.h,v 1.18 2009/06/17 14:18:51 njoly Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -123,6 +123,16 @@ #define LINUX_SCM_TIMESTAMP LINUX_SO_TIMESTAMP /* not actually implemented in Linux 2.5.15? */ +struct linux_msghdr { + void *msg_name; + int msg_namelen; + struct iovec *msg_iov; + size_t msg_iovlen; + void *msg_control; + size_t msg_controllen; + unsigned int msg_flags; +}; + /* * Message flags (for sendmsg/recvmsg) */ Index: src/sys/compat/linux/common/linux_socketcall.h diff -u src/sys/compat/linux/common/linux_socketcall.h:1.15 src/sys/compat/linux/common/linux_socketcall.h:1.16 --- src/sys/compat/linux/common/linux_socketcall.h:1.15 Mon Apr 28 20:23:44 2008 +++ src/sys/compat/linux/common/linux_socketcall.h Wed Jun 17 14:18:51 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_socketcall.h,v 1.15 2008/04/28 20:23:44 martin Exp $ */ +/* $NetBSD: linux_socketcall.h,v 1.16 2009/06/17 14:18:51 njoly Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -185,13 +185,13 @@ struct linux_sys_sendmsg_args { syscallarg(int) s; - syscallarg(struct msghdr *) msg; + syscallarg(struct linux_msghdr *) msg; syscallarg(u_int) flags; }; struct linux_sys_recvmsg_args { syscallarg(int) s; - syscallarg(struct msghdr *) msg; + syscallarg(struct linux_msghdr *) msg; syscallarg(u_int) flags; };