Customizing Printing Services (Task Map)
Adjusting Printer Port Characteristics
The printer port characteristics set by the LP print service must be compatible
with the printer communication settings. If the default printer port settings provided by
the LP print service do not work with a printer, refer to the
printer manual from the manufacturer to determine what settings the printer requires from
the LP print service. Use the stty command to set and display printer
communication settings.
The following table shows the default stty settings that are used by the
LP print service.
Table 7-1 Default stty Settings Used by the LP Print Service
Option |
Description |
-9600 |
Sets baud to 9600 |
-cs8 |
Sets 8-bit bytes |
-cstopb |
Sends one stop bit per
byte |
-parity |
Does not generate parity |
-ixon |
Enables XON/XOFF (also known as START/STOP or DC1/DC3) |
-opost |
Does
“output post-processing” using all the settings that follow in this table |
-olcuc |
Do not map
lowercase to uppercase |
-onlcr |
Changes linefeed to carriage return/linefeed |
-ocrnl |
Does not change carriage returns into
linefeeds |
-onocr |
Outputs carriage returns even at column 0 |
-n10 |
Provides no delay after linefeeds |
-cr0 |
Provides no
delay after carriage returns |
-tab0 |
Provides no delay after tabs |
-bs0 |
Provides no delay after backspace
characters |
-vt0 |
Provides no delay after vertical tabs |
-ff0 |
Provides no delay after form feeds |
How to Adjust the Printer Port Characteristics
- Log in as superuser, lp, or assume an equivalent role on the print
server.
- Adjust the printer port characteristics.
# lpadmin -p printer-name -o "stty=options"
- -p
Specifies the name of the printer for which you are adjusting the port characteristics.
- -o “stty=options”
Sets the port characteristic (stty option) specified by options. You can change more than one stty option setting with this command. Enclose each option in single quotation marks, and use a space to separate the options. For a complete list of options, see thestty(1) man page. Table 7-1 shows the default stty settings used by the LP print service.
- Verify that the printer port characteristics have been changed.
# lpstat -p printer-name -l
Example 7-1 Adjusting the Printer Port Characteristics
This example shows how to set the port characteristics for the printer
luna. The parenb option enables parity checking/generation. The parodd option sets odd parity
generation. The cs7 option sets the character size to 7 bits.
# lpadmin -p luna -o "stty='parenb parodd cs7'"
Example 7-2 Setting the Terminal Baud Rate
This example shows how to set the terminal baud rate to 19200
for the printer venus.
# lpadmin -p venus -o "stty=19200"
Adding a terminfo Entry for an Unsupported Printer
The LP print service uses an interface program and the terminfo database to
initialize each printer and establish the following:
Selected page size
Character pitch
Line pitch
Character set
Each printer is identified in the terminfo database with a short name. The
short name required by the terminfo database is identical to the name used
to set the TERM shell variable. This name is also the printer type
that you specify when setting up a printer. For example, the entries for
different types of PostScript printers are in the /usr/share/lib/terminfo/P directory. The default entries provided
with the SunOS software release are PS (for PostScript) and PSR (for PostScript
Reverse).
If you cannot find a terminfo entry for your printer, you still might
be able to use the printer with the LP print service without the
automatic selection of page size, pitch, and character sets. However, you might have
trouble keeping the printer set in the correct modes for each print request.
If no terminfo entry exists for your type of printer and you
want to keep the printer set in the correct modes, you can do
one of the following:
A terminal or printer entry in the terminfo database contains and defines hundreds
of items. The LP print service, however, uses fewer than 50 of these
items. The following table lists the required terminfo items for a printer.
Table 7-2 Required terminfo Items for a Printer (Booleans)
Item |
|
Description |
Booleans: |
|
|
|
cpix |
Changing
character pitch changes resolution |
|
daisy |
Printer requires an operator to change character set |
|
lpix |
Changing line
pitch changes resolution |
Table 7-3 Required terminfo Items for a Printer (Numbers)
Item |
|
Description |
Numbers: |
|
|
|
bufsx |
Number of bytes buffered before printing |
|
cols |
Number of columns in a
line |
|
cps |
Average print rate in characters per second |
|
it |
Tabs initially every n spaces |
|
lines |
Number of
lines on a page |
|
orc |
Horizontal resolution, in units per character |
|
orhi |
Horizontal resolution, in units
per inch |
|
orl |
Vertical resolution, in units per line |
|
orvi |
Vertical resolution, in units per inch |
Table 7-4 Required terminfo Items for a Printer (Strings)
Item |
|
Description |
Strings: |
|
|
|
chr |
Changes
horizontal resolution |
|
cpi |
Changes number of characters per inch |
|
cr |
Carriage return |
|
csnm |
List of character set names |
|
cudl |
Moves
carriage down one line |
|
cud |
Moves carriage down n lines |
|
cuf |
Moves carriage to the right
n columns |
|
cvr |
Changes vertical resolution |
|
ff |
Ejects page |
|
hpa |
Horizontal position absolute |
|
ht |
Tabs to next 8-space tab stop |
|
if |
Is
the name of initialization file |
|
iprog |
Is the path name of initialization program |
|
is1 |
Is a
printer initialization string |
|
is2 |
Is a printer initialization string |
|
is3 |
Is a printer initialization string |
|
lpi |
Changes number
of lines per inch |
|
mgc |
Clears all margins (top, bottom, and sides) |
|
rep |
Repeats a character
n times |
|
rwidm |
Disables double-wide printing |
|
scs |
Selects character set |
|
scsd |
Starts definition of a character set |
|
slines |
Set page
length to n lines per page |
|
smgl |
Sets left margin at current column |
|
smglp |
Set left
margin |
|
smgr |
Sets right margin at current column |
|
smgrp |
Sets right margin |
|
smglr |
Sets both left and right
margins |
|
msgt |
Sets top margin at current line |
|
smgtp |
Sets top margin |
|
smgb |
Sets bottom margin at current
line |
|
smgbp |
Sets bottom margin |
|
smgtb |
Sets both top and bottom margins |
|
swidm |
Enables double-wide printing |
|
vpa |
Sets vertical position
to absolute |
How to Add a terminfo Entry for an Unsupported Printer
Note - Before you create a terminfo entry for a printer, make sure that none
of the existing terminfo entries will support the printer. To do so, try
to set up the printer with an entry for a similar printer, if
a similar printer exists.
- Log in as superuser, lp, or assume an equivalent role on the
print server.
- Determine a terminfo entry name for the printer.
The directories in the /usr/share/lib/terminfo directory contain all the valid terminfo entries. Use
these entries as a guide for choosing a name for the printer.
- Create a terminfo entry file for the printer.
Table 7-2 shows the items you must define in the terminfo entry to add
a new printer to the LP print service. For more details about
the structure of the terminfo database, see the terminfo(4) man page.
To help you start writing a new terminfo entry, use the infocmp command
to save an existing terminfo entry to a file. This command is helpful
if there is a terminfo entry that is similar to entry you want
to create. For example, the following command saves the ps entry to the
ps_cust file, which will become the new terminfo entry.
infocmp ps > ps_cust
- Compile the terminfo entry file into the terminfo database.
# tic terminfo_entry
where terminfo-entry variable is the terminfo entry file you created.
- Check for the new terminfo entry file in the /usr/share/lib/terminfo directory.
Customizing the Printer Interface Program
If you have a printer that is not supported by the standard
printer interface program, you can furnish your own printer interface program. You can copy
the standard program and then tell the LP print service to use
it for a specified printer. First, you need to understand what is in
the standard program. The following section describes the standard program.
A printer interface program should perform the following tasks:
Initialize the printer port, if necessary. The standard printer interface program uses the stty command to initialize the printer port.
Initialize the printer hardware. The standard printer interface program receives the control sequences from the terminfo database and the TERM shell variable.
Print a banner page, if necessary.
Print the number of copies that are specified by the print request.
Caution - If you have a printer interface program from a release of UNIX System
V prior to release 3.2, it will probably work with the Solaris
Express, SunOS 5.10, or compatible LP print service. However, several -o options have been
standardized in the Solaris Express, SunOS 5.10, or compatible LP print service. These
options will be passed to every printer interface program. These options might interfere
with similarly named options used by the old interface.
The LP print service, not a printer interface program, is responsible for opening
the printer port. The printer port is given to the printer interface program
as standard output. In addition, the printer is identified as the “controlling terminal”
for the printer interface program so that a “hang-up” of the port causes
a SIGHUP signal to be sent to the printer interface program.
The Standard Printer Interface Program
The standard (model) printer interface program is /usr/lib/lp/model/standard. This program is used
by the LP print service to set the printing defaults shown in the
following table.
Table 7-5 Default Printer Port Characteristics
Characteristic |
Default Setting |
Default filter |
None |
Character pitch |
None |
Line pitch |
None |
Page width |
None |
Page length |
None |
Character set |
None |
stty options |
9600 cs8 -cstopb -parenb -parodd ixon -ixany opost -olcuc onlcr -ocrnl -onocr -onlret -ofill nl0 cr0 tab0 bs0 vt0 ff0 |
Exit code |
0 |
Customizing stty Modes
If you need to change the terminal characteristics, such as baud rate or
output options, find the section of the standard printer interface program that begins with
the following comment:
## Initialize the printer port
For more information, see the Adjusting Printer Port Characteristics.
Exit Codes
When printing is complete, your interface program should exit with a code that
shows the status of the print job. The exit code is the
last entry in the printer interface program.
The following table shows the exit codes and how they are interpreted by
the LP print service.
Table 7-6 Printer Interface Program Exit Codes
Exit Code |
Meaning to the LP Print Service |
0 |
The print
request has been successfully completed. If a printer fault occurred, it has been
cleared. |
1 to 127 |
A problem was encountered when printing a request. For example,
there were too many nonprintable characters or the request exceeds the printer's capabilities. The
LP print service notifies the person who submitted the request that an error
occurred when printing it. This error does not affect future print requests. If
a printer fault has occurred, it has been cleared. |
128 |
This code is reserved
for use by the LP print service. Interface programs must not exit with
this code. |
129 |
A printer fault was encountered when printing the request. This fault does
affect future print requests. If the fault recovery for the printer directs the
LP print service to wait for the administrator to correct the problem, the
LP print service disables the printer. If the fault recovery is to
continue printing, the LP print service does not disable the printer. However, the print
service will try printing again in a few minutes. |
>129 |
These codes are reserved
for use by the LP print service. Interface programs must not exit with
codes in this range. |
If the program exits with a code of 129, root is alerted of
a printer fault. The LP print service must also reprint the request from
the beginning, after the fault has been cleared. If you do not
want the entire request to be reprinted, you can have the interface program
send a fault message to the LP print service. (First wait for the
fault to be cleared.) When the fault is cleared, the interface program can
resume printing the file. When printing is finished, the printer interface program can
give a 0 exit code, just as if the fault had never occurred.
An added advantage of this approach: The interface program can detect when the
fault is cleared automatically. Thus, the administrator does not need to re-enable the
printer.
Fault Messages
You can use the lp.tell program to send fault messages to the LP
print service. This program is referenced by the LPTELL shell variable in the
standard printer interface code. The program takes standard input and sends it to
the LP print service. The LP print service puts standard input into the
message that alerts the administrator to the printer fault. If its standard input
is empty, the lp.tell program does not initiate an alert. For an example
of how the lp.tell program is used, examine the standard printer interface code
immediately after the following comment:
# Set up the $LPTELL program to capture fault messages here
If you use the special exit code 129 or the lp.tell program,
the printer interface program does not need to disable the printer itself. The
interface program can disable the printer directly. However, doing so overrides the fault-alerting
mechanism. Alerts are sent only if the LP print service detects that the
printer has a fault, and the special exit code and the lp.tell program
are its main detection tools.
If the LP print service has to interrupt printing of a file
at any time, it kills the interface program with a signal TERM (trap
number 15). For more information, see the kill(1) and signal(3C) man pages. If
the printer interface program dies from receipt of any other signal, the LP
print service assumes that future print requests are not be affected. As a
result, the LP print service continues to use the printer. The LP print
service notifies the user who submitted the request that the request has not
been finished successfully.
When the interface is first invoked, the signals HUP, INT, QUIT, and PIPE
(trap numbers 1, 2, 3, and 13) are ignored. The standard interface
changes this default behavior, so that the signals are trapped at appropriate times. The
standard interface interprets receipt of these signals as warnings that the printer has
a problem. When the standard interface receives a signal, it issues a fault
alert.
Using a Customized Printer Interface Program
You can create a customized printer interface program and use it instead of
the standard printer interface program on the print server. To do so,
you use the lpadmin command to register the program with the LP print service
for a specific printer.
How to Set Up a Custom Printer Interface Program
- Log in as superuser, lp, or assume an equivalent role on the
print server.
- Copy the standard printer interface program.
# cp /var/spool/lp/model/standard custom-interface
- (Optional) If you already have a custom printer interface program, go to Step 5
- Change the copy of the standard printer interface program to meet your needs.
Refer to the description of the program in The Standard Printer Interface Program to determine what you
need to change.
- Set up the custom printer interface program for a specific printer.
# lpadmin -p printer-name -i custom-interface
- -p
Specifies the printer that will use the custom printer interface program.
- -i
Is the name of the custom printer interface program.
The custom printer interface program is registered with the LP print service, and
will be used by that printer when users submit print requests.
- Verify that the custom printer interface program has been added in the /etc/lp/printers/printer-name/configuration
file.
Example 7-3 Setting Up a Custom Printer Interface Program
This example shows how to set up a custom printer interface program named
custom for the printer luna.
# lpadmin -p luna -i custom
Example 7-4 Copying a Custom Printer Interface Program
This example shows how to copy a custom printer interface program from the
printer venus to the printer asteroid.
# lpadmin -p asteroid -e venus