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