dhcp4: correctly check errors from c.once
This commit is contained in:
parent
bef7168112
commit
df9a40557c
@ -173,3 +173,15 @@ func TestDHCPv4(t *testing.T) {
|
|||||||
strings.Join(diff.TrimLines(want), "\n")))
|
strings.Join(diff.TrimLines(want), "\n")))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestError(t *testing.T) {
|
||||||
|
c := dhcp4.Client{
|
||||||
|
Interface: nil,
|
||||||
|
}
|
||||||
|
if c.ObtainOrRenew() {
|
||||||
|
t.Fatalf("ObtainOrRenew unexpectedly succeeded")
|
||||||
|
}
|
||||||
|
if err := c.Err(); err == nil {
|
||||||
|
t.Fatalf("Err unexpectedly nil")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -18,7 +18,6 @@ package dhcp4
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
@ -81,6 +80,7 @@ func (c *Client) packet(xid uint32, opts []layers.DHCPOption) *layers.DHCPv4 {
|
|||||||
|
|
||||||
// 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
|
||||||
@ -90,13 +90,13 @@ func (c *Client) ObtainOrRenew() bool {
|
|||||||
LinuxSockDGRAM: true,
|
LinuxSockDGRAM: true,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.err = err
|
onceErr = err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.connection = conn
|
c.connection = conn
|
||||||
}
|
}
|
||||||
if c.connection == nil && c.Interface == nil {
|
if c.connection == nil && c.Interface == nil {
|
||||||
c.err = fmt.Errorf("Interface is nil")
|
onceErr = fmt.Errorf("Interface is nil")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if c.hardwareAddr == nil {
|
if c.hardwareAddr == nil {
|
||||||
@ -108,12 +108,16 @@ 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 {
|
||||||
log.Fatal(err)
|
onceErr = err
|
||||||
|
return
|
||||||
}
|
}
|
||||||
c.hostname = string(utsname.Nodename[:bytes.IndexByte(utsname.Nodename[:], 0)])
|
c.hostname = string(utsname.Nodename[:bytes.IndexByte(utsname.Nodename[:], 0)])
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// TODO: handle c.err from c.once
|
if onceErr != nil {
|
||||||
|
c.err = onceErr
|
||||||
|
return false // permanent error
|
||||||
|
}
|
||||||
c.err = nil // clear previous error
|
c.err = nil // clear previous error
|
||||||
ack, err := c.dhcpRequest()
|
ack, err := c.dhcpRequest()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user