Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KTOR-6960 Add UnixDomainSocket support for iOS/tvOS/watchOS #4024

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions ktor-network/build.gradle.kts
Expand Up @@ -4,6 +4,9 @@ kotlin {
createCInterop("network", nixTargets()) {
defFile = projectDir.resolve("nix/interop/network.def")
}
createCInterop("un", iosTargets() + tvosTargets() + watchosTargets()) {
defFile = projectDir.resolve("nix/interop/un.def")
}

sourceSets {
jvmAndNixMain {
Expand Down
12 changes: 10 additions & 2 deletions ktor-network/ios/src/io/ktor/network/util/SocketUtilsIos.kt
Expand Up @@ -3,14 +3,17 @@
*/
package io.ktor.network.util

import io.ktor.network.interop.*
import kotlinx.cinterop.*
import platform.posix.*

@OptIn(ExperimentalForeignApi::class)
internal actual fun <T> unpack_sockaddr_un(
sockaddr: sockaddr,
block: (family: UShort, path: String) -> T
): T {
error("Address ${sockaddr.sa_family} is not supported on ios")
val address = sockaddr.ptr.reinterpret<sockaddr_un>().pointed
return block(address.sun_family.convert(), address.sun_path.toKString())
}

@OptIn(ExperimentalForeignApi::class)
Expand All @@ -19,5 +22,10 @@ internal actual fun pack_sockaddr_un(
path: String,
block: (address: CPointer<sockaddr>, size: socklen_t) -> Unit
) {
error("Address $family is not supported on ios")
cValue<sockaddr_un> {
strcpy(sun_path, path)
sun_family = family.convert()

block(ptr.reinterpret(), sizeOf<sockaddr_un>().convert())
}
}
Expand Up @@ -4,4 +4,4 @@

package io.ktor.network.sockets.tests

internal actual fun Any.supportsUnixDomainSockets(): Boolean = false
internal actual fun Any.supportsUnixDomainSockets(): Boolean = true
3 changes: 3 additions & 0 deletions ktor-network/nix/interop/un.def
@@ -0,0 +1,3 @@
package = io.ktor.network.interop
headers = sys/un.h
headerFilter = sys/un.h
12 changes: 10 additions & 2 deletions ktor-network/tvos/src/io/ktor/network/util/SocketUtilsTvos.kt
Expand Up @@ -3,14 +3,17 @@
*/
package io.ktor.network.util

import io.ktor.network.interop.*
import kotlinx.cinterop.*
import platform.posix.*

@OptIn(ExperimentalForeignApi::class)
internal actual fun <T> unpack_sockaddr_un(
sockaddr: sockaddr,
block: (family: UShort, path: String) -> T
): T {
error("Address ${sockaddr.sa_family} is not supported on tvos")
val address = sockaddr.ptr.reinterpret<sockaddr_un>().pointed
return block(address.sun_family.convert(), address.sun_path.toKString())
}

@OptIn(ExperimentalForeignApi::class)
Expand All @@ -19,5 +22,10 @@ internal actual fun pack_sockaddr_un(
path: String,
block: (address: CPointer<sockaddr>, size: socklen_t) -> Unit
) {
error("Address $family is not supported on tvos")
cValue<sockaddr_un> {
strcpy(sun_path, path)
sun_family = family.convert()

block(ptr.reinterpret(), sizeOf<sockaddr_un>().convert())
}
}
Expand Up @@ -4,4 +4,4 @@

package io.ktor.network.sockets.tests

internal actual fun Any.supportsUnixDomainSockets(): Boolean = false
internal actual fun Any.supportsUnixDomainSockets(): Boolean = true
Expand Up @@ -3,14 +3,17 @@
*/
package io.ktor.network.util

import io.ktor.network.interop.*
import kotlinx.cinterop.*
import platform.posix.*

@OptIn(ExperimentalForeignApi::class)
internal actual fun <T> unpack_sockaddr_un(
sockaddr: sockaddr,
block: (family: UShort, path: String) -> T
): T {
error("Address ${sockaddr.sa_family} is not supported on watchos")
val address = sockaddr.ptr.reinterpret<sockaddr_un>().pointed
return block(address.sun_family.convert(), address.sun_path.toKString())
}

@OptIn(ExperimentalForeignApi::class)
Expand All @@ -19,5 +22,10 @@ internal actual fun pack_sockaddr_un(
path: String,
block: (address: CPointer<sockaddr>, size: socklen_t) -> Unit
) {
error("Address $family is not supported on watchos")
cValue<sockaddr_un> {
strcpy(sun_path, path)
sun_family = family.convert()

block(ptr.reinterpret(), sizeOf<sockaddr_un>().convert())
}
}
Expand Up @@ -4,4 +4,4 @@

package io.ktor.network.sockets.tests

internal actual fun Any.supportsUnixDomainSockets(): Boolean = false
internal actual fun Any.supportsUnixDomainSockets(): Boolean = true