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

[tyndur-devel] [PATCH 5/6] kernel2: EOF-Handling in pread überarbeitet



* kernel2: Ein Terminal kann zwischendurch mal ein EOF senden wollen,
  anschließend aber wieder tadellos weiterarbeiten. Das ging mit dem
  alten Code nicht. Dafür ist es wichtig, dass erstens der Service
  überhaupt aufgerufen wird, damit er mitbekommt, dass sein EOF gelesen
  wurde und er im Programm weitermachen kann, und dass er zweitens bei
  einem Aufruf auch ein EOF anzeigen kann. Das geht jetzt durch die
  Rückgabe von -EAGAIN bei gelöschtem res->moredata.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/src/lostio/client.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/kernel2/src/lostio/client.c b/src/kernel2/src/lostio/client.c
index b2922eb..db98df1 100644
--- a/src/kernel2/src/lostio/client.c
+++ b/src/kernel2/src/lostio/client.c
@@ -324,7 +324,9 @@ ssize_t lio_pread(struct lio_stream* s, uint64_t offset, size_t bytes,
         if (res->moredata) {
             return -EAGAIN;
         }
-        return 0;
+        if (offset > res->size) {
+            return 0;
+        }
     }
 
     // Abschneiden, wenn ueber das Dateiende hinausgelesen wird
@@ -344,8 +346,14 @@ ssize_t lio_pread(struct lio_stream* s, uint64_t offset, size_t bytes,
 
     ret = drv->read(res, curoffset, bytes_aligned, p);
     if (ret >= 0) {
-        ret = bytes;
-        memcpy(buf, bounce + (offset - offset_aligned), ret);
+        if (bytes == 0 && res->moredata) {
+            ret = -EAGAIN;
+        } else {
+            ret = bytes;
+            memcpy(buf, bounce + (offset - offset_aligned), ret);
+        }
+    } else if (ret == -EAGAIN && !res->moredata) {
+        ret = 0;
     }
 
     free(bounce);
-- 
2.1.2