diff --git a/Userland/Libraries/LibC/bits/stdio_file_implementation.h b/Userland/Libraries/LibC/bits/stdio_file_implementation.h index 98e4820dcf..7181d7e96b 100644 --- a/Userland/Libraries/LibC/bits/stdio_file_implementation.h +++ b/Userland/Libraries/LibC/bits/stdio_file_implementation.h @@ -31,6 +31,7 @@ public: bool flush(); void purge(); + size_t pending(); bool close(); void lock(); diff --git a/Userland/Libraries/LibC/stdio.cpp b/Userland/Libraries/LibC/stdio.cpp index 47bbc2e9b7..efcab202e5 100644 --- a/Userland/Libraries/LibC/stdio.cpp +++ b/Userland/Libraries/LibC/stdio.cpp @@ -102,6 +102,16 @@ void FILE::purge() m_buffer.drop(); } +size_t FILE::pending() +{ + if (m_mode & O_RDONLY) { + return 0; + } + + // FIXME: Check if our buffer is a write buffer, and only count those bytes. + return m_buffer.buffered_size(); +} + ssize_t FILE::do_read(u8* data, size_t size) { int nread = ::read(m_fd, data, size); @@ -1279,6 +1289,12 @@ FILE* tmpfile() return fdopen(fd, "rw"); } +size_t __fpending(FILE* stream) +{ + ScopedFileLock lock(stream); + return stream->pending(); +} + int __freading(FILE* stream) { ScopedFileLock lock(stream); diff --git a/Userland/Libraries/LibC/stdio_ext.h b/Userland/Libraries/LibC/stdio_ext.h index 90501fa1e1..4809204e8d 100644 --- a/Userland/Libraries/LibC/stdio_ext.h +++ b/Userland/Libraries/LibC/stdio_ext.h @@ -10,6 +10,7 @@ __BEGIN_DECLS +size_t __fpending(FILE*); int __freading(FILE*); int __fwriting(FILE*); void __fpurge(FILE*);