[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