From 23772b620fd80192f36f626dae5afb1868642c71 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Thu, 2 Aug 2012 15:02:09 +0200 Subject: [PATCH] libc_fs: return resulting offset in 'lseek()' Fixes #314. --- libports/src/lib/libc_fs/plugin.cc | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/libports/src/lib/libc_fs/plugin.cc b/libports/src/lib/libc_fs/plugin.cc index 70e754159..2501bdf0d 100644 --- a/libports/src/lib/libc_fs/plugin.cc +++ b/libports/src/lib/libc_fs/plugin.cc @@ -227,6 +227,16 @@ static void obtain_stat_for_node(File_system::Node_handle node_handle, class Plugin : public Libc::Plugin { + private: + + ::off_t _file_size(Libc::File_descriptor *fd) + { + struct stat stat_buf; + if (fstat(fd, &stat_buf) == -1) + return -1; + return stat_buf.st_size; + } + public: /** @@ -399,11 +409,13 @@ class Plugin : public Libc::Plugin case SEEK_SET: context(fd)->seek_offset(offset); - return 0; + return offset; case SEEK_CUR: context(fd)->advance_seek_offset(offset); - return 0; + if (context(fd)->is_appending()) + return _file_size(fd); + return context(fd)->seek_offset(); case SEEK_END: if (offset != 0) { @@ -411,7 +423,7 @@ class Plugin : public Libc::Plugin return -1; } context(fd)->infinite_seek_offset(); - return 0; + return _file_size(fd); default: errno = EINVAL;