qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Patch to allow user-mode networking for Win32


From: Gregory Alexander
Subject: [Qemu-devel] Patch to allow user-mode networking for Win32
Date: Wed, 06 Oct 2004 16:14:28 -0500
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.1) Gecko/20040707

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.
? 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;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]