Skip to content

Commit dae787c

Browse files
authored
Merge pull request #148 from finagolfin/droid
Android: update pread/pwrite for nullability annotations in NDK 26
2 parents 403776d + 5ca37e7 commit dae787c

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

Sources/System/Internals/Syscalls.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,15 @@ internal func system_pread(
7171
#if ENABLE_MOCKING
7272
if mockingEnabled { return _mockInt(fd, buf, nbyte, offset) }
7373
#endif
74+
#if os(Android)
75+
var zero = UInt8.zero
76+
return withUnsafeMutablePointer(to: &zero) {
77+
// this pread has a non-nullable `buf` pointer
78+
pread(fd, buf ?? UnsafeMutableRawPointer($0), nbyte, offset)
79+
}
80+
#else
7481
return pread(fd, buf, nbyte, offset)
82+
#endif
7583
}
7684

7785
// lseek
@@ -101,7 +109,15 @@ internal func system_pwrite(
101109
#if ENABLE_MOCKING
102110
if mockingEnabled { return _mockInt(fd, buf, nbyte, offset) }
103111
#endif
112+
#if os(Android)
113+
var zero = UInt8.zero
114+
return withUnsafeMutablePointer(to: &zero) {
115+
// this pwrite has a non-nullable `buf` pointer
116+
pwrite(fd, buf ?? UnsafeRawPointer($0), nbyte, offset)
117+
}
118+
#else
104119
return pwrite(fd, buf, nbyte, offset)
120+
#endif
105121
}
106122

107123
internal func system_dup(_ fd: Int32) -> Int32 {

Tests/SystemTests/FileOperationsTest.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,30 @@ final class FileOperationsTest: XCTestCase {
8686
for test in syscallTestCases { test.runAllTests() }
8787
}
8888

89+
func testWriteFromEmptyBuffer() throws {
90+
let fd = try FileDescriptor.open(FilePath("/dev/null"), .writeOnly)
91+
let written1 = try fd.write(toAbsoluteOffset: 0, .init(start: nil, count: 0))
92+
XCTAssertEqual(written1, 0)
93+
94+
let pointer = UnsafeMutableRawPointer.allocate(byteCount: 8, alignment: 8)
95+
defer { pointer.deallocate() }
96+
let empty = UnsafeRawBufferPointer(start: pointer, count: 0)
97+
let written2 = try fd.write(toAbsoluteOffset: 0, empty)
98+
XCTAssertEqual(written2, 0)
99+
}
100+
101+
func testReadToEmptyBuffer() throws {
102+
let fd = try FileDescriptor.open(FilePath("/dev/random"), .readOnly)
103+
let read1 = try fd.read(fromAbsoluteOffset: 0, into: .init(start: nil, count: 0))
104+
XCTAssertEqual(read1, 0)
105+
106+
let pointer = UnsafeMutableRawPointer.allocate(byteCount: 8, alignment: 8)
107+
defer { pointer.deallocate() }
108+
let empty = UnsafeMutableRawBufferPointer(start: pointer, count: 0)
109+
let read2 = try fd.read(fromAbsoluteOffset: 0, into: empty)
110+
XCTAssertEqual(read2, 0)
111+
}
112+
89113
func testHelpers() {
90114
// TODO: Test writeAll, writeAll(toAbsoluteOffset), closeAfter
91115
}

0 commit comments

Comments
 (0)