# Perl interface to GUSI, M. Neeracher 28Nov92package GUSI;# Address familiessub AF_UNSPEC		{ 0;	}sub AF_UNIX			{ 1;	}sub AF_INET			{ 2;	}sub AF_CTB 			{ 3;	}sub AF_FILE 		{ 4;	}sub AF_PPC 			{ 5;	}sub AF_APPLETALK	{ 16;	}sub ATALK_SYMADDR	{ 272;}# Socket typessub SOCK_STREAM 	{ 1;	}sub SOCK_DGRAM 	{ 2;	}# Address formatssub pack_sockaddr_in	{	local($family, $addr, $port) = @_;	if ($addr =~ /^(\d+)+\.(\d+)\.(\d+)\.(\d+)/) {		$addr = pack('C4', $1, $2, $3, $4);	} else {		local(@x) = gethostbyname($addr);		return undef unless @x;		$addr = $x[4];	}		pack("s S a4 x8", $family, $port, $addr);}sub unpack_sockaddr_in {	local($addr) = @_;	local($family, $port, $a1, $a2, $a3, $a4) = unpack("s S C4 x8", $addr);		($family, "$a1.$a2.$a3.$a4", $port);}sub pack_sockaddr_un	{	local($family, $path) = @_;		pack("s a108", $family, $path);}sub unpack_sockaddr_un {	local($addr) = @_;		return unpack("s a108", $addr);}sub pack_sockaddr_atlk	{	local($family, $net, $node, $socket) = @_;		pack("s s C C", $family, $net, $node, $socket);}sub unpack_sockaddr_atlk {	local($addr) = @_;		unpack("s s C C", $addr);}sub pack_sockaddr_atlk_sym	{	local($family, $obj, $type, $zone) = @_;	local($fmt);		$fmt	=	"s C a" . ((length($obj) & ~1) + 1);	$fmt	.=	"C a" . ((length($type) & ~1) + 1);	$fmt	.=	"C a" . ((length($zone) & ~1) + 1);		pack($fmt, $family, length($obj), $obj, length($type), $type, length($zone), $zone);}sub unpack_sockaddr_atlk_sym {	local($addr) = @_;	local($len, $obj, $type, $zone);		($len, $addr) = unpack("x2 C a*", $addr);	($obj, $addr) = unpack("a$len " . ($len & 1 ? "" : "x ") . "a*", $addr);	($len, $addr) = unpack("x2 C a*", $addr);	($type, $addr) = unpack("a$len " . ($len & 1 ? "" : "x ") . "a*", $addr);	($len, $addr) = unpack("x2 C a*", $addr);	($zone, $addr) = unpack("a$len " . ($len & 1 ? "" : "x ") . "a*", $addr);		($family, $obj, $type, $zone);}sub pack_sockaddr_ppc	{	local($family, $type, $name, $porttype) = @_;	local($ppcNBPTypeLocation, $smRoman, $ppcByString)	= (2,0,2);		pack("s s C a101 s C a32 x s C a32", 		$family, 		$ppcNBPTypeLocation, length($type), $type,		$smRoman, length($name), $name, $ppcByString, length($porttype), $porttype);}sub pack_sa_constr_file	{	local($count, $constr, $cur) = (0, "");		while ($cur = shift) {		++$count;		$constr .= pack("A4", $cur);	}		pack("s", $count) . $constr;}sub pack_sa_constr_atlk	{	local($count, $constr, $cur) = (0, "");		while ($cur = shift) {		++$count;		$constr .= pack("x4 C a33", length($cur), $cur);	}		pack("s", $count) . $constr;}sub pack_sa_constr_ppc	{	local($type) = @_;		pack("C a33", length($type), $type);}# Flags for choose()sub CHOOSE_DEFAULT	{	1;	}sub CHOOSE_NEW 		{	2;	}sub CHOOSE_DIR 		{	4;	}1;