diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2017-07-23 16:21:08 +0200 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2017-07-23 16:21:08 +0200 |
commit | c3d9ae402d431b7697686dbaf021f879c8ccab36 (patch) | |
tree | c2f2deb382e93b0e8afa3414386df0ca337c44d3 | |
parent | 2ed9dac3a51b296819380758f4390b0032243c61 (diff) |
Close UDP connection when listen port changes
-rw-r--r-- | src/config.go | 31 | ||||
-rw-r--r-- | src/uapi_darwin.go | 6 |
2 files changed, 14 insertions, 23 deletions
diff --git a/src/config.go b/src/config.go index c889de0..9751a18 100644 --- a/src/config.go +++ b/src/config.go @@ -2,7 +2,6 @@ package main import ( "bufio" - "errors" "fmt" "io" "net" @@ -105,8 +104,6 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { key := parts[0] value := parts[1] - fmt.Println(key, value) - switch key { /* interface configuration */ @@ -125,16 +122,21 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { } case "listen_port": - var port int - _, err := fmt.Sscanf(value, "%d", &port) - if err != nil || port > (1<<16) || port < 0 { + port, err := strconv.ParseUint(value, 10, 16) + if err != nil { logError.Println("Failed to set listen_port:", err) return &IPCError{Code: ipcErrorInvalidValue} } - device.net.mutex.Lock() - device.net.addr.Port = port - device.net.conn, err = net.ListenUDP("udp", device.net.addr) - device.net.mutex.Unlock() + netc := &device.net + netc.mutex.Lock() + if netc.addr.Port != int(port) { + if netc.conn != nil { + netc.conn.Close() + } + netc.addr.Port = int(port) + netc.conn, err = net.ListenUDP("udp", netc.addr) + } + netc.mutex.Unlock() if err != nil { logError.Println("Failed to create UDP listener:", err) return &IPCError{Code: ipcErrorInvalidValue} @@ -151,15 +153,10 @@ func ipcSetOperation(device *Device, socket *bufio.ReadWriter) *IPCError { return &IPCError{Code: ipcErrorInvalidValue} } device.mutex.RLock() - found, ok := device.peers[pubKey] + peer, _ := device.peers[pubKey] device.mutex.RUnlock() - if ok { - peer = found - } else { - peer = device.NewPeer(pubKey) - } if peer == nil { - panic(errors.New("bug: failed to find / create peer")) + peer = device.NewPeer(pubKey) } case "replace_peers": diff --git a/src/uapi_darwin.go b/src/uapi_darwin.go index ee6ee0b..9eee53c 100644 --- a/src/uapi_darwin.go +++ b/src/uapi_darwin.go @@ -7,12 +7,6 @@ import ( "time" ) -/* TODO: - * This code can be improved by using fsnotify once: - * https://github.com/fsnotify/fsnotify/pull/205 - * Is merged - */ - type UAPIListener struct { listener net.Listener // unix socket listener connNew chan net.Conn |