From owner-freebsd-emulation Fri Jan 8 20:53:55 1999 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id UAA12271 for freebsd-emulation-outgoing; Fri, 8 Jan 1999 20:53:55 -0800 (PST) (envelope-from owner-freebsd-emulation@FreeBSD.ORG) Received: from janus.syracuse.net (janus.syracuse.net [205.232.47.15]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id UAA12266 for ; Fri, 8 Jan 1999 20:53:53 -0800 (PST) (envelope-from green@unixhelp.org) Received: from localhost (green@localhost) by janus.syracuse.net (8.8.8/8.8.7) with ESMTP id XAA19251 for ; Fri, 8 Jan 1999 23:53:25 -0500 (EST) Date: Fri, 8 Jan 1999 23:53:25 -0500 (EST) From: Brian Feldman X-Sender: green@janus.syracuse.net To: freebsd-emulation@FreeBSD.ORG Subject: sendmsg() not working?! Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-emulation@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org I'm working on getting WINE to play properly, using clone() and all, but after resolving how to set the LDT (I added two new LINUX syscalls instead of trying to fix the current Linux ldt syscall's stub), I run into a new block: sendmsg() returns EINVAL (!) for some reason. I've got all the code in an archive if anyone wants to try it, and I'm including the output with my instrumentation added to it as well. Brian Feldman _ __ ___ ___ ___ green@unixhelp.org _ __ ___ | _ ) __| \ http://www.freebsd.org/ _ __ ___ ____ | _ \__ \ |) | FreeBSD: The Power to Serve! _ __ ___ ____ _____ |___/___/___/ /*********************************************************************** * CLIENT_SendRequest_v * * Send a request to the server. */ static void CLIENT_SendRequest_v( enum request req, int pass_fd, struct iovec *vec, int veclen ) { THDB *thdb = THREAD_Current(); #ifndef HAVE_MSGHDR_ACCRIGHTS struct cmsg_fd cmsg = { sizeof(cmsg), SOL_SOCKET, SCM_RIGHTS, pass_fd }; #endif struct msghdr msghdr = { NULL, 0, vec, veclen, NULL, 0, 0}; struct header head; int i, ret, len; assert( veclen > 0 ); vec[0].iov_base = &head; vec[0].iov_len = sizeof(head); for (i = len = 0; i < veclen; i++) len += vec[i].iov_len; assert( len <= MAX_MSG_LENGTH ); head.type = req; head.len = len; head.seq = thdb->seq++; if (pass_fd != -1) /* we have an fd to send */ { #ifdef HAVE_MSGHDR_ACCRIGHTS msghdr.msg_accrights = (void *)&pass_fd; msghdr.msg_accrightslen = sizeof(pass_fd); #else msghdr.msg_control = &cmsg; msghdr.msg_controllen = sizeof(cmsg); #endif } printf("socket: %d\n" "struct msghdr:\n" "msg_name = %p\n" "msg_namelen = %d\n" "msg_iov = %p\n" "msg_iovlen = %d\n" "msg_control = %p\n" "msg_controllen = %d\n" "msg_flags = %d\n", thdb->socket, msghdr.msg_name, msghdr.msg_namelen, msghdr.msg_iov, msghdr.msg_iovlen, msghdr.msg_control, msghdr.msg_controllen, msghdr.msg_flags); { register struct iovec *iov = msghdr.msg_iov; int c; for (c = 0; c < msghdr.msg_iovlen; c++) printf("msghdr.msg_iov[%d].iov_base = %p\n" "msghdr.msg_iov[%d].iov_len = %d\n", c, iov[c].iov_base, c, iov[c].iov_len); } if ((ret = sendmsg( thdb->socket, &msghdr, 0 )) < len) { if (ret == -1) perror( "sendmsg" ); CLIENT_ProtocolError( "partial msg sent %d/%d\n", ret, len ); } /* we passed the fd now we can close it */ if (pass_fd != -1) close( pass_fd ); } {"/home/green/wine-990103"}$ ./wine socket: 3 struct msghdr: msg_name = (nil) msg_namelen = 0 msg_iov = 0xefbfd6e8 msg_iovlen = 2 msg_control = 0xefbfd6b0 msg_controllen = 16 msg_flags = 0 msghdr.msg_iov[0].iov_base = 0xefbfd688 msghdr.msg_iov[0].iov_len = 12 msghdr.msg_iov[1].iov_base = 0xefbfd790 msghdr.msg_iov[1].iov_len = 4 sendmsg: Invalid argument Client protocol error:(nil): partial msg sent -1/16 Memory fault (core dumped) To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-emulation" in the body of the message