/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠEP AM ĠSystems Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ @ file : Suppress (" Object PropertyName ") Ċ Ċ package Ġcom . ep am . drill . hook . io Ċ Ċ import Ġcom . ep am . drill . hook . gen .* Ċ import Ġkotlinx . atomic fu .* Ċ import Ġkotlinx . c interop .* Ċ import Ġkotlinx . collections . immutable .* Ċ import Ġplatform . posix .* Ċ import Ġkotlin . native . Shared Immutable Ċ import Ġkotlin . native . Thread Local Ċ import Ġkotlin . native . concurrent .* Ċ Ċ @ Suppress (" unused ") Ċ @ Shared Immutable Ċ expect Ġval Ġtcp Initializer : ĠUnit Ċ Ċ @ Shared Immutable Ċ private Ġval Ġaccess Thread Ġ= ĠWorker . start ( true ) Ċ Ċ @ Shared Immutable Ċ val Ġ_ connect s Ġ= Ġatomic ( persistent HashSet Of < DR ILL _ SOCKET >()) Ċ Ċ @ Shared Immutable Ċ val Ġ_ accept s Ġ= Ġatomic ( persistent HashSet Of < DR ILL _ SOCKET >()) Ċ Ċ val Ġconnects ĊĠĠĠ Ġget () Ġ= Ġ_ connect s . value Ċ val Ġaccepts ĊĠĠĠ Ġget () Ġ= Ġ_ accept s . value Ċ Ċ @ Thread Local Ċ private Ġvar Ġ_ tcp Hook : ĠC Pointer < f unch ook _ t >? Ġ= Ġnull Ċ Ċ var Ġtcp Hook ĊĠĠĠ Ġget () Ġ= Ġaccess Thread . execute ( Transfer Mode . UN SAFE , Ġ{}) Ġ{ Ġ_ tcp Hook Ġ}. result ĊĠĠĠ Ġset ( value ) Ġ= Ġaccess Thread . execute ( Transfer Mode . UN SAFE , Ġ{ Ġvalue Ġ}) Ġ{ Ġ_ tcp Hook Ġ= Ġit Ġ}. result Ċ Ċ expect Ġfun Ġconfigure Tcp Hooks () Ċ Ċ fun Ġconfigure Tcp Hooks Build ( block : Ġ() Ġ-> ĠUnit ) Ġ= Ġif Ġ( tcp Hook Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġfun ch ook _ install ( tcp Hook , Ġ 0 ). check (" f unch ook _ install ") Ċ } Ġelse Ġ{ ĊĠĠĠ Ġtcp Hook Ġ= Ġfun ch ook _ create () Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Failed Ġto Ġcreate Ġhook ") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ch ook _ prepare ( tcp Hook , Ġread _ func _ point , Ġstatic C Function (:: drill Read )). check (" prepare Ġread _ func _ point ") ĊĠĠĠ Ġfun ch ook _ prepare ( tcp Hook , Ġwrite _ func _ point , Ġstatic C Function (:: drill Write )). check (" prepare Ġwrite _ func _ point ") ĊĠĠĠ Ġfun ch ook _ prepare ( tcp Hook , Ġsend _ func _ point , Ġstatic C Function (:: drill Send )). check (" prepare Ġsend _ func _ point ") ĊĠĠĠ Ġfun ch ook _ prepare ( tcp Hook , Ġrecv _ func _ point , Ġstatic C Function (:: drill Recv )). check (" prepare Ġrecv _ func _ point ") ĊĠĠĠ Ġblock () ĊĠĠĠ Ġfun ch ook _ install ( tcp Hook , Ġ 0 ). check (" f unch ook _ install ") Ċ } ĊĊ Ċ fun Ġremove Tcp Hook () Ġ{ ĊĠĠĠ Ġfun ch ook _ uninstall ( tcp Hook , Ġ 0 ). check (" f unch ook _ uninstall ") Ċ } Ċ Ċ // TODO ĠEP MD J - 8 6 9 6 ĠMove Ġback Ġto Ġcommon Ġmodule Ċ Ċ expect Ġfun Ġdr ill Read ( fd : ĠDR ILL _ SOCKET , Ġbuf : ĠC Pointer < Byte Var Of < Byte >> ?, Ġsize : Ġsize _ t ): Ġssize _ t Ċ Ċ expect Ġfun Ġdr ill Write ( fd : ĠDR ILL _ SOCKET , Ġbuf : ĠC Pointer < Byte Var Of < Byte >> ?, Ġsize : Ġsize _ t ): Ġssize _ t Ċ Ċ expect Ġfun Ġdr ill Send ( fd : ĠDR ILL _ SOCKET , Ġbuf : ĠC Pointer < Byte Var Of < Byte >> ?, Ġsize : ĠInt , Ġflags : ĠInt ): ĠInt Ċ Ċ expect Ġfun Ġdr ill Recv ( fd : ĠDR ILL _ SOCKET , Ġbuf : ĠC Pointer < Byte Var Of < Byte >> ?, Ġsize : ĠInt , Ġflags : ĠInt ): ĠInt Ċ Ċ internal Ġfun Ġdr ill Connect ( fd : ĠDR ILL _ SOCKET , Ġaddr : ĠC Pointer < sock addr > ?, Ġsock len : Ġdr ill _ sock _ len ): ĠInt Ġ{ ĊĠĠĠ Ġinit Runtime IfNeeded () ĊĠĠĠ Ġval Ġconnect Status Ġ= Ġnative Connect ( fd , Ġaddr , Ġsock len ). convert < Int >() ĊĠĠĠ Ġif Ġ( 0 Ġ== Ġconnect Status ) Ġ_ connect s . update Ġ{ Ġit Ġ+ Ġfd Ġ} ĊĠĠĠ Ġreturn Ġconnect Status Ċ } Ċ Ċ fun Ġdr ill Close ( fd : ĠDR ILL _ SOCKET ): ĠInt Ġ{ ĊĠĠĠ Ġinit Runtime IfNeeded () ĊĠĠĠ Ġval Ġresult Ġ= Ġnative Close ( fd ) ĊĠĠĠ Ġif Ġ( result Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ accept s . update Ġ{ Ġit Ġ- Ġfd Ġ} ĊĠĠĠĠĠĠĠ Ġ_ connect s . update Ġ{ Ġit Ġ- Ġfd Ġ} ĊĠĠĠĠĠĠĠ Ġcom . ep am . drill . hook . io . tcp . close ( fd ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ