cmd/ctrld: do not spawn extra listener if conflicted in cd mode

This commit is contained in:
Cuong Manh Le
2023-08-09 23:54:23 +07:00
committed by Cuong Manh Le
parent 0a7d3445f4
commit 7b476e38be
+2 -36
View File
@@ -1,14 +1,12 @@
package main package main
import ( import (
"errors"
"fmt" "fmt"
"math/rand" "math/rand"
"net" "net"
"os" "os"
"strconv" "strconv"
"sync" "sync"
"syscall"
"github.com/kardianos/service" "github.com/kardianos/service"
@@ -28,8 +26,6 @@ var logf = func(format string, args ...any) {
mainLog.Debug().Msgf(format, args...) mainLog.Debug().Msgf(format, args...)
} }
var errWindowsAddrInUse = syscall.Errno(0x2740)
var svcConfig = &service.Config{ var svcConfig = &service.Config{
Name: "ctrld", Name: "ctrld",
DisplayName: "Control-D Helper Service", DisplayName: "Control-D Helper Service",
@@ -132,39 +128,9 @@ func (p *prog) run() {
} }
addr := net.JoinHostPort(listenerConfig.IP, strconv.Itoa(listenerConfig.Port)) addr := net.JoinHostPort(listenerConfig.IP, strconv.Itoa(listenerConfig.Port))
mainLog.Info().Msgf("starting DNS server on listener.%s: %s", listenerNum, addr) mainLog.Info().Msgf("starting DNS server on listener.%s: %s", listenerNum, addr)
err := p.serveDNS(listenerNum) if err := p.serveDNS(listenerNum); err != nil {
if err != nil && !defaultConfigWritten && cdUID == "" { mainLog.Fatal().Err(err).Msgf("unable to start dns proxy on listener.%s", listenerNum)
mainLog.Fatal().Err(err).Msgf("Unable to start dns proxy on listener.%s", listenerNum)
return
} }
if err == nil {
return
}
if opErr, ok := err.(*net.OpError); ok && listenerNum == "0" {
if sErr, ok := opErr.Err.(*os.SyscallError); ok && errors.Is(opErr.Err, syscall.EADDRINUSE) || errors.Is(sErr.Err, errWindowsAddrInUse) {
mainLog.Warn().Msgf("Address %s already in used, pick a random one", addr)
ip := randomLocalIP()
listenerConfig.IP = ip
port := listenerConfig.Port
cfg.Upstream = map[string]*ctrld.UpstreamConfig{"0": cfg.Upstream["0"]}
if err := writeConfigFile(); err != nil {
mainLog.Fatal().Err(err).Msg("failed to write config file")
} else {
mainLog.Info().Msg("writing config file to: " + defaultConfigFile)
}
p.mu.Lock()
p.cfg.Service.AllocateIP = true
p.mu.Unlock()
p.preRun()
mainLog.Info().Msgf("starting DNS server on listener.%s: %s", listenerNum, net.JoinHostPort(ip, strconv.Itoa(port)))
if err := p.serveDNS(listenerNum); err != nil {
mainLog.Fatal().Err(err).Msgf("Unable to start dns proxy on listener.%s", listenerNum)
return
}
}
}
mainLog.Fatal().Err(err).Msgf("Unable to start dns proxy on listener.%s", listenerNum)
}(listenerNum) }(listenerNum)
} }