resolve1.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. //go:build linux
  2. package resolved
  3. import (
  4. "context"
  5. "errors"
  6. "fmt"
  7. "net/netip"
  8. "os"
  9. "os/user"
  10. "path/filepath"
  11. "strconv"
  12. "strings"
  13. "syscall"
  14. "github.com/sagernet/sing-box/adapter"
  15. C "github.com/sagernet/sing-box/constant"
  16. "github.com/sagernet/sing-box/dns"
  17. "github.com/sagernet/sing-box/log"
  18. "github.com/sagernet/sing/common"
  19. E "github.com/sagernet/sing/common/exceptions"
  20. F "github.com/sagernet/sing/common/format"
  21. M "github.com/sagernet/sing/common/metadata"
  22. "github.com/godbus/dbus/v5"
  23. mDNS "github.com/miekg/dns"
  24. )
  25. type resolve1Manager Service
  26. type Address struct {
  27. IfIndex int32
  28. Family int32
  29. Address []byte
  30. }
  31. type Name struct {
  32. IfIndex int32
  33. Hostname string
  34. }
  35. type ResourceRecord struct {
  36. IfIndex int32
  37. Type uint16
  38. Class uint16
  39. Data []byte
  40. }
  41. type SRVRecord struct {
  42. Priority uint16
  43. Weight uint16
  44. Port uint16
  45. Hostname string
  46. Addresses []Address
  47. CNAME string
  48. }
  49. type TXTRecord []byte
  50. type LinkDNS struct {
  51. Family int32
  52. Address []byte
  53. }
  54. type LinkDNSEx struct {
  55. Family int32
  56. Address []byte
  57. Port uint16
  58. Name string
  59. }
  60. type LinkDomain struct {
  61. Domain string
  62. RoutingOnly bool
  63. }
  64. func (t *resolve1Manager) getLink(ifIndex int32) (*TransportLink, *dbus.Error) {
  65. link, loaded := t.links[ifIndex]
  66. if !loaded {
  67. link = &TransportLink{}
  68. t.links[ifIndex] = link
  69. iif, err := t.network.InterfaceFinder().ByIndex(int(ifIndex))
  70. if err != nil {
  71. return nil, wrapError(err)
  72. }
  73. link.iif = iif
  74. }
  75. return link, nil
  76. }
  77. func (t *resolve1Manager) getSenderProcess(sender dbus.Sender) (int32, error) {
  78. var senderPid int32
  79. dbusObject := t.systemBus.Object("org.freedesktop.DBus", "/org/freedesktop/DBus")
  80. if dbusObject == nil {
  81. return 0, E.New("missing dbus object")
  82. }
  83. err := dbusObject.Call("org.freedesktop.DBus.GetConnectionUnixProcessID", 0, string(sender)).Store(&senderPid)
  84. if err != nil {
  85. return 0, E.Cause(err, "GetConnectionUnixProcessID")
  86. }
  87. return senderPid, nil
  88. }
  89. func (t *resolve1Manager) createMetadata(sender dbus.Sender) adapter.InboundContext {
  90. var metadata adapter.InboundContext
  91. metadata.Inbound = t.Tag()
  92. metadata.InboundType = C.TypeResolved
  93. senderPid, err := t.getSenderProcess(sender)
  94. if err != nil {
  95. return metadata
  96. }
  97. var processInfo adapter.ConnectionOwner
  98. metadata.ProcessInfo = &processInfo
  99. processInfo.ProcessID = uint32(senderPid)
  100. processPath, err := os.Readlink(F.ToString("/proc/", senderPid, "/exe"))
  101. if err == nil {
  102. processInfo.ProcessPath = processPath
  103. } else {
  104. processPath, err = os.Readlink(F.ToString("/proc/", senderPid, "/comm"))
  105. if err == nil {
  106. processInfo.ProcessPath = processPath
  107. }
  108. }
  109. var uidFound bool
  110. statusContent, err := os.ReadFile(F.ToString("/proc/", senderPid, "/status"))
  111. if err == nil {
  112. for _, line := range strings.Split(string(statusContent), "\n") {
  113. line = strings.TrimSpace(line)
  114. if strings.HasPrefix(line, "Uid:") {
  115. fields := strings.Fields(line)
  116. if len(fields) >= 2 {
  117. uid, parseErr := strconv.ParseUint(fields[1], 10, 32)
  118. if parseErr != nil {
  119. break
  120. }
  121. processInfo.UserId = int32(uid)
  122. uidFound = true
  123. if osUser, _ := user.LookupId(F.ToString(uid)); osUser != nil {
  124. processInfo.UserName = osUser.Username
  125. }
  126. break
  127. }
  128. }
  129. }
  130. }
  131. if !uidFound {
  132. metadata.ProcessInfo.UserId = -1
  133. }
  134. return metadata
  135. }
  136. func (t *resolve1Manager) log(sender dbus.Sender, message ...any) {
  137. metadata := t.createMetadata(sender)
  138. if metadata.ProcessInfo != nil {
  139. var prefix string
  140. if metadata.ProcessInfo.ProcessPath != "" {
  141. prefix = filepath.Base(metadata.ProcessInfo.ProcessPath)
  142. } else if metadata.ProcessInfo.UserName != "" {
  143. prefix = F.ToString("user:", metadata.ProcessInfo.UserName)
  144. } else if metadata.ProcessInfo.UserId != 0 {
  145. prefix = F.ToString("uid:", metadata.ProcessInfo.UserId)
  146. }
  147. t.logger.Info("(", prefix, ") ", F.ToString(message...))
  148. } else {
  149. t.logger.Info(F.ToString(message...))
  150. }
  151. }
  152. func (t *resolve1Manager) logRequest(sender dbus.Sender, message ...any) context.Context {
  153. ctx := log.ContextWithNewID(t.ctx)
  154. metadata := t.createMetadata(sender)
  155. if metadata.ProcessInfo != nil {
  156. var prefix string
  157. if metadata.ProcessInfo.ProcessPath != "" {
  158. prefix = filepath.Base(metadata.ProcessInfo.ProcessPath)
  159. } else if metadata.ProcessInfo.UserName != "" {
  160. prefix = F.ToString("user:", metadata.ProcessInfo.UserName)
  161. } else if metadata.ProcessInfo.UserId != 0 {
  162. prefix = F.ToString("uid:", metadata.ProcessInfo.UserId)
  163. }
  164. t.logger.InfoContext(ctx, "(", prefix, ") ", strings.Join(F.MapToString(message), " "))
  165. } else {
  166. t.logger.InfoContext(ctx, strings.Join(F.MapToString(message), " "))
  167. }
  168. return adapter.WithContext(ctx, &metadata)
  169. }
  170. func familyToString(family int32) string {
  171. switch family {
  172. case syscall.AF_UNSPEC:
  173. return "AF_UNSPEC"
  174. case syscall.AF_INET:
  175. return "AF_INET"
  176. case syscall.AF_INET6:
  177. return "AF_INET6"
  178. default:
  179. return F.ToString(family)
  180. }
  181. }
  182. func (t *resolve1Manager) ResolveHostname(sender dbus.Sender, ifIndex int32, hostname string, family int32, flags uint64) (addresses []Address, canonical string, outflags uint64, err *dbus.Error) {
  183. t.linkAccess.Lock()
  184. link, err := t.getLink(ifIndex)
  185. if err != nil {
  186. return
  187. }
  188. t.linkAccess.Unlock()
  189. var strategy C.DomainStrategy
  190. switch family {
  191. case syscall.AF_UNSPEC:
  192. strategy = C.DomainStrategyAsIS
  193. case syscall.AF_INET:
  194. strategy = C.DomainStrategyIPv4Only
  195. case syscall.AF_INET6:
  196. strategy = C.DomainStrategyIPv6Only
  197. }
  198. ctx := t.logRequest(sender, "ResolveHostname ", link.iif.Name, " ", hostname, " ", familyToString(family), " ", flags)
  199. responseAddresses, lookupErr := t.dnsRouter.Lookup(ctx, hostname, adapter.DNSQueryOptions{
  200. LookupStrategy: strategy,
  201. })
  202. if lookupErr != nil {
  203. err = wrapError(err)
  204. return
  205. }
  206. addresses = common.Map(responseAddresses, func(it netip.Addr) Address {
  207. var addrFamily int32
  208. if it.Is4() {
  209. addrFamily = syscall.AF_INET
  210. } else {
  211. addrFamily = syscall.AF_INET6
  212. }
  213. return Address{
  214. IfIndex: ifIndex,
  215. Family: addrFamily,
  216. Address: it.AsSlice(),
  217. }
  218. })
  219. canonical = mDNS.CanonicalName(hostname)
  220. return
  221. }
  222. func (t *resolve1Manager) ResolveAddress(sender dbus.Sender, ifIndex int32, family int32, address []byte, flags uint64) (names []Name, outflags uint64, err *dbus.Error) {
  223. t.linkAccess.Lock()
  224. link, err := t.getLink(ifIndex)
  225. if err != nil {
  226. return
  227. }
  228. t.linkAccess.Unlock()
  229. addr, ok := netip.AddrFromSlice(address)
  230. if !ok {
  231. err = wrapError(E.New("invalid address"))
  232. return
  233. }
  234. var nibbles []string
  235. for i := len(address) - 1; i >= 0; i-- {
  236. b := address[i]
  237. nibbles = append(nibbles, fmt.Sprintf("%x", b&0x0F))
  238. nibbles = append(nibbles, fmt.Sprintf("%x", b>>4))
  239. }
  240. var ptrDomain string
  241. if addr.Is4() {
  242. ptrDomain = strings.Join(nibbles, ".") + ".in-addr.arpa."
  243. } else {
  244. ptrDomain = strings.Join(nibbles, ".") + ".ip6.arpa."
  245. }
  246. request := &mDNS.Msg{
  247. MsgHdr: mDNS.MsgHdr{
  248. RecursionDesired: true,
  249. },
  250. Question: []mDNS.Question{
  251. {
  252. Name: mDNS.Fqdn(ptrDomain),
  253. Qtype: mDNS.TypePTR,
  254. Qclass: mDNS.ClassINET,
  255. },
  256. },
  257. }
  258. ctx := t.logRequest(sender, "ResolveAddress ", link.iif.Name, familyToString(family), addr, flags)
  259. var metadata adapter.InboundContext
  260. metadata.InboundType = t.Type()
  261. metadata.Inbound = t.Tag()
  262. response, lookupErr := t.dnsRouter.Exchange(adapter.WithContext(ctx, &metadata), request, adapter.DNSQueryOptions{})
  263. if lookupErr != nil {
  264. err = wrapError(err)
  265. return
  266. }
  267. if response.Rcode != mDNS.RcodeSuccess {
  268. err = rcodeError(response.Rcode)
  269. return
  270. }
  271. for _, rawRR := range response.Answer {
  272. switch rr := rawRR.(type) {
  273. case *mDNS.PTR:
  274. names = append(names, Name{
  275. IfIndex: ifIndex,
  276. Hostname: rr.Ptr,
  277. })
  278. }
  279. }
  280. return
  281. }
  282. func (t *resolve1Manager) ResolveRecord(sender dbus.Sender, ifIndex int32, hostname string, qClass uint16, qType uint16, flags uint64) (records []ResourceRecord, outflags uint64, err *dbus.Error) {
  283. t.linkAccess.Lock()
  284. link, err := t.getLink(ifIndex)
  285. if err != nil {
  286. return
  287. }
  288. t.linkAccess.Unlock()
  289. request := &mDNS.Msg{
  290. MsgHdr: mDNS.MsgHdr{
  291. RecursionDesired: true,
  292. },
  293. Question: []mDNS.Question{
  294. {
  295. Name: mDNS.Fqdn(hostname),
  296. Qtype: qType,
  297. Qclass: qClass,
  298. },
  299. },
  300. }
  301. ctx := t.logRequest(sender, "ResolveRecord", link.iif.Name, hostname, mDNS.Class(qClass), mDNS.Type(qType), flags)
  302. var metadata adapter.InboundContext
  303. metadata.InboundType = t.Type()
  304. metadata.Inbound = t.Tag()
  305. response, exchangeErr := t.dnsRouter.Exchange(adapter.WithContext(ctx, &metadata), request, adapter.DNSQueryOptions{})
  306. if exchangeErr != nil {
  307. err = wrapError(exchangeErr)
  308. return
  309. }
  310. if response.Rcode != mDNS.RcodeSuccess {
  311. err = rcodeError(response.Rcode)
  312. return
  313. }
  314. for _, rr := range response.Answer {
  315. var record ResourceRecord
  316. record.IfIndex = ifIndex
  317. record.Type = rr.Header().Rrtype
  318. record.Class = rr.Header().Class
  319. data := make([]byte, mDNS.Len(rr))
  320. _, unpackErr := mDNS.PackRR(rr, data, 0, nil, false)
  321. if unpackErr != nil {
  322. err = wrapError(unpackErr)
  323. }
  324. record.Data = data
  325. records = append(records, record)
  326. }
  327. return
  328. }
  329. func (t *resolve1Manager) ResolveService(sender dbus.Sender, ifIndex int32, hostname string, sType string, domain string, family int32, flags uint64) (srvData []SRVRecord, txtData []TXTRecord, canonicalName string, canonicalType string, canonicalDomain string, outflags uint64, err *dbus.Error) {
  330. t.linkAccess.Lock()
  331. link, err := t.getLink(ifIndex)
  332. if err != nil {
  333. return
  334. }
  335. t.linkAccess.Unlock()
  336. serviceName := hostname
  337. if hostname != "" && !strings.HasSuffix(hostname, ".") {
  338. serviceName += "."
  339. }
  340. serviceName += sType
  341. if !strings.HasSuffix(serviceName, ".") {
  342. serviceName += "."
  343. }
  344. serviceName += domain
  345. if !strings.HasSuffix(serviceName, ".") {
  346. serviceName += "."
  347. }
  348. ctx := t.logRequest(sender, "ResolveService ", link.iif.Name, " ", hostname, " ", sType, " ", domain, " ", familyToString(family), " ", flags)
  349. srvRequest := &mDNS.Msg{
  350. MsgHdr: mDNS.MsgHdr{
  351. RecursionDesired: true,
  352. },
  353. Question: []mDNS.Question{
  354. {
  355. Name: serviceName,
  356. Qtype: mDNS.TypeSRV,
  357. Qclass: mDNS.ClassINET,
  358. },
  359. },
  360. }
  361. var metadata adapter.InboundContext
  362. metadata.InboundType = t.Type()
  363. metadata.Inbound = t.Tag()
  364. srvResponse, exchangeErr := t.dnsRouter.Exchange(adapter.WithContext(ctx, &metadata), srvRequest, adapter.DNSQueryOptions{})
  365. if exchangeErr != nil {
  366. err = wrapError(exchangeErr)
  367. return
  368. }
  369. if srvResponse.Rcode != mDNS.RcodeSuccess {
  370. err = rcodeError(srvResponse.Rcode)
  371. return
  372. }
  373. txtRequest := &mDNS.Msg{
  374. MsgHdr: mDNS.MsgHdr{
  375. RecursionDesired: true,
  376. },
  377. Question: []mDNS.Question{
  378. {
  379. Name: serviceName,
  380. Qtype: mDNS.TypeTXT,
  381. Qclass: mDNS.ClassINET,
  382. },
  383. },
  384. }
  385. txtResponse, exchangeErr := t.dnsRouter.Exchange(ctx, txtRequest, adapter.DNSQueryOptions{})
  386. if exchangeErr != nil {
  387. err = wrapError(exchangeErr)
  388. return
  389. }
  390. for _, rawRR := range srvResponse.Answer {
  391. switch rr := rawRR.(type) {
  392. case *mDNS.SRV:
  393. var srvRecord SRVRecord
  394. srvRecord.Priority = rr.Priority
  395. srvRecord.Weight = rr.Weight
  396. srvRecord.Port = rr.Port
  397. srvRecord.Hostname = rr.Target
  398. var strategy C.DomainStrategy
  399. switch family {
  400. case syscall.AF_UNSPEC:
  401. strategy = C.DomainStrategyAsIS
  402. case syscall.AF_INET:
  403. strategy = C.DomainStrategyIPv4Only
  404. case syscall.AF_INET6:
  405. strategy = C.DomainStrategyIPv6Only
  406. }
  407. addrs, lookupErr := t.dnsRouter.Lookup(ctx, rr.Target, adapter.DNSQueryOptions{
  408. LookupStrategy: strategy,
  409. })
  410. if lookupErr == nil {
  411. srvRecord.Addresses = common.Map(addrs, func(it netip.Addr) Address {
  412. var addrFamily int32
  413. if it.Is4() {
  414. addrFamily = syscall.AF_INET
  415. } else {
  416. addrFamily = syscall.AF_INET6
  417. }
  418. return Address{
  419. IfIndex: ifIndex,
  420. Family: addrFamily,
  421. Address: it.AsSlice(),
  422. }
  423. })
  424. }
  425. for _, a := range srvResponse.Answer {
  426. if cname, ok := a.(*mDNS.CNAME); ok && cname.Header().Name == rr.Target {
  427. srvRecord.CNAME = cname.Target
  428. break
  429. }
  430. }
  431. srvData = append(srvData, srvRecord)
  432. }
  433. }
  434. for _, rawRR := range txtResponse.Answer {
  435. switch rr := rawRR.(type) {
  436. case *mDNS.TXT:
  437. data := make([]byte, mDNS.Len(rr))
  438. _, packErr := mDNS.PackRR(rr, data, 0, nil, false)
  439. if packErr == nil {
  440. txtData = append(txtData, data)
  441. }
  442. }
  443. }
  444. canonicalName = mDNS.CanonicalName(hostname)
  445. canonicalType = mDNS.CanonicalName(sType)
  446. canonicalDomain = mDNS.CanonicalName(domain)
  447. return
  448. }
  449. func (t *resolve1Manager) SetLinkDNS(sender dbus.Sender, ifIndex int32, addresses []LinkDNS) *dbus.Error {
  450. t.linkAccess.Lock()
  451. defer t.linkAccess.Unlock()
  452. link, err := t.getLink(ifIndex)
  453. if err != nil {
  454. return wrapError(err)
  455. }
  456. link.address = addresses
  457. if len(addresses) > 0 {
  458. t.log(sender, "SetLinkDNS ", link.iif.Name, " ", strings.Join(common.Map(addresses, func(it LinkDNS) string {
  459. return M.AddrFromIP(it.Address).String()
  460. }), ", "))
  461. } else {
  462. t.log(sender, "SetLinkDNS ", link.iif.Name, " (empty)")
  463. }
  464. return t.postUpdate(link)
  465. }
  466. func (t *resolve1Manager) SetLinkDNSEx(sender dbus.Sender, ifIndex int32, addresses []LinkDNSEx) *dbus.Error {
  467. t.linkAccess.Lock()
  468. defer t.linkAccess.Unlock()
  469. link, err := t.getLink(ifIndex)
  470. if err != nil {
  471. return wrapError(err)
  472. }
  473. link.addressEx = addresses
  474. if len(addresses) > 0 {
  475. t.log(sender, "SetLinkDNSEx ", link.iif.Name, " ", strings.Join(common.Map(addresses, func(it LinkDNSEx) string {
  476. return M.SocksaddrFrom(M.AddrFromIP(it.Address), it.Port).String()
  477. }), ", "))
  478. } else {
  479. t.log(sender, "SetLinkDNSEx ", link.iif.Name, " (empty)")
  480. }
  481. return t.postUpdate(link)
  482. }
  483. func (t *resolve1Manager) SetLinkDomains(sender dbus.Sender, ifIndex int32, domains []LinkDomain) *dbus.Error {
  484. t.linkAccess.Lock()
  485. defer t.linkAccess.Unlock()
  486. link, err := t.getLink(ifIndex)
  487. if err != nil {
  488. return wrapError(err)
  489. }
  490. link.domain = domains
  491. if len(domains) > 0 {
  492. t.log(sender, "SetLinkDomains ", link.iif.Name, " ", strings.Join(common.Map(domains, func(domain LinkDomain) string {
  493. if !domain.RoutingOnly {
  494. return domain.Domain
  495. } else {
  496. return "~" + domain.Domain
  497. }
  498. }), ", "))
  499. } else {
  500. t.log(sender, "SetLinkDomains ", link.iif.Name, " (empty)")
  501. }
  502. return t.postUpdate(link)
  503. }
  504. func (t *resolve1Manager) SetLinkDefaultRoute(sender dbus.Sender, ifIndex int32, defaultRoute bool) *dbus.Error {
  505. t.linkAccess.Lock()
  506. defer t.linkAccess.Unlock()
  507. link, err := t.getLink(ifIndex)
  508. if err != nil {
  509. return err
  510. }
  511. link.defaultRoute = defaultRoute
  512. if defaultRoute {
  513. t.defaultRouteSequence = append(common.Filter(t.defaultRouteSequence, func(it int32) bool { return it != ifIndex }), ifIndex)
  514. } else {
  515. t.defaultRouteSequence = common.Filter(t.defaultRouteSequence, func(it int32) bool { return it != ifIndex })
  516. }
  517. var defaultRouteString string
  518. if defaultRoute {
  519. defaultRouteString = "yes"
  520. } else {
  521. defaultRouteString = "no"
  522. }
  523. t.log(sender, "SetLinkDefaultRoute ", link.iif.Name, " ", defaultRouteString)
  524. return t.postUpdate(link)
  525. }
  526. func (t *resolve1Manager) SetLinkLLMNR(ifIndex int32, llmnrMode string) *dbus.Error {
  527. return nil
  528. }
  529. func (t *resolve1Manager) SetLinkMulticastDNS(ifIndex int32, mdnsMode string) *dbus.Error {
  530. return nil
  531. }
  532. func (t *resolve1Manager) SetLinkDNSOverTLS(sender dbus.Sender, ifIndex int32, dotMode string) *dbus.Error {
  533. t.linkAccess.Lock()
  534. defer t.linkAccess.Unlock()
  535. link, err := t.getLink(ifIndex)
  536. if err != nil {
  537. return wrapError(err)
  538. }
  539. switch dotMode {
  540. case "yes":
  541. link.dnsOverTLS = true
  542. case "":
  543. dotMode = "no"
  544. fallthrough
  545. case "opportunistic", "no":
  546. link.dnsOverTLS = false
  547. }
  548. t.log(sender, "SetLinkDNSOverTLS ", link.iif.Name, " ", dotMode)
  549. return t.postUpdate(link)
  550. }
  551. func (t *resolve1Manager) SetLinkDNSSEC(ifIndex int32, dnssecMode string) *dbus.Error {
  552. return nil
  553. }
  554. func (t *resolve1Manager) SetLinkDNSSECNegativeTrustAnchors(ifIndex int32, domains []string) *dbus.Error {
  555. return nil
  556. }
  557. func (t *resolve1Manager) RevertLink(sender dbus.Sender, ifIndex int32) *dbus.Error {
  558. t.linkAccess.Lock()
  559. defer t.linkAccess.Unlock()
  560. link, err := t.getLink(ifIndex)
  561. if err != nil {
  562. return wrapError(err)
  563. }
  564. delete(t.links, ifIndex)
  565. t.log(sender, "RevertLink ", link.iif.Name)
  566. return t.postUpdate(link)
  567. }
  568. // TODO: implement RegisterService, UnregisterService
  569. func (t *resolve1Manager) RegisterService(sender dbus.Sender, identifier string, nameTemplate string, serviceType string, port uint16, priority uint16, weight uint16, txtRecords []TXTRecord) (objectPath dbus.ObjectPath, dbusErr *dbus.Error) {
  570. return "", wrapError(E.New("not implemented"))
  571. }
  572. func (t *resolve1Manager) UnregisterService(sender dbus.Sender, servicePath dbus.ObjectPath) error {
  573. return wrapError(E.New("not implemented"))
  574. }
  575. func (t *resolve1Manager) ResetStatistics() *dbus.Error {
  576. return nil
  577. }
  578. func (t *resolve1Manager) FlushCaches(sender dbus.Sender) *dbus.Error {
  579. t.dnsRouter.ClearCache()
  580. t.log(sender, "FlushCaches")
  581. return nil
  582. }
  583. func (t *resolve1Manager) ResetServerFeatures() *dbus.Error {
  584. return nil
  585. }
  586. func (t *resolve1Manager) postUpdate(link *TransportLink) *dbus.Error {
  587. if t.updateCallback != nil {
  588. return wrapError(t.updateCallback(link))
  589. }
  590. return nil
  591. }
  592. func rcodeError(rcode int) *dbus.Error {
  593. return dbus.NewError("org.freedesktop.resolve1.DnsError."+mDNS.RcodeToString[rcode], []any{mDNS.RcodeToString[rcode]})
  594. }
  595. func wrapError(err error) *dbus.Error {
  596. if err == nil {
  597. return nil
  598. }
  599. var rcode dns.RcodeError
  600. if errors.As(err, &rcode) {
  601. return rcodeError(int(rcode))
  602. }
  603. return dbus.MakeFailedError(err)
  604. }