third_party: mdns: merge upstream logging changes

Change-Id: Id01653a2f6e0480b64dfbc6ba54fde85ef3a7e3d
MultiPart: 2/2
diff --git a/go/src/github.com/presotto/go-mdns-sd/README.google b/go/src/github.com/presotto/go-mdns-sd/README.google
index c6f348e..24025eb 100644
--- a/go/src/github.com/presotto/go-mdns-sd/README.google
+++ b/go/src/github.com/presotto/go-mdns-sd/README.google
@@ -1,5 +1,5 @@
-URL: https://github.com/presotto/go-mdns-sd/archive/80bc955e5588ac81a340d3a3fa9aacc2a1414d64.zip
-Version: 80bc955e5588ac81a340d3a3fa9aacc2a1414d64
+URL: https://github.com/presotto/go-mdns-sd/archive/343772046ec1b3840b8591799a7bbcc68ea47b4b.zip
+Version: 343772046ec1b3840b8591799a7bbcc68ea47b4b
 License: New BSD
 License File: LICENSE
 
diff --git a/go/src/github.com/presotto/go-mdns-sd/go_dns/README.google b/go/src/github.com/presotto/go-mdns-sd/go_dns/README.google
index d1c5de9..41e5f69 100644
--- a/go/src/github.com/presotto/go-mdns-sd/go_dns/README.google
+++ b/go/src/github.com/presotto/go-mdns-sd/go_dns/README.google
@@ -1,10 +1,11 @@
 URL: https://code.google.com/p/go/source/browse/src/pkg/net?r=01acf1dbe91f
-Version: 01acf1dbe91f	
+Version: 01acf1dbe91f
 License: BSD-like
 License File: LICENSE
 
 Description:
-	Go dns code
+Go dns code
 
 Local Modifications:
-	Extracted from package net into its own package.
+None beyond those done when extracting this code from the net package into its
+own package (github.com/presotto/go-mdns-sd/go_dns)
diff --git a/go/src/github.com/presotto/go-mdns-sd/mdns.go b/go/src/github.com/presotto/go-mdns-sd/mdns.go
index 70b08c4..f2be961 100644
--- a/go/src/github.com/presotto/go-mdns-sd/mdns.go
+++ b/go/src/github.com/presotto/go-mdns-sd/mdns.go
@@ -79,7 +79,7 @@
 		ifc:       ifc,
 		addr:      addr,
 		addresses: addresses,
-		cache:     newRRCache(mdns.debug),
+		cache:     newRRCache(mdns.logLevel),
 		mdns:      mdns,
 		ipver:     ipver,
 	}
@@ -145,16 +145,20 @@
 
 // Send a message on a multicast net and cache it locally.
 func (m *multicastIfc) sendMessage(msg *dns.Msg) {
-	if m.mdns.debug {
+	if m.mdns.logLevel >= 2 {
 		log.Printf("sending message %v\n", msg)
 	}
 	buf, ok := msg.Pack()
 	if !ok {
-		log.Printf("can't pack address message\n")
+		if m.mdns.logLevel >= 1 {
+			log.Printf("can't pack address message\n")
+		}
 		return
 	}
 	if _, err := m.conn.WriteTo(buf, m.addr); err != nil {
-		log.Printf("WriteTo failed %v %v", m.addr, err)
+		if m.mdns.logLevel >= 1 {
+			log.Printf("WriteTo failed %v %v", m.addr, err)
+		}
 	}
 
 	// Cache these RRs in case we ask about ourself.
@@ -250,7 +254,9 @@
 	// TTL to use for outgoing RRs.
 	ttl uint32
 
-	debug    bool
+	// TODO: Use a "real" leveled logging module, e.g.
+	// https://github.com/golang/glog.
+	logLevel int
 	loopback bool
 }
 
@@ -307,7 +313,7 @@
 }
 
 // Create a new MDNS service.
-func NewMDNS(host, v4addr, v6addr string, loopback, debug bool) (s *MDNS, err error) {
+func NewMDNS(host, v4addr, v6addr string, loopback bool, logLevel int) (s *MDNS, err error) {
 	s = new(MDNS)
 	if v4addr == "" {
 		v4addr = "224.0.0.251:5353"
@@ -321,7 +327,7 @@
 	if s.v6addr, err = net.ResolveUDPAddr("udp", v6addr); err != nil {
 		return nil, err
 	}
-	s.debug = debug
+	s.logLevel = logLevel
 	s.loopback = loopback
 	s.ttl = 120
 
@@ -400,7 +406,9 @@
 	for _, ifc := range ifcs {
 		addresses, addrErr := ifc.Addrs()
 		if addrErr != nil {
-			log.Printf("Addrs() failed: %s", addrErr)
+			if s.logLevel >= 1 {
+				log.Printf("Addrs() failed: %s", addrErr)
+			}
 			continue
 		}
 
@@ -419,7 +427,9 @@
 			case *net.IPNet:
 				// We either use loopback or non-loopback interfaces (generally loopback is for testing).
 				if (address.IP.IsLoopback() && !s.loopback) || (!address.IP.IsLoopback() && s.loopback) {
-					log.Printf("skipping ifc %d %s %s\n", ifc.Index, ifc.Name, address)
+					if s.logLevel >= 1 {
+						log.Printf("skipping ifc %d %s %s\n", ifc.Index, ifc.Name, address)
+					}
 					continue
 				}
 
@@ -452,7 +462,9 @@
 			}
 		}
 		m.stop()
-		log.Printf("removing ifc %s", m)
+		if s.logLevel >= 1 {
+			log.Printf("removing ifc %s", m)
+		}
 		delete(s.mifcs, k)
 	}
 
@@ -463,14 +475,20 @@
 		}
 		conn, err := net.ListenMulticastUDP("udp", &newm.ifc, newm.addr)
 		if err != nil {
-			log.Printf("ListenMulticastUDP %s: %v\n", newm, err)
+			if s.logLevel >= 1 {
+				log.Printf("ListenMulticastUDP %s: %v\n", newm, err)
+			}
 			continue
 		}
 		if err := SetMulticastTTL(conn, newm.ipver, 255); err != nil {
-			log.Printf("SetMulticastTTL %s: %v\n", newm, err)
+			if s.logLevel >= 1 {
+				log.Printf("SetMulticastTTL %s: %v\n", newm, err)
+			}
 		}
 		if err := SetMulticastLoopback(conn, newm.ipver, true); err != nil {
-			log.Printf("SetMulticastLoopback %s: %v\n", newm, err)
+			if s.logLevel >= 1 {
+				log.Printf("SetMulticastLoopback %s: %v\n", newm, err)
+			}
 		}
 		newm.conn = conn
 		s.mifcs[k] = newm
@@ -497,19 +515,25 @@
 // A go routine to listen for packets on a network.  Pass to the main loop with sufficient information to
 // answer on the same interface.
 func (s *MDNS) udpListener(ifc *multicastIfc) {
-	log.Printf("MDNS listening on %s with %v", ifc, ifc.addresses)
+	if s.logLevel >= 1 {
+		log.Printf("MDNS listening on %s with %v", ifc, ifc.addresses)
+	}
 
 	b := make([]byte, 2048)
 	for ifc.run() && s.run() {
 		n, a, err := ifc.conn.ReadFromUDP(b)
 		if err != nil {
-			log.Printf("error reading from udp: %v", err)
+			if s.logLevel >= 1 {
+				log.Printf("error reading from udp: %v", err)
+			}
 		}
 
 		// convert to dns packet
 		msg := new(dns.Msg)
 		if !msg.Unpack(b[0:n]) {
-			log.Printf("couldn't unpack %d byte dns msg from %v", n, a)
+			if s.logLevel >= 1 {
+				log.Printf("couldn't unpack %d byte dns msg from %v", n, a)
+			}
 		} else {
 			s.fromNet <- &msgFromNet{ifc, a, msg}
 		}
@@ -701,11 +725,13 @@
 		case m := <-s.fromNet:
 			if m.msg.Response {
 				// Cache the information.
-				if s.debug {
+				if s.logLevel >= 2 {
 					log.Printf("%s: response %v\n", s.hostName, m.msg)
 				}
 				if s.isDoppelGanger(m.msg.Answer) {
-					log.Printf("%s: name collision, %s also claims to be %s\n", s.hostName, m.sender, s.hostFQDN)
+					if s.logLevel >= 1 {
+						log.Printf("%s: name collision, %s also claims to be %s\n", s.hostName, m.sender, s.hostFQDN)
+					}
 					continue
 				}
 				for _, rr := range m.msg.Answer {
@@ -718,7 +744,7 @@
 				if s.hostName == "" {
 					break
 				}
-				if s.debug {
+				if s.logLevel >= 2 {
 					log.Printf("%s: question %v\n", s.hostName, m.msg)
 				}
 				s.answerQuestionFromNet(m)
@@ -731,7 +757,9 @@
 				s.services[req.service] = set
 			}
 			set[hostport(req.host, req.port)] = req
-			log.Printf("adding service %s %s %d\n", req.service, req.host, req.port)
+			if s.logLevel >= 1 {
+				log.Printf("adding service %s %s %d\n", req.service, req.host, req.port)
+			}
 
 			// Tell all the networks about the name
 			for _, mifc := range s.mifcs {
@@ -746,7 +774,9 @@
 			if len(set) == 0 {
 				delete(s.services, req.service)
 			}
-			log.Printf("removing service %s %s %d\n", req.service, req.host, req.port)
+			if s.logLevel >= 1 {
+				log.Printf("removing service %s %s %d\n", req.service, req.host, req.port)
+			}
 
 			// Tell all the networks about the goodbye
 			for _, mifc := range s.mifcs {
@@ -1078,7 +1108,7 @@
 	default:
 		return
 	}
-	if s.debug {
+	if s.logLevel >= 2 {
 		log.Printf("%s: changed %v\n", s.hostName, rr)
 	}
 	s.watchedLock.RLock()
diff --git a/go/src/github.com/presotto/go-mdns-sd/mdns_test.go b/go/src/github.com/presotto/go-mdns-sd/mdns_test.go
index 2712a0c..1877d3c 100644
--- a/go/src/github.com/presotto/go-mdns-sd/mdns_test.go
+++ b/go/src/github.com/presotto/go-mdns-sd/mdns_test.go
@@ -16,7 +16,7 @@
 
 var (
 	// common options
-	debugFlag = flag.Bool("debug", false, "turn on debugging")
+	logLevelFlag = flag.Int("v", 0, "log level")
 )
 
 type instance struct {
@@ -26,7 +26,7 @@
 }
 
 func createInstance(service string, inst instance) *MDNS {
-	s, err := NewMDNS(inst.host, "224.0.0.254:9999", "[FF02::FF]:9998", true, *debugFlag)
+	s, err := NewMDNS(inst.host, "224.0.0.254:9999", "[FF02::FF]:9998", true, *logLevelFlag)
 	if err != nil {
 		log.Fatal("can't translate address: %v", err)
 	}
diff --git a/go/src/github.com/presotto/go-mdns-sd/rrcache.go b/go/src/github.com/presotto/go-mdns-sd/rrcache.go
index f57c0c9..0b40d45 100644
--- a/go/src/github.com/presotto/go-mdns-sd/rrcache.go
+++ b/go/src/github.com/presotto/go-mdns-sd/rrcache.go
@@ -22,14 +22,14 @@
 	// The first key is the domain name and the second is the RR type
 	cache map[string]map[uint16][]*rrCacheEntry
 
-	debug bool
+	logLevel int
 }
 
 // Create a new rr cache.  Make sure at least the top level map exists.
-func newRRCache(debug bool) *rrCache {
+func newRRCache(logLevel int) *rrCache {
 	rrcache := new(rrCache)
 	rrcache.cache = make(map[string]map[uint16][]*rrCacheEntry, 0)
-	rrcache.debug = debug
+	rrcache.logLevel = logLevel
 	return rrcache
 }
 
@@ -50,7 +50,7 @@
 
 	// Remove all rr's matching this one's type if a cache flush is requested.
 	if rr.Header().Class&0x8000 == 0x8000 {
-		if c.debug {
+		if c.logLevel >= 2 {
 			log.Printf("cache flush for %v\n", rr)
 		}
 		dnmap[rr.Header().Rrtype] = make([]*rrCacheEntry, 0)
@@ -126,7 +126,7 @@
 			}
 		}
 		if same {
-			if c.debug {
+			if c.logLevel >= 2 {
 				log.Printf("replacing cached entry for %v with %v\n", rrslice[i].rr, rr)
 			}
 			rrslice[i] = entry
@@ -137,13 +137,13 @@
 	if firstnil >= 0 {
 		// Fill in a hole.
 		rrslice[firstnil] = entry
-		if c.debug {
+		if c.logLevel >= 2 {
 			log.Printf("adding cached entry for %v (in a hole)\n", rr)
 		}
 	} else {
 		// Append to the end of the list.
 		dnmap[rr.Header().Rrtype] = append(rrslice, entry)
-		if c.debug {
+		if c.logLevel >= 2 {
 			log.Printf("adding cached entry for %v (append)\n", rr)
 		}
 	}
diff --git a/go/src/github.com/presotto/go-mdns-sd/rrcache_test.go b/go/src/github.com/presotto/go-mdns-sd/rrcache_test.go
index 2a926e6..ade40e3 100644
--- a/go/src/github.com/presotto/go-mdns-sd/rrcache_test.go
+++ b/go/src/github.com/presotto/go-mdns-sd/rrcache_test.go
@@ -81,7 +81,7 @@
 }
 
 func TestRRCache(t *testing.T) {
-	cache := newRRCache(*debugFlag)
+	cache := newRRCache(*logLevelFlag)
 	// Cache a number of RRs with short TTLs.
 	for _, rr := range short {
 		cache.Add(rr)