dns: Fix preferred_by local support for platform local transport

This commit is contained in:
NagaseMinato
2026-08-30 17:41:45 +08:00
committed by 世界
parent ec3e95935f
commit eb6db316cc
5 changed files with 134 additions and 63 deletions
+1 -1
View File
@@ -30,7 +30,7 @@ func baseContext(platformInterface PlatformInterface) context.Context {
if platformInterface != nil {
if localTransport := platformInterface.LocalDNSTransport(); localTransport != nil {
dns.RegisterTransport[option.LocalDNSServerOptions](dnsRegistry, C.DNSTypeLocal, func(ctx context.Context, logger log.ContextLogger, tag string, options option.LocalDNSServerOptions) (adapter.DNSTransport, error) {
return newPlatformTransport(localTransport, tag, options), nil
return newPlatformTransport(ctx, logger, localTransport, tag, options)
})
}
}
+27 -7
View File
@@ -9,6 +9,8 @@ import (
"github.com/sagernet/sing-box/adapter"
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/dns"
"github.com/sagernet/sing-box/dns/transport/local"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
"github.com/sagernet/sing/common"
E "github.com/sagernet/sing/common/exceptions"
@@ -23,21 +25,26 @@ type LocalDNSTransport interface {
Exchange(ctx *ExchangeContext, message []byte) error
}
var _ adapter.DNSTransport = (*platformTransport)(nil)
type platformTransport struct {
dns.TransportAdapter
iif LocalDNSTransport
iif LocalDNSTransport
preferredResolver *local.PreferredDomainResolver
}
func newPlatformTransport(iif LocalDNSTransport, tag string, options option.LocalDNSServerOptions) *platformTransport {
return &platformTransport{
TransportAdapter: dns.NewTransportAdapterWithLocalOptions(C.DNSTypeLocal, tag, options),
iif: iif,
func newPlatformTransport(ctx context.Context, logger log.ContextLogger, iif LocalDNSTransport, tag string, options option.LocalDNSServerOptions) (*platformTransport, error) {
preferredResolver, err := local.NewPreferredDomainResolver(ctx, logger, options)
if err != nil {
return nil, err
}
return &platformTransport{
TransportAdapter: dns.NewTransportAdapterWithLocalOptions(C.DNSTypeLocal, tag, options),
iif: iif,
preferredResolver: preferredResolver,
}, nil
}
func (p *platformTransport) Start(stage adapter.StartStage) error {
p.preferredResolver.Start(stage)
return nil
}
@@ -48,7 +55,15 @@ func (p *platformTransport) Close() error {
func (p *platformTransport) Reset() {
}
func (p *platformTransport) PreferredDomain(domain string) bool {
return p.preferredResolver.PreferredDomain(domain)
}
func (p *platformTransport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
localResponse := p.preferredResolver.Lookup(message)
if localResponse != nil {
return localResponse, nil
}
response := &ExchangeContext{
context: ctx,
}
@@ -151,3 +166,8 @@ func (c *ExchangeContext) ErrorCode(code int32) {
func (c *ExchangeContext) ErrnoCode(code int32) {
c.error = syscall.Errno(code)
}
var (
_ adapter.DNSTransport = (*platformTransport)(nil)
_ adapter.DNSTransportWithPreferredDomain = (*platformTransport)(nil)
)