From 7b476e38be978ffe74e1e701f3834b64212144fe Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Mon, 17 Jul 2023 16:22:46 +0000 Subject: [PATCH] cmd/ctrld: do not spawn extra listener if conflicted in cd mode --- cmd/ctrld/prog.go | 38 ++------------------------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/cmd/ctrld/prog.go b/cmd/ctrld/prog.go index cf3b847..cd42e77 100644 --- a/cmd/ctrld/prog.go +++ b/cmd/ctrld/prog.go @@ -1,14 +1,12 @@ package main import ( - "errors" "fmt" "math/rand" "net" "os" "strconv" "sync" - "syscall" "github.com/kardianos/service" @@ -28,8 +26,6 @@ var logf = func(format string, args ...any) { mainLog.Debug().Msgf(format, args...) } -var errWindowsAddrInUse = syscall.Errno(0x2740) - var svcConfig = &service.Config{ Name: "ctrld", DisplayName: "Control-D Helper Service", @@ -132,39 +128,9 @@ func (p *prog) run() { } addr := net.JoinHostPort(listenerConfig.IP, strconv.Itoa(listenerConfig.Port)) mainLog.Info().Msgf("starting DNS server on listener.%s: %s", listenerNum, addr) - err := p.serveDNS(listenerNum) - if err != nil && !defaultConfigWritten && cdUID == "" { - mainLog.Fatal().Err(err).Msgf("Unable to start dns proxy on listener.%s", listenerNum) - return + if err := p.serveDNS(listenerNum); err != nil { + mainLog.Fatal().Err(err).Msgf("unable to start dns proxy on listener.%s", listenerNum) } - 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) }