ULPR - Universal LPR Client

Copyright © 2000, Chris Gonnerman

ULPR is a printing client program for the LPD, TCP (raw), and SMB protocols.  It is extensible, so that additional protocols may be added, and it requires NO configuration files.

ULPR is distributed under the terms of the General Public License of the Free Software Foundation; see the file COPYING included in the distribution for details, or visit www.gnu.org.

Updated! Version 0.6 a security hole in the LPD and TCP transports.  Note that the frontend-to-backend connection has changed so that you will need to rewrite any other protocols you may have implemented.


I am a laptop user, and I got tired of adding printers to /etc/printcap every time I needed to print at a new location.  Not only is it a hassle, but the /etc/printcap file rapidly becomes a mess.  ULPR solves these problems.

Here's an example:

  user@laptop> ulpr -P smb://office/deskjet

Simple, eh? ULPR accepts two main types of printer specification:

  • protocol://server/printer
  • protocol:printer@server
The protocol can be omitted (leave out the colon, too); this selects the default protocol, lpd.  If only a name without punctuation is found, it's assumed to be the printer name and the server name defaults to localhost.  If the first syntax is used and the printer name is omitted, the default printer name is assumed; this varies, as each protocol module can specify its own default.  For the lpd: protocol, the default is "lp".

Each protocol is implemented by a backend module, in the $PREFIX/libexec/ulpr directory, named "protocol"_print, i.e.  lpd_print, smb_print, tcp_print, etc. Eventually, there will be a ulpq command with similar backends named "protocol"_queue.  The default protocol is implemented by a symbolic link from lpd_print to def_print; you can change the default by changing this link.

It is also possible to specify options at the end of the printer specification where such are needed; I have deliberately limited the number of options accepted, and each protocol module implements its own set of options, so there is no general rule.  However, the option "debug" does usually specify verbose tracing of the program, probably not needed by any casual user.  Options are specified after the normal print specification, following a slash and separated by slashes, as in:

Some options are specified by themselves, and others have arguments following an equal sign, as shown above.  See below for additional examples.



This is the normal default protocol.  It has the following defaults and options:
  Host: localhost
  Printer: lp
  debug print verbose debugging output
  strict use strict RFC 1179 port range only (otherwise uses a reserved port)
  time=n connection timeout in seconds


This is the raw-tcp protocol module; it opens a connection to a given port and dumps in the print job.  Each file specified on the command line is sent through a separate connection.  The "printer" part of the print specification is the port address to send to.
  Host: localhost
  Printer: 10001
  debug print verbose debugging output
  reserved use a reserved port, less than 1024, as the source port
  time=n connection timeout in seconds


This is the SMB (Server Message Block) protocol.  The backend protocol module is actually a script file using the smbclient program included with Samba; therefore you need Samba installed to use this protocol module.  Note that name resolution uses the Samba model also; see the smbclient documentation for more information.  The default host and printer are rather likely to be incorrect...
  Host: server
  Printer: printer
  debug print verbose debugging output
  ip=n IP address of server (see the smbclient -I option)