#
 # Copyright (c) 1997-2009 Michael Fuhr.  All rights reserved.  This
 # program is free software; you can redistribute it and/or modify it
 # under the same terms as Perl itself.
 #
 # Net::DNS is currently maintained by a group, led by:
 #       Chris Reinhardt
 #       ctriv@net-dns.org
 #
 # Net::DNS was created by:
 #       Michael Fuhr
 #       mike@fuhr.org 
 #
 # Modified ever so slightly and those changes are
 # Copyright 2003-2009 Michael Robinton. All rights reserved.  This
 # program is free software; you can redistribute it and/or modify it
 # under the same terms as Perl itself.
 #
 #
 # int dn_expand(unsigned char *msg, unsigned char *eomorig,
 #	unsigned char *comp_dn, unsigned char *exp_dn, int length);
 #	   
 # dn_expand
 #	dn_expand() expands the compressed domain name given by the
 #	pointer comp _dn into a full domain name. Expanded names are
 #	converted to upper case. The compressed name is contained in
 #	a query or reply message; msg is a pointer to the beginning
 #	of that message. Expanded names are stored in the buffer
 #	referenced by the exp_dn buffer of size length, which should
 #	be large enough to hold the expanded result.
 #
 #	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);

	if (size < 0) {
	    XSRETURN_EMPTY;
	} else {
	    EXTEND(SP, 2);
	    PUSHs(sv_2mortal(newSViv(size + offset)));
	    PUSHs(sv_2mortal(newSVpv(name, 0)));
	}
	XSRETURN(2);