mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-29 10:50:05 +00:00
Fix NetBSD implementations of read_at and write_at
These procedures must not modify the underlying file pointer.
This commit is contained in:
+22
-12
@@ -426,7 +426,9 @@ foreign libc {
|
|||||||
@(link_name="open") _unix_open :: proc(path: cstring, flags: c.int, #c_vararg mode: ..u32) -> Handle ---
|
@(link_name="open") _unix_open :: proc(path: cstring, flags: c.int, #c_vararg mode: ..u32) -> Handle ---
|
||||||
@(link_name="close") _unix_close :: proc(fd: Handle) -> c.int ---
|
@(link_name="close") _unix_close :: proc(fd: Handle) -> c.int ---
|
||||||
@(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t ---
|
@(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t ---
|
||||||
|
@(link_name="pread") _unix_pread :: proc(fd: Handle, buf: rawptr, size: c.size_t, offset: i64) -> c.ssize_t ---
|
||||||
@(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t ---
|
@(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t ---
|
||||||
|
@(link_name="pwrite") _unix_pwrite :: proc(fd: Handle, buf: rawptr, size: c.size_t, offset: i64) -> c.ssize_t ---
|
||||||
@(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 ---
|
@(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 ---
|
||||||
@(link_name="getpagesize") _unix_getpagesize :: proc() -> c.int ---
|
@(link_name="getpagesize") _unix_getpagesize :: proc() -> c.int ---
|
||||||
@(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int ---
|
@(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int ---
|
||||||
@@ -535,23 +537,31 @@ write :: proc(fd: Handle, data: []byte) -> (int, Error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) {
|
read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) {
|
||||||
curr := seek(fd, offset, SEEK_CUR) or_return
|
if len(data) == 0 {
|
||||||
n, err = read(fd, data)
|
return 0, nil
|
||||||
_, err1 := seek(fd, curr, SEEK_SET)
|
|
||||||
if err1 != nil && err == nil {
|
|
||||||
err = err1
|
|
||||||
}
|
}
|
||||||
return
|
|
||||||
|
to_read := min(uint(len(data)), MAX_RW)
|
||||||
|
|
||||||
|
bytes_read := _unix_pread(fd, raw_data(data), to_read, offset)
|
||||||
|
if bytes_read < 0 {
|
||||||
|
return -1, get_last_error()
|
||||||
|
}
|
||||||
|
return bytes_read, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) {
|
write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) {
|
||||||
curr := seek(fd, offset, SEEK_CUR) or_return
|
if len(data) == 0 {
|
||||||
n, err = write(fd, data)
|
return 0, nil
|
||||||
_, err1 := seek(fd, curr, SEEK_SET)
|
|
||||||
if err1 != nil && err == nil {
|
|
||||||
err = err1
|
|
||||||
}
|
}
|
||||||
return
|
|
||||||
|
to_write := min(uint(len(data)), MAX_RW)
|
||||||
|
|
||||||
|
bytes_written := _unix_pwrite(fd, raw_data(data), to_write, offset)
|
||||||
|
if bytes_written < 0 {
|
||||||
|
return -1, get_last_error()
|
||||||
|
}
|
||||||
|
return bytes_written, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Error) {
|
seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user