New Upstream Release - golang-github-hashicorp-mdns

Ready changes

Summary

Merged new upstream version: 1.0.5 (was: 1.0.3).

Resulting package

Built on 2023-05-15T23:42 (took 5m48s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases golang-github-hashicorp-mdns-dev

Lintian Result

Diff

diff --git a/client.go b/client.go
index c15e3ee..7d530e8 100644
--- a/client.go
+++ b/client.go
@@ -42,6 +42,8 @@ type QueryParam struct {
 	Interface           *net.Interface       // Multicast interface to use
 	Entries             chan<- *ServiceEntry // Entries Channel
 	WantUnicastResponse bool                 // Unicast response desired, as per 5.4 in RFC
+	DisableIPv4         bool                 // Whether to disable usage of IPv4 for MDNS operations. Does not affect discovered addresses.
+	DisableIPv6         bool                 // Whether to disable usage of IPv6 for MDNS operations. Does not affect discovered addresses.
 }
 
 // DefaultParams is used to return a default set of QueryParam's
@@ -52,6 +54,8 @@ func DefaultParams(service string) *QueryParam {
 		Timeout:             time.Second,
 		Entries:             make(chan *ServiceEntry),
 		WantUnicastResponse: false, // TODO(reddaly): Change this default.
+		DisableIPv4:         false,
+		DisableIPv6:         false,
 	}
 }
 
@@ -61,7 +65,7 @@ func DefaultParams(service string) *QueryParam {
 // either read or buffer.
 func Query(params *QueryParam) error {
 	// Create a new client
-	client, err := newClient()
+	client, err := newClient(!params.DisableIPv4, !params.DisableIPv6)
 	if err != nil {
 		return err
 	}
@@ -96,6 +100,9 @@ func Lookup(service string, entries chan<- *ServiceEntry) error {
 // Client provides a query interface that can be used to
 // search for service providers using mDNS
 type client struct {
+	use_ipv4 bool
+	use_ipv6 bool
+
 	ipv4UnicastConn *net.UDPConn
 	ipv6UnicastConn *net.UDPConn
 
@@ -108,29 +115,48 @@ type client struct {
 
 // NewClient creates a new mdns Client that can be used to query
 // for records
-func newClient() (*client, error) {
+func newClient(v4 bool, v6 bool) (*client, error) {
+	if !v4 && !v6 {
+		return nil, fmt.Errorf("Must enable at least one of IPv4 and IPv6 querying")
+	}
+
 	// TODO(reddaly): At least attempt to bind to the port required in the spec.
 	// Create a IPv4 listener
-	uconn4, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: 0})
-	if err != nil {
-		log.Printf("[ERR] mdns: Failed to bind to udp4 port: %v", err)
+	var uconn4 *net.UDPConn
+	var uconn6 *net.UDPConn
+	var mconn4 *net.UDPConn
+	var mconn6 *net.UDPConn
+	var err error
+
+	if v4 {
+		uconn4, err = net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: 0})
+		if err != nil {
+			log.Printf("[ERR] mdns: Failed to bind to udp4 port: %v", err)
+		}
 	}
-	uconn6, err := net.ListenUDP("udp6", &net.UDPAddr{IP: net.IPv6zero, Port: 0})
-	if err != nil {
-		log.Printf("[ERR] mdns: Failed to bind to udp6 port: %v", err)
+
+	if v6 {
+		uconn6, err = net.ListenUDP("udp6", &net.UDPAddr{IP: net.IPv6zero, Port: 0})
+		if err != nil {
+			log.Printf("[ERR] mdns: Failed to bind to udp6 port: %v", err)
+		}
 	}
 
 	if uconn4 == nil && uconn6 == nil {
 		return nil, fmt.Errorf("failed to bind to any unicast udp port")
 	}
 
-	mconn4, err := net.ListenMulticastUDP("udp4", nil, ipv4Addr)
-	if err != nil {
-		log.Printf("[ERR] mdns: Failed to bind to udp4 port: %v", err)
+	if v4 {
+		mconn4, err = net.ListenMulticastUDP("udp4", nil, ipv4Addr)
+		if err != nil {
+			log.Printf("[ERR] mdns: Failed to bind to udp4 port: %v", err)
+		}
 	}
-	mconn6, err := net.ListenMulticastUDP("udp6", nil, ipv6Addr)
-	if err != nil {
-		log.Printf("[ERR] mdns: Failed to bind to udp6 port: %v", err)
+	if v6 {
+		mconn6, err = net.ListenMulticastUDP("udp6", nil, ipv6Addr)
+		if err != nil {
+			log.Printf("[ERR] mdns: Failed to bind to udp6 port: %v", err)
+		}
 	}
 
 	if mconn4 == nil && mconn6 == nil {
@@ -138,6 +164,8 @@ func newClient() (*client, error) {
 	}
 
 	c := &client{
+		use_ipv4:          v4,
+		use_ipv6:          v6,
 		ipv4MulticastConn: mconn4,
 		ipv6MulticastConn: mconn6,
 		ipv4UnicastConn:   uconn4,
@@ -176,21 +204,25 @@ func (c *client) Close() error {
 // setInterface is used to set the query interface, uses system
 // default if not provided
 func (c *client) setInterface(iface *net.Interface) error {
-	p := ipv4.NewPacketConn(c.ipv4UnicastConn)
-	if err := p.SetMulticastInterface(iface); err != nil {
-		return err
-	}
-	p2 := ipv6.NewPacketConn(c.ipv6UnicastConn)
-	if err := p2.SetMulticastInterface(iface); err != nil {
-		return err
-	}
-	p = ipv4.NewPacketConn(c.ipv4MulticastConn)
-	if err := p.SetMulticastInterface(iface); err != nil {
-		return err
+	if c.use_ipv4 {
+		p := ipv4.NewPacketConn(c.ipv4UnicastConn)
+		if err := p.SetMulticastInterface(iface); err != nil {
+			return err
+		}
+		p = ipv4.NewPacketConn(c.ipv4MulticastConn)
+		if err := p.SetMulticastInterface(iface); err != nil {
+			return err
+		}
 	}
-	p2 = ipv6.NewPacketConn(c.ipv6MulticastConn)
-	if err := p2.SetMulticastInterface(iface); err != nil {
-		return err
+	if c.use_ipv6 {
+		p2 := ipv6.NewPacketConn(c.ipv6UnicastConn)
+		if err := p2.SetMulticastInterface(iface); err != nil {
+			return err
+		}
+		p2 = ipv6.NewPacketConn(c.ipv6MulticastConn)
+		if err := p2.SetMulticastInterface(iface); err != nil {
+			return err
+		}
 	}
 	return nil
 }
@@ -202,10 +234,14 @@ func (c *client) query(params *QueryParam) error {
 
 	// Start listening for response packets
 	msgCh := make(chan *dns.Msg, 32)
-	go c.recv(c.ipv4UnicastConn, msgCh)
-	go c.recv(c.ipv6UnicastConn, msgCh)
-	go c.recv(c.ipv4MulticastConn, msgCh)
-	go c.recv(c.ipv6MulticastConn, msgCh)
+	if c.use_ipv4 {
+		go c.recv(c.ipv4UnicastConn, msgCh)
+		go c.recv(c.ipv4MulticastConn, msgCh)
+	}
+	if c.use_ipv6 {
+		go c.recv(c.ipv6UnicastConn, msgCh)
+		go c.recv(c.ipv6MulticastConn, msgCh)
+	}
 
 	// Send the query
 	m := new(dns.Msg)
diff --git a/debian/changelog b/debian/changelog
index 02a5dae..1b86d0d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,13 @@
-golang-github-hashicorp-mdns (1.0.3-3) UNRELEASED; urgency=medium
+golang-github-hashicorp-mdns (1.0.5-1) UNRELEASED; urgency=medium
 
+  [ Tianon Gravi ]
   * Team upload.
   * Remove self from Uploaders
 
- -- Tianon Gravi <tianon@debian.org>  Wed, 23 Feb 2022 11:11:32 -0800
+  [ Debian Janitor ]
+  * New upstream release.
+
+ -- Tianon Gravi <tianon@debian.org>  Mon, 15 May 2023 23:36:38 -0000
 
 golang-github-hashicorp-mdns (1.0.3-2) unstable; urgency=medium
 
diff --git a/go.mod b/go.mod
index f66c20d..0a85a51 100644
--- a/go.mod
+++ b/go.mod
@@ -1,8 +1,8 @@
 module github.com/hashicorp/mdns
 
 require (
-	github.com/miekg/dns v1.1.27
-	golang.org/x/net v0.0.0-20190923162816-aa69164e4478
+	github.com/miekg/dns v1.1.41
+	golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1
 )
 
 go 1.13
diff --git a/go.sum b/go.sum
index 52581f6..f11ff48 100644
--- a/go.sum
+++ b/go.sum
@@ -1,19 +1,17 @@
-github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM=
-github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g=
-golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe h1:6fAMxZRR6sl1Uq8U61gxU+kPTs2tR8uOySCbBP7BN/M=
-golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
+github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1 h1:4qWs8cYYH6PoEFy4dfhDFgoMGkwAcETd+MmPdCPMzUc=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04 h1:cEhElsAv9LUt9ZUUocxzWe05oFLVd+AA2nstydTeI8g=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/server_test.go b/server_test.go
index 5a40e82..f729816 100644
--- a/server_test.go
+++ b/server_test.go
@@ -1,7 +1,7 @@
 package mdns
 
 import (
-	"sync/atomic"
+	"fmt"
 	"testing"
 	"time"
 )
@@ -23,37 +23,43 @@ func TestServer_Lookup(t *testing.T) {
 	defer serv.Shutdown()
 
 	entries := make(chan *ServiceEntry, 1)
-	var found int32 = 0
+	errCh := make(chan error, 1)
+	defer close(errCh)
 	go func() {
 		select {
 		case e := <-entries:
 			if e.Name != "hostname._foobar._tcp.local." {
-				t.Fatalf("bad: %v", e)
+				errCh <- fmt.Errorf("Entry has the wrong name: %+v", e)
+				return
 			}
 			if e.Port != 80 {
-				t.Fatalf("bad: %v", e)
+				errCh <- fmt.Errorf("Entry has the wrong port: %+v", e)
+				return
 			}
 			if e.Info != "Local web server" {
-				t.Fatalf("bad: %v", e)
+				errCh <- fmt.Errorf("Entry as the wrong Info: %+v", e)
+				return
 			}
-			atomic.StoreInt32(&found, 1)
-
+			errCh <- nil
 		case <-time.After(80 * time.Millisecond):
-			t.Fatalf("timeout")
+			errCh <- fmt.Errorf("Timed out waiting for response")
 		}
 	}()
 
 	params := &QueryParam{
-		Service: "_foobar._tcp",
-		Domain:  "local",
-		Timeout: 50 * time.Millisecond,
-		Entries: entries,
+		Service:     "_foobar._tcp",
+		Domain:      "local",
+		Timeout:     50 * time.Millisecond,
+		Entries:     entries,
+		DisableIPv6: true,
 	}
 	err = Query(params)
 	if err != nil {
 		t.Fatalf("err: %v", err)
 	}
-	if atomic.LoadInt32(&found) == 0 {
-		t.Fatalf("record not found")
+
+	err = <-errCh
+	if err != nil {
+		t.Fatalf("err: %v", err)
 	}
 }

Debdiff

File lists identical (after any substitutions)

No differences were encountered in the control files

More details

Full run details