Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
.HTML "A Guide to the Lp Printer Spooler
2
.TL
3
A Guide to the Lp
4
Printer Spooler
5
.AU
6
Paul Glick
7
pg@plan9.bell-labs.com
8
.AB
9
.PP
10
.I Lp
11
is a collection of programs used to provide an easy-to-use
12
interface for printing a variety of document types on a variety
13
of printers.
14
.I Lp
15
is the glue that connects various document language
16
translators and printer communication programs together so that
17
the users may have a consistent view of printers.
18
Most of the glue
19
is shell script, which can be easily modified.
20
The user need not
21
specify options to get sensible output in most cases.
22
.I Lp
23
is described here
24
so that others may make additions and changes.
25
.AE
26
\" .2C
27
.NH
28
Introduction
29
.PP
30
.I Lp
31
is used to format and print data on a variety of output devices.
32
The need for
33
.I lp
34
was rooted in the inability of other printer spoolers to do simple
35
tasks without a great deal of user specification of options.
36
At the time
37
.I lp
38
was written, there were several printer
39
languages, such as ImPress and PostScript, and
40
an internally developed printer that would accept
41
.I troff
42
output.
43
Now, all our printers take PostScript,
44
but printers that use HPCL and HPGL abound and
45
support for those printers may be added easily.
46
A great deal of what underlies
47
.I lp
48
is taken from BSD's
49
.I lpr
50
and System V's
51
.I lp .
52
The important features of this system are that most of the programs
53
are easily modified shell scripts and the user need not
54
learn to use the large amount of underlying software developed by others.
55
.I Lp
56
runs under Plan 9 and several flavors of
57
UNIX.
58
This document deals with
59
.I lp
60
as it relates to Plan 9.
61
.I Lp
62
was developed using both Datakit and Ethernet to transport data between machines.
63
Now only the Ethernet transport mechanism remains.
64
.PP
65
Text, graphics, and formatted text files are appropriately processed and
66
placed into a spool directory from which they are taken to be printed by a daemon process.
67
Additional functions include checking the status of a printer queue
68
and removing jobs from the printer queue.
69
.PP
70
All the shell scripts (see
71
.I rc (1))
72
associated with
73
.I lp
74
reside in the spool directory
75
.CW /sys/lib/lp
76
except for the
77
.I lp
78
command itself, which resides in
79
.CW /rc/bin .
80
Commands related to
81
.I lp
82
that are not shell scripts can most often be found
83
in
84
.CW /$cputype/bin/aux .
85
The directory where all the
86
.I lp
87
scripts  reside is defined within
88
.I lp
89
by the shell variable
90
.CW LPLIB .
91
In the remainder of this document, file names will be specified
92
with this shell variable as their root.
93
.NH
94
Usage
95
.PP
96
.I Lp
97
requires an output device to be specified
98
before it will process input.
99
This can be done in any of three ways described here.
100
.IP 1)
101
The file
102
.CW $LPLIB/defdevice
103
may contain the name of a default output device.
104
This may not be practical for environments where
105
there are many printers.
106
.IP 2)
107
The user's environment variable
108
.CW LPDEST
109
may be set to the name of the device to be used.
110
This is often a more practical solution when there are several printers
111
available.
112
This overrides a
113
.CW defdevice
114
specification.
115
.IP 3)
116
The
117
.CW -d
118
.I printer
119
option to the
120
.I lp
121
command specifies
122
.I printer
123
as the device to which output should be directed, overriding the
124
previous two specifications.
125
.PP
126
.ti 0
127
If
128
.I printer
129
is
130
.CW ? ,
131
a list of printers and other information in the
132
.CW devices
133
file is printed, as shown in Figure 1.
134
Quote the question mark to prevent it from being
135
interpreted by the shell language as a metacharacter.
136
\" .1C
137
.KF
138
.P1
139
% lp -d'?'
140
device   location  host             class
141
fn       2C-501    helix            post/2+600dpi+duplex
142
pcclone  -         -                post+nohead
143
peacock  2C-501    cetus            post/2+300dpi+nohead+color
144
ps83     st8_fl3   rice             post+300dpi+reverse
145
psu      2C-501    cetus            post/2+1200dpi
146
     .
147
     .
148
     .
149
%
150
.P2
151
.ce
152
.I "Figure 1.  Sample listing of installed printers"
153
.KE
154
.PP
155
Normally,
156
.I lp
157
uses the
158
.CW file
159
command to figure out what type of input it is receiving.
160
This is done within the
161
.CW generic
162
process which is discussed later in this paper in the
163
.B "Process directory"
164
section.
165
To select a specific input processor the
166
\f(CW-p\fP\fIprocess\fP
167
option is used where
168
.I process
169
is one of the shell scripts in the
170
.CW process
171
directory.
172
.LP
173
Troff
174
output can be printed, in this case, on printer
175
.I fn
176
with
177
.P1
178
% troff -ms lp.ms | lp -dfn
179
.P2
180
.LP
181
A file can be converted to PostScript using the pseudo-printer
182
.CW stdout :
183
.P1
184
% troff -ms lp.ms | lp -dstdout > lp.ps
185
.P2
186
LaTeX (and analogously TeX)
187
documents are printed in two steps:
188
.P1
189
% latex lp.tex
190
     .
191
     .
192
% lp lp.dvi
193
     .
194
     .
195
%
196
.P2
197
LaTeX
198
produces a `.dvi' file and
199
does not permit the use of a pipe
200
connection to the standard input of
201
.I lp .
202
To look at the status and queue of a device, use
203
.CW -q :
204
.P1
205
% lp -dpsu -q
206
daemon status:
207
:  67.17% sent
208
printer status:
209
%%[ status: busy; source: lpd ]%%
210
 
211
queue on cetus:
212
job		user	try	size
213
rice29436.1	pg	0	17454
214
slocum17565.1	ches	1	49995
215
%
216
.P2
217
This command can print the status and queue of the local
218
and remote hosts.
219
Administrators should be advised that working in an environment where the
220
.I lp
221
spool directory is shared among the local and remote hosts,
222
no spooling should be done on the local hosts.
223
The format of the status and queue printout is up to the administrator.
224
The job started above can be killed with
225
.CW -k :
226
.P1
227
$ lp -dpsu -k rice29436.1
228
rice29436.1 removed from psu queue on cetus
229
.P2
230
.NH
231
Options
232
.PP
233
There are options available to modify the way in which a job is handled.
234
It is the job of the
235
.I lp
236
programs to convert the option settings so they may be used by each of the
237
different translation and interface programs.
238
Not all options are applicable to all printer environments.
239
Table 1 lists the standard
240
.I lp
241
options, the shell variable settings, and description of the options.
242
\" .1C
243
.KF
244
.sp
245
.in 0
246
.TS
247
center;
248
c | c s s | c
249
c | c c c | c
250
lfCWp-2 | lfCWp-2 cfCWp-2 cfCWp-2 | lp-2w(3i).
251
=
252
option	shell variable	action
253
\^	name	default	set	\^
254
_
255
-D	DEBUG	N	1	turn on debugging mode.
256
_
257
-H	NOHEADER	N	1	suppress header page.
258
_
259
-L	LAND	N	1	make long page dimension horizontal.
260
_
261
-M \fImach\fP	LPMACHID	N	\fImach\fP	set the source machine name.
262
_
263
-Q	QONLY	N	1	do not execute daemon; for debugging.
264
_
265
-c \fIn\fP	COPIES	N	\fIn\fP	number of copies to be printed.
266
_
267
-d \fIprinter\fP	LPDEST	U	\fIprinter\fP	set job destination; override other settings.
268
_
269
-f \fIfont.pt\fP	FONT	N	\fIfont\fP	set font style and point size for printing.
270
	POINT	N	\fIpt\fP
271
_
272
-i \fIn\fP	IBIN	N	\fIn\fP	T{
273
select input paper tray options.
274
The argument given is dependent on the printer type.
275
A number can be given to select a particular tray and/or
276
.CW simplex
277
or
278
.CW duplex
279
may be used to get single or double sided output, where
280
applicable.
281
Multiple options should be separated by commas.
282
T}
283
_
284
-k	KILLFLAG	0	1	T{
285
take non-option arguments as job numbers to be removed from queue.
286
T}
287
_
288
-l \fIn\fP	LINES	N	\fIn\fP	T{
289
for printed data, the number of lines per logical page.
290
T}
291
_
292
-m \fIf\fP	MAG	N	\fIf\fP	T{
293
magnify the image by a factor \fIf\fP.
294
The factor should be a positive real number.
295
T}
296
_
297
-n \fIn\fP	NPAG	N	\fIn\fP	T{
298
put \fIn\fP logical pages on a single physical page.
299
A simple algorithm is used to pack the pages.
300
T}
301
_
302
-o \fIlist\fP	OLIST	N	\fIlist\fP	T{
303
print only those pages specified in the list.
304
The list may be a sequence of numbers or ranges separated by commas.
305
A range is a pair of numbers separated by a hyphen.
306
T}
307
_
308
-p \fIproc\fP	LPPROC	L	\fIproc\fP	T{
309
use the preprocessor \fIproc\fP instead of the preprocessor given
310
in the
311
.CW devices
312
file for this printer.
313
T}
314
_
315
-q	LPQ	N	1	T{
316
print the status and queue.
317
T}
318
_
319
-r	REVERSE	L	1	T{
320
this toggles the
321
.CW REVERSE
322
flag, changing whether or not page reversal should occur in preprocessing.
323
Page reversal is needed if a printer delivers pages face up.
324
The keyword
325
.CW reverse
326
can be placed in the
327
.I lpclass
328
field of the
329
.CW devices
330
file.
331
If a document has already been processed this flag has no effect.
332
T}
333
_
334
-u \fIuser\fP	LPUSERID	U	\fIuser\fP	T{
335
change the user id that appears on the cover page.
336
T}
337
_
338
-x \fIoffset\fP	XOFF	N	\fIoffset\fP	T{
339
move the image \fIoffset\fP inches to the right.
340
A negative \fIoffset\fP will move the image to the left.
341
The \fIoffset\fP may be any reasonable real number.
342
T}
343
_
344
-y \fIoffset\fP	YOFF	N	\fIoffset\fP	T{
345
same as for
346
.CW -x
347
except a positive offset will move the image down.
348
T}
349
_
350
.T&
351
l l cp-2 lp-2 s
352
l l cfCWp-2 lp-2 s.
353
.vs -2p
354
 
355
		default	setting definition
356
		N	set to the null string (`') initially in \fIlp\fP.
357
		L	set from printer entry in \f(CW\\s-\\n(XPdevices\\s+\\n(XP\fP file.
358
		U	set from the user's environment.
359
.vs +2p
360
.TE
361
.sp
362
.ce
363
.I "Table 1. Lp Option List"
364
.sp
365
.ll \\n(LLu
366
.KE
367
\" .2C	
368
.NH
369
Devices file
370
.PP
371
The
372
.CW devices
373
file is found in the spool directory.
374
Each line in the file is composed of 12 fields, separated
375
by tabs or spaces, that describe the attributes
376
of the printer and how it should be serviced.
377
Within the
378
.CW lp
379
command, a shell variable is set for each attribute;
380
the following list describes them:
381
.IP "\f(CW\s-\n(XPLPDEST\s+\n(XP\fP " 12
382
is the name of the device as given to
383
.I lp
384
with the
385
.CW -d
386
option
387
or as specified by the shell environment variable
388
.CW LPDEST
389
or as specified by
390
the file
391
.CW $LPLIB/defdevice .
392
This name is used in creating directories and log files that are associated with
393
the printers operation.
394
.IP "\f(CW\s-\n(XPLOC\s+\n(XP\fP "
395
just describes where the printer is physically located.
396
.IP "\f(CW\s-\n(XPDEST_HOST\s+\n(XP\fP "
397
is the host from which the files are printed.
398
Files may be spooled on other machines before being transferred to the
399
destination host.
400
.IP "\f(CW\s-\n(XPOUT_DEV\s+\n(XP\fP "
401
is the physical device name or network address needed by the printer daemon
402
to connect to the printer.
403
This field depends on the requirements of the daemon and may contain a `\(en'
404
if not required.
405
.IP "\f(CW\s-\n(XPSPEED\s+\n(XP\fP "
406
is the baud rate setting for the port.
407
This field depends on the requirements of the daemon and may contain a `\(en'
408
if not required.
409
.IP "\f(CW\s-\n(XPLPCLASS\s+\n(XP\fP "
410
is used to encode minor printer differences.
411
The keyword
412
.CW reverse
413
is used by some of the preprocessors
414
to reverse the order the pages are printed to accommodate different output
415
trays (either face up or face down).
416
The keyword
417
.CW nohead
418
is used to suppress the header page.
419
This is used for special and color printers.
420
The keyword
421
.CW duplex
422
is used to coax double sided output from duplex printers.
423
.IP "\f(CW\s-\n(XPLPPROC\s+\n(XP\fP "
424
is the command from the
425
.CW LPLIB/process
426
directory to be used to convert input to a format
427
that will be accepted by the device.
428
The preprocessor is invoked by the spooler.
429
.IP "\f(CW\s-\n(XPSPOOLER\s+\n(XP\fP "
430
is the command from the
431
.CW LPLIB/spooler
432
directory which will select files using the
433
.CW SCHED
434
command and invoke the
435
.CW LPPROC
436
command, putting its output
437
into the remote spool directory.
438
The output is sent directly to the spool directory on the
439
destination machine to avoid conflicts when client and
440
server machines share spool directories.
441
.IP "\f(CW\s-\n(XPSTAT\s+\n(XP\fP "
442
is the command from the
443
.CW LPLIB/stat
444
directory that prints the status of the device and the list of jobs
445
waiting on the queue for the device.
446
The status information depends on what is available from the printer
447
and interface software.
448
The queue information should be changed to show information
449
useful in tracking down problems.
450
The
451
.CW SCHED
452
command is used to show the jobs in the order
453
in which they will be printed.
454
.IP "\f(CW\s-\n(XPKILL\s+\n(XP\fP "
455
is the command from the
456
.CW LPLIB/kill
457
that removes jobs from the queue.
458
The jobs to be removed are given as arguments to the
459
.I lp
460
command.
461
When possible, it should also abort the currently running job
462
if it has to be killed.
463
.IP "\f(CW\s-\n(XPDAEMON\s+\n(XP\fP "
464
is the command from the
465
.CW LPLIB/daemon
466
that is meant to run asynchronously to remove
467
jobs from the queue.
468
Jobs may either be passed on to another host or sent to the
469
printing device.
470
.I Lp
471
always tries to start a daemon process when one is specified.
472
.IP "\f(CW\s-\n(XPSCHED\s+\n(XP\fP "
473
is the command from the
474
.CW LPLIB/sched
475
that is used to present the job names to the
476
daemon and stat programs
477
in some order, e.g., first-in-first-out, smallest first.
478
.NH
479
Support programs
480
.PP
481
The following sections describe the basic functions of the programs
482
that are found in the subdirectories of
483
.CW $LPLIB .
484
The programs in a specific directory vary with the
485
type of output device or networks that have to be used.
486
.NH 2
487
Process directory
488
.PP
489
The
490
.CW generic
491
preprocessor
492
is the default preprocessor for most printers.
493
It uses the
494
.I file (1)
495
command to determine the format of the input file.
496
The appropriate preprocessor is then selected to transform the
497
file to a format suitable for the printer.
498
.PP
499
Here is a list of some of the preprocessors and
500
a description of their function.
501
A complete list of preprocessors and their descriptions can be found in the manual page
502
.I lp (8).
503
.sp
504
.IP \f(CWdvipost\fP 14
505
Converts TeX or LaTeX output (\f(CW.dvi\fP files) to PostScript
506
.IP \f(CWppost\fP
507
Converts UTF text to PostScript.
508
The default font is Courier with Lucida fonts filling in
509
the remainder of the (available) Unicode character space.
510
.IP \f(CWtr2post\fP
511
Converts (device independent) troff output for the device type
512
.CW utf .
513
See
514
.CW /sys/lib/troff/font/devutf
515
directory for troff font width table descriptions.
516
See also the
517
.CW /sys/lib/postscript/troff
518
directory for mappings of
519
troff
520
.CW UTF
521
character space to PostScript font space.
522
.IP \f(CWp9bitpost\fP
523
Converts Plan 9 bitmaps (see
524
.I bitfile (9.6))
525
to PostScript.
526
.IP \f(CWg3post\fP
527
Converts fax (CCITT-G31 format) to PostScript.
528
.IP \f(CWhpost\fP
529
Does header page processing and page reversal processing, if
530
necessary.
531
Page reversal is done here so the header page always comes
532
out at the beginning of the job.
533
Header page processing is very location-dependent.
534
.NH 2
535
Spool directory
536
.PP
537
The
538
.CW generic
539
spooler is responsible for executing the preprocessor
540
and directing its output to a file in the printer's queue.
541
An additional file is created containing information such as the system name,
542
user id, job number, and number of times this job was attempted.
543
.PP
544
Certain printer handling programs do not require separate
545
preprocessing and spooling.
546
For such circumstances a
547
.CW nospool
548
spooler is available that just executes the preprocessing program.
549
The processing and spooling functions are assumed by this program and the output is sent to
550
.CW OUT_DEV
551
or standard output if
552
.CW OUT_DEV
553
is '-'.
554
.PP
555
The
556
.CW pcclone
557
spooler is used to send print jobs directly to a printer connected
558
to a 386 compatible printer port (See
559
.I lpt (3)).
560
.NH 2
561
Stat directory
562
.PP
563
The function of the shell scripts in the
564
.CW stat
565
directory is to present status information about the
566
printer and its queue.
567
When necessary, the
568
.CW stat
569
scripts may be designed
570
to return information about the local queue as well as the remote queue.
571
This is not done on Plan 9 because many systems share the same queue directory.
572
The scheduler is used to print the queue in the order in which the jobs
573
will be executed.
574
.NH 2
575
Kill directory
576
.PP
577
The
578
.CW kill
579
scripts receive command line arguments passed to them by
580
.I lp
581
and remove the job and id files which match the arguments
582
for the particular queue.
583
When a job is killed, the generic kill procedure:
584
.IP 1)
585
kills the daemon for this queue if the job being killed
586
is first in the queue,
587
.IP 2)
588
removes the files associated with the job from the queue,
589
.IP 3)
590
attempts to restart the daemon.
591
.NH 2
592
Daemon directory
593
.PP
594
The
595
.CW daemon
596
shell scripts are the last to be invoked by
597
.I lp
598
if the
599
.CW -Q
600
option has not been given.
601
The daemon process is executed asynchronously
602
with its standard output and standard error appended to
603
the printer log file.
604
The log file is described in a subsequent section.
605
Because the daemon runs asynchronously, it must
606
catch signals that could cause it to terminate abnormally.
607
The daemon first checks to see that it is the only one running
608
by using the
609
.CW LOCK
610
program found in the
611
.CW /$cputype/bin/aux
612
directory.
613
The
614
.CW LOCK
615
command creates a
616
.CW LOCK
617
file in the printer's queue directory.
618
The daemon then executes the scheduler to obtain the name of the
619
next job on the queue.
620
.PP
621
The processing of jobs may entail transfer to another host
622
or transmission to a printer.
623
The details of this are specific to the individual daemons.
624
If a job is processed without error, it is removed from the queue.
625
If a job does not succeed, the associated files may be
626
moved to a printer specific directory in
627
.CW $LPLIB/prob .
628
In either case, the daemon can make an entry in the printer's
629
log file.
630
Before exiting, the daemon should clean up lock files by calling
631
.CW UNLOCK .
632
.PP
633
Several non-standard daemon programs have been designed
634
to suit various requirements and whims.
635
One such program announces job completion and empty paper trays
636
by causing icons to appear in peoples'
637
.CW seemail
638
window.
639
Another, using a voice synthesizer, makes verbal announcements.
640
Other daemons may be designed to taste.
641
.NH 2
642
Sched directory
643
.PP
644
The scheduler must decide which job files should be executed and
645
in what order.
646
The most commonly used scheduler program is
647
.CW FIFO ,
648
which looks like this:
649
.P1
650
ls -tr $* | sed -n -e 's/.*  *//' \e
651
  -e '/^[0-9][0-9]*\.[1-9][0-9]*$/p'
652
.P2
653
This lists all the job files in this printer's queue in modification
654
time order.
655
Jobs entering the queue have a dot (.) prefixed to their name
656
to keep the scheduler from selecting them before they are complete.
657
.NH
658
Where Things Go Wrong
659
.PP
660
There are four directories where
661
.I lp
662
writes files.
663
On the Plan 9 release these directories may be found
664
in a directory on a scratch filesystem that is not
665
backed-up.
666
This directory is
667
.CW /n/emelieother/lp .
668
It is built on top of a file system
669
.CW other
670
that is mounted on the file server
671
.CW emelie .
672
The four directories in
673
this scratch directory
674
are
675
.CW log ,
676
.CW prob ,
677
.CW queue ,
678
and
679
.CW tmp .
680
.I Lp
681
binds (see
682
.I bind (1))
683
the first three into the directory
684
.CW /sys/lib/lp
685
for its processes and their children.
686
The
687
.CW tmp
688
directory is bound to the
689
.CW /tmp
690
directory so that the lp daemons, which run as user `none',
691
may write into this directory.
692
.PP
693
On any new installation, it is important that these directories
694
be set up and that the
695
.I /rc/bin/lp
696
command be editted to reflect the change.
697
If you do not have a scratch filesystem for these directories,
698
create the four directories
699
.CW log ,
700
.CW prob ,
701
.CW queue ,
702
and
703
.CW tmp
704
in
705
.CW $LPLIB
706
.CW (/sys/lib/lp)
707
so that they are writable by anyone.
708
.NH 2
709
Log directory
710
.PP
711
The log files for a particular
712
.I printer
713
appear in a subdirectory of the spool directory
714
\f(CWlog\fP/\fIprinter\fP.
715
There are currently two types of log files.
716
One is for the daemon to log errors and successful completions
717
of jobs.
718
These are named
719
.I printer.day
720
where
721
.I day
722
is the three letter abbreviation for the day of the week.
723
These are overwritten once a week to avoid the need for regular
724
cleanup.
725
The other type of log file contains the status of the printer and
726
is written by the program that communicates with the printer itself.
727
These are named
728
\fIprinter\fP.\f(CWst\fP.
729
These are overwritten with each new job and are saved in the
730
.CW $LPLIB/prob
731
directory along with the job under circumstances described below.
732
When a printer does not appear to be functioning these files are the
733
place to look first.
734
.NH 2
735
Prob directory
736
.PP
737
When a job fails to produce output,
738
the log files should be checked for any obvious problems.
739
If none can be found, a directory with full read and write permissions
740
should be created with the name of the printer in the
741
.CW $LPLIB/prob
742
directory.
743
Subsequent failure of a job will cause the daemon to leave a
744
copy of the job and the printer communication log in
745
\f(CW$LPLIB/prob/\fP\fIprinter\fP
746
directory.
747
It is common for a printer to enter states from which
748
it cannot be rescued except by manually cycling the power on the printer.
749
After this is done the print daemon should recover by itself
750
(give it a minute).
751
If it does not recover, remove the
752
.CW LOCK
753
file from the printer's spool directory to kill the daemon.
754
The daemon will have to be restarted by sending another job
755
to the printer.
756
For PostScript printers just use:
757
.P1
758
echo '%!PS' | lp
759
.P2
760
.NH 2
761
Repairing Stuck Daemons
762
.PP
763
There are conditions that occur which are not handled
764
by the daemons.
765
One such problem can only be described as the printer entering a
766
comatose state.
767
The printer does not respond to any messages sent to it.
768
The daemon should recover from the reset and an error message
769
will appear in the log files.
770
If all else fails, one can kill the first job in the queue
771
or remove the
772
.CW LOCK
773
file from the queue directory.
774
This will kill the daemon, which will have to be restarted.
775
.NH
776
Interprocessor Communication
777
.PP
778
A Plan 9 CPU server can be set up as a printer's spooling host.
779
That is, the machine where jobs are spooled and from which those jobs
780
are sent directly to the printer.
781
To do this, the CPU must listen on TCP port 515 which is the well known
782
port for the BSD line printer daemon.
783
The file
784
.CW /rc/bin/service/tcp515
785
is executed when a call comes in on that port.
786
The Plan 9
787
.CW lpdaemon
788
will accept jobs sent from BSD LPR/LPD systems.
789
The
790
.CW /$cputype/bin/aux/lpdaemon
791
command is executed from the service call and it accepts print jobs, requests for status,
792
and requests to kill jobs.
793
The command
794
.CW /$cputype/bin/aux/lpsend
795
is used to send jobs
796
to other Plan 9 machines and is usually called from
797
within a spooler or daemon script.
798
The command
799
.CW /$cputype/bin/aux/lpdsend
800
is used to send jobs
801
to machines and printers that use the BSD LPR/LPD protocol and is also usually called from
802
within a spooler or daemon script.
803
.NH
804
Acknowledgements
805
.PP
806
Special thanks to Rich Drechsler for supplying and maintaining most of
807
the PostScript translation and interface programs,
808
without which
809
.I lp
810
would be an empty shell.
811
Tomas Rokicki provided the
812
TeX
813
to PostScript
814
translation program.
815
.NH
816
References
817
.LP
818
[Camp86] Ralph Campbell,
819
``4.3BSD Line Printer Spooler Manual'', UNIX System Manager's Manual,
820
May, 1986, Berkeley, CA
821
.br
822
[RFC1179] Request for Comments: 1179, Line Printer Daemon Protocol, Aug 1990
823
.br
824
[Sys5] System V manual, date unknown