[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