#!/usr/local/bin/perl
# ShellFire -- ObjectiveShell on httpd
# (C) KUBO Hiroya(hiroya@sfc.keio.ac.jp)
#
######################################################################
require 5.004;
 
sub Usage{
    die<<"EOF";
$SERVER_SOFTWARE -- ObjectiveShell on Httpd (nhttpd)
  (C) KUBO Hiroya(hiroya\@sfc.keio.ac.jp)

Usage: nomos [libName] [-p port] [-d] [-f]
 libName    : database library Name (default:"default")
 -p port    : server port number(default:$SERVER_PORT)
 -d         : debug mode (not fork)
 -f         : kill another server and startup
EOF
}

sub parseOpt{
    my($ARGV)=@_;
    my($SERVER_SOFTWARE)='ShellFireHttpd/1.6 (Nomos)';
    my($SERVER_PORT)    =7001;
    my($libName)        ='default';
    my($DEBUG)          =0;

    require "hostname.pl";
    my($hostname,$domainname);
    $hostname=&hostname;
#    chop($domainname=`hostname -d`);
#    chop($domainname=`domainname`);
    $domainname='dentsu.co.jp';
    my($SERVER_NAME)="$hostname.$domainname";

    while(@ARGV){
	$_=shift(@ARGV);
	if($_ eq '-h'){
	    &Usage;
	}
	elsif($_ eq '-d'){
	    $DEBUG=1;
	    $Config::showSTDERR=1;
	}
	elsif($_ eq '-f'){
	    $FORCED=1;
	}
	elsif($_ eq '-p'){
	    my($val)=shift(@ARGV);
	    if($val =~/^\d+$/){
		$SERVER_PORT=($val ne '' )?$val:$SERVER_PORT;
	    }
	}else{
	    $libName=$_;
	}
    }

    return($SERVER_SOFTWARE,$SERVER_NAME,$SERVER_PORT,
	   $libName,$FORCED,$DEBUG);
}

#-----------------------------------------------#
# init
#umask 022;
umask 000;
if(defined $ENV{NOMOS}){
    $ROOT=$ENV{NOMOS};
}else{
    print STDERR "You must setenv \$NOMOS.\n(ex. export NOMOS=/home/nomos )\n";
    exit 1;
}

($SERVER_SOFTWARE,$SERVER_NAME,$SERVER_PORT,
 $libName,$FORCED,$DEBUG)
    =&parseOpt(@ARGV);

chdir($ROOT);
require "bin/modules/Config.pl";
require "bin/modules/Init.pl";

$Config::DBM='GDBM';
if($Config::DBM eq 'GDBM'){
    use GDBM_File;
}
if($Config::DBM eq 'NDBM'){
    use NDBM_File;
}
elsif($Config::DBM eq 'SDBM'){
    use SDBM_File;
}
elsif($Config::DBM eq 'ODBM'){
    use ODBM_File;
}

&Config::load(&Init::path($libName).'/base/Configuration.pl');
&Init::forkChild($libName,$FORCED,$DEBUG);
#require "syslog.pl";
require "bin/modules/jcode.pl";
require "bin/modules/mtime.pl";
require "bin/modules/DB.pl";
require "bin/modules/ClassFile.pl";
require "bin/modules/Session.pl";
require "bin/modules/HTTPD.pl";
require "bin/modules/Log.pl";
require "bin/modules/SHELL.pl";
require "bin/modules/LoginHistory.pl";
require "bin/modules/AUTH.pl";

my($sin)=&Init::initSystem($libName,$SERVER_PORT,$FORCED);

$SIG{'INT'}  = '_sigint';
$SIG{'HUP'}  = '_sighup';
$SIG{'ALRM'} = '_sigalrm';
alarm($Config::alarmInterval);

&HTTPD::server( $sin );
exit;

#-----------------------------------------------#
sub _sigalrm{
    &LoginHistory::checkTimeOutUser;
}

sub _sigint{
    if($Config::Session==1){
	$Config::sig{INT}=1;
    }else{
	&SIGINT;
    }
}
sub _sighup{
    if($Config::Session==1){
	$Config::sig{HUP}=1;
    }else{
	&SIGHUP;
    }
}
sub SIGINT{
    my($libPath)=&Init::path($libName);
    print STDERR "\nshutting down server...\n";
    &HTTPD::shutdown_server;
#    &ClassFile::saveClass($libPath);
    &DB::saveInstance($libPath);
    unlink($libPath.'/log/'.$Config::PIDFILE);
#    unlink($libPath.'/log/'.$Config::PORTFILE);
    &Log::closeLog;
    print STDERR "...done.\n";
    exit(0);
}
sub SIGHUP{
    &AUTH::clean_tmpdata;
    $Config::sig{HUP}=0;
}
#-----------------------------------------------#
