mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
44 lines
1.0 KiB
Go
44 lines
1.0 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
|
|
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
|
|
"tailscale.com/util/dnsname"
|
|
)
|
|
|
|
// searchDomains returns the current search domains config.
|
|
func searchDomains() ([]dnsname.FQDN, error) {
|
|
flags := winipcfg.GAAFlagIncludeGateways |
|
|
winipcfg.GAAFlagIncludePrefix
|
|
|
|
aas, err := winipcfg.GetAdaptersAddresses(syscall.AF_UNSPEC, flags)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("winipcfg.GetAdaptersAddresses: %w", err)
|
|
}
|
|
|
|
var sds []dnsname.FQDN
|
|
for _, aa := range aas {
|
|
if aa.OperStatus != winipcfg.IfOperStatusUp {
|
|
continue
|
|
}
|
|
|
|
// Skip if software loopback or other non-physical types
|
|
// This is to avoid the "Loopback Pseudo-Interface 1" issue we see on windows
|
|
if aa.IfType == winipcfg.IfTypeSoftwareLoopback {
|
|
continue
|
|
}
|
|
|
|
for a := aa.FirstDNSSuffix; a != nil; a = a.Next {
|
|
d, err := dnsname.ToFQDN(a.String())
|
|
if err != nil {
|
|
mainLog.Load().Debug().Err(err).Msgf("failed to parse domain: %s", a.String())
|
|
continue
|
|
}
|
|
sds = append(sds, d)
|
|
}
|
|
}
|
|
return sds, nil
|
|
}
|