@@ -501,6 +501,34 @@ func sprintName(s string) string {
501501 return string (dst )
502502}
503503
504+ func sprintCAAValue (s string ) string {
505+ src := []byte (s )
506+ dst := make ([]byte , 0 , len (src ))
507+ dst = append (dst , '"' )
508+ for i := 0 ; i < len (src ); {
509+ if i + 1 < len (src ) && src [i ] == '\\' && src [i + 1 ] == '.' {
510+ dst = append (dst , src [i :i + 2 ]... )
511+ i += 2
512+ } else {
513+ b , n := nextByte (src , i )
514+ if n == 0 {
515+ i ++ // dangling back slash
516+ } else if b == '.' {
517+ dst = append (dst , b )
518+ } else {
519+ if b < ' ' || b > '~' {
520+ dst = appendByte (dst , b )
521+ } else {
522+ dst = append (dst , b )
523+ }
524+ }
525+ i += n
526+ }
527+ }
528+ dst = append (dst , '"' )
529+ return string (dst )
530+ }
531+
504532func sprintTxt (txt []string ) string {
505533 var out []byte
506534 for i , s := range txt {
@@ -543,21 +571,24 @@ func appendTXTStringByte(s []byte, b byte) []byte {
543571 return append (s , '\\' , b )
544572 }
545573 if b < ' ' || b > '~' {
546- var buf [3 ]byte
547- bufs := strconv .AppendInt (buf [:0 ], int64 (b ), 10 )
548- s = append (s , '\\' )
549- for i := 0 ; i < 3 - len (bufs ); i ++ {
550- s = append (s , '0' )
551- }
552- for _ , r := range bufs {
553- s = append (s , r )
554- }
555- return s
556-
574+ return appendByte (s , b )
557575 }
558576 return append (s , b )
559577}
560578
579+ func appendByte (s []byte , b byte ) []byte {
580+ var buf [3 ]byte
581+ bufs := strconv .AppendInt (buf [:0 ], int64 (b ), 10 )
582+ s = append (s , '\\' )
583+ for i := 0 ; i < 3 - len (bufs ); i ++ {
584+ s = append (s , '0' )
585+ }
586+ for _ , r := range bufs {
587+ s = append (s , r )
588+ }
589+ return s
590+ }
591+
561592func nextByte (b []byte , offset int ) (byte , int ) {
562593 if offset >= len (b ) {
563594 return 0 , 0
@@ -1527,8 +1558,6 @@ func (rr *EUI64) copy() RR { return &EUI64{*rr.Hdr.copyHeader(), rr.Ad
15271558func (rr * EUI64 ) String () string { return rr .Hdr .String () + euiToString (rr .Address , 64 ) }
15281559func (rr * EUI64 ) len () int { return rr .Hdr .len () + 8 }
15291560
1530- // Support in incomplete - just handle it as unknown record
1531- /*
15321561type CAA struct {
15331562 Hdr RR_Header
15341563 Flag uint8
@@ -1538,14 +1567,9 @@ type CAA struct {
15381567
15391568func (rr * CAA ) Header () * RR_Header { return & rr .Hdr }
15401569func (rr * CAA ) copy () RR { return & CAA {* rr .Hdr .copyHeader (), rr .Flag , rr .Tag , rr .Value } }
1541- func (rr *CAA) len() int { return rr.Hdr.len() + 1 + len(rr.Tag) + 1 + len(rr.Value) }
1570+ func (rr * CAA ) len () int { return rr .Hdr .len () + 1 + len (rr .Tag ) + len (rr .Value )/ 2 }
1571+ func (rr * CAA ) String () string { return rr .Hdr .String () + strconv .Itoa (int (rr .Flag )) + " " + rr .Tag + " " + sprintCAAValue (rr .Value ) }
15421572
1543- func (rr *CAA) String() string {
1544- s := rr.Hdr.String() + strconv.FormatInt(int64(rr.Flag), 10) + " " + rr.Tag
1545- s += strconv.QuoteToASCII(rr.Value)
1546- return s
1547- }
1548- */
15491573
15501574type UID struct {
15511575 Hdr RR_Header
@@ -1668,10 +1692,10 @@ func copyIP(ip net.IP) net.IP {
16681692
16691693// Map of constructors for each RR type.
16701694var typeToRR = map [uint16 ]func () RR {
1671- TypeA : func () RR { return new (A ) },
1672- TypeAAAA : func () RR { return new (AAAA ) },
1673- TypeAFSDB : func () RR { return new (AFSDB ) },
1674- // TypeCAA: func() RR { return new(CAA) },
1695+ TypeA : func () RR { return new (A ) },
1696+ TypeAAAA : func () RR { return new (AAAA ) },
1697+ TypeAFSDB : func () RR { return new (AFSDB ) },
1698+ TypeCAA : func () RR { return new (CAA ) },
16751699 TypeCDS : func () RR { return new (CDS ) },
16761700 TypeCERT : func () RR { return new (CERT ) },
16771701 TypeCNAME : func () RR { return new (CNAME ) },
0 commit comments