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:
parent
8de4eb7ba1
commit
f8d1b4c8f2
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user