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

[tyndur-devel] [PATCH 1/6] libc: POSIX: pread() und pwrite()



+ libc: POSIX: pread() und pwrite()
---
 src/modules/include/unistd.h        |    6 +++++
 src/modules/lib/posix/posix_files.c |   41 +++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/src/modules/include/unistd.h b/src/modules/include/unistd.h
index fa7dc2a..341b363 100644
--- a/src/modules/include/unistd.h
+++ b/src/modules/include/unistd.h
@@ -115,6 +115,12 @@ char* mktemp(char* template);
 /// Temporaere Datei anlegen
 int mkstemp(char* template);
 
+/// In eine Datei mit gegebenem Offset lesen
+ssize_t pread(int fd, void *buf, size_t count, off_t offset);
+
+/// In eine Datei mit gegebenem Offset schreiben
+ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
+
 #ifndef CONFIG_LIBC_NO_STUBS
 /// Prozess klonen
 pid_t fork(void);
diff --git a/src/modules/lib/posix/posix_files.c b/src/modules/lib/posix/posix_files.c
index bfa3601..659de16 100644
--- a/src/modules/lib/posix/posix_files.c
+++ b/src/modules/lib/posix/posix_files.c
@@ -346,6 +346,47 @@ int close(int fd)
     return 0;
 }
 
+/// In eine Datei mit gegebenem Offset lesen
+ssize_t pread(int fd, void *buf, size_t count, off_t offset)
+{
+    FILE* file = fd_to_file(fd);
+    off_t old_pos;
+    ssize_t ret;
+
+    // Bei einem ungueltigen Deskriptor wird abgebrochen
+    if (file == NULL) {
+        errno = EBADF;
+        return -1;
+    }
+
+    old_pos = ftell(file);
+    fseek(file, offset, SEEK_SET);
+    ret = read(fd, buf, count);
+    fseek(file, old_pos, SEEK_SET);
+
+    return ret;
+}
+
+/// In eine Datei mit gegebenem Offset schreiben
+ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
+{
+    FILE* file = fd_to_file(fd);
+    off_t old_pos;
+    ssize_t ret;
+
+    // Bei einem ungueltigen Deskriptor wird abgebrochen
+    if (file == NULL) {
+        errno = EBADF;
+        return -1;
+    }
+
+    old_pos = ftell(file);
+    fseek(file, offset, SEEK_SET);
+    ret = write(fd, buf, count);
+    fseek(file, old_pos, SEEK_SET);
+
+    return ret;
+}
 
 #ifndef CONFIG_LIBC_NO_STUBS
 /**
-- 
1.5.4.5