Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
also awake the listener after opening a file socket
[simgrid.git] / src / gras / Transport / transport_plugin_file.c
index 0d6f7ab..79e8cfc 100644 (file)
@@ -8,17 +8,18 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "portable.h"
-#include "transport_private.h"
+#include "gras/Transport/transport_private.h"
 #include "xbt/ex.h"
+#include "gras/Msg/msg_interface.h" /* gras_msg_listener_awake */
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(trp_file,transport,
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_file,gras_trp,
        "Pseudo-transport to write to/read from a file");
 
 /***
- *** Prototypes 
+ *** Prototypes
  ***/
 void gras_trp_file_close(gras_socket_t sd);
-  
+
 void gras_trp_file_chunk_send_raw(gras_socket_t sd,
                                  const char *data,
                                  unsigned long int size);
@@ -84,8 +85,8 @@ gras_socket_client_from_file(const char*path) {
   res->plugin=gras_trp_plugin_get_by_name("file");
 
   if (strcmp("-", path)) {
-    res->sd = open(path, O_WRONLY|O_CREAT | O_BINARY, S_IRUSR|S_IWUSR|S_IRGRP );
-    
+    res->sd = open(path, O_TRUNC|O_WRONLY|O_CREAT | O_BINARY, S_IRUSR|S_IWUSR|S_IRGRP );
+
     if ( res->sd < 0) {
       THROW2(system_error,0,
             "Cannot create a client socket from file %s: %s",
@@ -98,10 +99,12 @@ gras_socket_client_from_file(const char*path) {
   DEBUG5("sock_client_from_file(%s): sd=%d in=%c out=%c accept=%c",
         path,
         res->sd,
-        res->incoming?'y':'n', 
+        res->incoming?'y':'n',
         res->outgoing?'y':'n',
         res->accepting?'y':'n');
 
+  xbt_dynar_push(((gras_trp_procdata_t)
+                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,&res);
   return res;
 }
 
@@ -137,16 +140,19 @@ gras_socket_t gras_socket_server_from_file(const char*path) {
 
   DEBUG4("sd=%d in=%c out=%c accept=%c",
         res->sd,
-        res->incoming?'y':'n', 
+        res->incoming?'y':'n',
         res->outgoing?'y':'n',
         res->accepting?'y':'n');
 
+  xbt_dynar_push(((gras_trp_procdata_t)
+                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,&res);
+  gras_msg_listener_awake();
   return res;
 }
 
 void gras_trp_file_close(gras_socket_t sock){
   gras_trp_file_plug_data_t *data;
-  
+
   if (!sock) return; /* close only once */
   data=sock->plugin->data;
 
@@ -162,7 +168,7 @@ void gras_trp_file_close(gras_socket_t sock){
 
     /* close the socket */
     if(close(sock->sd) < 0) {
-      WARN2("error while closing file %d: %s", 
+      WARN2("error while closing file %d: %s",
               sock->sd, strerror(errno));
     }
   }
@@ -184,22 +190,22 @@ void
 gras_trp_file_chunk_send_raw(gras_socket_t sock,
                             const char *data,
                             unsigned long int size) {
-  
+
   xbt_assert0(sock->outgoing, "Cannot write on client file socket");
   xbt_assert0(size >= 0, "Cannot send a negative amount of data");
 
   while (size) {
     int status = 0;
-    
+
     DEBUG3("write(%d, %p, %ld);", sock->sd, data, (long int)size);
     status = write(sock->sd, data, (long int)size);
-    
+
     if (status == -1) {
       THROW4(system_error,0,"write(%d,%p,%d) failed: %s",
             sock->sd, data, (int)size,
             strerror(errno));
     }
-    
+
     if (status) {
       size  -= status;
       data  += status;
@@ -224,23 +230,30 @@ gras_trp_file_chunk_recv(gras_socket_t sock,
   xbt_assert0(sock->incoming, "Cannot recv on client file socket");
   xbt_assert0(size >= 0, "Cannot receive a negative amount of data");
 
+  if (sock->recvd) {
+     data[0] = sock->recvd_val;
+     sock->recvd = 0;
+     got++;
+     size--;
+  }
+
   while (size) {
     int status = 0;
-    
+
     status = read(sock->sd, data+got, (long int)size);
     DEBUG3("read(%d, %p, %ld);", sock->sd, data+got, size);
-    
-    if (status == -1) {
+
+    if (status < 0) {
       THROW4(system_error,0,"read(%d,%p,%d) failed: %s",
             sock->sd, data+got, (int)size,
             strerror(errno));
     }
-    
+
     if (status) {
       size    -= status;
       got    += status;
     } else {
-      THROW0(system_error,0,"file descriptor closed");
+       THROW1(system_error,errno,"file descriptor closed after %d bytes",got);
     }
   }
   return got;