package Ġcom . ark iv an ov . mv ik otlin . time travel . server Ċ Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . thread . Thread Ċ import Ġkotlinx . c interop . alloc Ċ import Ġkotlinx . c interop . convert Ċ import Ġkotlinx . c interop . mem Scoped Ċ import Ġkotlinx . c interop . ptr Ċ import Ġkotlinx . c interop . reinterpret Ċ import Ġkotlinx . c interop . size Of Ċ import Ġplatform . posix . AF _ INET Ċ import Ġplatform . posix . IN ADDR _ ANY Ċ import Ġplatform . posix . IP PROTO _ TCP Ċ import Ġplatform . posix . PF _ INET Ċ import Ġplatform . posix . SOCK _ STREAM Ċ import Ġplatform . posix . accept Ċ import Ġplatform . posix . bind Ċ import Ġplatform . posix . close Ċ import Ġplatform . posix . errno Ċ import Ġplatform . posix . listen Ċ import Ġplatform . posix . memset Ċ import Ġplatform . posix . sock addr _ in Ċ import Ġplatform . posix . socket Ċ import Ġkotlin . native . concurrent . Atomic Int Ċ Ċ @ Suppress (" EXPERIMENT AL _ API _ USAGE ") Ċ internal Ġclass ĠConnection Thread ( ĊĠĠĠ Ġprivate Ġval Ġport : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġon Client Connected : Ġ( Int ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval ĠonError : Ġ( Throwable ) Ġ-> ĠUnit Ċ ) Ġ: ĠThread () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsocket Ref Ġ= ĠAtomic Int (- 1 ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Socket Ġ= Ġsocket ( PF _ INET , ĠSOCK _ STREAM , ĠIP PROTO _ TCP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( server Socket Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( Exception (" Error Ġopen Ġsocket : Ġ$ errno ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket Ref . value Ġ= Ġserver Socket ĊĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsin Ġ= Ġalloc < sock addr _ in >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemset ( sin . ptr , Ġ 0 , Ġsockaddr _ in . size . convert ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ len Ġ= Ġsize Of < sock addr _ in >(). convert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ family Ġ= ĠAF _ INET . convert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ port Ġ= Ġget Sin Port () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ addr . s _ addr Ġ= ĠIN ADDR _ ANY ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bind ( server Socket , Ġsin . ptr . reinterpret (), Ġsockaddr _ in . size . convert ()) Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( Exception (" Error Ġbind Ġsocket : Ġ$ errno ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( listen ( server Socket , ĠSOCKET _ BACK LOG ) Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( Exception (" Error Ġlisten Ġsocket : Ġ$ errno ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is Inter rupted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= Ġaccept ( server Socket , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( socket Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( Exception (" Error Ġaccept Ġsocket : Ġ$ errno ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Client Connected ( socket ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Magic Number ") ĊĠĠĠ Ġprivate Ġfun Ġget Sin Port (): ĠU Short Ġ= Ġ(( port Ġshr Ġ 8 ) Ġor Ġ(( port Ġand Ġ 0 xff ) Ġshl Ġ 8 )). to U Short () ĊĊĠĠĠ Ġoverride Ġfun Ġinterrupt () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . interrupt () ĊĊĠĠĠĠĠĠĠ Ġsocket Ref ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ Ġclose ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSOCKET _ BACK LOG Ġ= Ġ 1 6 ĊĠĠĠ Ġ} Ċ } Ċ