From a80bb1165256cf481c80bad15b3b00c2afaf12a4 Mon Sep 17 00:00:00 2001 From: Infendro Date: Mon, 16 Feb 2026 17:53:50 +0100 Subject: [PATCH] Fix native implementation --- .../kotlin/com/infendro/shell/Shell.linux.kt} | 17 +++------------- .../kotlin/com/infendro/shell/Shell.macos.kt | 20 +++++++++++++++++++ src/mingwMain/kotlin/shell/Shell.mingw.kt | 20 +++++++++++++++++++ src/nativeMain/kotlin/com.infendro.shell/C.kt | 17 ++++++++++++++++ 4 files changed, 60 insertions(+), 14 deletions(-) rename src/{nativeMain/kotlin/com/infendro/shell/Shell.native.kt => linuxMain/kotlin/com/infendro/shell/Shell.linux.kt} (57%) create mode 100644 src/macosMain/kotlin/com/infendro/shell/Shell.macos.kt create mode 100644 src/mingwMain/kotlin/shell/Shell.mingw.kt create mode 100644 src/nativeMain/kotlin/com.infendro.shell/C.kt diff --git a/src/nativeMain/kotlin/com/infendro/shell/Shell.native.kt b/src/linuxMain/kotlin/com/infendro/shell/Shell.linux.kt similarity index 57% rename from src/nativeMain/kotlin/com/infendro/shell/Shell.native.kt rename to src/linuxMain/kotlin/com/infendro/shell/Shell.linux.kt index f05bb42..e5aece8 100644 --- a/src/nativeMain/kotlin/com/infendro/shell/Shell.native.kt +++ b/src/linuxMain/kotlin/com/infendro/shell/Shell.linux.kt @@ -1,9 +1,8 @@ package com.infendro.shell -import kotlinx.cinterop.CPointer -import kotlinx.cinterop.refTo -import kotlinx.cinterop.toKString -import platform.posix.* +import platform.posix.chdir +import platform.posix.pclose +import platform.posix.popen import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -19,13 +18,3 @@ actual suspend fun execute(vararg command: String, directory: String?): Result = val result = Result.from(code, value) continuation.resume(result) } - -private fun CPointer.readLines(): List { - val lines = mutableListOf() - val buffer = ByteArray(4096) - while (true) { - val line = fgets(buffer.refTo(0), buffer.size, this) ?: break - lines.add(line.toKString()) - } - return lines -} diff --git a/src/macosMain/kotlin/com/infendro/shell/Shell.macos.kt b/src/macosMain/kotlin/com/infendro/shell/Shell.macos.kt new file mode 100644 index 0000000..e5aece8 --- /dev/null +++ b/src/macosMain/kotlin/com/infendro/shell/Shell.macos.kt @@ -0,0 +1,20 @@ +package com.infendro.shell + +import platform.posix.chdir +import platform.posix.pclose +import platform.posix.popen +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + +actual suspend fun execute(vararg command: String, directory: String?): Result = suspendCoroutine { continuation -> + val command = command.joinToString(" ") { """"$it"""" } + if (directory != null) { + chdir(directory) + } + val stream = popen(command, "r")!! + val value = stream.readLines().joinToString("") + val code = pclose(stream) + + val result = Result.from(code, value) + continuation.resume(result) +} diff --git a/src/mingwMain/kotlin/shell/Shell.mingw.kt b/src/mingwMain/kotlin/shell/Shell.mingw.kt new file mode 100644 index 0000000..7dbe21d --- /dev/null +++ b/src/mingwMain/kotlin/shell/Shell.mingw.kt @@ -0,0 +1,20 @@ +package com.infendro.shell + +import platform.posix._pclose +import platform.posix._popen +import platform.posix.chdir +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + +actual suspend fun execute(vararg command: String, directory: String?): Result = suspendCoroutine { continuation -> + val command = command.joinToString(" ") { """"$it"""" } + if (directory != null) { + chdir(directory) + } + val stream = _popen(command, "r")!! + val value = stream.readLines().joinToString("") + val code = _pclose(stream) + + val result = Result.from(code, value) + continuation.resume(result) +} diff --git a/src/nativeMain/kotlin/com.infendro.shell/C.kt b/src/nativeMain/kotlin/com.infendro.shell/C.kt new file mode 100644 index 0000000..91209b6 --- /dev/null +++ b/src/nativeMain/kotlin/com.infendro.shell/C.kt @@ -0,0 +1,17 @@ +package com.infendro.shell + +import kotlinx.cinterop.CPointer +import kotlinx.cinterop.refTo +import kotlinx.cinterop.toKString +import platform.posix.FILE +import platform.posix.fgets + +internal fun CPointer.readLines(): List { + val lines = mutableListOf() + val buffer = ByteArray(4096) + while (true) { + val line = fgets(buffer.refTo(0), buffer.size, this) ?: break + lines.add(line.toKString()) + } + return lines +}