#!/usr/athena/bin/perl -w

# scan.pl version 2
# By Brad Thompson <yak>

$|=1;
use Socket;
@HOSTACL=split(/\n/,`cat /var/local/etc/scan_acl`);

$peername = getpeername(STDIN);
if (!defined($peername)) { fail("not a socket"); }

@peersockaddr = unpack_sockaddr_in($peername);
if (!defined(@peersockaddr)) { fail("bad peer address"); }
$peeraddr = $peersockaddr[1];

$peerhostname = gethostbyaddr($peeraddr, AF_INET);
if (!defined($peerhostname)) { fail("can't get remote host"); }

if (!grep {$_ eq $peerhostname} (@HOSTACL)) { fail("access denied to $peerhostname"); }

@INPUT=();
do
{
    $LINE = <STDIN>;
    push(@INPUT, $LINE);
} until ($LINE!~/[a-zA-Z]/);

close(STDIN);

%VARDB = parseget($INPUT[0]);

if (!defined($VARDB{'resolution'}))
{
    print("HTTP/1.0 200 OK\nContent-type: text/html\n\n");
    exec "cat /var/local/etc/scan.html";
}

$BRIGHTNESS=$VARDB{'brightness'}*256/100-127;
$CONTRAST=$VARDB{'contrast'}*256/100-127;
$ARGS = sprintf(
    "-t %f -l %f -x %f -y %f --resolution %d --brightness %d --contrast %d",
    $VARDB{'top'}, $VARDB{'left'}, $VARDB{'width'}, $VARDB{'height'},
    $VARDB{'resolution'}, $BRIGHTNESS, $CONTRAST);
{
    my $mode = defined($VARDB{'mode'}) ? lc($VARDB{'mode'}) : "";
    if ($mode eq 'color' or $mode eq 'gray' or $mode eq 'lineart')
    {
	$ARGS = $ARGS . " --mode " . $mode;
    }
}
print("HTTP/1.0 200 OK\nContent-type: image/pnm\n\n");
exec("/usr/X11R6/bin/scanimage --device-name hp:/dev/scanner $ARGS");

sub parseget($)
{
    my($QUERY)=@_;
    my($GET,@VARS);

    $GET = ($QUERY =~ /^[^ \t]+[ \t]+\/\?([^\/]*)\/?[ \t]+[^ \t]+$/)[0];
    if (!defined($GET)) { $GET = ""; }
    @VARS=grep(/[a-z]+=[0-9.A-Za-z]+/,split("&",$GET));

    %VARDB=();
    for $VAR (@VARS)
    {
	($VARNAME,$VALUE) = $VAR=~/([a-z]+)=([0-9.A-Za-z]+)/;
	$VARDB{$VARNAME}=$VALUE;
    }
    %VARDB;
}

sub fail($)
{
    my($ERR)=@_;
    print("HTTP/1.0 200 OK\nContent-type: text/html\n\nError: $ERR\n");
    exit;
}
