LPRng-HOWTO: 15 Oct 2001 (For LPRng-3.7.9)
Prev | Chapter 15. Job Processing | Next

# 15.4. Opening the Output Device

Options used:

- `achk` FLAG Accounting check at start

- `af=`Accounting File

- `ar` FLAG Remote printer accounting enabled

- `as=`Accounting at start

- `connect_grace=`Time between jobs

- `connect_interval=`Connection interval

- `connect_timeout=`Connection timeout

- `control_filter=`Control file filter

- `ff=`form feed

- `fo` FLAG form feed on open

- `la` FLAG Local printer accounting enabled

- `ld=`leader on open (initialization string)

- `lk` FLAG Lock IO device

- `lp=`IO device pathname

- `nb` FLAG Nonblocking device open

- `network_connect_grace=`Interval in secs between jobs

- `of=`of filter

- `retry_econnrefused` FLAG Retry if open failed

- `retry_nolink` FLAG Retry if open failed

- `rm=`the remote machine to send the job to

- `rp=`the remote print queue to send the job to

- `rw` FLAG device opened RW flag

- `server_tmp_dir=`temporary directory

Sequence of Operations:

1. During the server operations, it will try to create temporary files in the print queue spool directory. If this is not desirable, it will create them in the `server_tmp_dir` directory.

2. If the accounting file specified by `af` exists, it is opened (af_fd) and the af_fd is passed as file descriptor 3 to all filters. If the `af` value has the form `af=|/program` then the program is started and the program STDIN is used as af_fd. If the `af` value has the form `af=host%port`, then a TCP/IP connection to the corresponding port on the remote host is made and the port used as af_fd. In the latter two cases, the filter STDIN (file descriptor 0) is actually opened read/write, and is used when information is needed from the accounting filter or remote server. See Accounting Printcap Options for more information on the LPRng accounting support.

3. If `la` (local accounting) is true and we are printing a job or `ar` (remote accounting) is true and we are transferring a job, the `as` value is examined. If it is a filter (program) specification, then the program is started with its STDIN attached to `/dev/null`, STDOUT will be read by the print spooler, STDERR output will be written to the error log, and file descriptor 3 output will be appended to the accounting file. The lpd program will wait until the accounting filter program terminates, and examine the error code for action, as for the filters (see errorcodes below). If the exit status is 0, (JSUCC) then the printing process will continue, if JHOLD the job will be held, if JREMOVE the job will be removed, if JFAIL the job processing will terminate with a JFAIL indication, otherwise the job processing will terminate with a JABORT indication.

4. If the accounting filter exited with a JSUCC (no error code) and the `achk` (accounting check) flag is set, the line read from the accounting filter STDOUT will be examined. This line should be `accept`, `hold`, `fail`, `remove`, otherwise the job processing terminates with a JABORT indication. An `accept` will allow the job to be printed, `hold` will hold the job, `fail` will cause the job to fail, `remove` will cause the job to be removed.

5. If the `connect_grace` value is non-zero and the server is opening a device or `network_connect_grace` is non-zero and a network connection is being made, the server will pause the specified time. This is to accommodate devices which need a recovery time between jobs.

6. The `lp` option is checked to determine the type of IO device.

   Format | Meaning
   --- | ---
   `/pathname` | Absolute pathname of IO device
   `pr@host` | transfer to `pr` on remote `host`
   `host%port` | open a TCP/IP connection to port on host. host can be name or IP address
   `|filter` | run the filter program; it STDIN will be used as device

7. The IO device specified by `lp` is opened write-only or read-write if the `rw` flag is true, and the resulting file descriptor is io_fd. If the `nb` flag is set, a non-blocking open will be done as well. If the `lk` (lock device) flag is true, the device will be locked against use by other lpd servers.

8. If a `host%port` combination, a TCP/IP connection will be opened to the remote port and the connection will be used as io_fd.

9. If a filter program is specified, the filter program will be run and the STDIN of the filter will be used as the device file descriptor.

10. If a `rp@rm` combination, or none of the above combinations are true and the `rm` and `rp` values are non-zero, then the job will be transferred to a remote printer. The type of operation will be a job transfer, rather than printing operation.

11. If the `connect_timeout` value is non-zero, a timeout is setup for the device or socket open. If the device or connection open does not succeed within the timeout, then the open operation fails.

12. If a connection is to a network address (i.e. - `connect()` system call) and the connection attempt fails with an ECONNREFUSED error, if the `retry_econnrefused` flag is set then the connection attempt is retried, but this time using an alternative port number. See RFC1179 for details. This is repeated until all of the possible originating port numbers are exhausted.

13. If the open or connect operation fails, and the `retry_nolink` flag is set, then the server will pause for a minimum of `connect_grace` plus a multiple of `connect_interval` seconds based on the number of attempts before retrying the open operation. Note that the interval may increase as the number of attempts increases.

14. If printing a job and the `:of` filter is specified, it is created with its STDOUT (fd 1) attached to the io_fd. Its stdin (of_fd) will be used in the steps listed below. If there is no `:of` filter, then the of_fd value will be the io_fd descriptor.

15. If transferring a job and the `control_filter` option is specified, then the program specified by the `control_filter` value will be run. It will have its STDIN set to the control file, and its STDOUT output will be used as the new value of the control file to transfer to the remote host. See Filter Command Line Options and Environment Variables for details of options passed to the control filter, and errorcodes for the exit codes of the filter.

16. If the operation is a job transfer, the operation proceeds as outlined in RFC1179, and then the Normal Termination operations are carried out.

17. If the operation is a print operation and the `ld` (leader on open) value is provided, the string is translated (escapes removed) and written to the of_fd file descriptor.

18. If the `fo` (form feed on open) flag is true, then the `ff` (form feed) string is translated (escapes removed) and written to the of_fd file descriptor.

Prev | Home | Next
Spool Queue Processing | Up | Printing Banners