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