mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-08-10 13:20:33 +02:00
cmd/ctrld: do not spawn extra listener if conflicted in cd mode
This commit is contained in:
+2
-36
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user