Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 Jan 1999 17:30:48 -0500 (EST)
From:      Brian Feldman <green@unixhelp.org>
To:        Mike Smith <mike@smith.net.au>
Cc:        Marcel Moolenaar <marcel@scc.nl>, freebsd-emulation@FreeBSD.ORG
Subject:   Re: sendmsg() not working?! 
Message-ID:  <Pine.BSF.4.05.9901101727510.21005-100000@janus.syracuse.net>
In-Reply-To: <199901101052.CAA05296@dingo.cdrom.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 10 Jan 1999, Mike Smith wrote:

> > 
> > Just one question. Is it save to assume there is no problem with the native
> > FreeBSD syscall?
> > To put it differently; Is it wise to focus on the subtle differences of the
> > Linux syscall?
> 
> I would definitely want to set up a FreeBSD version of the call under 
> the same circumstances (ie. test program) to make sure it worked 
> natively, then build the same test program under Linux and verify that 
> it failed under emulation, and then compare the call data inside the 
> kernel for the two operations.

Thanks for the previous tip to try using DDB and work it out, from the kernel
on outward :)

--- src/sys/i386/linux/linux_socket.c.orig	Sun Jan 10 16:47:36 1999
+++ src/sys/i386/linux/linux_socket.c	Sun Jan 10 17:25:10 1999
@@ -51,6 +51,10 @@
 #include <i386/linux/linux_proto.h>
 #include <i386/linux/linux_util.h>
 
+#ifndef offsetof
+#define offsetof(type, member)  ((size_t)(&((type *)0)->member))
+#endif
+
 static int
 linux_to_bsd_domain(int domain)
 {
@@ -811,7 +815,40 @@
     case LINUX_GETSOCKOPT:
 	return linux_getsockopt(p, args->args);
     case LINUX_SENDMSG:
-	return sendmsg(p, args->args);
+	do {
+		int error, level;
+		caddr_t control;
+		struct {
+			int s;
+			const struct msghdr *msg;
+			int flags;
+		} *uap = args->args;
+
+		error = copyin(uap->msg + offsetof(struct msghdr, msg_control),
+				&control, sizeof(caddr_t));
+		if (error)
+			return error;
+		if (control == NULL)
+			goto done;
+		error = copyin(control + offsetof(struct cmsghdr, cmsg_level),
+				&level, sizeof(int));
+		if (error)
+			return error;
+		if (level == 1) {
+		/*
+		 * Linux thinks that SOL_SOCKET is 1; we know that it's really
+		 * 0xffff, of course.
+		 */
+			level = SOL_SOCKET;
+			error = copyout(&level, control +
+					offsetof(struct cmsghdr, cmsg_level),
+					sizeof(int));
+			if (error)
+				return error;
+		}
+	done:
+		return sendmsg(p, args->args);
+	} while (0);
     case LINUX_RECVMSG:
 	return recvmsg(p, args->args);
 


> 
> -- 
> \\  Sometimes you're ahead,       \\  Mike Smith
> \\  sometimes you're behind.      \\  mike@smith.net.au
> \\  The race is long, and in the  \\  msmith@freebsd.org
> \\  end it's only with yourself.  \\  msmith@cdrom.com
> 
> 
> 

 Brian Feldman						  _ __  ___ ___ ___  
 green@unixhelp.org				      _ __ ___ | _ ) __|   \ 
		      http://www.freebsd.org/	 _ __ ___ ____ | _ \__ \ |) |
 FreeBSD: The Power to Serve!		   _ __ ___ ____ _____ |___/___/___/ 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-emulation" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9901101727510.21005-100000>