diff --git a/libports/src/lib/libc/pread_pwrite.cc b/libports/src/lib/libc/pread_pwrite.cc
index 346bdea711..2b07ad04a3 100644
--- a/libports/src/lib/libc/pread_pwrite.cc
+++ b/libports/src/lib/libc/pread_pwrite.cc
@@ -13,6 +13,7 @@
/* Genode includes */
#include
+#include
/* libc includes */
#include
@@ -20,31 +21,32 @@
#include
-static Genode::Lock rw_lock;
-
-
struct Read
{
- ssize_t operator()(int fd, void *buf, size_t count)
- {
- return read(fd, buf, count);
- }
+ ssize_t operator()(int fd, void *buf, size_t count)
+ {
+ return read(fd, buf, count);
+ }
};
struct Write
{
- ssize_t operator()(int fd, const void *buf, size_t count)
- {
- return write(fd, buf, count);
- }
+ ssize_t operator()(int fd, const void *buf, size_t count)
+ {
+ return write(fd, buf, count);
+ }
};
template
static ssize_t pread_pwrite_impl(Rw_func rw_func, int fd, Buf_type buf, ::size_t count, ::off_t offset)
{
- Genode::Lock_guard rw_lock_guard(rw_lock);
+ Libc::File_descriptor *fdesc = Libc::file_descriptor_allocator()->find_by_libc_fd(fd);
+ if (fdesc == 0)
+ return -1;
+
+ Genode::Lock_guard rw_lock_guard(fdesc->lock);
off_t old_offset = lseek(fd, 0, SEEK_CUR);