[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