Skip to content

Commit 8aabd6d

Browse files
committed
Add PosixDirectory and use it instead of expect/actual DIR functions.
Unfortunately we cannot typealias `DIR` in a shared source set. Because it is already a typealias on Linux.
1 parent 6a1fca7 commit 8aabd6d

4 files changed

Lines changed: 42 additions & 30 deletions

File tree

okio/src/androidNativeMain/kotlin/okio/internal/DIR.kt renamed to okio/src/androidNativeMain/kotlin/okio/internal/PosixDirectory.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,17 @@
1515
*/
1616
package okio.internal
1717

18-
import kotlinx.cinterop.CValuesRef
18+
import okio.Closeable
19+
import okio.Path
20+
import platform.posix.closedir
21+
import platform.posix.opendir
22+
import platform.posix.readdir
1923

20-
internal actual typealias DIR = cnames.structs.DIR
21-
internal actual fun opendir(path: String) = platform.posix.opendir(path)
22-
internal actual fun readdir(dir: CValuesRef<DIR>) = platform.posix.readdir(dir)
23-
internal actual fun closedir(dir: CValuesRef<DIR>) = platform.posix.closedir(dir)
24+
internal actual class PosixDirectory actual constructor(path: Path) : Closeable {
25+
private val dir = opendir(path.toString())
26+
actual val isInvalid get() = dir == null
27+
actual fun nextEntry() = readdir(dir)
28+
actual override fun close() {
29+
closedir(dir) // Ignore errno from closedir.
30+
}
31+
}

okio/src/nativeMain/kotlin/okio/PosixFileSystem.kt

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,11 @@
1515
*/
1616
package okio
1717

18-
import kotlinx.cinterop.CPointer
1918
import kotlinx.cinterop.get
2019
import okio.Path.Companion.toPath
21-
import okio.internal.closedir
22-
import okio.internal.opendir
23-
import okio.internal.readdir
20+
import okio.internal.PosixDirectory
2421
import okio.internal.toPath
2522
import platform.posix.EEXIST
26-
import platform.posix.dirent
2723
import platform.posix.errno
2824
import platform.posix.set_posix_errno
2925

@@ -40,16 +36,17 @@ internal object PosixFileSystem : FileSystem() {
4036
override fun listOrNull(dir: Path): List<Path>? = list(dir, throwOnFailure = false)
4137

4238
private fun list(dir: Path, throwOnFailure: Boolean): List<Path>? {
43-
val opendir = opendir(dir.toString())
44-
?: if (throwOnFailure) throw errnoToIOException(errno) else return null
45-
46-
try {
39+
val posixDir = PosixDirectory(dir)
40+
if (posixDir.isInvalid) {
41+
if (throwOnFailure) throw errnoToIOException(errno) else return null
42+
}
43+
posixDir.use {
4744
val result = mutableListOf<Path>()
4845
val buffer = Buffer()
4946

5047
set_posix_errno(0) // If readdir() returns null it's either the end or an error.
5148
while (true) {
52-
val dirent: CPointer<dirent> = readdir(opendir) ?: break
49+
val dirent = it.nextEntry() ?: break
5350
val childPath = buffer.writeNullTerminated(
5451
bytes = dirent[0].d_name,
5552
).toPath(normalize = true)
@@ -71,8 +68,6 @@ internal object PosixFileSystem : FileSystem() {
7168

7269
result.sort()
7370
return result
74-
} finally {
75-
closedir(opendir) // Ignore errno from closedir.
7671
}
7772
}
7873

okio/src/nativeMain/kotlin/okio/internal/DIR.kt renamed to okio/src/nativeMain/kotlin/okio/internal/PosixDirectory.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@
1515
*/
1616
package okio.internal
1717

18-
import kotlinx.cinterop.CPointed
1918
import kotlinx.cinterop.CPointer
20-
import kotlinx.cinterop.CValuesRef
19+
import okio.Closeable
20+
import okio.Path
2121
import platform.posix.dirent
2222

2323
/**
2424
* `platform.posix.DIR` is not available on Android Native, so the standard
2525
* POSIX directory APIs (`opendir`, `readdir`, `closedir`) cannot be used
2626
* directly.
2727
*
28-
* These expect declarations provide platform-specific implementations
29-
* for all `DIR`-related functionality.
28+
* [PosixDirectory] provides platform-specific implementation
29+
* for `DIR`-related functionality.
3030
*/
31-
internal expect class DIR : CPointed
32-
internal expect fun opendir(path: String): CPointer<DIR>?
33-
internal expect fun readdir(dir: CValuesRef<DIR>): CPointer<dirent>?
34-
internal expect fun closedir(dir: CValuesRef<DIR>): Int
31+
internal expect class PosixDirectory(path: Path) : Closeable {
32+
val isInvalid: Boolean
33+
fun nextEntry(): CPointer<dirent>?
34+
override fun close()
35+
}

okio/src/nativeNonAndroidMain/kotlin/okio/internal/DIR.kt renamed to okio/src/nativeNonAndroidMain/kotlin/okio/internal/PosixDirectory.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,17 @@
1515
*/
1616
package okio.internal
1717

18-
import kotlinx.cinterop.CValuesRef
18+
import okio.Closeable
19+
import okio.Path
20+
import platform.posix.closedir
21+
import platform.posix.opendir
22+
import platform.posix.readdir
1923

20-
internal actual typealias DIR = platform.posix.DIR
21-
internal actual fun opendir(path: String) = platform.posix.opendir(path)
22-
internal actual fun readdir(dir: CValuesRef<DIR>) = platform.posix.readdir(dir)
23-
internal actual fun closedir(dir: CValuesRef<DIR>) = platform.posix.closedir(dir)
24+
internal actual class PosixDirectory actual constructor(path: Path) : Closeable {
25+
private val dir = opendir(path.toString())
26+
actual val isInvalid get() = dir == null
27+
actual fun nextEntry() = readdir(dir)
28+
actual override fun close() {
29+
closedir(dir) // Ignore errno from closedir.
30+
}
31+
}

0 commit comments

Comments
 (0)