#!/usr/bin/perl -w
use strict;
use Socket;
undef $/;
die "usage: <host>\n" unless(1==@ARGV);
my $host=$ARGV[0];

my $myhostname=`hostname`;
$myhostname =~ s/\r?\n$//;
my $jobname=sprintf "fA%03u%s",$$%1000,$myhostname;
my $file=<STDIN>;

my $ctrl="H$myhostname\n";
$ctrl.="Ndirectlpr-stdin\n";
die "no USER environment" unless($ENV{USER});
$ctrl.="P$ENV{USER}\n";
# f is "filtered text", l is "raw text", o is "Postscript"
$ctrl.="od$jobname\n";

my $port=515;
$port=$1 if($host =~ s/:(\d+)$//;
my $iaddr=gethostbyname($host) or die;
my $paddr=sockaddr_in($port,$iaddr);
socket(SOCK,PF_INET,SOCK_STREAM,getprotobyname("tcp")) or die "socket: $!";
connect(SOCK,$paddr) or die "connect: $!";
select((select(SOCK),$|=1)[0]);

sub ack($) {
	read(SOCK,my $byte,1) or die;
	1==length($byte) or die;
	my $val=unpack("C",$byte);
	die "$_[0]:$val" if($val);
print STDERR "$_[0] succeeded\n";
}

if(0==length($file)) {
	print SOCK "\3lpr\n";
	print <SOCK>;
	exit 0;
}
print SOCK "\2"."lpr\n";
ack("recvjob");
print SOCK "\2".length($ctrl)." c$jobname\n";
ack("ctrlcmd");
print SOCK $ctrl;
print SOCK "\0";
ack("ctrlfile");
print SOCK "\3".length($file)." d$jobname\n";
ack("datacmd");
print SOCK $file;
print SOCK "\0";
ack("data");
close(SOCK);
0;
