mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-09-29 13:51:51 +02:00
cmd/ctrld: ignore syscall.EINTR on Linux
Observing while tested on Ubuntu 22.04.1, the request to reset using systemd resolved via dbus may be interruped.
This commit is contained in:
1 parent
8a2c48e996
commit
9fc546443b
1 file changed
+16
-6
+16
-6
@@ -7,6 +7,7 @@ import (
|
|||||||
"net/netip"
|
"net/netip"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"github.com/insomniacslk/dhcp/dhcpv4"
|
"github.com/insomniacslk/dhcp/dhcpv4"
|
||||||
"github.com/insomniacslk/dhcp/dhcpv4/client4"
|
"github.com/insomniacslk/dhcp/dhcpv4/client4"
|
||||||
@@ -61,6 +62,7 @@ func setDNS(iface *net.Interface, nameservers []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func resetDNS(iface *net.Interface) error {
|
func resetDNS(iface *net.Interface) error {
|
||||||
|
var ns []string
|
||||||
c := client4.NewClient()
|
c := client4.NewClient()
|
||||||
conversation, err := c.Exchange(iface.Name)
|
conversation, err := c.Exchange(iface.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -69,11 +71,9 @@ func resetDNS(iface *net.Interface) error {
|
|||||||
for _, packet := range conversation {
|
for _, packet := range conversation {
|
||||||
if packet.MessageType() == dhcpv4.MessageTypeAck {
|
if packet.MessageType() == dhcpv4.MessageTypeAck {
|
||||||
nameservers := packet.DNS()
|
nameservers := packet.DNS()
|
||||||
ns := make([]string, 0, len(nameservers))
|
|
||||||
for _, nameserver := range nameservers {
|
for _, nameserver := range nameservers {
|
||||||
ns = append(ns, nameserver.String())
|
ns = append(ns, nameserver.String())
|
||||||
}
|
}
|
||||||
_ = setDNS(iface, ns)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ func resetDNS(iface *net.Interface) error {
|
|||||||
c := client6.NewClient()
|
c := client6.NewClient()
|
||||||
conversation, err := c.Exchange(iface.Name)
|
conversation, err := c.Exchange(iface.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
mainLog.Warn().Err(err).Msg("failed to exchange DHCPv6")
|
||||||
}
|
}
|
||||||
for _, packet := range conversation {
|
for _, packet := range conversation {
|
||||||
if packet.Type() == dhcpv6.MessageTypeReply {
|
if packet.Type() == dhcpv6.MessageTypeReply {
|
||||||
@@ -90,15 +90,16 @@ func resetDNS(iface *net.Interface) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
nameservers := msg.Options.DNS()
|
nameservers := msg.Options.DNS()
|
||||||
ns := make([]string, 0, len(nameservers))
|
|
||||||
for _, nameserver := range nameservers {
|
for _, nameserver := range nameservers {
|
||||||
ns = append(ns, nameserver.String())
|
ns = append(ns, nameserver.String())
|
||||||
}
|
}
|
||||||
_ = setDNS(iface, ns)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
return ignoringEINTR(func() error {
|
||||||
|
return setDNS(iface, ns)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func currentDNS(iface *net.Interface) []string {
|
func currentDNS(iface *net.Interface) []string {
|
||||||
@@ -147,3 +148,12 @@ func getDNSByNmcli(iface string) []string {
|
|||||||
}
|
}
|
||||||
return dns
|
return dns
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ignoringEINTR(fn func() error) error {
|
||||||
|
for {
|
||||||
|
err := fn()
|
||||||
|
if err != syscall.EINTR {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user