diff --git a/handbook/Makefile b/handbook/Makefile
index fa00946625..c8fa84f6af 100644
--- a/handbook/Makefile
+++ b/handbook/Makefile
@@ -1,11 +1,12 @@
-# $Id: Makefile,v 1.3 1995-09-25 18:23:02 wollman Exp $
+# $Id: Makefile,v 1.4 1995-10-01 04:43:11 jfieber Exp $
SRCS= authors.sgml basics.sgml bibliography.sgml boothelp.sgml
SRCS+= booting.sgml contrib.sgml crypt.sgml ctm.sgml current.sgml dialup.sgml
SRCS+= diskless.sgml dma.sgml eresources.sgml esdi.sgml glossary.sgml
SRCS+= handbook.sgml history.sgml hw.sgml install.sgml kerberos.sgml
SRCS+= kerneldebug.sgml memoryuse.sgml mirrors.sgml nfs.sgml nutshell.sgml
-SRCS+= porting.sgml ports.sgml ppp.sgml relnotes.sgml scsi.sgml sections.sgml
+SRCS+= porting.sgml ports.sgml ppp.sgml printing.sgml relnotes.sgml
+SRCS+= scsi.sgml sections.sgml
SRCS+= skey.sgml slipc.sgml slips.sgml submitters.sgml sup.sgml
SRCS+= troubleshooting.sgml userppp.sgml
diff --git a/handbook/authors.sgml b/handbook/authors.sgml
index 93fa26190a..b6f5a6b758 100644
--- a/handbook/authors.sgml
+++ b/handbook/authors.sgml
@@ -1,4 +1,4 @@
-
+
+
The FreeBSD Documentation Project
- September 24, 1995
+ September 30, 1995Welcome to FreeBSD! This handbook covers the
installation and day to day use of FreeBSD Release
@@ -80,11 +80,13 @@ Web server">.
&kerberos;
* Firewalls
+ &printing;
+
The X-Window System
Pending the completion of this section, please refer to
documentation supplied by the
+
+
+ Printing with FreeBSD
+ Sean Kelly 30 September 1995, (c) 1995
+
+ This document describes printing with FreeBSD. It
+ tells how to set up printer hardware, how to configure FreeBSD
+ to use printers, and how to control the print queue and print
+ a variety of file formats.
+
+
+-->
+
+ Printing
+
+
Contributed by &a.kelly;30 September 1995
+
+ In order to use printers with FreeBSD, you'll need to set
+ them up to work with the Berkeley line printer spooling
+ system, also known as the LPD spooling system. It's the
+ standard printer control system in FreeBSD. This section
+ introduces the LPD spooling system, often simply called LPD.
+
+ If you're already familiar with LPD or another printer
+ spooling system, you may wish to skip to section .
+
+ What the Spooler Does
+
+
LPD controls everything about a host's printers. It's
+ responsible for a number of things:
+
+
+ It controls access to attached printers and
+ printers attached to other hosts on the network.
+
+ It enables users to submit files to be printed;
+ these submissions are known as It prevents multiple users from accessing a printer
+ at the same time by maintaining a It can print It takes care of communications parameters for
+ printers connected on serial ports.
+
+ It can send jobs over the network to another LPD
+ spooler on another host.
+
+ It can run special filters to format jobs to be
+ printed for various printer languages or printer
+ capabilities.
+
+ It can account for printer usage.
+
+
+ Through a configuration file, and by providing the special
+ filter programs, you can enable the LPD system to do all or
+ some subset of the above for a great variety of printer
+ hardware.
+
+ Why You Should Use the Spooler
+
+
If you're the sole user of your system, you may be
+ wondering why you should bother with the spooler when you
+ don't need access control, header pages, or printer
+ accounting. While it's possible to enable direct access to
+ a printer, you should use the spooler anyway since
+
+
+ LPD prints jobs in the background; you don't have
+ to wait for data to be copied to the printer.
+
+ LPD can conveniently run a job to be printed
+ through filters to add date/time headers or convert a
+ special file format (such as a TeX DVI file) into a
+ format the printer will understand. You won't have to do
+ these steps manually.
+
+ Many free and commercial programs that provide a
+ print feature usually expect to talk to the spooler on
+ your system. By setting up the spooling system, you'll
+ more easily support other software you may later add or
+ already have.
+
+
+ Setting Up the Spooling System
+
+
To use printers with the LPD spooling system, you'll need
+ to set up both your printer hardware and the LPD software.
+ This document describes two levels of setup:
+
+
+ See section to learn how to connect a
+ printer, tell LPD how to communicate with it, and
+ print plain text files to the printer.
+
+ See section to find out how to print a
+ variety of special file formats, to print header
+ pages, to print across a network, to control access to
+ printers, and to do printer accounting.
+
+
+
+ Simple Printer Setup
+
+
This section tells how to configure printer hardware and the
+ LPD software to use the printer. It teaches the basics:
+
+
+ Section gives some hints on connecting the printer to a
+ port on your computer.
+
+ Section shows how to setup the LPD spooler configuration
+ file /etc/printcap.
+
+
+ If you're setting up a printer that uses a network protocol
+ to accept data to print instead of a serial or parallel interface,
+ see .
+
+ Although this section is called ``Simple Printer Setup,'' it's
+ actually fairly complex. Getting the printer to work with
+ your computer and the LPD spooler is the hardest part. The
+ advanced options like header pages and accounting are fairly
+ easy once you get the printer working.
+
+ Hardware Setup
+
+
This section tells about the various ways you can connect a
+ printer to your PC. It talks about the kinds of ports and
+ cables, and also the kernel configuration you may need to
+ enable FreeBSD to speak to the printer.
+
+ If you've already connected your printer and have
+ successfully printed with it under another operating system,
+ you can probably skip to section .
+
+ Ports and Cables
+
+
Nearly all printers you can get for a PC today support
+ one or both of the following interfaces:
+
+
+ Parallel interfaces are sometimes known as
+ ``Centronics'' interfaces, named after the connector
+ type on the printer.
+
+
+ In general, serial interfaces are slower than parallel
+ interfaces. Parallel interfaces usually offer just
+ one-way communication (computer to printer) while serial
+ gives you two-way. Many newer parallel ports can also
+ receive data from the printer, but only few printers need
+ to send data back to the computer. And FreeBSD doesn't
+ support two-way parallel communication yet.
+
+ Usually, the only time you need two-way communication with
+ the printer is if the printer speaks PostScript.
+ PostScript printers can be very verbose. In fact,
+ PostScript jobs are actually programs sent to the printer;
+ they needn't produce paper at all and may return results
+ directly to the computer. PostScript also uses
+ two-way communication to tell the computer about problems,
+ such as errors in the PostScript program or paper jams.
+ Your users may be appreciative of such information.
+ Furthermore, the best way to do effective accounting with
+ a PostScript printer requires two-way communication: you
+ ask the printer for its page count (how many pages it's
+ printed in its lifetime), then send the user's job, then
+ ask again for its page count. Subtract the two values and
+ you know how much paper to charge the user.
+
+ So, which interface should you use?
+
+
+ If you need two-way communication, use a serial
+ port. FreeBSD does not yet support two-way
+ communication over a parallel port.
+
+ If you don't need two-way communication and can
+ pick parallel or serial, prefer the parallel
+ interface. It keeps a serial port free for other
+ peripherals---such as a terminal or a modem---and is
+ faster most of the time. It's also easier to
+ configure.
+
+ Finally, use whatever works.
+
+
+
+ Parallel Ports
+
+
To hook up a printer using a parallel interface, connect
+ the Centronics cable between the printer and the
+ computer. The instructions that came with the printer, the
+ computer, or both should give you complete guidance.
+
+ Remember which parallel port you used on the computer. The
+ first parallel port is /dev/lpt0 to FreeBSD; the second is
+ /dev/lpt1, and so on.
+
+ Serial Ports
+
+
To hook up a printer using a serial interface, connect
+ the proper serial cable between the printer and the
+ computer. The instructions that came with the printer,
+ the computer, or both should give you complete guidance.
+
+ If you're unsure what the ``proper serial cable'' is, you
+ may wish to try one of the following alternatives:
+
+ A A A
+
+ You should also set up the communications parameters for
+ the printer, usually through front-panel controls or DIP
+ switches on the printer. Choose the highest bps (bits per
+ second, sometimes Software Setup
+
+
This section describes the software setup necessary to
+ print with the LPD spooling system in FreeBSD.
+
+ Here's an outline of the steps involved:
+
+ Configure your kernel, if necessary, for the port
+ you're using for the printer; section tells
+ you what you need to do.
+
+ Set the communications mode for the parallel port,
+ if you're using a parallel port; section gives
+ details.
+
+ Test if the operating system can send data to the
+ printer. Section gives some
+ suggestions on how to do this.
+
+ Set up LPD for the printer by modifying the file
+ /etc/printcap. Section
+ shows you how.
+
+
+ Kernel Configuration
+
+
The operating system kernel is compiled to work with a
+ specific set of devices. The serial or parallel interface
+ for your printer is a part of that set. Therefore, it
+ might be necessary to add support for an additional serial
+ or parallel port if your kernel isn't already configured
+ for one.
+
+ To find out if the kernel you're currently using supports a serial
+ interface, type
+
+dmesg | grep sio
+ where
+sio2 at 0x3e8-0x3ef irq 5 on isa
+sio2: type 16550A
+
+ then the kernel supports the port.
+
+ To find out if the kernel supports a parallel interface,
+ type
+
+dmesg | grep lpt
+ where
+lpt0 at 0x378-0x37f on isa
+
+ then the kernel supports the port.
+
+ You might have to reconfigure your kernel in order for the
+ operating system to recognize and use the parallel or
+ serial port you're using for the printer.
+
+ To add support for a serial port, see the section on
+ kernel configuration. To add support for a parallel port,
+ see that section Adding /dev Entries for the Ports
+
+
+
Even though the kernel may support communication along
+ a serial or parallel port, you'll still need a software
+ interface through which programs running on the system
+ can send and receive data. That's what entries in the
+ /dev directory are for.
+
+ To add a /dev entry for a port:
+
+ Become root with the Change to the /dev directory:
+
+cd /dev
+
+
+ Type
+
+ ./MAKEDEV
+ where Type
+
+ls -l
+ to make sure the device entry got created.
+
+
+ Setting the Communication Mode for the Parallel Port
+
+
+
When you're using the parallel interface, you can
+ choose whether FreeBSD should use interrupt-driven or
+ polled communication with the printer.
+
+
+ The The
+
+ The interrupt-driven method is somewhat faster but uses
+ up a precious IRQ line. You should use whichever one
+ works.
+
+ You can set the communications mode in two ways: by
+ configuring the kernel or by using the To set the communications mode by configuring the
+ kernel:
+
+ Edit your kernel configuration file. Look for
+ or add an
+ If you want interrupt-driven mode, add the
+device lpt0 at isa? port? tty irq
+
+ where If you want polled mode, don't add the
+
+device lpt0 at isa? port? tty vector lptintr
+
+
+ Save the file. Then configure, build, and
+ install the kernel, then reboot. See for more details.
+
+
+ To set the communications mode with
+
+
+
+ Type
+
+lptcontrol -i -u
+
+ to set interrupt-driven mode for
+ Type
+
+lptcontrol -p -u
+
+ to set polled-mode for
+ You could put these commands in your
+ /etc/rc.local file to set the mode each time
+ your system boots. See lptcontrol(8) for more
+ information.
+
+ Checking Printer Communications
+
+
Before proceeding to configure the spooling system,
+ you should make sure the operating system can
+ successfully send data to your printer. It's a lot
+ easier to debug printer communication and the spooling
+ system separately.
+
+ To test the printer, we'll send some text to it. For
+ printers that can immediately print characters sent to
+ them, the program
+%!PS
+100 100 moveto 300 300 lineto stroke
+310 310 moveto
+/Helvetica findfont 12 scalefont setfont
+(Is this thing working?) show
+showpage
+
+ Checking a Parallel Printer
+
+
This section tells you how to check if FreeBSD can
+ communicate with a printer connected to a parallel port.
+
+ To test a printer on a parallel port:
+
+ Become root with Send data to the printer.
+
+ If the printer can print plain text, then
+ use
+lptest > /dev/lpt
+
+ where If the printer understands PostScript or
+ other printer language, then send a small
+ program to the printer. Type
+
+cat > /dev/lpt
+
+ Then, line by line, type the program
+ Alternatively, you can put the program in
+ a file and type
+
+cat /dev/lpt
+
+ where
+
+
+ You should see something print. Don't worry if the
+ text doesn't look right; we'll fix such things later.
+
+ Checking a Serial Printer
+
+
This section tells you how to check if FreeBSD can
+ communicate with a printer on a serial port.
+
+ To test a printer on a serial port:
+
+ Become root with Edit the file /etc/remote. Add the
+ following entry:
+
+printer:dv=/dev/
+
+ where
+ Here's a sample entry for a printer connected
+ via a serial line to the third serial port at
+ 19200 bps with no parity:
+
+printer:dv=/dev/ttyd2:br#19200:pa=none
+
+
+ Connect to the printer with
+tip printer
+
+ If this step doesn't work, edit the file
+ /etc/remote again and try using
+ /dev/cuaa instead of
+ /dev/ttyd.
+
+ Send data to the printer.
+
+ If the printer can print plain text, then
+ use
+~$lptest
+
+
+ If the printer understands PostScript or
+ other printer language, then send a small
+ program to the printer. Type the program,
+ line by line, Alternatively, you can put the program in
+ a file and type
+
+˜>
+
+ where
+
+
+ You should see something print. Don't worry if the
+ text doesn't look right; we'll fix that later.
+
+ Enabling the Spooler: The /etc/printcap File
+
+
+
At this point, your printer should be hooked up, your
+ kernel configured to communicate with it (if necessary),
+ and you've been able to send some simple data to the
+ printer. Now, we're ready to configure LPD to control
+ access to your printer.
+
+ You configure LPD by editing the file
+ /etc/printcap. The LPD spooling system reads
+ this file each time the spooler is used, so updates to the
+ file take immediate effect.
+
+ The format of the /etc/printcap. The format is identical to other
+ capability files like /usr/share/misc/termcap and
+ /etc/remote. For complete information about the
+ format, see the cgetent(3).
+
+ The simple spooler configuration consists of the following steps:
+
+ Pick a name (and a few convenient aliases) for
+ the printer, and put them in the
+ /etc/printcap file; see .
+
+ Turn off header pages (which are on by default)
+ by inserting the .
+
+ Make a spooling directory, and specify its
+ location with the .
+
+ Set the /dev entry to use for the
+ printer, and note it in /etc/printcap with
+ the . Also, if the
+ printer's on a serial port, set up the communication
+ parameters with the .
+
+ Install a plain text input filter; see
+
+ Test the setup by printing something with the
+ and .
+
+
+ tells how to do
+ this.
+
+ Naming the Printer
+
+
The first (easy) step is to pick a name for your
+ printer. It really doesn't matter whether you choose
+ functional or whimsical names since you can also provide
+ a number aliases for the printer.
+
+ At least one of the printers specified in the
+ /etc/printcap should have the alias
+ /etc/printcap file. The name of
+ the printer should start in the leftmost column.
+ Separate each alias with a vertical bar and put a colon
+ after the last alias.
+
+ In the following example, we start with a skeletal
+ /etc/printcap that defines two printers (a
+ Diablo 630 line printer and a Panasonic KX-P4455
+ PostScript laser printer):
+
+#
+# /etc/printcap for host rose
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:
+
+ In this example, the first printer is named Suppressing Header Pages
+
+
The LPD spooling system will by default print a
+ /etc/printcap
. Here's the example
+ /etc/printcap with
+#
+# /etc/printcap for host rose - no header pages anywhere
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:
+
+ Note how we used the correct format: the first line
+ starts in the leftmost column, and subsequent lines are
+ indented with a single TAB. Every line in an entry
+ except the last ends in a backslash character.
+
+ Making the Spooling Directory
+
+
The next step in the simple spooler setup is to make a
+ /var/spool
. It's not necessary to backup the
+ contents of spooling directories, either. Recreating
+ them is as simple as running
+mkdir /var/spool/printer-name
+
+ However, if you have a lot of printers on your network,
+ you might want to put the spooling directories under a
+ single directory that you reserve just for printing with
+ LPD. We'll do this for our two example printers
+
+mkdir /var/spool/lpd
+mkdir /var/spool/lpd/rattan
+mkdir /var/spool/lpd/bamboo
+
+
+
+chown daemon.daemon /var/spool/lpd/rattan
+chown daemon.daemon /var/spool/lpd/bamboo
+chmod 770 /var/spool/lpd/rattan
+chmod 770 /var/spool/lpd/bamboo
+
+
+ Finally, you need to tell LPD about these directories
+ using the /etc/printcap file. You specify the
+ pathname of the spooling directory with the
+#
+# /etc/printcap for host rose - added spooling directories
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:
+
+ Note that the name of the printer starts in the first
+ column but all other entries describing the printer
+ should be indented with a tab and each line escaped with
+ a backslash.
+
+ If you don't specify a spooling directory with /var/spool/lpd as
+ a default.
+
+ Identifying the Printer Device
+
+
In section , we identified which
+ entry in the /dev directory FreeBSD will use
+ to communicate with the printer. Now, we tell LPD
+ that information. When the spooling system has a job
+ to print, it will open the specified device on behalf
+ of the filter program (which is responsible for
+ passing data to the printer).
+
+ List the /dev entry pathname in the
+ /etc/printcap file using the /etc/printcap:
+
+#
+# /etc/printcap for host rose - identified what devices to use
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:
+
+
+ If you don't specify the /etc/printcap file, LPD uses
+ /dev/lp as a default. /dev/lp
+ currently doesn't exist in FreeBSD.
+
+ If the printer you're installing is connected to a
+ parallel port, skip to the section . Otherwise,
+ be sure to follow the instructions in the next section.
+
+ Configuring Spooler Communication
+ Parameters
+
+
For printers on serial ports, LPD can set up the bps
+ rate, parity, and other serial communication parameters
+ on behalf of the filter program that sends data to the
+ printer. This is advantageous since
+
+ It lets you try different communication
+ parameters by simply editing the
+ /etc/printcap file; you don't have to
+ recompile the filter program.
+
+ It enables the spooling system to use the same
+ filter program for multiple printers which may have
+ different serial communication settings.
+
+
+ The following /etc/printcap capabilities
+ control serial communication parameters of the device
+ listed in the
+ br#/
+
+ Sets the communications speed of the device to
+ fc#/
+
+ Clears the flag bits fs#/
+
+ Sets the flag bits xc#/
+
+ Clears local mode bits xs#/
+
+ Sets local mode bits
+ For more information on the bits for the /usr/include/sys/ioctl_compat.h and also BLAH
+ (the serial communications document).
+
+ When LPD opens the device specified by the
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:fs#0x82000c1:xs#0x820:
+
+
+
+ Installing the Text Filter
+
+
We're now ready to tell LPD what text filter to use to
+ send jobs to the printer. A .
+
+ For our simple printer setup, the text filter can be a
+ small shell script that just executes /bin/cat
+ to send the job to the printer. FreeBSD comes with
+ another filter called .
+
+ First, let's make the shell script
+ /usr/local/libexec/if-simple be a simple text
+ filter. Put the following text into that file with your
+ favorite text editor:
+
+#!/bin/sh
+#
+# if-simple - Simple text input filter for lpd
+# Installed in /usr/local/libexec/if-simple
+#
+# Simply copies stdin to stdout. Ignores all filter arguments.
+
+/bin/cat &ero;&ero; exit 0
+exit 2
+
+ Make the file executable:
+
+chmod 555 /usr/local/libexec/if-simple
+
+
+ And then tell LPD to use it by specifying it with the
+ /etc/printcap. We'll add
+ it to the two printers we have so far in the example
+ /etc/printcap:
+
+#
+# /etc/printcap for host rose - added text filter
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:\
+ :if=/usr/local/libexec/if-simple:
+
+
+ Trying It Out
+
+
You've reached the end of the simple LPD setup.
+ Unfortunately, congratulations are not quite yet in
+ order, since we've still got to test the setup and
+ correct any problems. To test the setup, try printing
+ something. To print with the LPD system, you use the
+ command to generate some
+ test text.
+
+ To test the simple LPD setup:
+
+
. To test
+ the default printer, type
+!"#$%&ero;'()*+,-./01234
+"#$%&ero;'()*+,-./012345
+#$%&ero;'()*+,-./0123456
+$%&ero;'()*+,-./01234567
+%&ero;'()*+,-./012345678
+
+
+ To further test the printer, try downloading larger
+ programs (for language-based printers) or running
+ .
+
+ Troubleshooting
+
+
After performing the simple test with
+ /usr/local/libexec/if-simple prints a form
+ feed after it sends the job to the printer:
+
+#!/bin/sh
+#
+# if-simple - Simple text input filter for lpd
+# Installed in /usr/local/libexec/if-simple
+#
+# Simply copies stdin to stdout. Ignores all filter arguments.
+# Writes a form feed character (\f) after printing job.
+
+/bin/cat &ero;&ero; printf "\f" &ero;&ero; exit 0
+exit 2
+
+
+
+!"#$%&ero;'()*+,-./01234
+ "#$%&ero;'()*+,-./012345
+ #$%&ero;'()*+,-./0123456
+ $%&ero;'()*+,-./01234567
+
+ You've become another victim of the
+Printer received CR Printer prints CR
+Printer received LF Printer prints CR + LF
+
+
+ Here are some ways to achieve this:
+
+ Use the printer's configuration switches or
+ control panel to alter its interpretation of
+ these characters. Check your printer's manual
+ to find out how to do this.
+
+
Have FreeBSD's serial line driver
+ automatically convert LF to CR+LF. Of course,
+ this works with printers on serial ports
+ /etc/printcap
file for the printer.
+
+ Send an Here's an example text filter for printers
+ that understand the Hewlett-Packard PCL escape
+ codes. This filter makes the printer treat LF
+ characters as a LF and CR; then it sends the
+ job; then it sends a form feed to eject the
+ last page of the job. It should work with
+ nearly all Hewlett Packard printers.
+
+
+#!/bin/sh
+#
+# hpif - Simple text input filter for lpd for HP-PCL based printers
+# Installed in /usr/local/libexec/hpif
+#
+# Simply copies stdin to stdout. Ignores all filter arguments.
+# Tells printer to treat LF as CR+LF. Writes a form feed character
+# after printing job.
+
+printf "\033&ero;k2G" &ero;&ero; cat &ero;&ero; printf "\f" &ero;&ero; exit 0
+exit 2
+
+
+ Here's an example /etc/printcap from
+ a host called orchid. It has a single printer
+ attached to its first parallel port, a Hewlett
+ Packard LaserJet 3Si named
+#
+# /etc/printcap for host orchid
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/hpif:
+
+
+
+
+Printer received CR Printer prints CR
+Printer received LF Printer prints CR + LF
+
+
+
+ If the printer supports XON/XOFF flow
+ control, have FreeBSD use it by specifying the
+ TANDEM bit in the If the printer supports carrier flow
+ control, specify the MDMBUF bit in the If the printer doesn't support any flow
+ control, use some combination of the NLDELAY,
+ TBDELAY, CRDELAY, VTDELAY, and BSDELAY bits in
+ the
+
+ /etc/printcap file.
+
+ /etc/printcap file.
+ For example, here's the entry for
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:\
+ :lf=/var/log/rattan.log
+
+ Then, try printing again. Check the log file (in
+ our example, /var/log/rattan.log) to see
+ any error messages that might appear. Based on the
+ messages you see, try to correct the problem.
+
+ If you don't specify a /dev/console as a default.
+
+
+ Using Printers
+
+
This section tells you how to use printers you've setup with
+ FreeBSD. Here's an overview of the user-level commands:
+
+
+
+ There's also an administrative command, , used to control printers and their queues.
+
+ All three of the commands /etc/printcap file. This enables you to submit,
+ remove, and check on jobs for various printers. If you don't
+ use the Printing Jobs
+
+
+ To print files, type
+
+lpr
+
+ This prints each of the listed files to the default printer.
+ If you list no files,
+lpr /etc/host.conf /etc/hosts.equiv
+
+ To select a specific printer, type
+
+lpr -P
+
+ This example prints a long listing of the current directory
+ to the printer named
+ls -l | lpr -P rattan
+
+ Because no files were listed for the .
+
+ Checking Jobs
+
+
When you print with
+lpq -P bamboo
+
+ shows the queue for the printer named
+bamboo is ready and printing
+Rank Owner Job Files Total Size
+active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes
+2nd kelly 10 (standard input) 1635 bytes
+3rd mary 11 ... 78519 bytes
+
+ This shows three jobs in the queue for for details.
+
+ Job number nine consists of two files; multiple files given
+ on the
+waiting for bamboo to become ready (offline ?)
+
+kelly: 1st [job 009rose]
+ /etc/host.conf 73 bytes
+ /etc/hosts.equiv 15 bytes
+
+kelly: 2nd [job 010rose]
+ (standard input) 1635 bytes
+
+mary: 3rd [job 011rose]
+ /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes
+
+
+ Removing Jobs
+
+
If you change your mind about printing a job, you can
+ remove the job from the queue with the
+
+ To remove the job from a specific printer, add the
+lprm -P bamboo 10
+
+ The
+
+
+ Just use the
+lprm -P rattan -
+
+
+
+rose% lpr -P rattan myfile
+rose% rlogin orchid
+orchid% lpq -P rattan
+Rank Owner Job Files Total Size
+active seeyan 12 ... 49123 bytes
+2nd kelly 13 myfile 12 bytes
+orchid% lprm -P rattan 13
+rose: Permission denied
+orchid% logout
+rose% lprm -P rattan 13
+dfA013rose dequeued
+cfA013rose dequeued
+rose%
+
+
+ Beyond Plain Text: Printing Options
+
+
The Formatting and Conversion Options
+
+
The following
+lpr -P bamboo -d fish-report.dvi
+
+ These options apply to every file in the job, so you can't
+ mix (say) DVI and ditroff files together in a job.
+ Instead, submit the files as separate jobs, using a
+ different conversion option for each job.
+
+ gives details.
+
+
+
+
+ Here's an example: this command prints a nicely
+ formatted version of the
+zcat /usr/share/man/man1/ls.1.gz | troff -t -man | lpr -t
+
+ The Job Handling Options
+
+
The following options to
+ .
+
+
This example prints three copies of
+lpr -#3 parser.c parser.h
+
+
+
+
+ Header Page Options
+
+
These options to for information about
+ setting up header pages.
+
+
+ for
+ details.
+
+
+
+ Administrating Printers
+
+
As an administrator for your printers, you've had to
+ install, set up, and test them. Using the
+ Start and stop the printers
+
+ Enable and disable their queues
+
+ Rearrange the order of the jobs in each queue.
+
+
+ First, a note about terminology: if a printer is
+ /etc/printcap.
+
+
+
+
+ Advanced Printer Setup
+
+
This section describes filters for printing specially
+ formatted files, header pages, printing across networks, and
+ restricting and accounting for printer usage.
+
+ Filters
+
+
Although LPD handles network protocols, queuing, access
+ control, and other aspects of printing, most of the
+ ).
+
+ However, in order to take advantage of format conversion,
+ printer accounting, specific printer quirks, and so on, you
+ should understand how filters work. It will ultimately be
+ the filter's responsibility to handle these aspects. And the
+ bad news is that most of the time /usr/libexec/lpr/lpf
,
+ that works with many printers that can print plain text.
+ (It handles backspacing and tabs in the file, and does
+ accounting, but that's about all it does.) There are also
+ several filters and filter components in the FreeBSD ports
+ collection.
+
+ Here's what you'll find in this section:
+
+
+ Section , tries to give an overview of a
+ filter's role in the printing process. You should read
+ this section to get an understanding of what's happening
+ ``under the hood'' when LPD uses filters. This
+ knowledge could help you anticipate and debug problems
+ you might encounter as you install more and more filters
+ on each of your printers.
+
+ LPD expects every printer to be able to print plain
+ text by default. This presents a problem for PostScript
+ (or other language-based printers) which can't directly
+ print plain text. Section tells you what
+ you should do to overcome this problem. I recommend
+ reading this section if you have a PostScript printer.
+
+ PostScript is a popular output format for many
+ programs. Even some people (myself included) write
+ PostScript code directly. But PostScript printers are
+ expensive. Section
+ tells how you can further modify a printer's text filter
+ to accept and print PostScript data on a
+ Section tells about a way you can
+ automate the conversion of specific file formats, such
+ as graphic or typesetting data, into formats your
+ printer can understand. After reading this section,
+ you should be able to set up your printers such that
+ users can type Section tells all about a not often used feature of
+ LPD: output filters. Unless you're printing header
+ pages (see ), you can probably skip that
+ section altogether.
+
+ Section describes
+
+ How Filters Work
+
+
As mentioned before, a filter is an executable program
+ started by LPD to handle the device-dependent part of
+ communicating with the printer.
+
+ When LPD wants to print a file in a job, it starts a
+ filter program. It sets the filter's standard input to
+ the file to print, its standard output to the printer, and
+ its standard error to the error logging file (specified in
+ the /etc/printcap, or
+ /dev/console by default).
+
+ Which filter LPD starts and the filter's arguments depend
+ on what's listed in the /etc/printcap file and
+ what arguments the user specified for the job on the
+ for
+ details).
+
+ There are three kinds filters you can specify in
+ /etc/printcap:
+
+ The
+[-c] -w
+
+ where
+
+ /etc/printcap,
+ default 132
+
+
+
+ A tells all about them.
+ Conversion filters also need to do accounting, if you
+ need printer accounting.
+
+ Conversion filters are started with the following
+ arguments:
+
+-x
+
+ where The
+ describe them. There are only two arguments to an
+ output filter:
+
+-w
+
+ which are identical to the text filters
+
+ Filters should also
+
+
+ The text filter that comes with the FreeBSD release,
+ /usr/libexec/lpr/lpf, takes advantage of the page
+ width and length arguments to determine when to send a
+ form feed and how to account for printer usage. It uses
+ the login, host, and accounting file arguments to make the
+ accounting entries.
+
+ If you're shopping for filters, see if they're
+ LPD-compatible. If they are, they must support the
+ argument lists described above. If you plan on writing
+ filters for general use, then have them support the same
+ argument lists and exit codes.
+
+ Accommodating Plain Text Jobs on PostScript Printers
+
+
+
If you're the only user of your computer and PostScript
+ (or other language-based) printer, and you promise to
+ never send plain text to your printer and to never use
+ features of various programs that will want to send plain
+ text to your printer, then you don't need to worry about
+ this section at all.
+
+ But, if you would like to send both PostScript and plain
+ text jobs to the printer, then you're urged to augment
+ your printer setup. To do so, we have the text filter
+ detect if the arriving job is plain text or PostScript.
+ All PostScript jobs must start with ); if not,
+ it should be shortly. You can fetch, build and install it
+ yourself, of course. After installing /etc/printcap:
+
+ :if=/usr/local/libexec/psif:
+
+ You should also specify the
+#!/bin/sh
+#
+# psif - Print PostScript or plain text on a PostScript printer
+# Script version; NOT the version that comes with lprps
+# Installed in /usr/local/libexec/psif
+#
+
+read first_line
+first_two_chars=`expr "$first_line" : '\(..\)'`
+
+if [ "$first_two_chars" = "%!" ]; then
+ #
+ # PostScript job, print it.
+ #
+ echo $first_line &ero;&ero; cat &ero;&ero; printf "\004" &ero;&ero; exit 0
+ exit 2
+else
+ #
+ # Plain text, convert it, then print it.
+ #
+ ( echo $first_line; cat ) | /usr/local/bin/textps &ero;&ero; printf "\004" &ero;&ero; exit 0
+ exit 2
+fi
+
+ In the above script, ) includes a full featured text-to-PostScript
+ program called Simulating PostScript on Non-PostScript Printers
+
+
+
PostScript is the
+#!/bin/sh
+#
+# ifhp - Print Ghostscript-simulated PostScript on a DesJet 500
+# Installed in /usr/local/libexec/hpif
+
+#
+# Treat LF as CR+LF:
+#
+printf "\033&ero;k2G" || exit 2
+
+#
+# Read first two characters of the file
+#
+read first_line
+first_two_chars=`expr "$first_line" : '\(..\)'`
+
+if [ "$first_two_chars" = "%!" ]; then
+ #
+ # It's PostScript; use Ghostscript to scan-convert and print it
+ #
+ /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 -sOutputFile=- - \
+ &ero;&ero; exit 0
+
+else
+ #
+ # Plain text or HP/PCL, so just print it directly; print a form
+ # at the end to eject the last page.
+ #
+ echo $first_line &ero;&ero; cat &ero;&ero; printf "\f" &ero;&ero; exit 2
+fi
+
+exit 2
+
+ Finally, you need to notify LPD of the filter via the
+
+ :if=/usr/local/libexec/hpif:
+
+ That's it. You can type Conversion Filters
+
+
After completing the simple setup described in , the
+ first thing you'll probably want to do is install
+ conversion filters for your favorite file formats
+ (besides plain ASCII text).
+
+ Why Install Conversion Filters?
+
+
Conversion filters make printing various kinds of
+ files easy. As an example, suppose we do a lot of work
+ with the TeX typesetting system, and we have a
+ PostScript printer. Every time we generate a DVI file
+ from TeX, we can't print it directly until we convert
+ the DVI file into PostScript. The command sequence
+ goes like this:
+
+dvips seaweed-analysis.dvi
+lpr seaweed-analysis.ps
+
+ By installing a conversion filter for DVI files, we can
+ skip the hand conversion step each time by having LPD do
+ it for us. Now, each time we get a DVI file, we're just
+ one step away from printing it:
+
+lpr -d seaweed-analysis.dvi
+
+ We got LPD to do the DVI file conversion for us by
+ specifying the lists the conversion options.
+
+ For each of the conversion options you want a printer to
+ support, install a /etc/printcap. A conversion
+ filter is like the text filter for the simple printer
+ setup (see section ) except that instead
+ of printing plain text, the filter converts the file
+ into a format the printer can understand.
+
+ Which Conversions Filters Should I Install?
+
+
+
You should install the conversion filters you expect
+ to use. If you print a lot of DVI data, then a DVI
+ conversion filter is in order. If you've got plenty of
+ troff to print out, then you probably want a troff
+ filter.
+
+ The following table summarizes the filters that LPD
+ works with, their capability entries for the
+ /etc/printcap file, and how to invoke them with
+ the
+ /etc/printcap
+File type Capability lpr option
+------------ ------------- ----------
+cifplot cf -c
+DVI df -d
+plot gf -g
+ditroff nf -n
+FORTRAN text rf -f
+troff tf -t
+raster vf -v
+plain text if none, -p, or -l
+
+
+ In our example, using /etc/printcap.
+
+ Despite what others might contend, formats like FORTRAN
+ text and plot are probably obsolete. At your site, you
+ can give new meanings to these or any of the formatting
+ options just by installing custom filters. For example,
+ suppose you'd like to directly print Printerleaf files
+ (files from the Interleaf desktop publishing program),
+ but will never print plot files. You could install a
+ Printerleaf conversion filter under the Installing Conversion Filters
+
+
Since conversion filters are programs you install
+ outside of the base FreeBSD installation, they should
+ probably go under /usr/local. The directory
+ /usr/local/libexec is a popular location, since
+ they they're specialized programs that only LPD will
+ run; regular users shouldn't ever need to run them.
+
+ To enable a conversion filter, specify its pathname
+ under the appropriate capability for the destination
+ printer in /etc/printcap.
+
+ In our example, we'll add the DVI conversion filter to
+ the entry for the printer named /etc/printcap file again, with the new
+
+#
+# /etc/printcap for host rose - added df filter for bamboo
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:\
+ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+
+ The DVI filter is a shell script named
+ /usr/local/libexec/psdf. Here's that script:
+
+#!bin/sh
+#
+# DVI to PostScript printer filter
+# Installed in /usr/local/libexec/psdf
+#
+# Invoked by lpd when user runs lpr -d
+#
+exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"
+
+ This script runs ) with the arguments LPD passed to this script.
+ More Conversion Filter Examples
+
+
Since there's no fixed set of steps to install
+ conversion filters, let me instead provide more
+ examples. Use these as guidance to making your own
+ filters. Use them directly, if appropriate.
+
+ This example script is a raster (well, GIF file,
+ actually) conversion filter for a Hewlett Packard
+ LaserJet III-Si printer:
+
+#!/bin/sh
+#
+# hpvf - Convert GIF files into HP/PCL, then print
+# Installed in /usr/local/libexec/hpvf
+
+PATH=/usr/X11R6/bin:$PATH; export PATH
+
+giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \
+ && exit 0 \
+ || exit 2
+
+ It works by converting the GIF file into a portable
+ anymap, converting that into a portable graymap,
+ converting that into a portable bitmap, and converting
+ that into LaserJet/PCL-compatible data.
+
+ Here's the /etc/printcap file with an entry for
+ a printer using the above filter:
+
+#
+# /etc/printcap for host orchid
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sh:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/hpif:\
+ :vf=/usr/local/libexec/hpvf:
+
+
+ The following script is a conversion filter for troff
+ data from the groff typesetting system for the
+ PostScript printer named
+#!/bin/sh
+#
+# pstf - Convert groff's troff data into PS, then print.
+# Installed in /usr/local/libexec/pstf
+#
+exec grops | /usr/local/libexec/lprps "$@"
+
+ The above script makes use of
+#!/bin/sh
+#
+# pstf - Convert groff's troff data into PS, then print.
+# Installed in /usr/local/libexec/pstf
+#
+exec grops
+
+ That's it. Here's the entry we need to add to
+ /etc/printcap to enable the filter:
+
+ :tf=/usr/local/libexec/pstf:
+
+
+ Here's an example that might make old hands at FORTRAN
+ blush. It's a FORTRAN-text filter for any printer that
+ can directly print plain text. We'll install it for the
+ printer
+#!/bin/sh
+#
+# hprf - FORTRAN text filter for LaserJet 3si:
+# Installed in /usr/local/libexec/hprf
+#
+
+printf "\033&ero;k2G" &ero;&ero; fpr &ero;&ero; printf "\f" &ero;&ero; exit 0
+exit 2
+
+ And we'll add this line to the /etc/printcap
+ for the printer
+ :rf=/usr/local/libexec/hprf:
+
+
+ Here's one final, somewhat complex example. We'll add a
+ DVI filter to the LaserJet printer /etc/printcap with the location of the DVI
+ filter:
+
+ :df=/usr/local/libexec/hpdf:
+
+
+ Now, for the hard part: making the filter. For that, we
+ need a DVI-to-LaserJet/PCL conversion program. The
+ FreeBSD ports collection (see ) has one: /dev/fd/0 for standard input is problematic.
+ We can get around that problem by linking (symbolically)
+ a temporary file name (one that ends in /dev/fd/0, thereby forcing /tmp directory
+ has the sticky bit set. The filter can create the link,
+ but it won't be able clean up when done and remove it
+ since the link will belong to a different user.
+
+ Instead, the filter will make the symbolic link in the
+ current working directory, which is the spooling
+ directory (specified by the /etc/printcap). This is a perfect place for
+ filters to do their work, especially since there's
+ (sometimes) more free disk space in the spooling directory
+ than under /tmp.
+
+ Here, finally, is the filter:
+
+#!/bin/sh
+#
+# hpdf - Print DVI data on HP/PCL printer
+# Installed in /usr/local/libexec/hpdf
+
+PATH=/usr/local/bin:$PATH; export PATH
+
+#
+# Define a function to clean up our temporary files. These exist
+# in the current directory, which will be the spooling directory
+# for the printer.
+#
+cleanup() {
+ rm -f hpdf$$.dvi
+}
+
+#
+# Define a function to handle fatal errors: print the given message
+# and exit 2. Exiting with 2 tells LPD to don't try to reprint the
+# job.
+#
+fatal() {
+ echo "$@" 1>&ero;2
+ cleanup
+ exit 2
+}
+
+#
+# If user removes the job, LPD will send SIGINT, so trap SIGINT
+# (and a few other signals) to clean up after ourselves.
+#
+trap cleanup 1 2 15
+
+#
+# Make sure we're not colliding with any existing files.
+#
+cleanup
+
+#
+# Link the DVI input file to standard input (the file to print).
+#
+ln -s /dev/fd/0 hpdf$$.dvi || fatal "Cannot symlink /dev/fd/0"
+
+#
+# Make LF = CR+LF
+#
+printf "\033&ero;k2G" || fatal "Cannot initialize printer"
+
+#
+# Convert and print. Return value from dvilj2p doesn't seem to be
+# reliable, so we ignore it.
+#
+dvilj2p -M1 -q -e- dfhp$$.dvi
+
+#
+# Clean up and exit
+#
+cleanup
+exit 0
+
+
+ Automated Conversion: An Alternative To Conversion Filters
+
+
+
All these conversion filters accomplish a lot for your
+ printing environment, but at the cost forcing the user
+ to specify (on the Output Filters
+
+
The LPD spooling system supports one other type of
+ filter that we've not yet explored: an output filter. An
+ output filter is intended for printing plain text only,
+ like the text filter, but with many simplifications. If
+ you're using an output filter but no text filter, then
+
+ LPD starts an output filter once for the entire
+ job instead of once for each file in the job.
+
+ LPD doesn't make any provision to identify the
+ start or the end of files within the job for the
+ output filter.
+
+ LPD doesn't pass the user's login or host to
+ the filter, so it's not intended to do accounting. In
+ fact, it gets only two arguments:
+
+-w
+
+ where
+
+ Don't be seduced by an output filter's simplicity. If
+ you'd like each file in a job to start on a different page
+ an output filter . Furthermore, an output filter is actually
+ )
+ only. LPD then expects the output filter to
+
+
The program /usr/libexec/lpr/lpf that comes
+ with FreeBSD binary distribution is a text filter (input
+ filter) that can indent output (job submitted with /etc/printcap file. It uses
+ these values to determine how much text can fit on a page
+ and how many pages were in a user's job. For more
+ information on printer accounting, see .
+
+ Header Pages
+
+
If you've got .
+
+ Enabling Header Pages
+
+
In the , we turned off header pages by specifying
+ /etc/printcap file. To enable header pages for
+ a printer, just remove the
+#!/bin/sh
+#
+# hpof - Output filter for Hewlett Packard PCL-compatible printers
+# Installed in /usr/local/libexec/hpof
+
+
+printf "\033&ero;k2G" || exit 2
+exec /usr/libexec/lpr/lpf
+
+ Specify the path to the output filter in the for more information.
+
+ Here's an example /etc/printcap file for the printer
+
+#
+# /etc/printcap for host orchid
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/hpif:\
+ :vf=/usr/local/libexec/hpvf:\
+ :of=/usr/local/libexec/hpof:
+
+ Now, when users print jobs to
+ for more /etc/printcap.
+
+ Controlling Header Pages
+
+
By enabling header pages, LPD will produce a
+k ll ll
+k l l
+k l l
+k k eeee l l y y
+k k e e l l y y
+k k eeeeee l l y y
+kk k e l l y y
+k k e e l l y yy
+k k eeee lll lll yyy y
+ y
+ y y
+ yyyy
+
+
+ ll
+ t l i
+ t l
+ oooo u u ttttt l ii n nnn eeee
+o o u u t l i nn n e e
+o o u u t l i n n eeeeee
+o o u u t l i n n e
+o o u uu t t l i n n e e
+ oooo uuu u tt lll iii n n eeee
+
+
+
+
+
+
+
+
+
+r rrr oooo ssss eeee
+rr r o o s s e e
+r o o ss eeeeee
+r o o ss e
+r o o s s e e
+r oooo ssss eeee
+
+
+
+
+
+
+
+ Job: outline
+ Date: Sun Sep 17 11:04:58 1995
+
+ LPD appends a form feed after this text so the job starts
+ on a new page (unless you've got /etc/printcap).
+
+ If you prefer, LPD can make a /etc/printcap
file.
+ The header page will look like this:
+
+rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995
+
+ Also by default, LPD prints the header page first, then
+ the job. To reverse that, specify /etc/printcap.
+
+ Accounting for Header Pages
+
+
Using LPD's built-in header pages enforces a particular
+ paradigm when it comes to printer accounting: header pages
+ must be
+ Accept LPD's paradigm and make header pages free.
+
+ Install an alternative to LPD, such as LPDng or
+ PLP. Section tells more
+ about other spooling software you can substitute for
+ LPD.
+
+ Write a /etc/printcap
.
+
+ Then again, all that might be too much trouble, and
+ users will certainly appreciate the more generous
+ system administrator who makes header pages free.
+
+
+ Header Pages on PostScript Printers
+
+
As described above, LPD can generate a plain text header
+ page suitable for many printers. Of course, PostScript
+ can't directly print plain text, so the header page
+ feature of LPD is useless---or mostly so.
+
+ One obvious way to get header pages is to have every
+ conversion filter and the text filter generate the header
+ page. The filters should should use the user and host
+ arguments to generate a suitable header page. The
+ drawback of this method is that users will always get a
+ header page, even if they submit jobs with
+#!/bin/sh
+#
+# make-ps-header - make a PostScript header page on stdout
+# Installed in /usr/local/libexec/make-ps-header
+#
+
+#
+# These are PostScript units (72 to the inch). Modify for A4 or
+# whatever size paper you're using:
+#
+page_width=612
+page_height=792
+border=72
+
+#
+# Check arguments
+#
+if [ $# -ne 3 ]; then
+ echo "Usage: `basename $0` " 1>&ero;2
+ exit 1
+fi
+
+#
+# Save these, mostly for readability in the PostScript, below.
+#
+user=$1
+host=$2
+job=$3
+date=`date`
+
+#
+# Send the PostScript code to stdout.
+#
+exec cat <
+ Now, each of the conversion filters and the text filter
+ can call this script to first generate the header page,
+ and then print the user's job. Here's the DVI conversion
+ filter from earlier in this document, modified to make a
+ header page:
+
+#!/bin/sh
+#
+# DVI to PostScript printer filter
+# Installed in /usr/local/libexec/psdf
+#
+# Invoked by lpd when user runs lpr -d
+#
+
+orig_args="$@"
+
+fail() {
+ echo "$@" 1>&ero;2
+ exit 2
+}
+
+while getopts "x:y:n:h:" option; do
+ case $option in
+ x|y) ;; # Ignore
+ n) login=$OPTARG ;;
+ h) host=$OPTARG ;;
+ *) echo "LPD started `basename $0` wrong." 1>&ero;2
+ exit 2
+ ;;
+ esac
+done
+
+[ "$login" ] || fail "No login name"
+[ "$host" ] || fail "No host name"
+
+( /u/kelly/freebsd/printing/filters/make-ps-header $login $host "DVI File"
+ /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args
+
+ Notice how the filter has to parse the argument list in
+ order to determine the user and host name. The parsing
+ for the other conversion filters is identical. The text
+ filter takes a slightly different set of arguments, though
+ (see section ).
+
+ As we've mentioned before, the above scheme, though fairly
+ simple, disables the ``suppress header page'' option (the
+ : write an output
+ filter that parses the LPD-generated header page and
+ produces a PostScript version. If the user submits the
+ job with Networked Printing
+
+
FreeBSD supports networked printing: sending jobs to
+ remote printers. Networked printing generally refers to two
+ different things:
+
+ Accessing a printer attached to a remote host. You
+ install a printer that has a conventional serial or
+ parallel interface on one host. Then, you set up LPD to
+ enable access to the printer from other hosts on the
+ network. Section tells how to
+ do this.
+
+ Accessing a printer attached directly to a network.
+ The printer has a network interface in addition (or in
+ place of) a more conventional serial or parallel
+ interface. Such a printer might work as follows:
+
+
+ It might understand the LPD protocol and can
+ even queue jobs from remote hosts. In this case, it
+ acts just like a regular host running LPD. Follow
+ the same procedure in section to set up such a
+ printer.
+
+ It might support a data stream network
+ connection. In this case, you ``attach'' the
+ printer to one host on the network by making that
+ host responsible for spooling jobs and sending them
+ to the printer. Section gives some
+ suggestions on installing such printers.
+
+
+
+ Printers Installed on Remote Hosts
+
+
The LPD spooling system has built-in support for sending
+ jobs to other hosts also running LPD (or are compatible
+ with LPD). This feature enables you to install a printer
+ on one host and make it accessible from other hosts. It
+ also works with printers that have network interfaces that
+ understand the LPD protocol.
+
+ To enable this kind of remote printing, first install a
+ printer on one host, the . Do any
+ advanced setup in that you need. Make sure
+ to test the printer and see if it works with the features
+ of LPD you've enabled.
+
+ If you're using a printer with a network interface that's
+ compatible with LPD, then the /etc/printcap
+ files with the following:
+
+ Name the entry anything you want. For
+ simplicity, though, you probably want to use the same
+ name and aliases as on the printer host.
+
+ Leave the Make a spooling directory and specify its
+ location in the Place the name of the printer host in the Place the printer name on the
+ That's it. You don't need to list conversion filters,
+ page dimensions, or anything else in the
+ /etc/printcap file.
+
+ Here's an example. The host rose has two printers,
+ /etc/printcap file for orchid (back from section
+ ). It already had the entry
+ for the printer
+#
+# /etc/printcap for host orchid - added (remote) printers on rose
+#
+
+#
+# teak is local; it's connected directly to orchid:
+#
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
+ :if=/usr/local/libexec/ifhp:\
+ :vf=/usr/local/libexec/vfhp:\
+ :of=/usr/local/libexec/ofhp:
+
+#
+# rattan is connected to rose; send jobs for rattan to rose:
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
+
+#
+# bamboo is connected to rose as well:
+#
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:
+
+ Then, we just need to make spooling directories on orchid:
+
+mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
+chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
+chown daemon.daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo
+
+
+ Now, users on orchid can print to
+lpr -P bamboo -d sushi-review.dvi
+
+ the LPD system on orchid would copy the job to the
+ spooling directory /var/spool/lpd/bamboo and note
+ that it was a DVI job. As soon as the host rose has room
+ in its Printers with Networked Data Stream Interfaces
+
+
Often, when you buy a network interface card for a
+ printer, you can get two versions: one which emulates a
+ spooler (the more expensive version), or one which just
+ lets you send data to it as if you were using a serial or
+ parallel port (the cheaper version). This section tells
+ how to use the cheaper version. For the more expensive
+ version, see the previous section .
+
+ The format of the /etc/printcap file lets you
+ specify what serial or parallel interface to use, and (if
+ you're using a serial interface), what baud rate, whether
+ to use flow control, delays for tabs, conversion of
+ newlines, and more. But there's no way to specify a
+ connection to a printer that's listening on a TCP/IP or
+ other network port.
+
+ To send data to a networked printer, you need to develop a
+ communications program that can be called by the text and
+ conversion filters. Here's one such example: the script
+
+#!/usr/bin/perl
+#
+# netprint - Text filter for printer attached to network
+# Installed in /usr/local/libexec/netprint
+#
+
+$#ARGV eq 1 || die "Usage: $0 ";
+
+$printer_host = $ARGV[0];
+$printer_port = $ARGV[1];
+
+require 'sys/socket.ph';
+
+($ignore, $ignore, $protocol) = getprotobyname('tcp');
+($ignore, $ignore, $ignore, $ignore, $address)
+ = gethostbyname($printer_host);
+
+$sockaddr = pack('S n a4 x8', &ero;AF_INET, $printer_port, $address);
+
+socket(PRINTER, &ero;PF_INET, &ero;SOCK_STREAM, $protocol)
+ || die "Can't create TCP/IP stream socket: $!";
+connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
+while () { print PRINTER; }
+exit 0;
+
+ We can then use this script in various filters. Suppose
+ we had a Diablo 750-N line printer connected to the
+ network. The printer accepts data to print on port number
+ 5100. The host name of the printer is scrivener. Here's
+ the text filter for the printer:
+
+#!/bin/sh
+#
+# diablo-if-net - Text filter for Diablo printer `scrivener' listening
+# on port 5100. Installed in /usr/local/libexec/diablo-if-net
+#
+
+exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100
+
+
+
+ Restricting Printer Usage
+
+
This section gives information on restricting printer
+ usage. The LPD system lets you control who can access a
+ printer, both locally or remotely, whether they can print
+ multiple copies, how large their jobs can be, and how large
+ the printer queues can get.
+
+ Restricting Multiple Copies
+
+
The LPD system makes it easy for users to print multiple
+ copies of a file. Users can print jobs with /etc/printcap file. When users submit jobs
+ with the
+lpr: multiple copies are not allowed
+
+
+ Note that if you've set up access to a printer remotely
+ (see section ), you need the
+ /etc/printcap
+ files as well, or else users will still be able to submit
+ multiple-copy jobs by using another host.
+
+ Here's an example. This is the /etc/printcap
+ file for the host rose. The printer
+#
+# /etc/printcap for host rose - restrict multiple copies on bamboo
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:\
+ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+
+ Now, we also need to add the /etc/printcap (and while we're at
+ it, let's disable multiple copies for the printer
+
+#
+# /etc/printcap for host orchid - no multiple copies for local
+# printer teak or remote printer bamboo
+
+teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
+ :lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:sc:\
+ :if=/usr/local/libexec/ifhp:\
+ :vf=/usr/local/libexec/vfhp:\
+ :of=/usr/local/libexec/ofhp:
+
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:sc:
+
+ By using the
+lpr forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign
+
+ There are many ways to prevent this abuse (including
+ ignoring it) which you are free to explore.
+
+ Restricting Access To Printers
+
+
You can control who can print to what printers by using
+ the UNIX group mechanism and the /etc/printcap. Just place the users you want to
+ have access to a printer in a certain group, and then name
+ that group in the
+lpr: Not a member of the restricted group
+
+ if they try to print to the controlled printer.
+
+ As with the ).
+
+ For example, we'll let anyone access the printer
+ /etc/printcap
+ for host rose:
+
+#
+# /etc/printcap for host rose - restricted group for bamboo
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:\
+ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+
+ Let's leave the other example /etc/printcap file
+ (for the host orchid) alone. Of course, anyone on orchid
+ can print to Controlling Sizes of Jobs Submitted
+
+
If you have many users accessing the printers, you
+ probably need to put an upper limit on the sizes of the
+ files users can submit to print. After all, there's only
+ so much free space on the filesystem that houses the
+ spooling directories, and you also need to make sure
+ there's room for the jobs of other users.
+
+ LPD enables you to limit the maximum byte size a file in a
+ job can be with the
+#
+# /etc/printcap for host rose
+#
+
+#
+# No limit on job size:
+#
+rattan|line|diablo|lp|Diablo 630 Line Printer:\
+ :sh:sd=/var/spool/lpd/rattan:\
+ :lp=/dev/lpt0:\
+ :if=/usr/local/libexec/if-simple:
+
+#
+# Limit of five megabytes:
+#
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
+ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+
+ Again, the limits apply to the local users only. If
+ you've set up access to your printers remotely, remote
+ users won't get those limits. You'll need to specify the
+ /etc/printcap
+ files as well. See section for
+ more information on remote printing.
+
+ There's another specialized way to limit job sizes from
+ remote printers; see section .
+
+ Restricting Jobs from Remote Printers
+
+
The LPD spooling system provides several ways to restrict
+ print jobs submitted from remote hosts:
+
+
+ /etc/hosts.equiv
and /etc/hosts.lpd.
+ LPD checks to see if an incoming request is from a
+ host listed in either one of these files. If not, LPD
+ refuses the request.
+
+ The format of these files is simple: one host name per
+ line. Note that the file /etc/hosts.equiv is
+ also used by the ruserok(3) protocol, and affects
+ programs like /etc/hosts.lpd file
+ on the host rose:
+
+orchid
+violet
+madrigal.fishbaum.de
+
+ This means rose will accept requests from the hosts
+ orchid, violet, and madrigal.fishbaum.de. If any
+ other host tries to access rose's LPD, LPD will
+ refuse them.
+
+ /etc/printcap
to find the spooling directory
+ for this printer; here's
+bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
+ :sh:sd=/var/spool/lpd/bamboo:sc:rg=artists:mx#5000:\
+ :lp=/dev/ttyd5:fs#0x82000e1:xs#0x820:rw:mx#5000:\
+ :if=/usr/local/libexec/psif:\
+ :df=/usr/local/libexec/psdf:
+
+ The spooling directory is the given in the
+echo 6144 > /var/spool/lpd/bamboo/minfree
+
+ /etc/printcap. When /usr/bin/false.
+
+
+ Accounting for Printer Usage
+
+
So, you need to charge for printouts. And why not? Paper
+ and ink cost money. And then there are maintenance
+ costs---printers are loaded with moving parts and tend to
+ break down. You've examined your printers, usage patterns,
+ and maintenance fees and have come up with a per-page (or
+ per-foot, per-meter, or per-whatever) cost. Now, how do you
+ actually start accounting for printouts?
+
+ Well, the bad news is the LPD spooling system doesn't
+ provide much help in this department. Accounting is highly
+ dependent on the kind of printer in use, the formats being
+ printed, and .
+
+ Generally, there are two ways to do accounting:
+
+
+
+ The LPD spooling system supports both methods easily: since
+ you have to provide the filters (well, most of the time),
+ you also have to provide the accounting code. But there is
+ a bright side: you have enormous flexibility in your
+ accounting methods. For example, you choose whether to use
+ periodic or timely accounting. You choose what information
+ to log: user names, host names, job types, pages printed,
+ square footage of paper used, how long the job took to
+ print, and so forth. And you do so by modifying the filters
+ to save this information.
+
+ Quick and Dirty Printer Accounting
+
+
FreeBSD comes with two programs that can get you set up
+ with simple periodic accounting right away. They are the
+ text filter , and
+ ), LPD
+ starts the text and the conversion filters with the name
+ of the accounting file to use on the filter command
+ line. The filters can use this argument to know where
+ to write an accounting file entry. The name of this
+ file comes from the /etc/printcap, and if not specified as an
+ absolute path, is relative to the spooling directory.
+
+ LPD starts
+ 2.00 rose:andy
+ 3.00 rose:kelly
+ 3.00 orchid:mary
+ 5.00 orchid:mary
+ 2.00 orchid:zhang
+
+ You should use a separate accounting file for each
+ printer, as /etc/printcap.
+ Then, each accounting file will be in the spooling directory
+ for a printer, in a file named
+ Login pages/feet runs price
+orchid:kelly 5.00 1 $ 0.10
+orchid:mary 31.00 3 $ 0.62
+orchid:zhang 9.00 1 $ 0.18
+rose:andy 2.00 1 $ 0.04
+rose:kelly 177.00 104 $ 3.54
+rose:mary 87.00 32 $ 1.74
+rose:root 26.00 12 $ 0.52
+
+total 337.00 154 $ 6.74
+
+ These are the arguments
+ /etc/printcap.
+
+ /etc/printcap, or two cents (the
+ default). You can specify
+
+ In the default summary that
+ Login pages/feet runs price
+andy 2.00 1 $ 0.04
+kelly 182.00 105 $ 3.64
+mary 118.00 35 $ 2.36
+root 26.00 12 $ 0.52
+zhang 9.00 1 $ 0.18
+
+total 337.00 154 $ 6.74
+
+ To compute the dollar amount due, /etc/printcap file
+ (default of 200, or 2 cents per page). Specify, in
+ hundreths of cents, the price per page or per foot you
+ want to charge for printouts in this capability. You can
+ override this value when you run
+pac -p1.50
+
+ makes each page cost one dollar and fifty cents. You can
+ really rake in the profits by using this option.
+
+ Finally, running How Can You Count Pages Printed?
+
+
In order to perform even remotely accurate accounting,
+ you need to be able to determine how much paper a job
+ uses. This is the essential problem of printer
+ accounting.
+
+ For plain text jobs, the problem's not that hard to solve:
+ you count how many lines are in a job and compare it to
+ how many lines per page your printer supports. Don't
+ forget to take into account backspaces in the file which
+ overprint lines, or long logical lines that wrap onto one
+ or more additional physical lines.
+
+ The text filter )
+ takes into account these things when it does accounting.
+ If you're writing a text filter which needs to do
+ accounting, you might want to examine Alternatives to the Standard Spooler
+
+
If you've been reading straight through this manual, by now
+ you've learned just about everything there is to know about
+ the LPD spooling system that comes with FreeBSD. You can
+ probably appreciate many of its shortcomings, which naturally
+ leads to the question: ``What other spooling systems are out
+ there (and work with FreeBSD)?''
+
+ Unfortunately, I've located only
+ . There's also a .
+
+ It's quite similar to the BSD LPD spooler, but boasts a
+ host of features, including:
+
+ Better network support, including built-in support
+ for networked printers, NIS-maintained printcaps, and
+ NFS-mounted spooling directories
+
+ Sophisticated queue management, allowing multiple
+ printers on a queue, transfer of jobs between queues,
+ and queue redirection
+
+ Remote printer control functions
+
+ Prioritization of jobs
+
+ Expansive security and access options
+
+
+ .
+
+
+
+ Acknowledgments
+
+
I'd like to thank the following people who've assisted in
+ the development of this document:
+
+
+
diff --git a/handbook/sections.sgml b/handbook/sections.sgml
index 30f77ab87d..63e5efa85f 100644
--- a/handbook/sections.sgml
+++ b/handbook/sections.sgml
@@ -1,4 +1,4 @@
-
+
@@ -30,6 +30,7 @@
+