#!/usr/bin/perl -w

##########################################################################
# INFORMATION TOOL ABOUT THE SERVERS VERSION OF ATHENA
#
# By connection on a server, this software display the version of the
# designed server.
#-------------------------------------------------------------------------
# Usages:
#   ./checkversion IP:port
#   ./checkversion IP port
#   perl checkversion IP:port
#   perl checkversion IP port
#
# note: default port: 6900
#
# When successfull, the software return the value 0.
#
##########################################################################

#------------------------- start of configuration ------------------------

$connecttimeout = 10;   # Connection Timeout (in seconds)

#-------------------------- End of configuration -------------------------

use IO::Socket;

unless($ARGV[0]) {
	print "USAGE: $0 server_ip:port\n";
	exit(1);
}

$server = $ARGV[0];
$port = $ARGV[1];
$port = $1 if ($server =~ s/:(\d+)//);
$port ||= 6900;

# Connection to the server
my($so,$er) = ();
eval{
	$so = IO::Socket::INET->new(
		PeerAddr=> $server,
		PeerPort=> $port,
		Proto   => "tcp",
		Timeout => $connecttimeout) or $er = 1;
};

if($er || $@) {
	print "Can't not connect to server [$server:$port] !\n";
	exit(2);
}

# Request for the server version
print $so pack("v",30000); # 0x7530
$so->flush();

# Receiving of the answer of the server
if (read($so,$buf,10) < 10) {
	print "Invalid answer. It isn't an athena server or it is a too old version.\n";
	exit(5);
}

# Sending end of connection to the server
print $so pack("v",30002); # 0x7532
$so->flush();

# Analyse of the answer
my($ret,$maver,$miver,$rev,$dev,$mod,$type,$mdver) = unpack("v c6 v",$buf);

if ($ret != 30001) { # 0x7531
	print "Invalid answer. It isn't an athena server or it is a too old version.\n";
	exit(6);
}

my(@stype) = ();
foreach $i(0..3) {
	push @stype,(("login","char","inter","map")[$i]) if( $type & (1<<$i) );
}
print "  ".join("/",@stype)." server [$server:$port].\n";
printf "  Athena version %s-%d.%d", ("stable","dev")[$dev], $maver,$miver;
printf " revision %d",$rev if $rev;
printf "%s%d\n",("","-mod")[$mod],$mdver;

exit(0);
