diff options
author | insomniac <insomniacslk@users.noreply.github.com> | 2018-11-13 11:09:11 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-13 11:09:11 +0000 |
commit | 81701eacf8671ec9f6e1993c1384e42cebbc866c (patch) | |
tree | 93e61c46f0e6c50229a8547767bdb8e601dc12a3 /dhcpv4 | |
parent | 22ab333fff995af78b17bb533de93317fc7b65d5 (diff) |
Consolidated v6 and v4 server handlers (#196)
* Uniformed DHCPv6 and DHCPv4 servers
* Reverted main goroutine
* Reverted example code too
* Added conn fix
Diffstat (limited to 'dhcpv4')
-rw-r--r-- | dhcpv4/server.go | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/dhcpv4/server.go b/dhcpv4/server.go index 94e4578..8008769 100644 --- a/dhcpv4/server.go +++ b/dhcpv4/server.go @@ -78,28 +78,31 @@ func (s *Server) LocalAddr() net.Addr { return s.conn.LocalAddr() } -// ActivateAndServe starts the DHCPv4 server +// ActivateAndServe starts the DHCPv4 server. The listener will run in +// background, and can be interrupted with `Server.Close`. func (s *Server) ActivateAndServe() error { s.connMutex.Lock() - if s.conn == nil { - conn, err := net.ListenUDP("udp4", &s.localAddr) - if err != nil { - s.connMutex.Unlock() - return err - } - s.conn = conn + if s.conn != nil { + // this may panic if s.conn is closed but not reset properly. For that + // you should use `Server.Close`. + s.Close() + } + conn, err := net.ListenUDP("udp4", &s.localAddr) + if err != nil { + s.connMutex.Unlock() + return err } + s.conn = conn s.connMutex.Unlock() - defer s.Close() var ( pc *net.UDPConn ok bool ) if pc, ok = s.conn.(*net.UDPConn); !ok { - return fmt.Errorf("Error: not an UDPConn") + return fmt.Errorf("error: not an UDPConn") } if pc == nil { - return fmt.Errorf("ActivateAndServe: Invalid nil PacketConn") + return fmt.Errorf("ActivateAndServe: invalid nil PacketConn") } log.Printf("Server listening on %s", pc.LocalAddr()) log.Print("Ready to handle requests") @@ -115,7 +118,7 @@ func (s *Server) ActivateAndServe() error { if err != nil { switch err.(type) { case net.Error: - if err.(net.Error).Timeout() { + if !err.(net.Error).Timeout() { return err } // if timeout, silently skip and continue @@ -142,7 +145,9 @@ func (s *Server) Close() error { s.connMutex.Lock() defer s.connMutex.Unlock() if s.conn != nil { - return s.conn.Close() + ret := s.conn.Close() + s.conn = nil + return ret } return nil } |