diff --git a/samples/nonBlockingEchoServer/EchoServer.kt b/samples/nonBlockingEchoServer/EchoServer.kt index 5f298987dd4..141ec6a0dc4 100644 --- a/samples/nonBlockingEchoServer/EchoServer.kt +++ b/samples/nonBlockingEchoServer/EchoServer.kt @@ -203,22 +203,15 @@ class IOException: RuntimeException { } val errno: Int - get() = __error()!!.pointed.value + get() = interop_errno() -fun FD_ZERO(set: fd_set) { - memset(set.fds_bits, 0, sizeOf()) -} +fun FD_ZERO(set: fd_set): Unit = interop_FD_ZERO(set.ptr) -fun FD_SET(bit: Int, set: fd_set) { - set.fds_bits[bit / 32] = set.fds_bits[bit / 32] or (1 shl (bit % 32)) -} +fun FD_SET(bit: Int, set: fd_set): Unit = interop_FD_SET(bit, set.ptr) -fun FD_ISSET(bit: Int, set: fd_set): Boolean { - return set.fds_bits[bit / 32] and (1 shl (bit % 32)) != 0 -} +fun FD_ISSET(bit: Int, set: fd_set) = interop_FD_ISSET(bit, set.ptr) != 0 -// Not available through interop because declared as macro: -fun htons(value: Short) = ((value.toInt() ushr 8) or (value.toInt() shl 8)).toShort() +fun htons(value: Short) = interop_htons(value.toInt()).toShort() fun getUnixError() = strerror(errno)!!.toKString() diff --git a/samples/nonBlockingEchoServer/sockets.def b/samples/nonBlockingEchoServer/sockets.def index 3f8f2666168..29d04ef2609 100644 --- a/samples/nonBlockingEchoServer/sockets.def +++ b/samples/nonBlockingEchoServer/sockets.def @@ -1,2 +1,24 @@ headers = sys/socket.h sys/errno.h sys/select.h fcntl.h netdb.h stdio.h string.h unistd.h stdlib.h netinet/in.h excludeDependentModules.osx = true + +--- + +static int interop_errno() { + return errno; +} + +static int interop_htons(int x) { + return htons(x); +} + +static void interop_FD_ZERO(fd_set *set) { + FD_ZERO(set); +} + +static void interop_FD_SET(int bit, fd_set *set) { + FD_SET(bit, set); +} + +static int interop_FD_ISSET(int bit, fd_set *set) { + return FD_ISSET(bit, set); +} diff --git a/samples/socket/EchoServer.kt b/samples/socket/EchoServer.kt index 2b8e5ae6e06..d7a776cac9d 100644 --- a/samples/socket/EchoServer.kt +++ b/samples/socket/EchoServer.kt @@ -64,24 +64,21 @@ fun main(args: Array) { } } -// Not available through interop because declared as macro: -fun htons(value: Short) = ((value.toInt() ushr 8) or (value.toInt() shl 8)).toShort() +val errno: Int + get() = interop_errno() -fun throwUnixError(): Nothing { - perror(null) // TODO: store error message to exception instead. - throw Error("UNIX call failed") -} +fun htons(value: Short) = interop_htons(value.toInt()).toShort() inline fun Int.ensureUnixCallResult(predicate: (Int) -> Boolean): Int { if (!predicate(this)) { - throwUnixError() + throw Error(strerror(errno)!!.toKString()) } return this } inline fun Long.ensureUnixCallResult(predicate: (Long) -> Boolean): Long { if (!predicate(this)) { - throwUnixError() + throw Error(strerror(errno)!!.toKString()) } return this } \ No newline at end of file diff --git a/samples/socket/sockets.def b/samples/socket/sockets.def index c6e28130bb0..9d9821313f6 100644 --- a/samples/socket/sockets.def +++ b/samples/socket/sockets.def @@ -1,2 +1,12 @@ -headers = sys/socket.h netdb.h stdio.h string.h unistd.h stdlib.h netinet/in.h +headers = sys/socket.h sys/errno.h netdb.h stdio.h string.h unistd.h stdlib.h netinet/in.h excludeDependentModules.osx = true + +--- + +static int interop_errno() { + return errno; +} + +static int interop_htons(int x) { + return htons(x); +}