73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
/*
|
|
Multiserver is a multi-server minetest reverse proxy capable of
|
|
media and definition multiplexing
|
|
*/
|
|
package main
|
|
|
|
import (
|
|
"log"
|
|
"net"
|
|
)
|
|
|
|
func main() {
|
|
defaultSrv, ok := ConfKey("default_server").(string)
|
|
if !ok {
|
|
log.Fatal("Default server name not set or not a string")
|
|
}
|
|
|
|
_, ok = ConfKey("servers:" + defaultSrv + ":address").(string)
|
|
if !ok {
|
|
log.Fatal("Default server address not set or not a string")
|
|
}
|
|
|
|
host, ok := ConfKey("host").(string)
|
|
if !ok {
|
|
host = "0.0.0.0:33000"
|
|
}
|
|
|
|
lc, err := net.ListenPacket("udp", host)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer lc.Close()
|
|
|
|
log.Print("Listening on " + host)
|
|
|
|
l := Listen(lc)
|
|
|
|
Announce(AnnounceStart)
|
|
|
|
for {
|
|
clt, err := l.Accept()
|
|
if err != nil {
|
|
log.Print(err)
|
|
continue
|
|
}
|
|
|
|
log.Print(clt.Addr(), " connected")
|
|
|
|
fin := make(chan *Conn)
|
|
go Init(nil, clt, true, false, fin)
|
|
|
|
go func() {
|
|
srv := <-fin
|
|
|
|
if srv == nil {
|
|
select {
|
|
case <-clt.Closed():
|
|
clt.Close()
|
|
default:
|
|
clt.CloseWith(AccessDeniedServerFail, "", false)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
clt.SetServer(srv)
|
|
|
|
go Proxy(clt, srv)
|
|
go Proxy(srv, clt)
|
|
}()
|
|
}
|
|
}
|