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;
 };
 

Reply via email to