@@ -6,16 +6,13 @@ import android.os.CancellationSignal
66import android.system.ErrnoException
77import androidx.annotation.RequiresApi
88import io.nekohasekai.sagernet.SagerNet
9- import io.nekohasekai.sagernet.ktx.tryResumeWithException
9+ import io.nekohasekai.sagernet.ktx.Logs
1010import kotlinx.coroutines.Dispatchers
1111import kotlinx.coroutines.asExecutor
12- import kotlinx.coroutines.runBlocking
1312import libcore.ExchangeContext
1413import libcore.LocalDNSTransport
1514import java.net.InetAddress
1615import java.net.UnknownHostException
17- import kotlin.coroutines.resume
18- import kotlin.coroutines.suspendCoroutine
1916
2017object LocalResolverImpl : LocalDNSTransport {
2118
@@ -27,98 +24,106 @@ object LocalResolverImpl : LocalDNSTransport {
2724 return Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q
2825 }
2926
27+ override fun networkHandle (): Long {
28+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q ) {
29+ return SagerNet .underlyingNetwork?.networkHandle ? : 0
30+ }
31+ return 0
32+ }
33+
3034 @RequiresApi(Build .VERSION_CODES .Q )
3135 override fun exchange (ctx : ExchangeContext , message : ByteArray ) {
32- return runBlocking {
33- suspendCoroutine { continuation ->
34- val signal = CancellationSignal ()
35- ctx.onCancel(signal::cancel)
36- val callback = object : DnsResolver .Callback <ByteArray > {
37- override fun onAnswer (answer : ByteArray , rcode : Int ) {
38- // exchange don't generate rcode error
39- ctx.rawSuccess(answer)
40- continuation.resume(Unit )
41- }
36+ val signal = CancellationSignal ()
37+ ctx.onCancel(signal::cancel)
4238
43- override fun onError (error : DnsResolver .DnsException ) {
44- when (val cause = error.cause) {
45- is ErrnoException -> {
46- ctx.errnoCode(cause.errno)
47- continuation.resume(Unit )
48- return
49- }
50- }
51- continuation.tryResumeWithException(error)
52- }
39+ val callback = object : DnsResolver .Callback <ByteArray > {
40+ override fun onAnswer (answer : ByteArray , rcode : Int ) {
41+ ctx.rawSuccess(answer)
42+ }
43+
44+ override fun onError (error : DnsResolver .DnsException ) {
45+ val cause = error.cause
46+ if (cause is ErrnoException ) {
47+ ctx.errnoCode(cause.errno)
48+ } else {
49+ Logs .w(error)
50+ ctx.errnoCode(114514 )
5351 }
54- DnsResolver .getInstance().rawQuery(
55- SagerNet .underlyingNetwork,
56- message,
57- DnsResolver .FLAG_NO_RETRY ,
58- Dispatchers .IO .asExecutor(),
59- signal,
60- callback
61- )
6252 }
6353 }
54+
55+ DnsResolver .getInstance().rawQuery(
56+ SagerNet .underlyingNetwork,
57+ message,
58+ DnsResolver .FLAG_NO_RETRY ,
59+ Dispatchers .IO .asExecutor(),
60+ signal,
61+ callback
62+ )
6463 }
6564
6665 override fun lookup (ctx : ExchangeContext , network : String , domain : String ) {
6766 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q ) {
68- return runBlocking {
69- suspendCoroutine { continuation ->
70- val signal = CancellationSignal ()
71- ctx.onCancel(signal::cancel)
72- val callback = object : DnsResolver .Callback <Collection <InetAddress >> {
73- override fun onAnswer (answer : Collection <InetAddress >, rcode : Int ) {
74- if (rcode == 0 ) {
75- ctx.success((answer as Collection <InetAddress ?>).mapNotNull { it?.hostAddress }
76- .joinToString(" \n " ))
77- } else {
78- ctx.errorCode(rcode)
79- }
80- continuation.resume(Unit )
81- }
67+ val signal = CancellationSignal ()
68+ ctx.onCancel(signal::cancel)
8269
83- override fun onError (error : DnsResolver .DnsException ) {
84- when (val cause = error.cause) {
85- is ErrnoException -> {
86- ctx.errnoCode(cause.errno)
87- continuation.resume(Unit )
88- return
89- }
90- }
91- continuation.tryResumeWithException(error)
70+ val callback = object : DnsResolver .Callback <Collection <InetAddress >> {
71+ override fun onAnswer (answer : Collection <InetAddress >, rcode : Int ) {
72+ try {
73+ if (rcode == 0 ) {
74+ ctx.success(answer.mapNotNull { it.hostAddress }.joinToString(" \n " ))
75+ } else {
76+ ctx.errorCode(rcode)
9277 }
78+ } catch (e: Exception ) {
79+ Logs .w(e)
80+ ctx.errnoCode(114514 )
9381 }
94- val type = when {
95- network.endsWith(" 4" ) -> DnsResolver .TYPE_A
96- network.endsWith(" 6" ) -> DnsResolver .TYPE_AAAA
97- else -> null
98- }
99- if (type != null ) {
100- DnsResolver .getInstance().query(
101- SagerNet .underlyingNetwork,
102- domain,
103- type,
104- DnsResolver .FLAG_NO_RETRY ,
105- Dispatchers .IO .asExecutor(),
106- signal,
107- callback
108- )
109- } else {
110- DnsResolver .getInstance().query(
111- SagerNet .underlyingNetwork,
112- domain,
113- DnsResolver .FLAG_NO_RETRY ,
114- Dispatchers .IO .asExecutor(),
115- signal,
116- callback
117- )
82+ }
83+
84+ override fun onError (error : DnsResolver .DnsException ) {
85+ try {
86+ val cause = error.cause
87+ if (cause is ErrnoException ) {
88+ ctx.errnoCode(cause.errno)
89+ } else {
90+ Logs .w(error)
91+ ctx.errnoCode(114514 )
92+ }
93+ } catch (e: Exception ) {
94+ Logs .w(e)
95+ ctx.errnoCode(114514 )
11896 }
11997 }
12098 }
99+
100+ val type = when {
101+ network.endsWith(" 4" ) -> DnsResolver .TYPE_A
102+ network.endsWith(" 6" ) -> DnsResolver .TYPE_AAAA
103+ else -> null
104+ }
105+ if (type != null ) {
106+ DnsResolver .getInstance().query(
107+ SagerNet .underlyingNetwork,
108+ domain,
109+ type,
110+ DnsResolver .FLAG_NO_RETRY ,
111+ Dispatchers .IO .asExecutor(),
112+ signal,
113+ callback
114+ )
115+ } else {
116+ DnsResolver .getInstance().query(
117+ SagerNet .underlyingNetwork,
118+ domain,
119+ DnsResolver .FLAG_NO_RETRY ,
120+ Dispatchers .IO .asExecutor(),
121+ signal,
122+ callback
123+ )
124+ }
121125 } else {
126+ // 老版本系统,继续用阻塞的 InetAddress
122127 val answer = try {
123128 val u = SagerNet .underlyingNetwork
124129 if (u != null ) {
0 commit comments