Net-DNS-ToolKit
view release on metacpan or search on metacpan
int offset
SV * name
PROTOTYPE: $$$;@
PREINIT:
AV * dptr;
SV **aptrs;
STRLEN len, size, bsize;
u_char **lastdnptr, **aoff;
u_char * exp_dn, * msg, * comp_dn;
int i, v, dnsize;
PPCODE:
if (! SvROK(buffer) || ! SvROK(name))
XSRETURN_EMPTY;
# see: perlapi on 'svtype' and /usr/lib/perl5/i386-linux/CORE/sv.h
name = SvRV(name);
if (SvTYPE(name) == SVt_PVGV) /* debugging, skip dn_comp */
exp_dn = (u_char *)SvPV(GvSV(name), len);
if (SvPOK(name)) /* normal */
# return the header values
# ID, QR, Opcode, AA, TC, RD, RA, MBZ, AD, CD, RCODE, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT
void
gethead(header)
SV * header
PROTOTYPE: $
PREINIT:
STRLEN len;
MY_HEADER * hp;
PPCODE:
if (! SvROK(header))
XSRETURN_EMPTY;
hp = (MY_HEADER *)SvPV(SvRV(header),len);
EXTEND(SP, 16);
PUSHs(sv_2mortal(newSViv(NS_HFIXEDSZ)));
PUSHs(sv_2mortal(newSViv(ntohs(hp->id))));
PUSHs(sv_2mortal(newSViv(hp->qr)));
PUSHs(sv_2mortal(newSViv(hp->opcode)));
PUSHs(sv_2mortal(newSViv(hp->aa)));
XSRETURN(16);
void
parse_char(ch)
unsigned char ch
PROTOTYPE: $
PREINIT:
u_char bmask[] = {128,64,32,16,8,4,2,1};
unsigned int i, hi, lo, tens[] = {1000,100,10,1, 1000,100,10,1};
char out[15];
PPCODE:
hi = lo = 0;
for(i=0;i<4;i++) {
if (ch & bmask[i])
hi += tens[i];
}
for(i=4;i<8;i++) {
if (ch & bmask[i])
lo += tens[i];
}
EXTEND(SP,4);
void
getstring(buffer,off,len)
SV * buffer
unsigned int off
unsigned int len
PROTOTYPE: $$$
PREINIT:
STRLEN size;
unsigned char * cp;
SV * out;
PPCODE:
if (!SvROK(buffer)) /* not a pointer */
XSRETURN_EMPTY;
cp = (u_char *)(SvPV(SvRV(buffer),size) + off);
if (off + len > size) /* offset beyond end */
XSRETURN_EMPTY;
out = sv_newmortal();
sv_setpvn(out, (char *)cp, len );
void
get16(buffer,off)
SV * buffer
unsigned int off
ALIAS:
Net::DNS::ToolKit::get32 = 1
PREINIT:
SV * out;
STRLEN size;
u_char * cp;
PPCODE:
if (GIMME_V == G_VOID)
XSRETURN_UNDEF; /* punt, nothing to return */
if (!SvROK(buffer)) {
bail:
if (GIMME_V != G_ARRAY)
XSRETURN_UNDEF;
else
XSRETURN_EMPTY;
}
RETVAL
void
getIPv4(buffer,off)
SV * buffer
unsigned int off
PREINIT:
SV * netaddr;
STRLEN size;
u_char * cp, out[NS_INADDRSZ];
PPCODE:
if (GIMME_V == G_VOID)
XSRETURN_UNDEF; /* punt, nothing to return */
if (!SvROK(buffer)) {
bail:
if (GIMME_V != G_ARRAY)
XSRETURN_UNDEF;
else
XSRETURN_EMPTY;
}
RETVAL
void
getIPv6(buffer,off)
SV * buffer
unsigned int off
PREINIT:
SV * ipv6addr;
STRLEN size;
u_char * cp, out[NS_IN6ADDRSZ];
PPCODE:
if (GIMME_V == G_VOID)
XSRETURN_UNDEF; /* punt, nothing to return */
if (!SvROK(buffer)) {
bail:
if (GIMME_V != G_ARRAY)
XSRETURN_UNDEF;
else
XSRETURN_EMPTY;
}
memcpy(cp,ipv6addr,NS_IN6ADDRSZ);
RETVAL = (int)(size + NS_IN6ADDRSZ);
OUTPUT:
RETVAL
void
gettimeofday()
PREINIT:
SV * tmp; /* older perl does not know about newSVuv */
PPCODE:
if (gettimeofday(&tv,NULL)) { /* any error */
if (GIMME_V == G_ARRAY)
XSRETURN_EMPTY;
else
XSRETURN_UNDEF;
}
tmp = newSViv(tv.tv_sec);
sv_setuv(tmp,tv.tv_sec);
XPUSHs(sv_2mortal(tmp));
if (GIMME_V == G_ARRAY) {
tmp = newSViv(tv.tv_usec);
sv_setuv(tmp,tv.tv_usec);
XPUSHs(sv_2mortal(tmp));
XSRETURN(2);
}
XSRETURN(1);
void
get_default()
PPCODE:
mysin();
XPUSHs(sv_2mortal(newSVpvn((char *)&mysa.sin_addr, NS_INADDRSZ)));
XSRETURN(1);
void
get_path()
PREINIT:
SV * out;
PPCODE:
if (path == NULL)
XSRETURN_UNDEF;
out = sv_newmortal();
sv_setpvn(out, path, (STRLEN)pathz);
XPUSHs(out);
XSRETURN(1);
void
lastchance()
PREINIT:
int i, nscount;
u_char * netptr;
PPCODE:
if ((nscount = lchance()) < 1) {
if (GIMME_V != G_ARRAY)
XSRETURN_UNDEF;
else
XSRETURN_EMPTY;
}
if (GIMME_V != G_ARRAY)
nscount = 1;
for(i=0;i<nscount;i++) {
xs_include/dn_expand.inc view on Meta::CPAN
#
# dn_expand() returns the size of the compressed name, or -1
# if there was an error.
#
void
dn_expand(buffer, offset)
SV * buffer
int offset
PROTOTYPE: $$
PPCODE:
STRLEN len;
u_char * buf;
char name[MAXDNAME];
int size;
if (SvROK(buffer))
buffer = SvRV(buffer);
buf = (u_char *)SvPV(buffer, len);
size = dn_expand(buf, buf+len, buf+offset, &name[0], MAXDNAME);
( run in 1.235 second using v1.01-cache-2.11-cpan-5511b514fd6 )