#!/usr/bin/perl -w

use Getopt::Std;

my $usage = "Usage: $0 [-p pid_file] [-r server_root] args\n";

# locations of stuff
chomp($location = `dirname $0`);

# get the server root by popping the /bin off of our parent directory
@parts = split(/\//, $location);
pop(@parts);
my $root = join("/", @parts);

my $jhome = $ENV{"JAVA_HOME"};

# make sure JAVA_HOME is set
if (!defined $jhome) {
    warn "$0: Error: No JAVA_HOME specified!\n";
    warn "\n";
    warn "You must set your JAVA_HOME environment variable to the\n";
    warn "the absolute path of your JDK installation. For example:\n";
    warn "\n";
    warn " % JAVA_HOME=/usr/local/jdk1.2\n";
    warn " % export JAVA_HOME\n";
    die "\n";
}

# make sure it's set to a directory
if (! -d $jhome) {
    die "$0: Can't find a java interpreter in '$jhome'.\n";
}

my $java = "$jhome/bin/java";
my $jlib = "$jhome/lib/classes.zip";

# determine our machine architecture
my $ostype = `uname -s`;
my $machtype = `uname -m`;
chomp($ostype);
chomp($machtype);
my $arch = "$machtype-$ostype";

# add our native libraries to the runtime library path
my $libs = "$root/lib/$arch";
my $libpath = $ENV{"LD_LIBRARY_PATH"};

if (defined $libpath) {
    $ENV{"LD_LIBRARY_PATH"} = "$libs:$libpath";
} else {
    $ENV{"LD_LIBRARY_PATH"} = $libs;
}

# put everything in our class path
my $classpath = "-classpath $jlib:$root/dist/classes";

# any zip or jar files in our lib/ directory get added to the class path
if (opendir(DIR, "$root/lib")) {
    foreach $lib (grep { /.(zip|jar)/ && -f "$root/lib/$_" } readdir(DIR)) {
	$classpath .= ":$root/lib/$lib";
    }
    closedir DIR;
}

# any zip or jar files in our lib/ directory get added to the class path
if (opendir(DIR, "/usr/share/java")) {
    foreach $lib (grep { /.(zip|jar)/ && -f "/usr/share/java/$_" } readdir(DIR)) {
	$classpath .= ":/usr/share/java/$lib";
    }
    closedir DIR;
}

# specify our server root (this is for server code)
my $serverroot = "-Dserver.root=$root";

# specify our base directory (this is for client code)
my $basedir = "-Dbase.dir=$root/src/java";

my $pid_file = undef;
my $i = 0;

# strip out the -p and -r args (we'd use getopt() but the damned thing
# provides no way of escaping arguments so that we can pass args to
# runjava that get passed down to the JVM)
for ($i = 0; $i < @ARGV; $i++) {
    my $arg = $ARGV[$i];

    # stop when we see -- (and strip it out because Java don't dig --)
    if ($arg eq "--") {
        splice(@ARGV, $i, 1);
        last;
    }

    if ($arg eq "-p") {
        $pid_file = $ARGV[$i+1];
        splice(@ARGV, $i, 2);
	$i -= 1; # decrement i so that things stay in sync

    } elsif ($arg eq "-r") {
        $serverroot = "-Dserver.root=" . $ARGV[$i+1];
        splice(@ARGV, $i, 2);
	$i -= 1; # decrement i so that things stay in sync
    }
}

# log the pid file if requested to do so
print `echo $$ > $pid_file` if (defined $pid_file);

my $cmd = "$java -mx256M $classpath $serverroot $basedir \"" .
    join("\" \"", @ARGV) . "\"";
# print "$cmd\n";
exec($cmd);
