Преглед на файлове

Only listen on each interface once

Ask Bjørn Hansen преди 13 години
родител
ревизия
75e3227e0f
променени са 2 файла, в които са добавени 54 реда и са изтрити 27 реда
  1. 3 27
      geodns.go
  2. 51 0
      util.go

+ 3 - 27
geodns.go

@@ -86,33 +86,9 @@ func main() {
 	setupPgeodnsZone(Zones)
 
 	go configReader(dirName, Zones)
-	for _, host := range strings.Split(*flaginter, ",") {
-		ip, port, err := net.SplitHostPort(host)
-		if err != nil {
-			switch {
-			case strings.Contains(err.Error(), "missing port in address"):
-				// 127.0.0.1
-				ip = host
-			case strings.Contains(err.Error(), "too many colons in address") &&
-				// [a:b::c]
-				strings.LastIndex(host, "]") == len(host)-1:
-				ip = host[1 : len(host)-1]
-				port = ""
-			case strings.Contains(err.Error(), "too many colons in address"):
-				// a:b::c
-				ip = host
-				port = ""
-			default:
-				log.Fatalf("Could not parse %s: %s\n", host, err)
-			}
-		}
-		if len(port) == 0 {
-			port = *flagport
-		}
-		host = net.JoinHostPort(ip, port)
-		if len(serverId) == 0 {
-			serverId = ip
-		}
+
+	inter := getInterfaces()
+	for _, host := range inter {
 		go listenAndServe(host, &Zones)
 	}
 

+ 51 - 0
util.go

@@ -0,0 +1,51 @@
+package main
+
+import (
+	"log"
+	"net"
+	"strings"
+)
+
+func getInterfaces() []string {
+
+	var inter []string
+	uniq := make(map[string]bool)
+
+	for _, host := range strings.Split(*flaginter, ",") {
+		ip, port, err := net.SplitHostPort(host)
+		if err != nil {
+			switch {
+			case strings.Contains(err.Error(), "missing port in address"):
+				// 127.0.0.1
+				ip = host
+			case strings.Contains(err.Error(), "too many colons in address") &&
+				// [a:b::c]
+				strings.LastIndex(host, "]") == len(host)-1:
+				ip = host[1 : len(host)-1]
+				port = ""
+			case strings.Contains(err.Error(), "too many colons in address"):
+				// a:b::c
+				ip = host
+				port = ""
+			default:
+				log.Fatalf("Could not parse %s: %s\n", host, err)
+			}
+		}
+		if len(port) == 0 {
+			port = *flagport
+		}
+		host = net.JoinHostPort(ip, port)
+		if uniq[host] {
+			continue
+		}
+		uniq[host] = true
+
+		if len(serverId) == 0 {
+			serverId = ip
+		}
+		inter = append(inter, host)
+
+	}
+
+	return inter
+}