mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-09-15 21:00:27 +00:00
dns: Fix preferred_by local support for platform local transport
This commit is contained in:
@@ -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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user