From c1bd3eb98c546a3de0af3d650137071cc305f3ed Mon Sep 17 00:00:00 2001 From: AJ Date: Mon, 28 Oct 2024 18:42:31 -0700 Subject: [PATCH] Specify variadic arguments for fmm ioctl call --- .../terminal/terminalinterface/ffm/FfmLayouts.kt | 4 +++- .../ffm/TerminalInterface.ffm.linux.kt | 7 ++++++- .../ffm/TerminalInterface.ffm.macos.kt | 12 +++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/FfmLayouts.kt b/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/FfmLayouts.kt index 6d62a1596..b3e644416 100644 --- a/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/FfmLayouts.kt +++ b/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/FfmLayouts.kt @@ -152,6 +152,7 @@ internal abstract class MethodHandlesHolder( protected fun handle( resLayout: MemoryLayout, vararg argLayouts: MemoryLayout, + linkerOptions: Array = emptyArray(), ) = PropertyDelegateProvider> { _, property -> val name = property.name @@ -160,7 +161,8 @@ internal abstract class MethodHandlesHolder( .map { linker.downcallHandle( it, - FunctionDescriptor.of(resLayout, *argLayouts) + FunctionDescriptor.of(resLayout, *argLayouts), + *linkerOptions ) } .orElseThrow() diff --git a/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.linux.kt b/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.linux.kt index ad1c0264e..2a5cbc8cc 100644 --- a/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.linux.kt +++ b/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.linux.kt @@ -3,6 +3,7 @@ package com.github.ajalt.mordant.terminal.terminalinterface.ffm import com.github.ajalt.mordant.rendering.Size import com.github.ajalt.mordant.terminal.terminalinterface.TerminalInterfaceJvmPosix import java.lang.foreign.Arena +import java.lang.foreign.Linker import java.lang.foreign.MemorySegment @Suppress("ClassName", "PropertyName", "SpellCheckingInspection") @@ -51,9 +52,13 @@ private class LinuxCLibrary { object MethodHandles : MethodHandlesHolder() { val isatty by handle(Layouts.INT, Layouts.INT) - val ioctl by handle(Layouts.INT, Layouts.INT, Layouts.LONG, Layouts.POINTER) val tcgetattr by handle(Layouts.INT, Layouts.INT, Layouts.POINTER) val tcsetattr by handle(Layouts.INT, Layouts.INT, Layouts.INT, Layouts.POINTER) + val ioctl by handle( + Layouts.INT, Layouts.INT, Layouts.LONG, Layouts.POINTER, linkerOptions = arrayOf( + Linker.Option.firstVariadicArg(2) + ) + ) } fun isatty(fd: Int): Boolean { diff --git a/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.macos.kt b/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.macos.kt index 3d4a11a7d..22c78b143 100644 --- a/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.macos.kt +++ b/mordant-jvm-ffm/src/jvmMain/kotlin/com/github/ajalt/mordant/terminal/terminalinterface/ffm/TerminalInterface.ffm.macos.kt @@ -3,6 +3,7 @@ package com.github.ajalt.mordant.terminal.terminalinterface.ffm import com.github.ajalt.mordant.rendering.Size import com.github.ajalt.mordant.terminal.terminalinterface.TerminalInterfaceJvmPosix import java.lang.foreign.Arena +import java.lang.foreign.Linker import java.lang.foreign.MemorySegment @Suppress("ClassName", "PropertyName", "SpellCheckingInspection") @@ -43,9 +44,13 @@ private class MacosCLibrary { object MethodHandles : MethodHandlesHolder() { val isatty by handle(Layouts.INT, Layouts.INT) - val ioctl by handle(Layouts.INT, Layouts.INT, Layouts.LONG, Layouts.POINTER) val tcgetattr by handle(Layouts.INT, Layouts.INT, Layouts.POINTER) val tcsetattr by handle(Layouts.INT, Layouts.INT, Layouts.INT, Layouts.POINTER) + val ioctl by handle( + Layouts.INT, Layouts.INT, Layouts.LONG, Layouts.POINTER, linkerOptions = arrayOf( + Linker.Option.firstVariadicArg(2) + ) + ) } fun isatty(fd: Int): Boolean { @@ -69,10 +74,7 @@ internal class TerminalInterfaceFfmMacos : TerminalInterfaceJvmPosix() { override val termiosConstants: TermiosConstants get() = MacosTermiosConstants private companion object { - val TIOCGWINSZ = when (System.getProperty("os.arch")) { - "x86", "amd64" -> 0x00005413 - else -> 0x40087468 - } + const val TIOCGWINSZ = 0x40087468 const val TCSADRAIN: Int = 0x1 }