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

[tyndur-devel] [PATCH 5/6] libc: Rückgabe von lio_compat_read/write angepasst



* libc: lio_compat_read/write gibt jetzt wie das richtge lio_read/write
  etwas negatives zurück, wenn ein Fehler aufgetreten ist und 0 bei EOF

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/modules/include/lostio.h         |    4 ++--
 src/modules/lib/lostio/client/file.c |   33 ++++++++++++++++++++++++++-------
 2 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/src/modules/include/lostio.h b/src/modules/include/lostio.h
index 4df497f..5aa580c 100644
--- a/src/modules/include/lostio.h
+++ b/src/modules/include/lostio.h
@@ -196,11 +196,11 @@ io_resource_t* lio_compat_open(const char* filename, uint8_t attr);
 int lio_compat_close(io_resource_t* io_res);
 
 /// Von einem Stream lesen
-size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
+ssize_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
     io_resource_t* io_res);
 
 /// In einen Stream schreiben
-size_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
+ssize_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
     io_resource_t* io_res);
 
 /// Prueft, ob das Ende des Streams erreicht ist
diff --git a/src/modules/lib/lostio/client/file.c b/src/modules/lib/lostio/client/file.c
index 3b789b4..142de7d 100644
--- a/src/modules/lib/lostio/client/file.c
+++ b/src/modules/lib/lostio/client/file.c
@@ -98,9 +98,16 @@ int lio_compat_close(io_resource_t* io_res)
     return result;
 }
 
-size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
+/**
+ * Liest aus einer Ressource
+ *
+ * @return Anzahl gelesener Bytes; 0 bei Dateiende; negativ im Fehlerfall.
+ */
+ssize_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
     io_resource_t* io_res)
 {
+    size_t size;
+
     io_read_request_t read_request = {
         .id         = io_res->id,
         .blocksize  = blocksize,
@@ -115,7 +122,7 @@ size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
 
         response_t* resp = rpc_get_response(io_res->pid, "IO_READ ",
             sizeof(read_request), (char*) &(read_request));
-        size_t size = *((size_t*) resp->data);
+        size = *((size_t*) resp->data);
 
         // Wenn zuviele Daten gekommen sind, wird nur der notwendige Teil
         // kopiert.
@@ -127,14 +134,12 @@ size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
 
         free(resp->data);
         free(resp);
-
-        return size;
     } else {
         read_request.shared_mem_id = 0;
 
         response_t* resp = rpc_get_response(io_res->pid, "IO_READ ",
             sizeof(read_request), (char*) &(read_request));
-        size_t size = resp->data_length;
+        size = resp->data_length;
 
         // Wenn zuviele Daten gekommen sind, wird nur der notwendige Teil
         // kopiert.
@@ -145,12 +150,21 @@ size_t lio_compat_read(void* dest, size_t blocksize, size_t blockcount,
 
         free(resp->data);
         free(resp);
+    }
 
-        return size;
+    // EOF ist Rückgabewert 0, Fehler sind negativ
+    if (size == 0  && !lio_compat_eof(io_res)) {
+        return -1;
     }
+    return size;
 }
 
-size_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
+/**
+ * Schreibt in eine Ressource
+ *
+ * @return Anzahl geschriebener Bytes; negativ im Fehlerfall.
+ */
+ssize_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
     io_resource_t* io_res)
 {
     size_t data_size = blockcount * blocksize;
@@ -184,6 +198,11 @@ size_t lio_compat_write(const void* src, size_t blocksize, size_t blockcount,
     if (data_size >= 1024) {
         close_shared_memory(write_request->shared_mem_id);
     }
+
+    // Rückgabewert für Fehler ist -1
+    if (resp == 0) {
+        return -1;
+    }
     return resp;
 }
 
-- 
1.6.0.2