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

[tyndur-devel] [PATCH][LIOv2] LostIOv2: lio_seek() benutzt bei SEEK_END auch den offset, Testcase



* lio_seek() hat bei SEEK_END bis jetzt den offset nicht mitbenutzt,
  dadurch wurden Positionierungen relativ zum Dateiende erschwert
+ Testcase für lio_seek() hinzugefügt

Signed-off-by: Patrick Pokatilo <shyxormz@xxxxxxxxxx>
---
 src/kernel2/src/lostio/client.c |    6 +++-
 tests/lostio/001.c              |   68 +++++++++++++++++++++++++++++++++++++++
 tests/lostio/run_test.sh        |    1 +
 3 files changed, 74 insertions(+), 1 deletions(-)

diff --git a/src/kernel2/src/lostio/client.c b/src/kernel2/src/lostio/client.c
index 9ee4101..ecb9e1f 100644
--- a/src/kernel2/src/lostio/client.c
+++ b/src/kernel2/src/lostio/client.c
@@ -459,7 +459,11 @@ int64_t lio_seek(lio_stream_t s, int64_t offset, int whence)
             break;
 
         case LIO_SEEK_END:
-            s->pos_read = s->res_read->size;
+            if (s->res_read->size + offset < 0) {
+                return -1;
+            } else {
+                s->pos_read = s->res_read->size + offset;
+            }
             break;
     }
 
diff --git a/tests/lostio/001.c b/tests/lostio/001.c
index dde6ea7..ca6d9e7 100644
--- a/tests/lostio/001.c
+++ b/tests/lostio/001.c
@@ -254,6 +254,71 @@ static void test3(void)
     printf("* PASS %s\n", test_name);
 }
 
+static void test4(void)
+{
+    lio_resource_t tmp_root;
+    lio_resource_t tmp_file;
+    lio_stream_t s;
+    int64_t r;
+    char *data = "DATA";
+
+    test_name = "Suchen in Dateien";
+
+    /* Testdatei anlegen und öffnen */
+    tmp_root = lio_resource("tmp:/", false);
+    test_assert(tmp_root >= 0);
+
+    tmp_file = lio_mkfile(tmp_root, "test_seek");
+    test_assert(tmp_file >= 0);
+
+    s = lio_open(tmp_file, LIO_WRITE);
+    test_assert(s >= 0);
+
+    /* In Datei schreiben */
+    r = lio_write(s, 4, data);
+    test_assert(r == 4);
+
+    /* Ein paar Bytes überspringen (sollten mit 0 aufgefüllt werden) */
+    r = lio_seek(s, 4, LIO_SEEK_CUR);
+    test_assert(r == 8);
+
+    /* Noch was in die Datei schreiben */
+    r = lio_write(s, 4, data);
+    test_assert(r == 4);
+
+    /* Datei schließen und erneut öffnen */
+    r = lio_close(s);
+    test_assert(r >= 0);
+
+    char buffer[8];
+
+    s = lio_open(tmp_file, LIO_READ);
+    test_assert(tmp_file >= 0);
+
+    /* Relativ zum Ende der Datei springen */
+    r = lio_seek(s, -8, LIO_SEEK_END);
+    test_assert(r == 4);
+
+    /* Daten einlesen und überprüfen */
+    r = lio_read(s, 8, buffer);
+    test_assert(r == 8);
+    test_assert(memcmp("\0\0\0\0DATA", buffer, 8) == 0);
+
+    /* Auch die Daten vom Anfang einlesen */
+    r = lio_seek(s, 0, LIO_SEEK_SET);
+    test_assert(r == 0);
+
+    r = lio_read(s, 4, buffer);
+    test_assert(r == 4);
+    test_assert(memcmp("DATA", buffer, 4) == 0);
+
+    /* Datei entfernen */
+    r = lio_unlink(tmp_root, "test_seek");
+    test_assert(r >= 0);
+
+    printf("* PASS %s\n", test_name);
+}
+
 int main(int argc, char* argv[])
 {
     if (argc < 2) {
@@ -271,6 +336,9 @@ int main(int argc, char* argv[])
         case 3:
             test3();
             break;
+        case 4:
+            test4();
+            break;
 
         default:
             printf("* ERROR Unbekannter Testfall\n");
diff --git a/tests/lostio/run_test.sh b/tests/lostio/run_test.sh
index 5bf5e52..311b637 100755
--- a/tests/lostio/run_test.sh
+++ b/tests/lostio/run_test.sh
@@ -25,3 +25,4 @@ dd if=/dev/zero of=scratch.img bs=1M count=4
 run_test 001 1
 run_test 001 2
 run_test 001 3
+run_test 001 4
-- 
1.7.4.1