aboutsummaryrefslogtreecommitdiff
path: root/fallback.go
diff options
context:
space:
mode:
Diffstat (limited to 'fallback.go')
-rw-r--r--fallback.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/fallback.go b/fallback.go
new file mode 100644
index 0000000..729a4e4
--- /dev/null
+++ b/fallback.go
@@ -0,0 +1,61 @@
+package proxy
+
+import "github.com/HimbeerserverDE/mt"
+
+func (cc *ClientConn) fallback() bool {
+ if cc.fallbackFrom == "" {
+ return false
+ }
+
+ fallback := config.Servers[cc.fallbackFrom].Fallback
+ if fallback == "" {
+ ack, _ := cc.SendCmd(cc.whyKicked)
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+
+ cc.mu.Lock()
+ cc.srv = nil
+ cc.mu.Unlock()
+
+ if srv := cc.server(); srv != nil {
+ srv.mu.Lock()
+ srv.clt = nil
+ srv.mu.Unlock()
+ }
+ }
+
+ return true
+ }
+
+ // Use HopRaw so the fallback server doesn't get saved
+ // as the last server.
+ if err := cc.HopRaw(fallback); err != nil {
+ cc.Log("<-", "fallback fail:", err)
+
+ ack, _ := cc.SendCmd(&mt.ToCltKick{
+ Reason: mt.Custom,
+ Custom: "Fallback failed.",
+ })
+
+ select {
+ case <-cc.Closed():
+ case <-ack:
+ cc.Close()
+
+ cc.mu.Lock()
+ cc.srv = nil
+ cc.mu.Unlock()
+
+ if srv := cc.server(); srv != nil {
+ srv.mu.Lock()
+ srv.clt = nil
+ srv.mu.Unlock()
+ }
+ }
+ }
+
+ return true
+}