[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] Patch to allow user-mode networking for Win32
From: |
Gregory Alexander |
Subject: |
Re: [Qemu-devel] Patch to allow user-mode networking for Win32 |
Date: |
Thu, 07 Oct 2004 10:39:24 -0500 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.1) Gecko/20040707 |
Oops, I've got an updated patch. Version 2.
I earlier fixed a memory problem in the wrong way. This version should
prevent a possible SEGFAULT under linux as well.
Thanks,
GREG
Gregory Alexander wrote:
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.
? foo
? patch-slirp-win32.diff
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 7 Oct 2004 15:34:25 -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 7 Oct 2004 15:34:26 -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 ||
@@ -496,6 +496,15 @@
*/
if (if_queued && link_up)
if_start();
+
+ /* clear global file descriptor sets.
+ * these reside on the stack in vl.c
+ * so they're unusable if we're not in
+ * slirp_select_fill or slirp_select_poll.
+ */
+ global_readfds = NULL;
+ global_writefds = NULL;
+ global_xfds = NULL;
}
#define ETH_ALEN 6
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 7 Oct 2004 15:34:26 -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 7 Oct 2004 15:34:27 -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_CLR(so->s,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_CLR(so->s,global_readfds);
+ }
+ if(global_xfds && (1 || FD_ISSET(so->s,global_xfds))) {
+ FD_CLR(so->s,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 7 Oct 2004 15:34:28 -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 7 Oct 2004 15:34:28 -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;