1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 19:55:10 +00:00

LibCore+cat: Switch Core::System::read/write to take a Span of bytes

In the spirit of the Core::System name space having "modern" facades
for classically C functions / Kernel interfaces, it seems appropriate
that we should take Span's of data instead of raw pointer + length
arguments.
This commit is contained in:
Brian Gianforcaro 2021-11-27 13:02:33 -08:00 committed by Andreas Kling
parent eb896aa33e
commit fcc00c9a27
3 changed files with 14 additions and 11 deletions

View file

@ -157,17 +157,17 @@ ErrorOr<struct stat> stat(StringView path)
#endif #endif
} }
ErrorOr<ssize_t> read(int fd, void* buffer, size_t buffer_size) ErrorOr<ssize_t> read(int fd, Bytes buffer)
{ {
ssize_t rc = ::read(fd, buffer, buffer_size); ssize_t rc = ::read(fd, buffer.data(), buffer.size());
if (rc < 0) if (rc < 0)
return Error::from_syscall("read"sv, -errno); return Error::from_syscall("read"sv, -errno);
return rc; return rc;
} }
ErrorOr<ssize_t> write(int fd, void const* data, size_t data_size) ErrorOr<ssize_t> write(int fd, ReadonlyBytes buffer)
{ {
ssize_t rc = ::write(fd, data, data_size); ssize_t rc = ::write(fd, buffer.data(), buffer.size());
if (rc < 0) if (rc < 0)
return Error::from_syscall("write"sv, -errno); return Error::from_syscall("write"sv, -errno);
return rc; return rc;

View file

@ -27,8 +27,8 @@ ErrorOr<int> open(StringView path, int options, ...);
ErrorOr<void> close(int fd); ErrorOr<void> close(int fd);
ErrorOr<void> ftruncate(int fd, off_t length); ErrorOr<void> ftruncate(int fd, off_t length);
ErrorOr<struct stat> stat(StringView path); ErrorOr<struct stat> stat(StringView path);
ErrorOr<ssize_t> read(int fd, void* buffer, size_t buffer_size); ErrorOr<ssize_t> read(int fd, Bytes buffer);
ErrorOr<ssize_t> write(int fd, void const* data, size_t data_size); ErrorOr<ssize_t> write(int fd, ReadonlyBytes buffer);
ErrorOr<void> kill(pid_t, int signal); ErrorOr<void> kill(pid_t, int signal);
ErrorOr<int> dup2(int source_fd, int destination_fd); ErrorOr<int> dup2(int source_fd, int destination_fd);
ErrorOr<String> ptsname(int fd); ErrorOr<String> ptsname(int fd);

View file

@ -45,15 +45,18 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
TRY(Core::System::pledge("stdio", nullptr)); TRY(Core::System::pledge("stdio", nullptr));
Array<u8, 32768> buffer;
for (auto& fd : fds) { for (auto& fd : fds) {
for (;;) { for (;;) {
char buffer[32768]; auto buffer_span = buffer.span();
auto nread = TRY(Core::System::read(fd, buffer, sizeof(buffer))); auto nread = TRY(Core::System::read(fd, buffer_span));
if (nread == 0) if (nread == 0)
break; break;
ssize_t already_written = 0; buffer_span = buffer_span.trim(nread);
while (already_written < nread) while (!buffer_span.is_empty()) {
already_written += TRY(Core::System::write(STDOUT_FILENO, buffer + already_written, nread - already_written)); auto already_written = TRY(Core::System::write(STDOUT_FILENO, buffer_span));
buffer_span = buffer_span.slice(already_written);
}
} }
TRY(Core::System::close(fd)); TRY(Core::System::close(fd));
} }