Creating printer interface scripts

If you have a printer that is not supported by adding an entry to the terminfo database, or if your printing needs are not supported by the standard or other interface scripts provided in the /etc/lp/model file, you can create your own printer interface script.

To create a customized interface script, do the following:

  1. Modify the standard interface script (or one of the other scripts in /etc/lp/model). For example:
    	
    	cd /etc/lp/model
    	
    	cp standard okidatanew
    	
  2. Make sure that the custom interface script sets the proper stty modes (terminal characteristics such as baud rate or output options). Look for the section that begins with this line:
      ## Initialize the printer port
  3. Modify the code in the standard interface script. It sets both the default modes and the adjusted modes given by the print service or the user with a line similar to the following:
    stty mode options 0<&1

    This command line takes the standard input for the stty command from the printer port. For example, the following stty command example sets the baud rate to 1200bps and sets some of the option modes:

    stty -parenb -parodd 1200 cs8 cread clocal ixon 0<&1
  4. Set the hardware-flow control printer-port characteristic. The standard interface script does not set hardware flow control; it is set according to your computer hardware. The code for the standard interface script suggests where to set this and other printer port characteristics. Look for the section that begins with this line:
      # Here you may want to add other port initialization code.
  5. Because different printers have different numbers of columns, make sure the header and trailer for your interface script correspond to your printer. The standard interface script prints a banner that fits on an 80-column page (except for the user's title, which may be longer). Look for the section in the code for the standard interface script that begins with this line:
      ## Print the banner page
  6. Some applications, when run with certain printers, may require that you turn off page breaking. If you must turn off page breaking, you can modify the standard interface program (/usr/lib/lp/model/standard) at this line:
      if [ -n "${FF}" -a "no" = "${nofilebreak}" ]

    Change the no to yes to turn off page breaking.

  7. Specify that the custom interface script print all user-related error messages to the standard output or to the standard error output. The print service prints standard output errors on the page and mails standard error to the user.
  8. Specify that when printing is complete, the interface script exits with a code advising the status of the print job. The Exit Codes Table, Print service exit codes, describes how the print service interprets exit codes.
One way of alerting the administrator to a printer fault is to exit with a code of 129. Unfortunately, if the interface script exits, the print service reprints the print job from the beginning after the fault is cleared. To get an alert to the administrator without reprinting the entire job, specify that the interface script send a fault message to the print service, but wait for the fault to clear. When the fault clears, the interface script resumes printing the job. When the job finishes printing, the interface script can exit with zero as if the fault never occurred. An added advantage is that the interface script can detect when the fault is cleared automatically so that the administrator does not have to re-enable the printer.

To specify that fault messages be sent to the print service, use the lp.tell command. The standard printer interface code calls the lp.tell command with the LPTELL shell variable. The lp.tell program sends its standard input to the print service. The print service forwards the message as an alert to the administrator. If its standard input is empty, lp.tell does not initiate an alert. Examine the code immediately following these comments in the standard interface script for an example of how to use the lp.tell (LPTELL) program:

# Here's where we set up the $LPTELL program to capture
        # fault messages.
        #
        # Here's where we print the file.

With the special exit code 129 or lp.tell, the interface script need not disable the printer itself. Your interface script can disable the printer directly, but doing so overrides the fault-alerting mechanism. Alerts are sent only if the print service detects that the printer has faulted, and the special exit code and lp.tell program are its main detection tools.

If the print service must interrupt the printing of a file at any time, it kills the interface script with a signal 15 (see the signal command and the kill command for more information).

If the interface script stops upon from receipt of any other signal, the print service assumes that future print jobs are not affected and continues to use the printer. The print service notifies the person who submitted the print job that the job did not finish successfully.

The signals SIGHUP, SIGINT, SIGQUI, and SIGPIP (trap numbers 1, 2, 3, and 13) are ignored when the interface is invoked. The standard interface script changes this to trap these signals at appropriate times, interprets these signals to mean that the printer has a problem, and issues a fault.