*BSD News Article 84955


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!news.mira.net.au!pumpkin.pangea.ca!www.nntp.primenet.com!nntp.primenet.com!howland.erols.net!math.ohio-state.edu!magnus.acs.ohio-state.edu!csn!nntp-xfer-1.csn.net!news.acsu.buffalo.edu!dsinc!newsfeed.pitt.edu!bb3.andrew.cmu.edu!cantaloupe.srv.cs.cmu.edu!das-news2.harvard.edu!oitnews.harvard.edu!purdue!mozo.cc.purdue.edu!hopf.math.purdue.edu!wilker
From: wilker@hopf.math.purdue.edu (Clarence Wilkerson)
Newsgroups: comp.unix.bsd.freebsd.misc
Subject: Re: Jetdirect via *BSD
Date: 14 Dec 1996 11:47:26 GMT
Organization: "Purdue University Department of Mathematics"
Lines: 90
Message-ID: <58u44e$o5o@mozo.cc.purdue.edu>
References: <nGogtM2@quack.kfu.com> <58srlf$jti@uriah.heep.sax.de>
Reply-To: wilker@math.purdue.edu
NNTP-Posting-Host: hopf.math.purdue.edu
To: joerg_wunsch@uriah.heep.sax.de (Joerg Wunsch)
Xref: euryale.cc.adfa.oz.au comp.unix.bsd.freebsd.misc:32593

The JetDirects I have for LJ II, LJ III do not support
internally the LPD protocol.

You have to set up a socket connection to port 9100
for these.

Here's a perl script that I use under Sunos: ( I`ve lost the
author  -- not me )

#!/usr/bin/perl
#
# Hewlett Packard (HP) JetDirect lpd "if" driver for Linux.
#
# You'll need a copy of this script for each jetdirect printer, because
# there's no way to pass parameters to "if" drivers.  This driver
# assumes that the JetDirect printer understands postscript.
# See the "Linux Printing HOWTO Guide" for details on how to 
# integrate ghostscript into this driver.
#
# The /etc/printcap entry should look something like:
#    lp|PostScript|postscript|ps:\
#        :lp=/dev/null:sh:sd=/var/spool/lpd/:\
#        :lf=/var/spool/lpd/lpd.log:if=/etc/bigoneif:
# Don't forget to create the spool directory and log file.
#
# /etc/services should have an entry like:
#    hpjetdirect     9100/tcp
# CWW added ENV -- wouldn't work from lpd without it
#Set PATH
$ENV{'PATH'} = "/bin:/usr/bin:/usr/local/bin";

# CONFIGURATION
$printer = 'ljet';              # Internet address of the JetDirect printer
$service = 'hpjetdirect';       # Name of service in /etc/services

# How to talk to BSD sockets from perl.
$AF_INET = 2;
$SOCK_STREAM = 1;
$structSockAddr = 'S n a4 x8';

# Get protocol and port
(($proto) = (getprotobyname('tcp'))[2]) 
  || &hardErr("getprotobyname('tcp'): $!");
# Try to get the service, but if that isn't available try 9100.
# (($port) = (getservbyname($service, $proto))[2]) || 
$port = 9100;

# Get host addresses
chop($host = `hostname`);
$host || &hardErr('unable to get hostname');
(($hostAddr) = (gethostbyname($host))[4]) 
  || &hardErr("gethostbyname($host): $!");
(($printerAddr) = (gethostbyname($printer))[4])
  || &hardErr("gethostbyname($printer): $!");

# Open the connection
socket(S, $AF_INET, $SOCK_STREAM, $proto) || &softErr("socket(tcp): $!");
bind(S, pack($structSockAddr, $AF_INET, 0, $hostAddr)) 
  || &hardErr("bind($host): $!");
connect(S, pack($structSockAddr, $AF_INET, 9100, $printerAddr))
  || &softErr("connect($printer): $!");

# Stuff data substituting unix newlines to msdos newlines
while () {
    $e = sysread(STDIN, $_, 1024);
    defined($e) || &softErr("read(STDIN): $!");
    $e || last;
# no filtering in raw version     s/\n/\r\n/g;
    (print S) || &softErr("write(S): $!");
}

# All done
close(S) || &softErr("close(SOCKET): $!");
exit(0);

################################################################
# softErr(@msg) 
#   Print @msg and terminate.  Job will be restarted by lpd.
sub softErr {
    warn("Soft Error: ", @_, "\n");
    exit(1);
} # softErr

# hardErr(@msg) 
#   Print @msg and terminate.  Job will NOT be restarted by lpd.
sub hardErr {
    warn("Hard Error: ", @_, "\n");
    exit(2);
} # hardErr