/******************************************************************************* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġby ĠMax ĠL v Ġ< max . c . lv @ gmail . com > ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġby ĠMy god ĠStudio Ġ< contact - shadow socks - android @ my god . be > Ġ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify ĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġit Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby ĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġthe ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor ĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġ( at Ġyour Ġoption ) Ġany Ġlater Ġversion . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠThis Ġprogram Ġis Ġdistributed Ġin Ġthe Ġhope Ġthat Ġit Ġwill Ġbe Ġuseful , ĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġbut ĠWITHOUT ĠANY ĠWARRANTY ; Ġwithout Ġeven Ġthe Ġimplied Ġwarranty Ġof ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠMERCHANTABILITY Ġor ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE . Ġ ĠSee Ġthe ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠGNU ĠGeneral ĠPublic ĠLicense Ġfor Ġmore Ġdetails . ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense ĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ* Ġ Ġalong Ġwith Ġthis Ġprogram . ĠIf Ġnot , Ġsee Ġ< http :// www . gnu . org / licenses />. ĠĠĠĠĠĠ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ċ Ġ************************************************************************* ******/ Ċ Ċ package Ġcom . github . vpn 2 4 7 . bg Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Local Socket Ċ import Ġandroid . net . Local SocketAddress Ċ import Ġandroid . net . Network Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Parcel FileDescriptor Ċ import Ġandroid . system . Errno Exception Ċ import Ġandroid . system . Os Ċ import Ġcom . github . vpn 2 4 7 . Core Ċ import Ġcom . github . vpn 2 4 7 . Vpn Request Activity Ċ import Ġcom . github . vpn 2 4 7 . acl . Acl Ċ import Ġcom . github . vpn 2 4 7 . core . R Ċ import Ġcom . github . vpn 2 4 7 . net . Concurrent Local Socket Listener Ċ import Ġcom . github . vpn 2 4 7 . net . Default Network Listener Ċ import Ġcom . github . vpn 2 4 7 . net . Subnet Ċ import Ġcom . github . vpn 2 4 7 . preference . DataStore Ċ import Ġcom . github . vpn 2 4 7 . utils . Key Ċ import Ġcom . github . vpn 2 4 7 . utils . parse Numeric Address Ċ import Ġcom . github . vpn 2 4 7 . utils . print Log Ċ import Ġkotlinx . coroutines . delay Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . File Ċ import Ġjava . io . FileDescriptor Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util .* Ċ import Ġandroid . net . Vpn Service Ġas ĠBase Vpn Service Ċ Ċ class ĠV pn Service Ġ: ĠBase Vpn Service (), ĠLocal Dns Service . Interface Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVPN _ MT U Ġ= Ġ 1 5 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRIVATE _ VL AN Ġ= Ġ" 1 7 2 . 1 9 . 0 .% s " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRIVATE _ VL AN 6 Ġ= Ġ" fd fe : dcb a : 9 8 7 6 :: % s " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġhttps :// android . google source . com / platform / pre bu il ts / runtime / +/ 9 4 fec 3 2 / appcompat / hidden api - light - grey list . txt # 9 4 6 6 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġget Int : ĠMethod Ġ= ĠFile Descriptor :: class . java . getDeclared Method (" getInt $ ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠClose able Fd ( val Ġfd : ĠFile Descriptor ) Ġ: ĠClose able Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ= ĠOs . close ( fd ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠProt ect Worker Ġ: ĠConcurrent Local Socket Listener (" Shadow socks Vpn Thread ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( Core . device Storage . no Backup Files Dir , Ġ" protect _ path ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġaccept Internal ( socket : ĠLocal Socket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . inputStream . read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġsocket . anc ill ary File Descriptors !!. single () !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClose able Fd ( fd ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . output Stream . write ( if Ġ( underlying Network . let Ġ{ Ġnetwork Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Ġ!= Ġnull Ġ&& ĠBuild . VERSION . SDK _ INT Ġ>= Ġ 2 3 ) Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork . bind Socket ( fd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsuppress ĠEN ON ET Ġ( Machine Ġis Ġnot Ġon Ġthe Ġnetwork ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( e . cause Ġas ? ĠErr no Exception )?. errno Ġ!= Ġ 6 4 ) Ġprint Log ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġprotect ( getInt . invoke ( fd ) Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ 0 Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠNull Connection Exception Ġ: ĠNullPointerException () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Localized Message () Ġ= ĠgetString ( R . string . reboot _ required ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġdata Ġ= ĠBase Service . Data ( this ) ĊĠĠĠ Ġoverride Ġval Ġtag : ĠString Ġget () Ġ= Ġ" Shadow socks Vpn Service " ĊĠĠĠ Ġoverride Ġfun Ġcreate Notification ( profile Name : ĠString ): ĠService Notification Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Notification ( this , Ġprofile Name , Ġ" service - vpn ") ĊĊĠĠĠ Ġprivate Ġvar Ġconn : ĠParcel FileDescriptor ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġworker : ĠProt ect Worker ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġactive Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġunderlying Network : ĠNetwork ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Ġ&& ĠBuild . VERSION . SDK _ INT Ġ>= Ġ 2 2 ) Ġset Under lying Networks ( underlying Networks ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġunderlying Networks Ġ= Ġunderlying Network ?. let Ġ{ ĠarrayOf ( it ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ) Ġ= Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSERVICE _ INTERFACE Ġ-> Ġsuper < Base Vpn Service >. on Bind ( intent ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper < Local Dns Service . Interface >. on Bind ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Re voke () Ġ= Ġstop Runner () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġkill Processes () Ġ{ ĊĠĠĠĠĠĠĠ Ġactive Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠDefault Network Listener . stop ( this ) ĊĠĠĠĠĠĠĠ Ġworker ?. shutdown () ĊĠĠĠĠĠĠĠ Ġworker Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . kill Processes () ĊĠĠĠĠĠĠĠ Ġconn ?. close () ĊĠĠĠĠĠĠĠ Ġconn Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( DataStore . service Mode Ġ== ĠKey . mode Vpn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Base Vpn Service . prepare ( this ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠV pn Request Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġreturn Ġsuper < Local Dns Service . Interface >. onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠĠĠĠĠ Ġstop Runner () ĊĠĠĠĠĠĠĠ Ġreturn ĠService . START _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġpre Init () Ġ= ĠDefault Network Listener . start ( this ) Ġ{ Ġunderlying Network Ġ= Ġit Ġ} ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġresolver ( host : ĠString ) Ġ= ĠDefault Network Listener . get (). get ByName ( host ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstart Processes () Ġ{ ĊĠĠĠĠĠĠĠ Ġworker Ġ= ĠProt ect Worker (). apply Ġ{ Ġstart () Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . start Processes () ĊĊĠĠĠĠĠĠĠ Ġsend Fd ( start Vpn ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Additional Arguments ( cmd : ĠArrayList < String >): ĠArrayList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġcmd Ġ+= Ġ"- V " ĊĠĠĠĠĠĠĠ Ġreturn Ġcmd ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġstart Vpn (): ĠFile Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprofile Ġ= Ġdata . proxy !!. profile ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Configure Intent ( Core . configure Intent ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session ( profile . formatted Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set M tu ( VPN _ MT U ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Address ( PRIVATE _ VL AN . format ( Locale . EN GL ISH , Ġ" 1 "), Ġ 2 4 ) ĊĊĠĠĠĠĠĠĠ Ġprofile . remote Dns . split ("," ). forEach Ġ{ Ġbuilder . add Dns Server ( it . trim ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( profile . ipv 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Address ( PRIVATE _ VL AN 6 . format ( Locale . EN GL ISH , Ġ" 1 "), Ġ 1 2 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Route (" :: ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( profile . proxy Apps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġme Ġ= ĠpackageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile . individual . split ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġme Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( profile . bypass ) Ġbuilder . add Dis allowed Application ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġbuilder . add Allowed Application ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Log ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! profile . bypass ) Ġbuilder . add Allowed Application ( me ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( profile . route ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA cl . ALL , ĠA cl . BY PASS _ CH N , ĠA cl . CUSTOM _ R ULES Ġ-> Ġbuilder . add Route (" 0 . 0 . 0 . 0 ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString Array ( R . array . bypass _ private _ route ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubnet Ġ= ĠSub net . fromString ( it ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Route ( subnet . address . host Address , Ġsubnet . prefix Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile . remote Dns . split ("," ). map NotNull Ġ{ Ġit . trim (). parse Numeric Address () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġbuilder . add Route ( it , Ġit . address . size Ġshl Ġ 3 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġactive Ġ= Ġtrue ĠĠ Ġ// Ġpossible Ġrace Ġcondition Ġhere ? ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 2 ) Ġbuilder . set Under lying Networks ( underlying Networks ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconn Ġ= Ġbuilder . est ablish () Ġ?: Ġthrow ĠNull Connection Exception () ĊĠĠĠĠĠĠĠ Ġthis . conn Ġ= Ġconn ĊĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġconn . fd ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġarray ListOf ( File ( application Info . native Library Dir , ĠExec utable . T UN 2 SOCK S ). absolute Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- net if - ip addr ", ĠPRIVATE _ VL AN . format ( Locale . EN GL ISH , Ġ" 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- net if - net mask ", Ġ" 2 5 5 . 2 5 5 . 2 5 5 . 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- socks - server - addr ", Ġ"${ DataStore . listen Address }:${ DataStore . port Proxy }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- tun fd ", Ġfd . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- tun mt u ", ĠVPN _ MT U . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- sock - path ", Ġ" sock _ path ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- log level ", Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġif Ġ( profile . ipv 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ+= Ġ"-- net if - ip 6 addr " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ+= ĠPRIVATE _ VL AN 6 . format ( Locale . EN GL ISH , Ġ" 2 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcmd Ġ+= Ġ"-- enable - ud pre lay " ĊĠĠĠĠĠĠĠ Ġif Ġ(! profile . ud pd ns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ+= Ġ"-- dn sg w " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ+= Ġ" 1 2 7 . 0 . 0 . 1 :${ DataStore . port Local Dns }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . processes !!. start ( cmd , Ġon Restart Callback Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Fd ( conn . file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠErr no Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Runner ( false , Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġconn . file Descriptor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsend Fd ( fd : ĠFile Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtries Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠFile ( Core . device Storage . no Backup Files Dir , Ġ" sock _ path "). absolute Path ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 L Ġshl Ġtries ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Socket (). use Ġ{ Ġlocal Socket Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Socket . connect ( Local SocketAddress ( path , ĠLocal SocketAddress . Namespace . FILE SYSTEM )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Socket . set File Descriptors For Send ( array Of ( fd )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Socket . output Stream . write ( 4 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tri es Ġ> Ġ 5 ) Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtries Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġdata . binder . close () ĊĠĠĠ Ġ} Ċ } Ċ