diff --git a/LibCore/CIODevice.cpp b/LibCore/CIODevice.cpp index 8fc12f6c0f..e393c26c02 100644 --- a/LibCore/CIODevice.cpp +++ b/LibCore/CIODevice.cpp @@ -2,6 +2,7 @@ #include #include #include +#include CIODevice::CIODevice(CObject* parent) : CObject(parent) @@ -185,3 +186,25 @@ bool CIODevice::seek(signed_qword offset) m_eof = false; return true; } + +bool CIODevice::write(const byte* data, int size) +{ + int rc = ::write(m_fd, data, size); + if (rc < 0) { + perror("CIODevice::write: write"); + return false; + } + return rc == size; +} + +int CIODevice::printf(const char* format, ...) +{ + va_list ap; + va_start(ap, format); + // FIXME: We're not propagating write() failures to client here! + int ret = printf_internal([this] (char*&, char ch) { + write((const byte*)&ch, 1); + }, nullptr, format, ap); + va_end(ap); + return ret; +} diff --git a/LibCore/CIODevice.h b/LibCore/CIODevice.h index 7a8b354b2e..5e892eb4aa 100644 --- a/LibCore/CIODevice.h +++ b/LibCore/CIODevice.h @@ -30,6 +30,8 @@ public: ByteBuffer read_line(int max_size); ByteBuffer read_all(); + bool write(const byte*, int size); + // FIXME: I would like this to be const but currently it needs to call populate_read_buffer(). bool can_read_line(); @@ -40,6 +42,8 @@ public: virtual bool open(CIODevice::OpenMode) = 0; virtual bool close(); + int printf(const char*, ...); + virtual const char* class_name() const override { return "CIODevice"; } protected: