Close UDP connection when listen port changes
This commit is contained in:
		
							parent
							
								
									2ed9dac3a5
								
							
						
					
					
						commit
						c3d9ae402d
					
				@ -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":
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user