cmd/ctrld: preserve OS error when updating listener config

This commit is contained in:
Cuong Manh Le
2023-08-09 23:55:45 +07:00
committed by Cuong Manh Le
parent 6e27f877ff
commit 82d887f52d
+8 -7
View File
@@ -1415,10 +1415,10 @@ func updateListenerConfig() {
_ = closer.Close() _ = closer.Close()
} }
}() }()
// listenOk reports whether we can listen on udp/tcp of given address. // tryListen attempts to listen on given udp and tcp address.
// Created listeners will be kept in listeners slice above, and close // Created listeners will be kept in listeners slice above, and close
// before function finished. // before function finished.
listenOk := func(addr string) bool { tryListen := func(addr string) error {
udpLn, udpErr := net.ListenPacket("udp", addr) udpLn, udpErr := net.ListenPacket("udp", addr)
if udpLn != nil { if udpLn != nil {
closers = append(closers, udpLn) closers = append(closers, udpLn)
@@ -1427,7 +1427,7 @@ func updateListenerConfig() {
if tcpLn != nil { if tcpLn != nil {
closers = append(closers, tcpLn) closers = append(closers, tcpLn)
} }
return udpErr == nil && tcpErr == nil return errors.Join(udpErr, tcpErr)
} }
logMsg := func(e *zerolog.Event, listenerNum int, format string, v ...any) { logMsg := func(e *zerolog.Event, listenerNum int, format string, v ...any) {
@@ -1476,11 +1476,12 @@ func updateListenerConfig() {
logMsg(mainLog.Load().Fatal(), n, "could not find available listen ip and port") logMsg(mainLog.Load().Fatal(), n, "could not find available listen ip and port")
} }
addr := net.JoinHostPort(listener.IP, strconv.Itoa(listener.Port)) addr := net.JoinHostPort(listener.IP, strconv.Itoa(listener.Port))
if listenOk(addr) { err := tryListen(addr)
if err == nil {
break break
} }
if !check.IP && !check.Port { if !check.IP && !check.Port {
logMsg(mainLog.Load().Fatal(), n, "failed to listen on: %s", addr) logMsg(mainLog.Load().Fatal(), n, "failed to listen: %v", err)
} }
if tryAllPort53 { if tryAllPort53 {
tryAllPort53 = false tryAllPort53 = false
@@ -1541,7 +1542,7 @@ func updateListenerConfig() {
listener.Port = oldPort listener.Port = oldPort
} }
if listener.IP == oldIP && listener.Port == oldPort { if listener.IP == oldIP && listener.Port == oldPort {
logMsg(mainLog.Load().Fatal(), n, "could not listener on: %s", net.JoinHostPort(listener.IP, strconv.Itoa(listener.Port))) logMsg(mainLog.Load().Fatal(), n, "could not listener on %s: %v", net.JoinHostPort(listener.IP, strconv.Itoa(listener.Port)), err)
} }
logMsg(mainLog.Load().Warn(), n, "could not listen on address: %s, pick a random ip+port", addr) logMsg(mainLog.Load().Warn(), n, "could not listen on address: %s, pick a random ip+port", addr)
attempts++ attempts++
@@ -1563,7 +1564,7 @@ func updateListenerConfig() {
for _, addr := range addrs { for _, addr := range addrs {
if netIP, ok := addr.(*net.IPNet); ok && netIP.IP.To4() != nil { if netIP, ok := addr.(*net.IPNet); ok && netIP.IP.To4() != nil {
addr := net.JoinHostPort(netIP.IP.String(), strconv.Itoa(listener.Port)) addr := net.JoinHostPort(netIP.IP.String(), strconv.Itoa(listener.Port))
if listenOk(addr) { if err := tryListen(addr); err == nil {
found = true found = true
listener.IP = netIP.IP.String() listener.IP = netIP.IP.String()
logMsg(mainLog.Load().Warn(), n, "use %s as listener address", listener.IP) logMsg(mainLog.Load().Warn(), n, "use %s as listener address", listener.IP)