Win32 build fix.
[qemu] / slirp / socket.c
index fe03d44..0ae1f87 100644 (file)
@@ -9,6 +9,9 @@
 #include <slirp.h>
 #include "ip_icmp.h"
 #include "main.h"
+#ifdef __sun__
+#include <sys/filio.h>
+#endif
 
 void
 so_init()
@@ -175,8 +178,12 @@ soread(so)
         * a close will be detected on next iteration.
         * A return of -1 wont (shouldn't) happen, since it didn't happen above
         */
-       if (n == 2 && nn == iov[0].iov_len)
-          nn += recv(so->s, iov[1].iov_base, iov[1].iov_len,0);
+       if (n == 2 && nn == iov[0].iov_len) {
+            int ret;
+            ret = recv(so->s, iov[1].iov_base, iov[1].iov_len,0);
+            if (ret > 0)
+                nn += ret;
+        }
        
        DEBUG_MISC((dfd, " ... read nn = %d bytes\n", nn));
 #endif
@@ -348,8 +355,12 @@ sowrite(so)
        }
        
 #ifndef HAVE_READV
-       if (n == 2 && nn == iov[0].iov_len)
-          nn += send(so->s, iov[1].iov_base, iov[1].iov_len,0);
+       if (n == 2 && nn == iov[0].iov_len) {
+            int ret;
+            ret = send(so->s, iov[1].iov_base, iov[1].iov_len,0);
+            if (ret > 0)
+                nn += ret;
+        }
         DEBUG_MISC((dfd, "  ... wrote nn = %d bytes\n", nn));
 #endif
        
@@ -565,6 +576,7 @@ solisten(port, laddr, lport, flags)
        addr.sin_port = port;
        
        if (((s = socket(AF_INET,SOCK_STREAM,0)) < 0) ||
+           (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)) < 0) ||
            (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) ||
            (listen(s,1) < 0)) {
                int tmperrno = errno; /* Don't clobber the real reason we failed */
@@ -579,13 +591,12 @@ solisten(port, laddr, lport, flags)
 #endif
                return NULL;
        }
-       setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int));
        setsockopt(s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));
        
        getsockname(s,(struct sockaddr *)&addr,&addrlen);
        so->so_fport = addr.sin_port;
        if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == loopback_addr.s_addr)
-          so->so_faddr = our_addr;
+          so->so_faddr = alias_addr;
        else
           so->so_faddr = addr.sin_addr;