summaryrefslogtreecommitdiff
path: root/sys/doc/lp.ms
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2011-07-18 11:01:22 +0200
committeraiju <aiju@phicode.de>2011-07-18 11:01:22 +0200
commit8c4c1f39f4e369d7c590c9d119f1150a2215e56d (patch)
treecd430740860183fc01de1bc1ddb216ceff1f7173 /sys/doc/lp.ms
parent11bf57fb2ceb999e314cfbe27a4e123bf846d2c8 (diff)
added /sys/doc
Diffstat (limited to 'sys/doc/lp.ms')
-rw-r--r--sys/doc/lp.ms824
1 files changed, 824 insertions, 0 deletions
diff --git a/sys/doc/lp.ms b/sys/doc/lp.ms
new file mode 100644
index 000000000..1d6b8ab61
--- /dev/null
+++ b/sys/doc/lp.ms
@@ -0,0 +1,824 @@
+.HTML "A Guide to the Lp Printer Spooler
+.TL
+A Guide to the Lp
+Printer Spooler
+.AU
+Paul Glick
+pg@plan9.bell-labs.com
+.AB
+.PP
+.I Lp
+is a collection of programs used to provide an easy-to-use
+interface for printing a variety of document types on a variety
+of printers.
+.I Lp
+is the glue that connects various document language
+translators and printer communication programs together so that
+the users may have a consistent view of printers.
+Most of the glue
+is shell script, which can be easily modified.
+The user need not
+specify options to get sensible output in most cases.
+.I Lp
+is described here
+so that others may make additions and changes.
+.AE
+\" .2C
+.NH
+Introduction
+.PP
+.I Lp
+is used to format and print data on a variety of output devices.
+The need for
+.I lp
+was rooted in the inability of other printer spoolers to do simple
+tasks without a great deal of user specification of options.
+At the time
+.I lp
+was written, there were several printer
+languages, such as ImPress and PostScript, and
+an internally developed printer that would accept
+.I troff
+output.
+Now, all our printers take PostScript,
+but printers that use HPCL and HPGL abound and
+support for those printers may be added easily.
+A great deal of what underlies
+.I lp
+is taken from BSD's
+.I lpr
+and System V's
+.I lp .
+The important features of this system are that most of the programs
+are easily modified shell scripts and the user need not
+learn to use the large amount of underlying software developed by others.
+.I Lp
+runs under Plan 9 and several flavors of
+UNIX.
+This document deals with
+.I lp
+as it relates to Plan 9.
+.I Lp
+was developed using both Datakit and Ethernet to transport data between machines.
+Now only the Ethernet transport mechanism remains.
+.PP
+Text, graphics, and formatted text files are appropriately processed and
+placed into a spool directory from which they are taken to be printed by a daemon process.
+Additional functions include checking the status of a printer queue
+and removing jobs from the printer queue.
+.PP
+All the shell scripts (see
+.I rc (1))
+associated with
+.I lp
+reside in the spool directory
+.CW /sys/lib/lp
+except for the
+.I lp
+command itself, which resides in
+.CW /rc/bin .
+Commands related to
+.I lp
+that are not shell scripts can most often be found
+in
+.CW /$cputype/bin/aux .
+The directory where all the
+.I lp
+scripts reside is defined within
+.I lp
+by the shell variable
+.CW LPLIB .
+In the remainder of this document, file names will be specified
+with this shell variable as their root.
+.NH
+Usage
+.PP
+.I Lp
+requires an output device to be specified
+before it will process input.
+This can be done in any of three ways described here.
+.IP 1)
+The file
+.CW $LPLIB/defdevice
+may contain the name of a default output device.
+This may not be practical for environments where
+there are many printers.
+.IP 2)
+The user's environment variable
+.CW LPDEST
+may be set to the name of the device to be used.
+This is often a more practical solution when there are several printers
+available.
+This overrides a
+.CW defdevice
+specification.
+.IP 3)
+The
+.CW -d
+.I printer
+option to the
+.I lp
+command specifies
+.I printer
+as the device to which output should be directed, overriding the
+previous two specifications.
+.PP
+.ti 0
+If
+.I printer
+is
+.CW ? ,
+a list of printers and other information in the
+.CW devices
+file is printed, as shown in Figure 1.
+Quote the question mark to prevent it from being
+interpreted by the shell language as a metacharacter.
+\" .1C
+.KF
+.P1
+% lp -d'?'
+device location host class
+fn 2C-501 helix post/2+600dpi+duplex
+pcclone - - post+nohead
+peacock 2C-501 cetus post/2+300dpi+nohead+color
+ps83 st8_fl3 rice post+300dpi+reverse
+psu 2C-501 cetus post/2+1200dpi
+ .
+ .
+ .
+%
+.P2
+.ce
+.I "Figure 1. Sample listing of installed printers"
+.KE
+.PP
+Normally,
+.I lp
+uses the
+.CW file
+command to figure out what type of input it is receiving.
+This is done within the
+.CW generic
+process which is discussed later in this paper in the
+.B "Process directory"
+section.
+To select a specific input processor the
+\f(CW-p\fP\fIprocess\fP
+option is used where
+.I process
+is one of the shell scripts in the
+.CW process
+directory.
+.LP
+Troff
+output can be printed, in this case, on printer
+.I fn
+with
+.P1
+% troff -ms lp.ms | lp -dfn
+.P2
+.LP
+A file can be converted to PostScript using the pseudo-printer
+.CW stdout :
+.P1
+% troff -ms lp.ms | lp -dstdout > lp.ps
+.P2
+LaTeX (and analogously TeX)
+documents are printed in two steps:
+.P1
+% latex lp.tex
+ .
+ .
+% lp lp.dvi
+ .
+ .
+%
+.P2
+LaTeX
+produces a `.dvi' file and
+does not permit the use of a pipe
+connection to the standard input of
+.I lp .
+To look at the status and queue of a device, use
+.CW -q :
+.P1
+% lp -dpsu -q
+daemon status:
+: 67.17% sent
+printer status:
+%%[ status: busy; source: lpd ]%%
+
+queue on cetus:
+job user try size
+rice29436.1 pg 0 17454
+slocum17565.1 ches 1 49995
+%
+.P2
+This command can print the status and queue of the local
+and remote hosts.
+Administrators should be advised that working in an environment where the
+.I lp
+spool directory is shared among the local and remote hosts,
+no spooling should be done on the local hosts.
+The format of the status and queue printout is up to the administrator.
+The job started above can be killed with
+.CW -k :
+.P1
+$ lp -dpsu -k rice29436.1
+rice29436.1 removed from psu queue on cetus
+.P2
+.NH
+Options
+.PP
+There are options available to modify the way in which a job is handled.
+It is the job of the
+.I lp
+programs to convert the option settings so they may be used by each of the
+different translation and interface programs.
+Not all options are applicable to all printer environments.
+Table 1 lists the standard
+.I lp
+options, the shell variable settings, and description of the options.
+\" .1C
+.KF
+.sp
+.in 0
+.TS
+center;
+c | c s s | c
+c | c c c | c
+lfCWp-2 | lfCWp-2 cfCWp-2 cfCWp-2 | lp-2w(3i).
+=
+option shell variable action
+\^ name default set \^
+_
+-D DEBUG N 1 turn on debugging mode.
+_
+-H NOHEADER N 1 suppress header page.
+_
+-L LAND N 1 make long page dimension horizontal.
+_
+-M \fImach\fP LPMACHID N \fImach\fP set the source machine name.
+_
+-Q QONLY N 1 do not execute daemon; for debugging.
+_
+-c \fIn\fP COPIES N \fIn\fP number of copies to be printed.
+_
+-d \fIprinter\fP LPDEST U \fIprinter\fP set job destination; override other settings.
+_
+-f \fIfont.pt\fP FONT N \fIfont\fP set font style and point size for printing.
+ POINT N \fIpt\fP
+_
+-i \fIn\fP IBIN N \fIn\fP T{
+select input paper tray options.
+The argument given is dependent on the printer type.
+A number can be given to select a particular tray and/or
+.CW simplex
+or
+.CW duplex
+may be used to get single or double sided output, where
+applicable.
+Multiple options should be separated by commas.
+T}
+_
+-k KILLFLAG 0 1 T{
+take non-option arguments as job numbers to be removed from queue.
+T}
+_
+-l \fIn\fP LINES N \fIn\fP T{
+for printed data, the number of lines per logical page.
+T}
+_
+-m \fIf\fP MAG N \fIf\fP T{
+magnify the image by a factor \fIf\fP.
+The factor should be a positive real number.
+T}
+_
+-n \fIn\fP NPAG N \fIn\fP T{
+put \fIn\fP logical pages on a single physical page.
+A simple algorithm is used to pack the pages.
+T}
+_
+-o \fIlist\fP OLIST N \fIlist\fP T{
+print only those pages specified in the list.
+The list may be a sequence of numbers or ranges separated by commas.
+A range is a pair of numbers separated by a hyphen.
+T}
+_
+-p \fIproc\fP LPPROC L \fIproc\fP T{
+use the preprocessor \fIproc\fP instead of the preprocessor given
+in the
+.CW devices
+file for this printer.
+T}
+_
+-q LPQ N 1 T{
+print the status and queue.
+T}
+_
+-r REVERSE L 1 T{
+this toggles the
+.CW REVERSE
+flag, changing whether or not page reversal should occur in preprocessing.
+Page reversal is needed if a printer delivers pages face up.
+The keyword
+.CW reverse
+can be placed in the
+.I lpclass
+field of the
+.CW devices
+file.
+If a document has already been processed this flag has no effect.
+T}
+_
+-u \fIuser\fP LPUSERID U \fIuser\fP T{
+change the user id that appears on the cover page.
+T}
+_
+-x \fIoffset\fP XOFF N \fIoffset\fP T{
+move the image \fIoffset\fP inches to the right.
+A negative \fIoffset\fP will move the image to the left.
+The \fIoffset\fP may be any reasonable real number.
+T}
+_
+-y \fIoffset\fP YOFF N \fIoffset\fP T{
+same as for
+.CW -x
+except a positive offset will move the image down.
+T}
+_
+.T&
+l l cp-2 lp-2 s
+l l cfCWp-2 lp-2 s.
+.vs -2p
+
+ default setting definition
+ N set to the null string (`') initially in \fIlp\fP.
+ L set from printer entry in \f(CW\\s-\\n(XPdevices\\s+\\n(XP\fP file.
+ U set from the user's environment.
+.vs +2p
+.TE
+.sp
+.ce
+.I "Table 1. Lp Option List"
+.sp
+.ll \\n(LLu
+.KE
+\" .2C
+.NH
+Devices file
+.PP
+The
+.CW devices
+file is found in the spool directory.
+Each line in the file is composed of 12 fields, separated
+by tabs or spaces, that describe the attributes
+of the printer and how it should be serviced.
+Within the
+.CW lp
+command, a shell variable is set for each attribute;
+the following list describes them:
+.IP "\f(CW\s-\n(XPLPDEST\s+\n(XP\fP " 12
+is the name of the device as given to
+.I lp
+with the
+.CW -d
+option
+or as specified by the shell environment variable
+.CW LPDEST
+or as specified by
+the file
+.CW $LPLIB/defdevice .
+This name is used in creating directories and log files that are associated with
+the printers operation.
+.IP "\f(CW\s-\n(XPLOC\s+\n(XP\fP "
+just describes where the printer is physically located.
+.IP "\f(CW\s-\n(XPDEST_HOST\s+\n(XP\fP "
+is the host from which the files are printed.
+Files may be spooled on other machines before being transferred to the
+destination host.
+.IP "\f(CW\s-\n(XPOUT_DEV\s+\n(XP\fP "
+is the physical device name or network address needed by the printer daemon
+to connect to the printer.
+This field depends on the requirements of the daemon and may contain a `\(en'
+if not required.
+.IP "\f(CW\s-\n(XPSPEED\s+\n(XP\fP "
+is the baud rate setting for the port.
+This field depends on the requirements of the daemon and may contain a `\(en'
+if not required.
+.IP "\f(CW\s-\n(XPLPCLASS\s+\n(XP\fP "
+is used to encode minor printer differences.
+The keyword
+.CW reverse
+is used by some of the preprocessors
+to reverse the order the pages are printed to accommodate different output
+trays (either face up or face down).
+The keyword
+.CW nohead
+is used to suppress the header page.
+This is used for special and color printers.
+The keyword
+.CW duplex
+is used to coax double sided output from duplex printers.
+.IP "\f(CW\s-\n(XPLPPROC\s+\n(XP\fP "
+is the command from the
+.CW LPLIB/process
+directory to be used to convert input to a format
+that will be accepted by the device.
+The preprocessor is invoked by the spooler.
+.IP "\f(CW\s-\n(XPSPOOLER\s+\n(XP\fP "
+is the command from the
+.CW LPLIB/spooler
+directory which will select files using the
+.CW SCHED
+command and invoke the
+.CW LPPROC
+command, putting its output
+into the remote spool directory.
+The output is sent directly to the spool directory on the
+destination machine to avoid conflicts when client and
+server machines share spool directories.
+.IP "\f(CW\s-\n(XPSTAT\s+\n(XP\fP "
+is the command from the
+.CW LPLIB/stat
+directory that prints the status of the device and the list of jobs
+waiting on the queue for the device.
+The status information depends on what is available from the printer
+and interface software.
+The queue information should be changed to show information
+useful in tracking down problems.
+The
+.CW SCHED
+command is used to show the jobs in the order
+in which they will be printed.
+.IP "\f(CW\s-\n(XPKILL\s+\n(XP\fP "
+is the command from the
+.CW LPLIB/kill
+that removes jobs from the queue.
+The jobs to be removed are given as arguments to the
+.I lp
+command.
+When possible, it should also abort the currently running job
+if it has to be killed.
+.IP "\f(CW\s-\n(XPDAEMON\s+\n(XP\fP "
+is the command from the
+.CW LPLIB/daemon
+that is meant to run asynchronously to remove
+jobs from the queue.
+Jobs may either be passed on to another host or sent to the
+printing device.
+.I Lp
+always tries to start a daemon process when one is specified.
+.IP "\f(CW\s-\n(XPSCHED\s+\n(XP\fP "
+is the command from the
+.CW LPLIB/sched
+that is used to present the job names to the
+daemon and stat programs
+in some order, e.g., first-in-first-out, smallest first.
+.NH
+Support programs
+.PP
+The following sections describe the basic functions of the programs
+that are found in the subdirectories of
+.CW $LPLIB .
+The programs in a specific directory vary with the
+type of output device or networks that have to be used.
+.NH 2
+Process directory
+.PP
+The
+.CW generic
+preprocessor
+is the default preprocessor for most printers.
+It uses the
+.I file (1)
+command to determine the format of the input file.
+The appropriate preprocessor is then selected to transform the
+file to a format suitable for the printer.
+.PP
+Here is a list of some of the preprocessors and
+a description of their function.
+A complete list of preprocessors and their descriptions can be found in the manual page
+.I lp (8).
+.sp
+.IP \f(CWdvipost\fP 14
+Converts TeX or LaTeX output (\f(CW.dvi\fP files) to PostScript
+.IP \f(CWppost\fP
+Converts UTF text to PostScript.
+The default font is Courier with Lucida fonts filling in
+the remainder of the (available) Unicode character space.
+.IP \f(CWtr2post\fP
+Converts (device independent) troff output for the device type
+.CW utf .
+See
+.CW /sys/lib/troff/font/devutf
+directory for troff font width table descriptions.
+See also the
+.CW /sys/lib/postscript/troff
+directory for mappings of
+troff
+.CW UTF
+character space to PostScript font space.
+.IP \f(CWp9bitpost\fP
+Converts Plan 9 bitmaps (see
+.I bitfile (9.6))
+to PostScript.
+.IP \f(CWg3post\fP
+Converts fax (CCITT-G31 format) to PostScript.
+.IP \f(CWhpost\fP
+Does header page processing and page reversal processing, if
+necessary.
+Page reversal is done here so the header page always comes
+out at the beginning of the job.
+Header page processing is very location-dependent.
+.NH 2
+Spool directory
+.PP
+The
+.CW generic
+spooler is responsible for executing the preprocessor
+and directing its output to a file in the printer's queue.
+An additional file is created containing information such as the system name,
+user id, job number, and number of times this job was attempted.
+.PP
+Certain printer handling programs do not require separate
+preprocessing and spooling.
+For such circumstances a
+.CW nospool
+spooler is available that just executes the preprocessing program.
+The processing and spooling functions are assumed by this program and the output is sent to
+.CW OUT_DEV
+or standard output if
+.CW OUT_DEV
+is '-'.
+.PP
+The
+.CW pcclone
+spooler is used to send print jobs directly to a printer connected
+to a 386 compatible printer port (See
+.I lpt (3)).
+.NH 2
+Stat directory
+.PP
+The function of the shell scripts in the
+.CW stat
+directory is to present status information about the
+printer and its queue.
+When necessary, the
+.CW stat
+scripts may be designed
+to return information about the local queue as well as the remote queue.
+This is not done on Plan 9 because many systems share the same queue directory.
+The scheduler is used to print the queue in the order in which the jobs
+will be executed.
+.NH 2
+Kill directory
+.PP
+The
+.CW kill
+scripts receive command line arguments passed to them by
+.I lp
+and remove the job and id files which match the arguments
+for the particular queue.
+When a job is killed, the generic kill procedure:
+.IP 1)
+kills the daemon for this queue if the job being killed
+is first in the queue,
+.IP 2)
+removes the files associated with the job from the queue,
+.IP 3)
+attempts to restart the daemon.
+.NH 2
+Daemon directory
+.PP
+The
+.CW daemon
+shell scripts are the last to be invoked by
+.I lp
+if the
+.CW -Q
+option has not been given.
+The daemon process is executed asynchronously
+with its standard output and standard error appended to
+the printer log file.
+The log file is described in a subsequent section.
+Because the daemon runs asynchronously, it must
+catch signals that could cause it to terminate abnormally.
+The daemon first checks to see that it is the only one running
+by using the
+.CW LOCK
+program found in the
+.CW /$cputype/bin/aux
+directory.
+The
+.CW LOCK
+command creates a
+.CW LOCK
+file in the printer's queue directory.
+The daemon then executes the scheduler to obtain the name of the
+next job on the queue.
+.PP
+The processing of jobs may entail transfer to another host
+or transmission to a printer.
+The details of this are specific to the individual daemons.
+If a job is processed without error, it is removed from the queue.
+If a job does not succeed, the associated files may be
+moved to a printer specific directory in
+.CW $LPLIB/prob .
+In either case, the daemon can make an entry in the printer's
+log file.
+Before exiting, the daemon should clean up lock files by calling
+.CW UNLOCK .
+.PP
+Several non-standard daemon programs have been designed
+to suit various requirements and whims.
+One such program announces job completion and empty paper trays
+by causing icons to appear in peoples'
+.CW seemail
+window.
+Another, using a voice synthesizer, makes verbal announcements.
+Other daemons may be designed to taste.
+.NH 2
+Sched directory
+.PP
+The scheduler must decide which job files should be executed and
+in what order.
+The most commonly used scheduler program is
+.CW FIFO ,
+which looks like this:
+.P1
+ls -tr $* | sed -n -e 's/.* *//' \e
+ -e '/^[0-9][0-9]*\.[1-9][0-9]*$/p'
+.P2
+This lists all the job files in this printer's queue in modification
+time order.
+Jobs entering the queue have a dot (.) prefixed to their name
+to keep the scheduler from selecting them before they are complete.
+.NH
+Where Things Go Wrong
+.PP
+There are four directories where
+.I lp
+writes files.
+On the Plan 9 release these directories may be found
+in a directory on a scratch filesystem that is not
+backed-up.
+This directory is
+.CW /n/emelieother/lp .
+It is built on top of a file system
+.CW other
+that is mounted on the file server
+.CW emelie .
+The four directories in
+this scratch directory
+are
+.CW log ,
+.CW prob ,
+.CW queue ,
+and
+.CW tmp .
+.I Lp
+binds (see
+.I bind (1))
+the first three into the directory
+.CW /sys/lib/lp
+for its processes and their children.
+The
+.CW tmp
+directory is bound to the
+.CW /tmp
+directory so that the lp daemons, which run as user `none',
+may write into this directory.
+.PP
+On any new installation, it is important that these directories
+be set up and that the
+.I /rc/bin/lp
+command be editted to reflect the change.
+If you do not have a scratch filesystem for these directories,
+create the four directories
+.CW log ,
+.CW prob ,
+.CW queue ,
+and
+.CW tmp
+in
+.CW $LPLIB
+.CW (/sys/lib/lp)
+so that they are writable by anyone.
+.NH 2
+Log directory
+.PP
+The log files for a particular
+.I printer
+appear in a subdirectory of the spool directory
+\f(CWlog\fP/\fIprinter\fP.
+There are currently two types of log files.
+One is for the daemon to log errors and successful completions
+of jobs.
+These are named
+.I printer.day
+where
+.I day
+is the three letter abbreviation for the day of the week.
+These are overwritten once a week to avoid the need for regular
+cleanup.
+The other type of log file contains the status of the printer and
+is written by the program that communicates with the printer itself.
+These are named
+\fIprinter\fP.\f(CWst\fP.
+These are overwritten with each new job and are saved in the
+.CW $LPLIB/prob
+directory along with the job under circumstances described below.
+When a printer does not appear to be functioning these files are the
+place to look first.
+.NH 2
+Prob directory
+.PP
+When a job fails to produce output,
+the log files should be checked for any obvious problems.
+If none can be found, a directory with full read and write permissions
+should be created with the name of the printer in the
+.CW $LPLIB/prob
+directory.
+Subsequent failure of a job will cause the daemon to leave a
+copy of the job and the printer communication log in
+\f(CW$LPLIB/prob/\fP\fIprinter\fP
+directory.
+It is common for a printer to enter states from which
+it cannot be rescued except by manually cycling the power on the printer.
+After this is done the print daemon should recover by itself
+(give it a minute).
+If it does not recover, remove the
+.CW LOCK
+file from the printer's spool directory to kill the daemon.
+The daemon will have to be restarted by sending another job
+to the printer.
+For PostScript printers just use:
+.P1
+echo '%!PS' | lp
+.P2
+.NH 2
+Repairing Stuck Daemons
+.PP
+There are conditions that occur which are not handled
+by the daemons.
+One such problem can only be described as the printer entering a
+comatose state.
+The printer does not respond to any messages sent to it.
+The daemon should recover from the reset and an error message
+will appear in the log files.
+If all else fails, one can kill the first job in the queue
+or remove the
+.CW LOCK
+file from the queue directory.
+This will kill the daemon, which will have to be restarted.
+.NH
+Interprocessor Communication
+.PP
+A Plan 9 CPU server can be set up as a printer's spooling host.
+That is, the machine where jobs are spooled and from which those jobs
+are sent directly to the printer.
+To do this, the CPU must listen on TCP port 515 which is the well known
+port for the BSD line printer daemon.
+The file
+.CW /rc/bin/service/tcp515
+is executed when a call comes in on that port.
+The Plan 9
+.CW lpdaemon
+will accept jobs sent from BSD LPR/LPD systems.
+The
+.CW /$cputype/bin/aux/lpdaemon
+command is executed from the service call and it accepts print jobs, requests for status,
+and requests to kill jobs.
+The command
+.CW /$cputype/bin/aux/lpsend
+is used to send jobs
+to other Plan 9 machines and is usually called from
+within a spooler or daemon script.
+The command
+.CW /$cputype/bin/aux/lpdsend
+is used to send jobs
+to machines and printers that use the BSD LPR/LPD protocol and is also usually called from
+within a spooler or daemon script.
+.NH
+Acknowledgements
+.PP
+Special thanks to Rich Drechsler for supplying and maintaining most of
+the PostScript translation and interface programs,
+without which
+.I lp
+would be an empty shell.
+Tomas Rokicki provided the
+TeX
+to PostScript
+translation program.
+.NH
+References
+.LP
+[Camp86] Ralph Campbell,
+``4.3BSD Line Printer Spooler Manual'', UNIX System Manager's Manual,
+May, 1986, Berkeley, CA
+.br
+[RFC1179] Request for Comments: 1179, Line Printer Daemon Protocol, Aug 1990
+.br
+[Sys5] System V manual, date unknown