#!/usr/bin/perl

my %ConfArray ;

require Cwd ;

my $home ;
findhome() ;


my $CONFFILE =  convPath("~/.sixpack.rc") ;
my $globalCONFFILE = "/etc/sixpack/sixpack.rc" ;

$ConfArray{"PIDFILE"} = "$ENV{'HOME'}/.sixpack.pid" ;
$ConfArray{"WC"} = "/usr/bin/wc";
$ConfArray{"AWK"} = "/usr/bin/awk";
$ConfArray{"CAT"} = "/bin/cat";
$ConfArray{"TMP"} = "/tmp/$ENV{'USER'}";
$ConfArray{"CONV"} = "/usr/bin/bibconv";
$ConfArray{"DATE"} = "/bin/date";
$ConfArray{"EDIT"} = "/usr/bin/vim -f";
$ConfArray{"GREP"} = "/bin/grep";
$ConfArray{"LESS"} = "/usr/bin/less";
$ConfArray{"MV"} = "/bin/mv";
$ConfArray{"RM"} = "/bin/rm";
$ConfArray{"MISCHANDLE"} = '/bin/echo no handler for file %s' ;
$ConfArray{"PICSDIR"} = "/usr/share/sixpack/pix";
$ConfArray{"PAPERS"} = "$ENV{'HOME'}/papers";
$ConfArray{'BACKUPEXT'} = ".bak" ;
$ConfArray{'BPHOME'} = "/usr/lib/bp" ;

$ConfArray{'CITEID'} = "LACHMANN,98" ;

$ConfArray{'TITLEIGNORE'} = "the a of in and from on" ;

$SIG{'USR1'} = 'usrSignal' ;
$SIG{'USR2'} = 'usrSignal' ;
$SIG{'INT'} = 'intSignal' ;


if( !(-e $CONFFILE) ) { $CONFFILE = $globalCONFFILE ; }      

if( -e $CONFFILE ) {
   my ($name,$value,$line) ;
   open(CONF,$CONFFILE) || die "Can't open $CONFFILE\n" ;
   while( <CONF> ) {
       $_ =~ /([^#]*)#?.*/ ;
       $line = $1 ;
       if(!( $line =~ /^\s*$/ )) {
         ($name,$value) = split( /\s*=\s*/, $line, 2) ;
         $value =~ s/\n//g ;
         $ConfArray{$name} = $value ;
       }
   }
   close CONF ;
}

my $TMP = $ConfArray{"TMP"} ;
my $working=0 ;

   
open(PIDF,"<".$ConfArray{"PIDFILE"}) ;
my $sixpackid = <PIDF> ;
close PIDF ;

if( -e $TMP."-sig-".$sixpackid ) { die "communication file $TMP-sig-$sixpackid already exists!\n" ;}
umask 0x077 ;
open(FTELL,">".$TMP."-sig-".$sixpackid) ;
print FTELL join ("\#\#",@ARGV)  ;
print FTELL "\#\#$$" ;
close FTELL ;

if( !defined($sixpackid) || ($sixpackid =~ /^\s*$/) || kill ('USR1', $sixpackid) == 0 ) {
  unlink $TMP."-sig-".$sixpackid ;
  warn "sixpack does not seem to be running!\n" ;
}

my $seconds = 0 ;
my $s ;

# Wait for 30 seconds, and quit if sixpack hasn't started yet,
# Or wait for half an hour if it has.
# When sixpack finishes, it deletes the -sig- file.
#
# We need to wait, because mozilla will delete the file once we
# quit.
while( (-e $ConfArray{"PIDFILE"}) && ($seconds < 30 || $working==0) && ($seconds < 1800) ) {
  sleep(1) ; $seconds++ ;
}

if( -e $TMP."-sig-".$sixpackid ) {
  unlink $TMP."-sig-".$sixpackid ;
}


if( $working == 0 ) {
   print "could not contact sixpack after $seconds seconds\n" ;
}
print "exiting after $seconds\n" ;
exit 0;


sub convPath
{
   my ($val) = @_;
   if (substr($val,0,1) eq '~') {
      if (substr($val,1,1) eq '/') {
	 $val = $home . substr($val,1);
      } else
      {my ($uid,$rest) = ($val =~ m#^~([^/]+)(/.*$)#
      );
      $val = (getpwnam($uid))[7] . $rest;
      }
   }
   return $val ;
}							   

sub findhome
{
  my $cwd = Cwd::getcwd() ;
  chdir( $ENV{'HOME'} ) ;
  $home = Cwd::getcwd() ;
  chdir( $cwd ) ;
}     

sub usrSignal
{
  local $SIG{'USR1'} = '' ;
  local $SIG{'USR2'} = '' ;
  my ($sig) = @_ ;
  if( $sig eq 'USR1' ) {
    open(FTELL,$TMP."-sig-".$sixpackid) ;
    my $err = <FTELL> ;
    close FTELL ;
    unlink $TMP."-sig-".$sixpackid ;
    die $err."\n" ;
  } elsif( $sig eq 'USR2' ) {
    open(FTELL,$TMP."-sig-".$sixpackid) ;
    my $err = <FTELL> ;
    close FTELL ;
    unlink $TMP."-sig-".$sixpackid ;
    $working = 1 ;
    $seconds = 0 ;
    print "$err...\n" ;
  } else {
    unlink $TMP."-sig-".$sixpackid ;  
    exit 0 ;
  }
}

sub intSignal
{
  unlink $TMP."-sig-".$sixpackid ;
  exit 3 ;
}

