ppc fixes - gcc 3.4 compile fix (initial patch by Jocelyn Mayer)
[qemu] / slirp / socket.c
index 7286b5e..47ed44b 100644 (file)
@@ -152,7 +152,7 @@ soread(so)
        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))
@@ -175,8 +175,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 += read(so->s, iov[1].iov_base, iov[1].iov_len);
+       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
@@ -333,7 +337,7 @@ sowrite(so)
        
        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))
@@ -348,8 +352,12 @@ sowrite(so)
        }
        
 #ifndef HAVE_READV
-       if (n == 2 && nn == iov[0].iov_len)
-          nn += write(so->s, iov[1].iov_base, iov[1].iov_len);
+       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
        
@@ -572,7 +580,11 @@ solisten(port, laddr, lport, flags)
                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 +655,9 @@ sofcantrcvmore(so)
 {
        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)
@@ -657,9 +671,13 @@ sofcantsendmore(so)
        struct socket *so;
 {
        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);
+            shutdown(so->s,1);           /* send FIN to fhost */
+            if (global_readfds) {
+                FD_CLR(so->s,global_readfds);
+            }
+            if (global_xfds) {
+                FD_CLR(so->s,global_xfds);
+            }
        }
        so->so_state &= ~(SS_ISFCONNECTING);
        if (so->so_state & SS_FCANTRCVMORE)