/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ import Ġkotlinx . c interop .* Ċ import Ġplatform . posix .* Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġif Ġ( args . size Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Usage : Ġ./ echo _ server Ġ< port >") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġport Ġ= Ġargs [ 0 ]. to Short () ĊĊĠĠĠ Ġ// ĠInitialize Ġsockets Ġin Ġplatform - dependent Ġway . ĊĠĠĠ Ġinit _ sockets () ĊĊĠĠĠ Ġmem Scoped Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġprefix Buffer Ġ= Ġ" echo : Ġ". to Utf 8 () ĊĠĠĠĠĠĠĠ Ġval Ġserver Addr Ġ= Ġalloc < sock addr _ in >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlisten Fd Ġ= Ġsocket ( AF _ INET , ĠSOCK _ STREAM , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Unix Call Result (" socket ") Ġ{ Ġ! it . is Minus One () Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith ( server Addr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemset ( this . ptr , Ġ 0 , Ġsockaddr _ in . size . convert ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin _ family Ġ= ĠAF _ INET . convert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin _ port Ġ= Ġposix _ ht ons ( port ). convert () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbind ( listen Fd , Ġserver Addr . ptr . reinterpret (), Ġsockaddr _ in . size . convert ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Unix Call Result (" bind ") Ġ{ Ġit Ġ== Ġ 0 Ġ} ĊĊĠĠĠĠĠĠĠ Ġlisten ( listen Fd , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Unix Call Result (" listen ") Ġ{ Ġit Ġ== Ġ 0 Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcomm Fd Ġ= Ġaccept ( listen Fd , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Unix Call Result (" accept ") Ġ{ Ġ! it . is Minus One () Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuffer . use Pin ned Ġ{ Ġpinned Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġrecv ( comm Fd , Ġpinned . address Of ( 0 ), Ġbuffer . size . convert (), Ġ 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Unix Call Result (" read ") Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( comm Fd , Ġprefix Buffer . ref To ( 0 ), Ġprefix Buffer . size . convert (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Unix Call Result (" write ") Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( comm Fd , Ġpinned . address Of ( 0 ), Ġlength . convert (), Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ensure Unix Call Result (" write ") Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun ĠInt . ensure Unix Call Result ( op : ĠString , Ġpredicate : Ġ( Int ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ(! predicate ( this )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠError ("$ op : Ġ${ str error ( posix _ errno ()) !!. to K String () }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ inline Ġfun ĠLong . ensure Unix Call Result ( op : ĠString , Ġpredicate : Ġ( Long ) Ġ-> ĠBoolean ): ĠLong Ġ{ ĊĠĠĠ Ġif Ġ(! predicate ( this )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠError ("$ op : Ġ${ str error ( posix _ errno ()) !!. to K String () }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ inline Ġfun ĠU Long . ensure Unix Call Result ( op : ĠString , Ġpredicate : Ġ( UL ong ) Ġ-> ĠBoolean ): ĠU Long Ġ{ ĊĠĠĠ Ġif Ġ(! predicate ( this )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠError ("$ op : Ġ${ str error ( posix _ errno ()) !!. to K String () }") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ private Ġfun ĠInt . is Minus One () Ġ= Ġ( this Ġ== Ġ- 1 ) Ċ private Ġfun ĠLong . is Minus One () Ġ= Ġ( this Ġ== Ġ- 1 L ) Ċ private Ġfun ĠU Long . is Minus One () Ġ= Ġ( this Ġ== ĠU Long . MAX _ VALUE ) Ċ