@@ -424,9 +424,11 @@ loop:
424424 xxlans := append (msg .Answer , msg .Extra ... )
425425 for _ , ans := range xxlans {
426426 ansname , aerr := xdns .AName (ans )
427- // expect answers only for the service name client queried for
428- if (aerr != nil ) || (c .oneshot && ! strings .Contains (ansname , qctx .svc )) {
429- log .V ("mdns: listen: ignoring %s ans for %s svc; err? %v" , ansname , qctx .svc , aerr )
427+ tracked := c .isTracked (ansname )
428+ // expect answers only for the service name client queried for, or
429+ // an already tracked alias (ex: cname targets)
430+ if (aerr != nil ) || (c .oneshot && ! strings .Contains (ansname , qctx .svc ) && ! tracked ) {
431+ log .V ("mdns: listen: ignoring %s ans for %s svc; tracked? %t; err? %v" , ansname , qctx .svc , tracked , aerr )
430432 continue
431433 }
432434 log .D ("mdns: listen: processing %s ans for %s" , ansname , qname )
@@ -446,6 +448,10 @@ loop:
446448 disco = c .track (rr .Hdr .Name )
447449 disco .txt = rr .Txt
448450 // todo: r.ans = ans ?
451+ case * dns.CNAME :
452+ disco = c .track (rr .Hdr .Name )
453+ disco .target = rr .Target
454+ c .alias (rr .Hdr .Name , rr .Target )
449455 case * dns.A :
450456 disco = c .track (rr .Hdr .Name )
451457 // todo: append to ip4?
@@ -595,6 +601,13 @@ func (c *client) track(name string) *dnssdanswer {
595601 return c .trackLocked (name )
596602}
597603
604+ func (c * client ) isTracked (name string ) bool {
605+ c .tmu .RLock ()
606+ defer c .tmu .RUnlock ()
607+ _ , ok := c .tracker [name ]
608+ return ok
609+ }
610+
598611// alias sets up mapping between two tracked entries;
599612// src and dst are NOT normalized.
600613func (c * client ) alias (src , dst string ) {
0 commit comments