Net-WDNS
view release on metacpan or search on metacpan
MC(WDNS_TYPE_NINFO);
MC(WDNS_TYPE_RKEY);
MC(WDNS_TYPE_TALINK);
MC(WDNS_TYPE_CDS);
MC(WDNS_TYPE_CDNSKEY);
MC(WDNS_TYPE_CSYNC);
MC(WDNS_TYPE_SPF);
MC(WDNS_TYPE_UINFO);
MC(WDNS_TYPE_UID);
MC(WDNS_TYPE_GID);
MC(WDNS_TYPE_UNSPEC);
MC(WDNS_TYPE_NID);
MC(WDNS_TYPE_L32);
MC(WDNS_TYPE_L64);
MC(WDNS_TYPE_LP);
MC(WDNS_TYPE_EUI48);
MC(WDNS_TYPE_EUI64);
MC(WDNS_TYPE_TKEY);
MC(WDNS_TYPE_TSIG);
MC(WDNS_TYPE_IXFR);
MC(WDNS_TYPE_AXFR);
MC(WDNS_TYPE_MAILB);
MC(WDNS_TYPE_MAILA);
MC(WDNS_TYPE_ANY);
MC(WDNS_TYPE_URI);
MC(WDNS_TYPE_CAA);
MC(WDNS_TYPE_TA);
MC(WDNS_TYPE_DLV);
}
size_t
len_name(sv_name)
SV *sv_name
PREINIT:
uint8_t *name;
STRLEN name_len;
wdns_res res;
const char *rstr;
CODE:
name = (void *)SvPV(sv_name, name_len);
res = wdns_len_uname(name, name + name_len, &RETVAL);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem determining name length (err %d: %s)", (int)res, rstr);
}
OUTPUT:
RETVAL
void
reverse_name(sv_name)
SV *sv_name
PREINIT:
uint8_t *name;
STRLEN name_len;
size_t sz;
wdns_res res;
const char *rstr;
char rev[WDNS_MAXLEN_NAME];
PPCODE:
name = (void *)SvPV(sv_name, name_len);
res = wdns_len_uname(name, name + name_len, &sz);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem determining name length (err %d: %s)", (int)res, rstr);
}
res = wdns_reverse_name(name, sz, rev);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem reversing name (err %d: %s)", (int)res, rstr);
}
mXPUSHs(newSVpvn(rev, sz));
void
left_chop(sv_name)
SV *sv_name
PREINIT:
STRLEN name_len;
wdns_name_t chop;
wdns_name_t name;
size_t sz;
wdns_res res;
const char *rstr;
PPCODE:
name.data = (void *)SvPV(sv_name, name_len);
name.len = name_len;
res = wdns_len_uname(name.data, name.data + name.len, &sz);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem determining name length (err %d: %s)", (int)res, rstr);
}
res = wdns_left_chop(&name, &chop);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem chopping name (err %d: %s)", (int)res, rstr);
}
mXPUSHs(newSVpvn(chop.data, chop.len));
size_t
count_labels(sv_name)
SV *sv_name
PREINIT:
STRLEN name_len;
wdns_name_t name;
size_t sz;
wdns_res res;
const char *rstr;
CODE:
name.data = (void *)SvPV(sv_name, name_len);
name.len = name_len;
res = wdns_len_uname(name.data, name.data + name.len, &sz);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem determining name length (err %d: %s)", (int)res, rstr);
}
res = wdns_count_labels(&name, &RETVAL);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem counting name labels (err %d: %s)", (int)res, rstr);
}
OUTPUT:
RETVAL
bool
is_subdomain(sv_name0, sv_name1)
SV *sv_name0
SV *sv_name1
PREINIT:
wdns_name_t name0;
wdns_name_t name1;
STRLEN name_len;
size_t sz;
wdns_res res;
const char *rstr;
CODE:
name0.data = (void *)SvPV(sv_name0, name_len);
name0.len = name_len;
name1.data = (void *)SvPV(sv_name1, name_len);
name1.len = name_len;
res = wdns_len_uname(name0.data, name0.data + name0.len, &sz);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem determining name length (err %d: %s)", (int)res, rstr);
}
res = wdns_len_uname(name1.data, name1.data + name1.len, &sz);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem determining name length (err %d: %s)", (int)res, rstr);
}
res = wdns_is_subdomain(&name0, &name1, &RETVAL);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem determining if name is subdomain (err %d: %s)",
(int)res, rstr);
}
OUTPUT:
RETVAL
const char *
wdns_opcode_to_str(dns_opcode)
uint16_t dns_opcode
const char *
wdns_rcode_to_str(dns_rcode)
uint16_t dns_rcode
const char *
wdns_rrclass_to_str(dns_rrclass)
uint16_t dns_rrclass
uint16_t
wdns_str_to_rrclass(str)
const char *str
const char *
wdns_rrtype_to_str(dns_rrtype)
uint16_t dns_rrtype
uint16_t
str_to_rcode(str)
const char *str
PREINIT:
wdns_res res;
const char *rstr;
CODE:
res = wdns_str_to_rcode(str, &RETVAL);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem converting string to return code (err %d: %s)",
(int)res, rstr);
}
OUTPUT:
RETVAL
void
domain_to_str(src_sv)
SV *src_sv
PREINIT:
const uint8_t *src;
STRLEN src_len;
char tgt[WDNS_PRESLEN_NAME];
STRLEN tgt_len;
PPCODE:
src = (void *)SvPV(src_sv, src_len);
tgt_len = wdns_domain_to_str(src, src_len, tgt);
// tgt_len is number of bytes read from source, not length of result
if (tgt_len != 0)
mXPUSHs(newSVpv(tgt, 0));
void
wdns_rrset_array_to_str(a, sec)
wdns_rrset_array_t *a
unsigned sec
PREINIT:
char *str;
PPCODE:
str = wdns_rrset_array_to_str(a, sec);
mXPUSHs(newSVpv(str, 0));
Safefree(str);
void
wdns_rrset_to_str(rrset, sec)
wdns_rrset_t *rrset
unsigned sec
PREINIT:
char *str;
PPCODE:
str = wdns_rrset_to_str(rrset, sec);
mXPUSHs(newSVpv(str, 0));
Safefree(str);
void
rr_to_str(rr, sec)
wdns_rr_t *rr
unsigned sec
PREINIT:
char *str;
PPCODE:
str = wdns_rr_to_str(rr, sec);
mXPUSHs(newSVpv(str, 0));
Safefree(str);
void
rdata_to_str(sv_rdata, rrtype, rrclass)
SV *sv_rdata
uint16_t rrtype
uint16_t rrclass
PREINIT:
STRLEN rdlen;
char *src_str;
char *tgt_str;
PPCODE:
src_str = SvPV(sv_rdata, rdlen);
tgt_str = wdns_rdata_to_str(src_str, (uint16_t)rdlen, rrtype, rrclass);
mXPUSHs(newSVpv(tgt_str, 0));
Safefree(tgt_str);
void
str_to_rdata(str, rrtype, rrclass)
const char *str
uint16_t rrtype
uint16_t rrclass
PREINIT:
uint8_t *rd;
size_t rdlen;
wdns_res res;
const char *rstr;
PPCODE:
res = wdns_str_to_rdata(str, rrtype, rrclass, &rd, &rdlen);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem converting str to rdata (err %d: %s)", (int)res, rstr);
}
mXPUSHs(newSVpvn(rd, rdlen));
Safefree(rd);
uint16_t
str_to_rrtype(src)
char *src
PREINIT:
wdns_name_t name;
CODE:
RETVAL = wdns_str_to_rrtype(src);
if (RETVAL == 0)
croak("wdns_str_to_rrtype() failed");
OUTPUT:
RETVAL
void
str_to_name(src)
char *src
PREINIT:
wdns_name_t name;
wdns_res res;
const char *rstr;
PPCODE:
res = wdns_str_to_name(src, &name);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem converting str to name (err %d: %s)", (int)res, rstr);
}
mXPUSHs(newSVpvn(name.data, name.len));
void
str_to_name_case(src)
char *src
PREINIT:
wdns_name_t name;
wdns_res res;
const char *rstr;
PPCODE:
res = wdns_str_to_name_case(src, &name);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem converting str to name case (err %d: %s)",
(int)res, rstr);
}
mXPUSHs(newSVpvn(name.data, name.len));
void
message_to_str(m)
wdns_message_t *m
PREINIT:
char *str;
PPCODE:
str = wdns_message_to_str(m);
mXPUSHs(newSVpv(str, 0));
Safefree(str);
void
wdns_clear_message(m)
wdns_message_t *m
wdns_message_t *
parse_message_raw(pkt)
SV *pkt
PREINIT:
uint8_t *p;
STRLEN len;
wdns_message_t m;
wdns_res res;
const char *rstr;
CODE:
p = SvPV(pkt, len);
res = wdns_parse_message(&m, p, len);
if (res != wdns_res_success) {
rstr = wdns_res_to_str(res);
croak("problem parsing pkt (err %d: %s)", (int)res, rstr);
}
RETVAL = &m;
OUTPUT:
RETVAL
uint16_t
get_id(m)
wdns_message_t *m
CODE:
RETVAL = m->id;
OUTPUT:
RETVAL
uint16_t
get_flags(m)
wdns_message_t *m
CODE:
RETVAL = m->flags;
OUTPUT:
RETVAL
uint16_t
get_rcode(m)
wdns_message_t *m
CODE:
RETVAL = m->rcode;
OUTPUT:
RETVAL
uint16_t
get_opcode(m)
wdns_message_t *m
CODE:
RETVAL = WDNS_FLAGS_OPCODE(*m);
OUTPUT:
RETVAL
void
get_section(m, i)
wdns_message_t *m
uint8_t i
PREINIT:
wdns_rrset_array_t *a;
wdns_rrset_t *dns_rrset;
wdns_rdata_t *dns_rdata;
int j, k;
AV *section;
AV *rrset;
AV *rdata;
SV *rd;
SV *rs;
PPCODE:
if (i >= 4)
croak("section out of range (0-3)");
a = &m->sections[i];
section = newAV();
mXPUSHs(newRV_noinc((SV *)section));
av_extend(section, a->n_rrsets);
for (j = 0; j < a->n_rrsets; ++j) {
rrset = newAV();
rs = newRV_noinc((SV *)rrset);
av_push(section, rs);
dns_rrset = &a->rrsets[j];
av_extend(rrset, 4 + dns_rrset->n_rdatas);
av_push(rrset, newSVpvn(dns_rrset->name.data,
dns_rrset->name.len));
av_push(rrset, newSVuv(dns_rrset->rrclass));
av_push(rrset, newSVuv(dns_rrset->rrtype));
if (i == 0) {
sv_bless(rs, gv_stashpv("Net::WDNS::Question", TRUE));
} else {
av_push(rrset, newSVuv(dns_rrset->rrttl));
for (k = 0; k < dns_rrset->n_rdatas; ++k) {
rdata = newAV();
rd = newRV_noinc((SV *)rdata);
av_push(rrset, rd);
av_extend(rdata, dns_rrset->n_rdatas + 2);
dns_rdata = dns_rrset->rdatas[k];
av_push(rdata, newSVpvn(dns_rdata->data, dns_rdata->len));
av_push(rdata, newSVuv(dns_rrset->rrclass));
av_push(rdata, newSVuv(dns_rrset->rrtype));
sv_bless(rd, gv_stashpv("Net::WDNS::RD", TRUE));
}
sv_bless(rs, gv_stashpv("Net::WDNS::RR", TRUE));
}
}
( run in 1.157 second using v1.01-cache-2.11-cpan-71847e10f99 )