Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Do not use recv() but read() to check whether a socket returned by select() is valid...
[simgrid.git] / src / gras / Transport / transport_plugin_tcp.c
index e5b5d4c..cfce9e2 100644 (file)
@@ -14,7 +14,7 @@
 #include "xbt/misc.h"
 #include "xbt/sysdep.h"
 #include "xbt/ex.h"
-#include "transport_private.h"
+#include "gras/Transport/transport_private.h"
 
 /* FIXME maybe READV is sometime a good thing? */
 #undef HAVE_READV
@@ -140,24 +140,31 @@ static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t ignored,
     THROW1(system_error,0,"Socket allocation failed: %s", sock_errstr(sock_errno));
 
   if (setsockopt(sock->sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)))
-     THROW1(system_error,0,"setsockopt failed, cannot condition the socket: %s",
+     THROW1(system_error,0,
+           "setsockopt failed, cannot condition the socket: %s",
            sock_errstr(sock_errno));
    
-  if (setsockopt(sock->sd, SOL_SOCKET, SO_RCVBUF, (char *)&size, sizeof(size)) ||
-      setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof(size))) {
+  if (   setsockopt(sock->sd, SOL_SOCKET, SO_RCVBUF,
+                   (char *)&size, sizeof(size)) 
+      || setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF, 
+                   (char *)&size, sizeof(size))) {
      WARN1("setsockopt failed, cannot set buffer size: %s",
           sock_errstr(sock_errno));
   }
        
   if (bind(sock->sd, (struct sockaddr *)&server, sizeof(server)) == -1) {
     tcp_close(sock->sd);
-    THROW2(system_error,0,"Cannot bind to port %d: %s",sock->port, sock_errstr(sock_errno));
+    THROW2(system_error,0,
+          "Cannot bind to port %d: %s",
+          sock->port, sock_errstr(sock_errno));
   }
 
   DEBUG2("Listen on port %d (sd=%d)",sock->port, sock->sd);
   if (listen(sock->sd, 5) < 0) {
     tcp_close(sock->sd);
-    THROW2(system_error,0,"Cannot listen on port %d: %s",sock->port,sock_errstr(sock_errno));
+    THROW2(system_error,0,
+          "Cannot listen on port %d: %s",
+          sock->port,sock_errstr(sock_errno));
   }
 
   VERB2("Openned a server socket on port %d (sd=%d)",sock->port,sock->sd);
@@ -230,7 +237,9 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) {
   }
   
   VERB3("Accepted from %s:%d (sd=%d)", res->peer_name,res->peer_port,sd);
-  
+  xbt_dynar_push(((gras_trp_procdata_t)
+                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,&res);
+   
   XBT_OUT;
   return res;
 }
@@ -313,6 +322,13 @@ gras_trp_tcp_recv_withbuffer(gras_socket_t sock,
 
   int got = 0;
 
+  if (sock->recvd) {
+     data[0] = sock->recvd_val;
+     sock->recvd = 0;
+     got++;
+     bufsize--;
+  }   
+
   while (size>got) {
     int status = 0;
     
@@ -334,7 +350,7 @@ gras_trp_tcp_recv_withbuffer(gras_socket_t sock,
       bufsize -= status;
       got     += status;
     } else {
-      THROW1(system_error,0,"Socket closed by remote side (got %d bytes before this)",
+      THROW1(system_error,errno,"Socket closed by remote side (got %d bytes before this)",
             got);
     }
   }