#!/client/bin/perl -w

# This little sendfile helper program watches the sendfile msglog file.
# When it founds a new SAFT message beginning with an "!" it displays it  
# within a xmessage window.

use Text::Tabs;
use Fcntl qw(:DEFAULT :flock);

$log = "/var/spool/sendfile/$ENV{USER}/msglog";
$sleep = shift || 3;
$| = 1;

open L,$log or die "$0: cannot open $log (do you have msglog=on in your sendfile config?) - $!\n";
flock(L, LOCK_EX|LOCK_NB) or die "$0: $log is locked\n";

seek L,0,2;
for (;;) {
  while (<L>) {
    next unless /^FROM/;
    @msg = ();
    push @msg,expand(utf7toiso($_));
    $_ = <L>;
    s/^(MSG\t)!/$1/ or next;
    $_ = utf7toiso($_);
    s/\n(.)/\n\t$1/g;
    push @msg,expand($_);
    $_ = <L>;
    push @msg,expand(utf7toiso($_));
    print "\n",@msg;
    open P,"|xmessage -nearmouse -font fixed -file - 2>/dev/null"
      or die "$0: cannot start subshell - $!\n";
    print P @msg;
    close P or die "$0: cannot run subshell - $!\n";
  }
  sleep $sleep;
}


sub utf7toiso {
    my $l = shift;

    $l =~ s/\+-/+ACs-/g;            # arghl!
    $l =~ s/\+(.*?)-/deb64($1)/ge;

    return $l;
}

sub deb64 {
    my $l = shift;

    $l =~ tr#A-Za-z0-9+/##cd;             # remove non-base64 chars
    $l =~ tr#A-Za-z0-9+/# -_#;            # convert to uuencoded format
    $len = pack("c", 32 + 0.75*length($l)); # compute length byte
    $l = unpack("u", $len . $l);   # uudecode
    $l =~ s/(.)(.)/$1 ne "\000" ? '_' : $2/ges;
    return $l;
}
