From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.33) id 1CFJF6-0006hz-6E for qemu-devel@nongnu.org; Wed, 06 Oct 2004 17:22:36 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.33) id 1CFJF4-0006h4-9M for qemu-devel@nongnu.org; Wed, 06 Oct 2004 17:22:34 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1CFJF4-0006gY-0K for qemu-devel@nongnu.org; Wed, 06 Oct 2004 17:22:34 -0400 Received: from [66.90.130.73] (helo=mx1.lsn.net) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.34) id 1CFJ7Q-0005og-M2 for qemu-devel@nongnu.org; Wed, 06 Oct 2004 17:14:41 -0400 Message-ID: <41646034.7010704@grandecom.net> Date: Wed, 06 Oct 2004 16:14:28 -0500 From: Gregory Alexander MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------040706050408020104020909" Subject: [Qemu-devel] Patch to allow user-mode networking for Win32 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: fabrice@bellard.org, qemu-devel@nongnu.org This is a multi-part message in MIME format. --------------040706050408020104020909 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Win32 networking doesn't work with the write() and read() calls, it has to use send() and recv(). This code replaces socket write() and read() calls in the slirp code, and also adds a changes a few other minor changes that were necessary to make the slirp code work in a Windows environment. Thanks, GREG Fabrice, sorry to send this to your personal account, but my ISP's mail server got blackhole listed and a lot of mailing lists aren't working for me right now. --------------040706050408020104020909 Content-Type: text/plain; name="patch-slirp-win32.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-slirp-win32.diff" ? foo Index: if.c =================================================================== RCS file: /cvsroot/qemu/qemu/slirp/if.c,v retrieving revision 1.2 diff -u -r1.2 if.c --- if.c 13 Sep 2004 21:42:51 -0000 1.2 +++ if.c 6 Oct 2004 21:01:03 -0000 @@ -79,14 +79,14 @@ int total; /* This should succeed most of the time */ - ret = write(fd, bptr, n); + ret = send(fd, bptr, n,0); if (ret == n || ret <= 0) return ret; /* Didn't write everything, go into the loop */ total = ret; while (n > total) { - ret = write(fd, bptr+total, n-total); + ret = send(fd, bptr+total, n-total,0); if (ret <= 0) return ret; total += ret; @@ -111,7 +111,7 @@ DEBUG_CALL("if_input"); DEBUG_ARG("ttyp = %lx", (long)ttyp); - if_n = read(ttyp->fd, (char *)if_inbuff, INBUFF_SIZE); + if_n = recv(ttyp->fd, (char *)if_inbuff, INBUFF_SIZE,0); DEBUG_MISC((dfd, " read %d bytes\n", if_n)); Index: slirp.c =================================================================== RCS file: /cvsroot/qemu/qemu/slirp/slirp.c,v retrieving revision 1.6 diff -u -r1.6 slirp.c --- slirp.c 5 Sep 2004 23:10:26 -0000 1.6 +++ slirp.c 6 Oct 2004 21:01:04 -0000 @@ -414,7 +414,7 @@ /* Connected */ so->so_state &= ~SS_ISFCONNECTING; - ret = write(so->s, &ret, 0); + ret = send(so->s, &ret, 0, 0); if (ret < 0) { /* XXXXX Must fix, zero bytes is a NOP */ if (errno == EAGAIN || errno == EWOULDBLOCK || @@ -447,7 +447,7 @@ */ #ifdef PROBE_CONN if (so->so_state & SS_ISFCONNECTING) { - ret = read(so->s, (char *)&ret, 0); + ret = recv(so->s, (char *)&ret, 0,0); if (ret < 0) { /* XXX */ @@ -460,7 +460,7 @@ /* tcp_input will take care of it */ } else { - ret = write(so->s, &ret, 0); + ret = send(so->s, &ret, 0,0); if (ret < 0) { /* XXX */ if (errno == EAGAIN || errno == EWOULDBLOCK || Index: slirp.h =================================================================== RCS file: /cvsroot/qemu/qemu/slirp/slirp.h,v retrieving revision 1.6 diff -u -r1.6 slirp.h --- slirp.h 24 Aug 2004 21:57:12 -0000 1.6 +++ slirp.h 6 Oct 2004 21:01:04 -0000 @@ -329,4 +329,8 @@ #define max(x,y) ((x) > (y) ? (x) : (y)) #endif +#ifdef _WIN32 +#define errno (WSAGetLastError()) +#endif + #endif Index: socket.c =================================================================== RCS file: /cvsroot/qemu/qemu/slirp/socket.c,v retrieving revision 1.2 diff -u -r1.2 socket.c --- socket.c 12 Jul 2004 22:33:05 -0000 1.2 +++ socket.c 6 Oct 2004 21:01:05 -0000 @@ -152,7 +152,7 @@ nn = readv(so->s, (struct iovec *)iov, n); DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn)); #else - nn = read(so->s, iov[0].iov_base, iov[0].iov_len); + nn = recv(so->s, iov[0].iov_base, iov[0].iov_len,0); #endif if (nn <= 0) { if (nn < 0 && (errno == EINTR || errno == EAGAIN)) @@ -176,7 +176,7 @@ * A return of -1 wont (shouldn't) happen, since it didn't happen above */ if (n == 2 && nn == iov[0].iov_len) - nn += read(so->s, iov[1].iov_base, iov[1].iov_len); + nn += recv(so->s, iov[1].iov_base, iov[1].iov_len,0); DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn)); #endif @@ -333,7 +333,7 @@ DEBUG_MISC((dfd, " ... wrote nn = %d bytes\n", nn)); #else - nn = write(so->s, iov[0].iov_base, iov[0].iov_len); + nn = send(so->s, iov[0].iov_base, iov[0].iov_len,0); #endif /* This should never happen, but people tell me it does *shrug* */ if (nn < 0 && (errno == EAGAIN || errno == EINTR)) @@ -349,7 +349,7 @@ #ifndef HAVE_READV if (n == 2 && nn == iov[0].iov_len) - nn += write(so->s, iov[1].iov_base, iov[1].iov_len); + nn += send(so->s, iov[1].iov_base, iov[1].iov_len,0); DEBUG_MISC((dfd, " ... wrote nn = %d bytes\n", nn)); #endif @@ -572,7 +572,11 @@ close(s); sofree(so); /* Restore the real errno */ +#ifdef _WIN32 + WSASetLastError(tmperrno); +#else errno = tmperrno; +#endif return NULL; } setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)); @@ -643,7 +647,9 @@ { if ((so->so_state & SS_NOFDREF) == 0) { shutdown(so->s,0); - FD_CLR(so->s, global_writefds); + if(global_writefds) { + FD_ZERO(global_writefds); + } } so->so_state &= ~(SS_ISFCONNECTING); if (so->so_state & SS_FCANTSENDMORE) @@ -658,8 +664,12 @@ { if ((so->so_state & SS_NOFDREF) == 0) { shutdown(so->s,1); /* send FIN to fhost */ - FD_CLR(so->s, global_readfds); - FD_CLR(so->s, global_xfds); + if(global_readfds) { + FD_ZERO(global_readfds); + } + if(global_xfds) { + FD_ZERO(global_xfds); + } } so->so_state &= ~(SS_ISFCONNECTING); if (so->so_state & SS_FCANTRCVMORE) Index: tcp_input.c =================================================================== RCS file: /cvsroot/qemu/qemu/slirp/tcp_input.c,v retrieving revision 1.3 diff -u -r1.3 tcp_input.c --- tcp_input.c 5 Sep 2004 23:10:26 -0000 1.3 +++ tcp_input.c 6 Oct 2004 21:01:06 -0000 @@ -681,7 +681,7 @@ goto cont_input; } - if(tcp_fconnect(so) == -1 && errno != EINPROGRESS) { + if((tcp_fconnect(so) == -1) && (errno != EINPROGRESS) && (errno != EWOULDBLOCK)) { u_char code=ICMP_UNREACH_NET; DEBUG_MISC((dfd," tcp fconnect errno = %d-%s\n", errno,strerror(errno))); Index: udp.c =================================================================== RCS file: /cvsroot/qemu/qemu/slirp/udp.c,v retrieving revision 1.3 diff -u -r1.3 udp.c --- udp.c 24 Aug 2004 21:57:12 -0000 1.3 +++ udp.c 6 Oct 2004 21:01:07 -0000 @@ -339,7 +339,11 @@ int lasterrno=errno; closesocket(so->s); so->s=-1; +#ifdef _WIN32 + WSASetLastError(lasterrno); +#else errno=lasterrno; +#endif } else { /* success, insert in queue */ so->so_expire = curtime + SO_EXPIRE; --------------040706050408020104020909--