Filters BSD Printer Configuration and the Printer Capability Database

cd usrspool mkdir newprinter chown daemon.daemon newprinter original BSD syntax chmod 755 newprinter ls −ld drwxr−xr−x 2 daemon daemon 2048 May 12 11:15 newprinter The location of spooling directories varies among BSD UNIX flavors for example, the common location of the spooling directory on SunOS was varspool.

10.2.1.4 Filters

The UNIX piping ability is widely implemented in the printing subsystem. A number of filters can be inserted in sequence in print job processing; these filters match printing files with printers. This approach provides the maximum possible flexibility in printing and makes the printing subsystem independent of the implemented printers. Quite simply, all required matching and any necessary adjustment of any specific printer characteristic becomes programmable. Filters are usually shell script files, and they are specified within the printer capability database in the etcprintcap file. Most of the filters are correlated with the options of the print command lpr; a corresponding filter provides the necessary preprocessing of data to fulfill the options requirements. However, two filters are the most common: if — the input filter — and of — the output filter. Their names often cause confusion, because the filters are used in an almost identical way: they are called by the daemon when a print job is sent to a printer in that sense they are both output filters for the daemon, or input filters for a printing device. When a user does not specify a filter−related option, either the if or of filter will be used. There are three cases of the corresponding printcap entry in the etcprintcap database worth examining: If the field if occurs, but no of field exists, the if filter will be called every time any print job is sent to the print device. 1. If the field of occurs, but no if field exists, the lpd daemon will call the of filter once for all print jobs in a queue and send them en masse to the print device. 2. If both fields if and of exist, the of filter will be used to send the banner page, while the if filter will be called for every print job separately. 3. It is highly recommended that a system administrator use if filters, because they are much easier to debug; of filters can be very confusing. One of the common problems related to printing is the so−called staircase effect in the printing. What is the staircase effect? The character pair CRLF carriage−returnline−feed is a common way to terminate each line of text, because old mechanical teletypes required a carriage return before shifting to a new line. UNIX continued this traditional text treatment. However, in a DOS text file, each line of text is terminated with a LF line−feed character only, assuming an automatic insertion of the CR carriage−return character. If such a file reaches the UNIX environment unchanged, from the UNIX standpoint, the file is corrupted and incomplete. Taken literally, this text file printed on an ASCII device will start each line below the end of the previous line. This is known as the staircase effect. In todays heterogeneous system environment, transfer of files between UNIX and non−UNIX platforms is quite common for added confusion, on the AppleMacintosh platform each line of the 231 This pending problem can also be fixed by providing the appropriate data filtering during printing. Some printers can be set to treat the single LF character as the LF+ CR pair, while others cannot. In the later case, one solution is to create an appropriate input shell script filter, which will convert each line of text before printing. Below we will see two possible solutions, tested on the Linux platform. These examples are written for the bash shell Bourne Again Shell and the Panasonic KX−P4411 laser printer. A shell script input filter that adds a CR character at the end of each line can be created: binsh if [ 1 = −l ];then cat else sed −e sM fi The echo −ne assumes that binsh is really bash echo −ne \\f Let us name the file crlf−if1. The test of the first argument 1 allows a bypass of the insertion of CR when the lpr −l command is used; otherwise, the CR character is inserted at the end of each line using the sequential editor sed M is a CR character, edited by vi as CTRL−v CTRL−m. At the end of the file, the form−feed is sent to print the last page properly. Alternatively, the printer itself can be controlled by an external escape sequence that sets the way the printer handles LF character it treats the LF character as two joint characters, CR+LF. For the implemented PANASONIC printer, the escape sequence is: ESC k2G. A simple filter that uses the echo −ne command to send this sequence at the start of printing could be: binsh Filter for HP printer to treat LF as CRLF The echo −ne assumes that binsh is really bash echo −ne \\033k2G cat echo −ne \\f Let us name this file crlf−if2, and copy both filter files in the usrlibfilters directory: ls −l usrlibfilterscrlf−in −rwxr−xr−x 1 root daemon 128 Dec 14 16:25 crlf−if1 −rwxr−xr−x 1 root daemon 147 Dec 16 09:22 crlf−if2 Both filters are workable, but remember that the second filter is printer dependent it can be slightly different on another printer. Finally, the etcprintcap file should be updated appropriately. The corresponding entries in the etcprintcap file are presented: cat etcprintcap Copyright c 1983 Regents of the University of California. All rights reserved. etc.printcap 5.2 Berkeley 5588 Generic printer: 232 ..... ..... PANASONIC Partner jet pan|pancrlf|panasonic|KX−P4410:\ :lp=devlp1:\ :sd=usrspoollp1:\ :mx0:\ :sh:\ :if=usrlibfilterscrlf−if1:\ :lf=usrspoollp1pan−err:\ :tr: HP Laser jet plus ljet|hplp|hpj|HP Laserjet:\ :lp=devlp1:\ :sd=usrspoollp1:\ :mx0:\ :sh:\ :if=usrlibfilterscrlf−if2:\ :lf=usrspoollp1 hp−err: ..... ..... The arbitrarily named logical printers logical because both point to the same physical printer pan and ljet can easily use both of the above filters.

10.2.1.5 Linux Printing Subsystem