From 7663a2036aa121900b6e13c60e1dd7f5297f4f5e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 4 Aug 2024 13:15:58 +0100 Subject: [PATCH] Add read_at/write_at to missing platforms --- core/os/errors.odin | 10 +++++++++- core/os/os_freebsd.odin | 20 ++++++++++++++++++++ core/os/os_haiku.odin | 20 ++++++++++++++++++++ core/os/os_netbsd.odin | 20 ++++++++++++++++++++ core/os/os_openbsd.odin | 20 ++++++++++++++++++++ core/os/stream.odin | 28 ++++++++++------------------ 6 files changed, 99 insertions(+), 19 deletions(-) diff --git a/core/os/errors.odin b/core/os/errors.odin index 63b0145e0..347f314d3 100644 --- a/core/os/errors.odin +++ b/core/os/errors.odin @@ -156,4 +156,12 @@ _error_string :: proc "contextless" (e: Platform_Error) -> string where intrinsi return ti.names[idx] } return "" -} \ No newline at end of file +} + +@(private, require_results) +error_to_io_error :: proc(ferr: Error) -> io.Error { + if ferr == nil { + return .None + } + return ferr.(io.Error) or_else .Unknown +} diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index 7840a72ea..3c514084e 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -472,6 +472,26 @@ write :: proc(fd: Handle, data: []byte) -> (int, Error) { return int(bytes_written), nil } +read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = read(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + +write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = write(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Error) { res := _unix_seek(fd, offset, c.int(whence)) if res == -1 { diff --git a/core/os/os_haiku.odin b/core/os/os_haiku.odin index bd5e945d0..ff06d2c80 100644 --- a/core/os/os_haiku.odin +++ b/core/os/os_haiku.odin @@ -241,6 +241,26 @@ write :: proc(fd: Handle, data: []byte) -> (int, Error) { return int(bytes_written), nil } +read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = read(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + +write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = write(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Error) { res := _unix_seek(fd, offset, c.int(whence)) if res == -1 { diff --git a/core/os/os_netbsd.odin b/core/os/os_netbsd.odin index 4d35a691e..69d0cab8a 100644 --- a/core/os/os_netbsd.odin +++ b/core/os/os_netbsd.odin @@ -528,6 +528,26 @@ write :: proc(fd: Handle, data: []byte) -> (int, Error) { return int(bytes_written), nil } +read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = read(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + +write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = write(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Error) { res := _unix_seek(fd, offset, c.int(whence)) if res == -1 { diff --git a/core/os/os_openbsd.odin b/core/os/os_openbsd.odin index f8d468b6d..30ffb3432 100644 --- a/core/os/os_openbsd.odin +++ b/core/os/os_openbsd.odin @@ -456,6 +456,26 @@ write :: proc(fd: Handle, data: []byte) -> (int, Error) { return int(bytes_written), nil } +read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = read(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + +write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { + curr := seek(fd, offset, SEEK_CUR) or_return + n, err = write(fd, data) + _, err1 := seek(fd, curr, SEEK_SET) + if err1 != nil && err == nil { + err = err1 + } + return +} + seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Error) { res := _unix_seek(fd, offset, c.int(whence)) if res == -1 { diff --git a/core/os/stream.odin b/core/os/stream.odin index c421285cd..7ec0e29a6 100644 --- a/core/os/stream.odin +++ b/core/os/stream.odin @@ -32,12 +32,10 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, } case .Read_At: - when !(ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku) { - n_int, os_err = read_at(fd, p, offset) - n = i64(n_int) - if n == 0 && os_err == nil { - err = .EOF - } + n_int, os_err = read_at(fd, p, offset) + n = i64(n_int) + if n == 0 && os_err == nil { + err = .EOF } case .Write: n_int, os_err = write(fd, p) @@ -46,12 +44,10 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, err = .EOF } case .Write_At: - when !(ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku) { - n_int, os_err = write_at(fd, p, offset) - n = i64(n_int) - if n == 0 && os_err == nil { - err = .EOF - } + n_int, os_err = write_at(fd, p, offset) + n = i64(n_int) + if n == 0 && os_err == nil { + err = .EOF } case .Seek: n, os_err = seek(fd, offset, int(whence)) @@ -60,11 +56,7 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, case .Destroy: err = .Empty case .Query: - when ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku { - return io.query_utility({.Close, .Flush, .Read, .Write, .Seek, .Size, .Query}) - } else { - return io.query_utility({.Close, .Flush, .Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Query}) - } + return io.query_utility({.Close, .Flush, .Read, .Read_At, .Write, .Write_At, .Seek, .Size, .Query}) } if err == nil && os_err != nil { @@ -73,7 +65,7 @@ _file_stream_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, return n, .EOF } } - err = .Unknown + err = error_to_io_error(os_err) } return }