Skip to content

Instantly share code, notes, and snippets.

@washort
Created July 2, 2013 15:54
Show Gist options
  • Save washort/5910537 to your computer and use it in GitHub Desktop.
Save washort/5910537 to your computer and use it in GitHub Desktop.
payload :typ :ttl :rdl =
?(typ == 'A') <anything{4}>:address
-> DNSParser.getType('A', ttl=ttl, address=address)
| ?(typ == 'A6') byte:pfl (-> int((128 - pfl) / 8.0)):bl
(-> '::'):sf (-> b''):n
(?(bl) <anything{bl}>:sf)? (?(pfl) typ:n)?
-> DNSParser.getType('A6', ttl=ttl, prefixLen=pfl, suffix=sf, prefix=n.name)
| ?(typ == 'AAAA') <anything{16}>:address
-> DNSParser.getType('AAAA', ttl=ttl, address=address)
| ?(typ == 'AFSDB') short:subtype name:n
-> DNSParser.getType('AFSDB', ttl=ttl, subtype=subtype, hostname=n.name)
| ?(typ == 'CNAME') name:n -> DNSParser.getType('CNAME', ttl=ttl, name=n.name)
| ?(typ == 'DNAME') name:n -> DNSParser.getType('DNAME', ttl=ttl, name=n.name)
| ?(typ == 'MB') name:n -> DNSParser.getType('MB', ttl=ttl, name=n.name)
| ?(typ == 'MD') name:n -> DNSParser.getType('MD', ttl=ttl, name=n.name)
| ?(typ == 'MF') name:n -> DNSParser.getType('MF', ttl=ttl, name=n.name)
| ?(typ == 'MR') name:n -> DNSParser.getType('MR', ttl=ttl, name=n.name)
| ?(typ == 'NS') name:n -> DNSParser.getType('NS', ttl=ttl, name=n.name)
| ?(typ == 'PTR') name:n -> DNSParser.getType('PTR', ttl=ttl, name=n.name)
| ?(typ == 'MG') name:n -> DNSParser.getType('MG', ttl=ttl, name=n.name)
| ?(typ == 'HINFO') byte:cpu byte:os
-> DNSParser.getType('HINFO', ttl=ttl, cpu=cpu, os=os)
| ?(typ == 'MINFO') name:rmailbx name:emailbx
-> DNSParser.getType('MINFO', ttl=ttl,
rmailbx=rmailbx.name, emailbx=emailbx.name)
| ?(typ == 'MX') short:pref name:n
-> DNSParser.getType('MX', ttl=ttl, preference=pref, name=n.name)
| ?(typ == 'NAPTR') short:order short:pref
byte:l <anything{l}>:flags
byte:l <anything{l}>:service
byte:l <anything{l}>:regexp
name:n
-> DNSParser.getType('NAPTR', ttl=ttl, order=order,
preference=pref, flags=flags, service=service,
regexp=regexp, replacement=n.name)
| ?(typ == 'NULL') <anything{rdl}>:p -> DNSParser.getType('NULL', ttl=ttl, payload=p)
| ?(typ == 'RP') name:mbox name:txt
-> DNSParser.getType('RP', ttl=ttl, mbox=mbox.name, txt=txt.name)
# The corresponding fmt is !LlllL, why signed long here?
| ?(typ == 'SOA') name:mname name:rname long:serial long:refresh long:retry
long:expire long:minimum
-> DNSParser.getType('SOA', ttl=ttl, mname=mname.name, rname=rname.name,
serial=serial, refresh=refresh, retry=retry, expire=expire,
minimum=minimum)
| ?(typ == 'SRV') short:priority short:weight short:port name:n
-> DNSParser.getType('SRV', ttl=ttl, priority=priority,
weight=weight, port=port, target=n.name)
| ?(typ == 'TXT') (-> 0):soFar (?(soFar < rdl) byte:l <anything{l}>)*:data
-> DNSParser.getType('TXT', ttl=ttl, data=data)
| ?(typ == 'SPF') (-> 0):soFar (?(soFar < rdl) byte:l <anything{l}>)*:data
-> DNSParser.getType('SPF', ttl=ttl, data=data)
| ?(typ == 'WKS') <anything{4}>:address byte:protocol (-> rdl - 5):l <anything{l}>:map
-> DNSParser.getType('WKS', ttl=ttl, address=address,
protocol=protocol, map=map)
| <anything{rdl}>:data -> DNSParser.getType('UnknownRecord', data=data, ttl=ttl)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment