internal/dhcp4: make persistent errors actally persistent (#62)

Previously, a permanent error would not be persisted for future
invocations of ObtainOrRenew. In practice, the daemon immediately
exited, so this made no difference.
This commit is contained in:
Robert Obryk 2020-11-23 09:35:00 +01:00 committed by GitHub
parent 8de4eb7ba1
commit f8d1b4c8f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -44,6 +44,7 @@ type Client struct {
err error err error
once sync.Once once sync.Once
onceErr error
connection net.PacketConn connection net.PacketConn
hardwareAddr net.HardwareAddr hardwareAddr net.HardwareAddr
hostname string hostname string
@ -84,7 +85,6 @@ var errNAK = errors.New("received DHCPNAK")
// ObtainOrRenew returns false when encountering a permanent error. // ObtainOrRenew returns false when encountering a permanent error.
func (c *Client) ObtainOrRenew() bool { func (c *Client) ObtainOrRenew() bool {
var onceErr error
c.once.Do(func() { c.once.Do(func() {
if c.timeNow == nil { if c.timeNow == nil {
c.timeNow = time.Now c.timeNow = time.Now
@ -94,13 +94,13 @@ func (c *Client) ObtainOrRenew() bool {
LinuxSockDGRAM: true, LinuxSockDGRAM: true,
}) })
if err != nil { if err != nil {
onceErr = err c.onceErr = err
return return
} }
c.connection = conn c.connection = conn
} }
if c.connection == nil && c.Interface == nil { if c.connection == nil && c.Interface == nil {
onceErr = fmt.Errorf("c.Interface is nil") c.onceErr = fmt.Errorf("c.Interface is nil")
return return
} }
if c.hardwareAddr == nil && c.HWAddr != nil { if c.hardwareAddr == nil && c.HWAddr != nil {
@ -115,14 +115,14 @@ func (c *Client) ObtainOrRenew() bool {
if c.hostname == "" { if c.hostname == "" {
var utsname unix.Utsname var utsname unix.Utsname
if err := unix.Uname(&utsname); err != nil { if err := unix.Uname(&utsname); err != nil {
onceErr = err c.onceErr = err
return return
} }
c.hostname = string(utsname.Nodename[:bytes.IndexByte(utsname.Nodename[:], 0)]) c.hostname = string(utsname.Nodename[:bytes.IndexByte(utsname.Nodename[:], 0)])
} }
}) })
if onceErr != nil { if c.onceErr != nil {
c.err = onceErr c.err = c.onceErr
return false // permanent error return false // permanent error
} }
c.err = nil // clear previous error c.err = nil // clear previous error