Patch title: Release 90 bulk changes
Abstract:
File: /protocol/dns/client.pli
Key:
    Removed line
    Added line
   
abstract
  [This is a DNS client implementation, according to RFC 103


function dns_query name field dns timeout -> answer
  arg Str name ; arg Int field ; arg Str dns ; arg Float tim
  if field=1 and dns:len=0
    answer := name_ip name
    if answer<>""
      return
  if field=15 and dns:len=0
    var Data:NameDomain d :> name_database:data:domain name
    if exists:d
      answer := ""
      each m d:mail
        answer += (shunt answer:len>0 " " "")+m
      return
abstract
  [This is a DNS client implementation, according to RFC 103


function dns_query name field dns timeout -> answer
  arg Str name ; arg Int field ; arg Str dns ; arg Float tim
  if field=1 and dns:len=0
    answer := name_ip name
    if answer<>""
      return
  if field=15 and dns:len=0
    var Data:NameDomain d :> name_database:data:domain name
    if exists:d
      answer := ""
      each m d:mail
        answer += (shunt answer:len>0 " " "")+m
      return
  var CBool use_cache := dns=""
  var Str name2 := name ; var Int count := 3
  part query_name
    answer := ""
    var Int limit := 512
    var Address buf := memory_allocate limit null
    var Pointer:DnsHeader h :> buf map DnsHeader ; var Int o
    h id := 0
    h flags := 100h
    h qdcount := 1
    h ancount := 0
    h nscount := 0
    h arcount := 0
    write_name buf offset limit name2
    var Pointer:DnsTail t :> (buf translate Byte offset) map
    t qtype := field
    t qclass := 1
    (var Str raw_query) set buf offset true
  var Str name2 := name ; var Int count := 3
  part query_name
    answer := ""
    var Int limit := 512
    var Address buf := memory_allocate limit null
    var Pointer:DnsHeader h :> buf map DnsHeader ; var Int o
    h id := 0
    h flags := 100h
    h qdcount := 1
    h ancount := 0
    h nscount := 0
    h arcount := 0
    write_name buf offset limit name2
    var Pointer:DnsTail t :> (buf translate Byte offset) map
    t qtype := field
    t qclass := 1
    (var Str raw_query) set buf offset true
    if dns=""
      var Str raw_answer := query_cache raw_query
    var Str raw_answer
    if dns<>""
      raw_answer := query_provider raw_query dns timeout
    eif use_cache
      raw_answer := query_cache raw_query
      if raw_answer=""
        raw_answer := query_providers raw_query
    else
      if raw_answer=""
        raw_answer := query_providers raw_query
    else
      raw_answer := query_provider raw_query dns timeout
      raw_answer := query_providers raw_query
    buf := raw_answer characters ; limit := raw_answer len
    if DnsHeader:size>limit
      return
    h :> buf map DnsHeader ; offset := DnsHeader size
    var Str alias := name2
    var Index mail_servers
    for (var Int i) 0 h:qdcount+h:ancount+h:nscount-1
      var Str id := read_name buf offset limit
      if offset+DnsTail:size>limit
        return
      var Pointer:DnsTail t :> (buf translate Byte offset) m
      if i>=h:qdcount
        if offset+DnsAnswer:size>limit
          return
        var Pointer:DnsAnswer a :> (buf translate Byte offse
        if offset+a:rdlength>limit
          return
        if t:qtype=1 and a:rdlength=4
          var Str ip := ""
          for (var Int j) 0 3
            ip += (shunt j=0 "" ".")+string:(cast ((buf tran
          if id=alias and field=1
            answer := ip
        eif t:qtype=5
          if id=alias
            var Int offset2 := offset ; alias := read_name b
        eif t:qtype=15 and a:rdlength>=3
          if id=alias and field=15
            var Int priority := (buf translate Byte offset) 
            var Int offset2 := offset+uInt16:size ; var Str 
            mail_servers insert (right string:priority 5 " "
        eif t:qtype=16 and a:rdlength>=1
          if id=alias
            answer set (memory_allocate a:rdlength-1 address
            memory_copy (buf translate Byte offset+1) answer
        offset += a:rdlength
    if field=15
      var Pointer:Arrow cursor :> mail_servers first
      while cursor<>null
        answer += (shunt answer:len>0 " " "")+(cursor map St
        cursor :> mail_servers next cursor
    if answer="" and alias<>name2 and count>0
      name2 := alias ; count -= 1
      restart query_name
    buf := raw_answer characters ; limit := raw_answer len
    if DnsHeader:size>limit
      return
    h :> buf map DnsHeader ; offset := DnsHeader size
    var Str alias := name2
    var Index mail_servers
    for (var Int i) 0 h:qdcount+h:ancount+h:nscount-1
      var Str id := read_name buf offset limit
      if offset+DnsTail:size>limit
        return
      var Pointer:DnsTail t :> (buf translate Byte offset) m
      if i>=h:qdcount
        if offset+DnsAnswer:size>limit
          return
        var Pointer:DnsAnswer a :> (buf translate Byte offse
        if offset+a:rdlength>limit
          return
        if t:qtype=1 and a:rdlength=4
          var Str ip := ""
          for (var Int j) 0 3
            ip += (shunt j=0 "" ".")+string:(cast ((buf tran
          if id=alias and field=1
            answer := ip
        eif t:qtype=5
          if id=alias
            var Int offset2 := offset ; alias := read_name b
        eif t:qtype=15 and a:rdlength>=3
          if id=alias and field=15
            var Int priority := (buf translate Byte offset) 
            var Int offset2 := offset+uInt16:size ; var Str 
            mail_servers insert (right string:priority 5 " "
        eif t:qtype=16 and a:rdlength>=1
          if id=alias
            answer set (memory_allocate a:rdlength-1 address
            memory_copy (buf translate Byte offset+1) answer
        offset += a:rdlength
    if field=15
      var Pointer:Arrow cursor :> mail_servers first
      while cursor<>null
        answer += (shunt answer:len>0 " " "")+(cursor map St
        cursor :> mail_servers next cursor
    if answer="" and alias<>name2 and count>0
      name2 := alias ; count -= 1
      restart query_name
    if answer="" and use_cache
      use_cache := false
      restart query_name


export dns_query


export dns_query