sam.html   [plain text]


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>
<TITLE>CUPS Software Administrators Manual</TITLE>
<META NAME="author" CONTENT="Easy Software Products">
<META NAME="copyright" CONTENT="Copyright 1997-2002, All Rights Reserved">
<META NAME="docnumber" CONTENT="CUPS-SAM-1.1.15">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
<STYLE TYPE="text/css"><!--
BODY { font-family: serif }
H1 { font-family: sans-serif }
H2 { font-family: sans-serif }
H3 { font-family: sans-serif }
H4 { font-family: sans-serif }
H5 { font-family: sans-serif }
H6 { font-family: sans-serif }
SUB { font-size: smaller }
SUP { font-size: smaller }
PRE { font-family: monospace }
--></STYLE>
</HEAD>
<BODY BGCOLOR="#ffffff">
<CENTER><A HREF="#CONTENTS"><IMG SRC="images/cups-large.gif" BORDER="0" WIDTH="431" HEIGHT="511"><BR>
<H1>CUPS Software Administrators Manual</H1></A><BR>
CUPS-SAM-1.1.15<BR>
Easy Software Products<BR>
Copyright 1997-2002, All Rights Reserved<BR>
</CENTER>
<HR>
<H1 ALIGN="CENTER"><A NAME="CONTENTS">Table of Contents</A></H1>
<BR>
<BR><B><A HREF="#1">Preface</A></B>
<UL>
<LI><A HREF="#1_1">System Overview</A></LI>
<LI><A HREF="#1_2">Document Overview</A></LI>
<LI><A HREF="#1_3">Notation Conventions</A></LI>
<LI><A HREF="#1_4">Abbreviations</A></LI>
<LI><A HREF="#1_5">Other References</A></LI>
</UL>
<B><A HREF="#OVERVIEW">1 - Printing System Overview</A></B>
<UL>
<LI><A HREF="#2_1">The Printing Problem</A></LI>
<LI><A HREF="#2_2">The Technology</A></LI>
<LI><A HREF="#2_3">Jobs</A></LI>
<LI><A HREF="#2_4">Classes</A></LI>
<LI><A HREF="#2_5">Filters</A></LI>
<LI><A HREF="#2_6">Backends</A></LI>
<LI><A HREF="#2_7">Printer Drivers</A></LI>
<LI><A HREF="#2_8">Networking</A></LI>
</UL>
<B><A HREF="#BUILDING_INSTALLING">2 - Building and Installing CUPS</A></B>
<UL>
<LI><A HREF="#3_1">Installing a Source Distribution</A></LI>
<UL>
<LI><A HREF="#REQUIREMENTS">Requirements</A></LI>
<LI><A HREF="#COMPILING">Compiling CUPS</A></LI>
<LI><A HREF="#INSTALLING">Installing the Software</A></LI>
<LI><A HREF="#RUNNING">Running the Software</A></LI>
</UL>
<LI><A HREF="#BINARY">Installing a Binary Distribution</A></LI>
<UL>
<LI><A HREF="#PORTABLE-BINARY">Installing a Portable Distribution</A></LI>
<LI><A HREF="#RPM-BINARY">Installing an RPM Distribution</A></LI>
<LI><A HREF="#DPKG-BINARY">Installing an Debian Distribution</A></LI>
</UL>
</UL>
<B><A HREF="#MANAGING_PRINTERS">3 - Managing Printers</A></B>
<UL>
<LI><A HREF="#4_1">The Basics</A></LI>
<LI><A HREF="#4_2">Adding Your First Printer</A></LI>
<UL>
<LI><A HREF="#4_2_1">Adding Your First Printer from the Command-Line</A></LI>
<LI><A HREF="#ADD_WEB">Adding Your First Printer from the Web</A></LI>
</UL>
<LI><A HREF="#4_3">Managing Printers from the Command-Line</A></LI>
<UL>
<LI><A HREF="#4_3_1">Adding and Modifying Printers</A></LI>
<LI><A HREF="#4_3_2">Deleting Printers</A></LI>
<LI><A HREF="#4_3_3">Setting the Default Printer</A></LI>
<LI><A HREF="#4_3_4">Starting and Stopping Printers</A></LI>
<LI><A HREF="#4_3_5">Accepting and Rejecting Print Jobs</A></LI>
<LI><A HREF="#4_3_6">Setting Quotas on a Printer</A></LI>
<LI><A HREF="#4_3_7">Restricting User Access to a Printer</A></LI>
</UL>
<LI><A HREF="#4_4">Managing Printers from the Web</A></LI>
</UL>
<B><A HREF="#PRINTER_CLASSES">4 - Printer Classes</A></B>
<UL>
<LI><A HREF="#5_1">The Basics</A></LI>
<LI><A HREF="#5_2">Managing Printer Classes from the Command-Line</A></LI>
<LI><A HREF="#5_3">Managing Printer Classes from the Web Interface</A></LI>
<LI><A HREF="#5_4">Implicit Classes</A></LI>
</UL>
<B><A HREF="#CLIENT_SETUP">5 - Client Setup</A></B>
<UL>
<LI><A HREF="#6_1">The Basics</A></LI>
<UL>
<LI><A HREF="#CLIENT_MANUAL">Manual Configuration of Print Queues</A></LI>
<LI><A HREF="#CLIENT_SERVER">Specifying a Single Server for Printing</A></LI>
<LI><A HREF="#CLIENT_AUTO">Automatic Configuration of Print Queues</A></LI>
<LI><A HREF="#CLIENT_POLL">Specifying Multiple Servers for Printing</A></LI>
<LI><A HREF="#CLIENT_RELAY">Relaying Printers to Other Clients</A></LI>
</UL>
<LI><A HREF="#6_2">Load Balancing and Failsafe Operation</A></LI>
</UL>
<B><A HREF="#PRINTING_MANAGEMENT">6 - Printing System Management</A></B>
<UL>
<LI><A HREF="#7_1">The Basics</A></LI>
<LI><A HREF="#RESTARTING">Restarting the CUPS Server</A></LI>
<LI><A HREF="#7_3">Changing the Server Configuration</A></LI>
<LI><A HREF="#7_4">Server Directives</A></LI>
<UL>
<LI><A HREF="#AccessLog">AccessLog</A></LI>
<LI><A HREF="#Allow">Allow</A></LI>
<LI><A HREF="#AuthClass">AuthClass</A></LI>
<LI><A HREF="#AuthGroupName">AuthGroupName</A></LI>
<LI><A HREF="#AuthType">AuthType</A></LI>
<LI><A HREF="#AutoPurgeJobs">AutoPurgeJobs</A></LI>
<LI><A HREF="#BrowseAddress">BrowseAddress</A></LI>
<LI><A HREF="#BrowseAllow">BrowseAllow</A></LI>
<LI><A HREF="#BrowseDeny">BrowseDeny</A></LI>
<LI><A HREF="#BrowseOrder">BrowseOrder</A></LI>
<LI><A HREF="#BrowseInterval">BrowseInterval</A></LI>
<LI><A HREF="#BrowsePoll">BrowsePoll</A></LI>
<LI><A HREF="#BrowsePort">BrowsePort</A></LI>
<LI><A HREF="#BrowseProtocols">BrowseProtocols</A></LI>
<LI><A HREF="#BrowseRelay">BrowseRelay</A></LI>
<LI><A HREF="#BrowseShortNames">BrowseShortNames</A></LI>
<LI><A HREF="#BrowseTimeout">BrowseTimeout</A></LI>
<LI><A HREF="#Browsing">Browsing</A></LI>
<LI><A HREF="#Classification">Classification</A></LI>
<LI><A HREF="#ClassifyOverride">ClassifyOverride</A></LI>
<LI><A HREF="#ConfigFilePerm">ConfigFilePerm</A></LI>
<LI><A HREF="#DataDir">DataDir</A></LI>
<LI><A HREF="#DefaultCharset">DefaultCharset</A></LI>
<LI><A HREF="#DefaultLanguage">DefaultLanguage</A></LI>
<LI><A HREF="#Deny">Deny</A></LI>
<LI><A HREF="#DocumentRoot">DocumentRoot</A></LI>
<LI><A HREF="#Encryption">Encryption</A></LI>
<LI><A HREF="#ErrorLog">ErrorLog</A></LI>
<LI><A HREF="#FilterLimit">FilterLimit</A></LI>
<LI><A HREF="#FontPath">FontPath</A></LI>
<LI><A HREF="#Group">Group</A></LI>
<LI><A HREF="#HideImplicitMembers">HideImplicitMembers</A></LI>
<LI><A HREF="#HostNameLookups">HostNameLookups</A></LI>
<LI><A HREF="#ImplicitClasses">ImplicitClasses</A></LI>
<LI><A HREF="#ImplicitAnyClasses">ImplicitAnyClasses</A></LI>
<LI><A HREF="#Include">Include</A></LI>
<LI><A HREF="#KeepAlive">KeepAlive</A></LI>
<LI><A HREF="#KeepAliveTimeout">KeepAliveTimeout</A></LI>
<LI><A HREF="#Limit">Limit</A></LI>
<LI><A HREF="#LimitExcept">LimitExcept</A></LI>
<LI><A HREF="#LimitRequestBody">LimitRequestBody</A></LI>
<LI><A HREF="#Listen">Listen</A></LI>
<LI><A HREF="#Location">Location</A></LI>
<LI><A HREF="#LogFilePerm">LogFilePerm</A></LI>
<LI><A HREF="#LogLevel">LogLevel</A></LI>
<LI><A HREF="#MaxClients">MaxClients</A></LI>
<LI><A HREF="#MaxJobs">MaxJobs</A></LI>
<LI><A HREF="#MaxJobsPerPrinter">MaxJobsPerPrinter</A></LI>
<LI><A HREF="#MaxJobsPerUser">MaxJobsPerUser</A></LI>
<LI><A HREF="#MaxLogSize">MaxLogSize</A></LI>
<LI><A HREF="#MaxRequestSize">MaxRequestSize</A></LI>
<LI><A HREF="#Order">Order</A></LI>
<LI><A HREF="#PageLog">PageLog</A></LI>
<LI><A HREF="#Port">Port</A></LI>
<LI><A HREF="#PreserveJobHistory">PreserveJobHistory</A></LI>
<LI><A HREF="#PreserveJobFiles">PreserveJobFiles</A></LI>
<LI><A HREF="#Printcap">Printcap</A></LI>
<LI><A HREF="#PrintcapFormat">PrintcapFormat</A></LI>
<LI><A HREF="#PrintcapGUI">PrintcapGUI</A></LI>
<LI><A HREF="#RemoteRoot">RemoteRoot</A></LI>
<LI><A HREF="#RequestRoot">RequestRoot</A></LI>
<LI><A HREF="#Require">Require</A></LI>
<LI><A HREF="#RIPCache">RIPCache</A></LI>
<LI><A HREF="#RunAsUser">RunAsUser</A></LI>
<LI><A HREF="#Satisfy">Satisfy</A></LI>
<LI><A HREF="#ServerAdmin">ServerAdmin</A></LI>
<LI><A HREF="#ServerBin">ServerBin</A></LI>
<LI><A HREF="#ServerCertificate">ServerCertificate</A></LI>
<LI><A HREF="#ServerKey">ServerKey</A></LI>
<LI><A HREF="#ServerName">ServerName</A></LI>
<LI><A HREF="#ServerRoot">ServerRoot</A></LI>
<LI><A HREF="#SSLListen">SSLListen</A></LI>
<LI><A HREF="#SSLPort">SSLPort</A></LI>
<LI><A HREF="#SystemGroup">SystemGroup</A></LI>
<LI><A HREF="#TempDir">TempDir</A></LI>
<LI><A HREF="#Timeout">Timeout</A></LI>
<LI><A HREF="#User">User</A></LI>
</UL>
<LI><A HREF="#PRINTING_SECURITY">Printing System Security</A></LI>
<UL>
<LI><A HREF="#CERTIFICATES">Authentication Using Certificates</A></LI>
<LI><A HREF="#7_5_2">Using Basic Authentication</A></LI>
<LI><A HREF="#7_5_3">Using Digest Authentication</A></LI>
<LI><A HREF="#7_5_4">System and Group Authentication</A></LI>
</UL>
<LI><A HREF="#PRINTER_ACCOUNTING">Printer Accounting</A></LI>
<UL>
<LI><A HREF="#7_6_1">The access_log File</A></LI>
<LI><A HREF="#7_6_2">The error_log File</A></LI>
<LI><A HREF="#7_6_3">The page_log File</A></LI>
</UL>
<LI><A HREF="#FILE_TYPING_FILTERING">File Typing and Filtering</A></LI>
<UL>
<LI><A HREF="#7_7_1">mime.types</A></LI>
<LI><A HREF="#7_7_2">mime.convs</A></LI>
<LI><A HREF="#7_7_3">Adding Filetypes and Filters</A></LI>
<LI><A HREF="#7_7_4">Printer Drivers and PPD Files</A></LI>
<LI><A HREF="#7_7_5">Writing Your Own Filter or Printer Driver</A></LI>
</UL>
</UL>
<B><A HREF="#PRINTING_OTHER">7 - Printing with Other Systems</A></B>
<UL>
<LI><A HREF="#8_1">The Basics</A></LI>
<LI><A HREF="#8_2">Printing from LPD Clients</A></LI>
<LI><A HREF="#8_3">Printing to LPD Servers</A></LI>
<LI><A HREF="#8_4">Printing from Mac OS Clients</A></LI>
<UL>
<LI><A HREF="#8_4_1">Columbia Appletalk Package (CAP)</A></LI>
<LI><A HREF="#8_4_2">XINET KA/Spool</A></LI>
<LI><A HREF="#8_4_3">NetATalk</A></LI>
</UL>
<LI><A HREF="#8_5">Printing to Mac OS Servers</A></LI>
<LI><A HREF="#8_6">Printing from Windows Clients</A></LI>
<UL>
<LI><A HREF="#8_6_1">Exporting Printer Drivers</A></LI>
</UL>
<LI><A HREF="#8_7">Printing to Windows Servers</A></LI>
</UL>
<B><A HREF="#LICENSE">A - Software License Agreement</A></B>
<UL>
<LI><A HREF="#9_1">Common UNIX Printing System License Agreement</A></LI>
<UL>
<LI><A HREF="#9_1_1">Introduction</A></LI>
<LI><A HREF="#9_1_2">License Exceptions</A></LI>
<LI><A HREF="#9_1_3">Trademarks</A></LI>
<LI><A HREF="#9_1_4">Binary Distribution Rights</A></LI>
<LI><A HREF="#9_1_5">Support</A></LI>
</UL>
<LI><A HREF="#9_2">GNU GENERAL PUBLIC LICENSE</A></LI>
<LI><A HREF="#9_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></LI>
</UL>
<B><A HREF="#COMMON_NETWORK">B - Common Network Settings</A></B>
<UL>
<LI><A HREF="#10_1">Configuring a Network Interface</A></LI>
<UL>
<LI><A HREF="#10_1_1">Configuring the IP Address Using ARP</A></LI>
<LI><A HREF="#10_1_2">Configuring the IP Address Using RARP</A></LI>
<LI><A HREF="#10_1_3">Configuring the IP Address Using BOOTP</A></LI>
</UL>
<LI><A HREF="#10_2">Verifying the Printer Connection</A></LI>
<LI><A HREF="#10_3">Common Network Interface Settings</A></LI>
<LI><A HREF="#AXIS">Configuring Axis Print Servers</A></LI>
<LI><A HREF="#LINKSYS">Configuring Linksys Print Servers</A></LI>
</UL>
<B><A HREF="#PRINTER_DRIVERS">C - Printer Drivers</A></B>
<UL>
<LI><A HREF="#11_1">Printer Drivers</A></LI>
<LI><A HREF="#EPSON9">EPSON 9-pin Dot Matrix</A></LI>
<LI><A HREF="#EPSON24">EPSON 24-pin Dot Matrix</A></LI>
<LI><A HREF="#STCOLOR">EPSON Stylus Color</A></LI>
<LI><A HREF="#STPHOTO">EPSON Stylus Photo</A></LI>
<LI><A HREF="#DESKJET">HP DeskJet</A></LI>
<LI><A HREF="#LASERJET">HP LaserJet</A></LI>
</UL>
<B><A HREF="#FILES">D - List of Files</A></B>
<BR>
<BR><B><A HREF="#FAQ">E - Troubleshooting Common Problems</A></B>
<UL>
<LI><A HREF="#13_1">My Applications Don't See the Available Printers</A></LI>
<LI><A HREF="#13_2">CUPS Doesn't Recognize My Username or Password!</A></LI>
<LI><A HREF="#ALLOW_REMOTE">I Can't Do Administration Tasks from Another
 Machine!</A></LI>
<LI><A HREF="#13_4">I Can't Do Administration Tasks from My Web Browser!</A>
</LI>
<LI><A HREF="#13_5">Connection Refused Messages</A></LI>
<LI><A HREF="#13_6">Write Error Messages</A></LI>
</UL>
<HR>
<H1 ALIGN="RIGHT"><A NAME="1">Preface</A></H1>
<P>This software administrators manual provides printer administration
 information for the Common UNIX Printing System<SUP>TM</SUP> (&quot;CUPS<SUP>
TM</SUP>&quot;), version 1.1.15.</P>
<H2><A NAME="1_1">System Overview</A></H2>
<P>CUPS provides a portable printing layer for UNIX&reg;-based operating
 systems. It has been developed by<A HREF="http://www.easysw.com"> Easy
 Software Products</A> to promote a standard printing solution for all
 UNIX vendors and users. CUPS provides the System V and Berkeley
 command-line interfaces.</P>
<P>CUPS uses the Internet Printing Protocol (&quot;IPP&quot;) as the basis for
 managing print jobs and queues. The Line Printer Daemon (&quot;LPD&quot;) Server
 Message Block (&quot;SMB&quot;), and AppSocket (a.k.a. JetDirect) protocols are
 also supported with reduced functionality. CUPS adds network printer
 browsing and PostScript Printer Description (&quot;PPD&quot;) based printing
 options to support real-world printing under UNIX.</P>
<P>CUPS also includes a customized version of GNU Ghostscript (currently
 based off GNU Ghostscript 5.50) and an image file RIP that are used to
 support non-PostScript printers. Sample drivers for HP and EPSON
 printers are included that use these filters.</P>

<!-- NEED 3in -->
<H2><A NAME="1_2">Document Overview</A></H2>
<P>This software administrators manual is organized into the following
 sections:</P>
<UL>
<LI><A HREF="#OVERVIEW">1 - Printing System Overview</A></LI>
<LI><A HREF="#BUILDING_INSTALLING">2 - Building and Installing CUPS</A></LI>
<LI><A HREF="#MANAGING_PRINTERS">3 - Managing Printers</A></LI>
<LI><A HREF="#PRINTER_CLASSES">4 - Printer Classes</A></LI>
<LI><A HREF="#CLIENT_SETUP">5 - Client Setup</A></LI>
<LI><A HREF="#PRINTING_MANAGEMENT">6 - Printing System Management</A></LI>
<LI><A HREF="#PRINTING_OTHER">7 - Printing with Other Systems</A></LI>
<LI><A HREF="#LICENSE">A - Software License Agreement</A></LI>
<LI><A HREF="#COMMON_NETWORK">B - Common Network Settings</A></LI>
<LI><A HREF="#PRINTER_DRIVERS">C - Printer Drivers</A></LI>
<LI><A HREF="#FILES">D - List of Files</A></LI>
<LI><A HREF="#FAQ">E - Troubleshooting Common Problems</A></LI>
</UL>
<H2><A NAME="1_3">Notation Conventions</A></H2>
<P>Various font and syntax conventions are used in this guide. Examples
 and their meanings and uses are explained below:
<CENTER>
<TABLE WIDTH="80%">
<TR><TH>Example</TH><TD>&nbsp;&nbsp;&nbsp;</TD><TH>Description</TH></TR>
<TR><TD>&nbsp;</TD></TR>
<TR VALIGN="TOP"><TD><CODE>lpstat</CODE>
<BR> <CODE>lpstat(1)</CODE></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>The names of commands;
 the first mention of a command or function in a chapter is followed by
 a manual page section number.</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR VALIGN="TOP"><TD><VAR>/var</VAR>
<BR><VAR> /usr/share/cups/data/testprint.ps</VAR></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>
File and directory names.</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR VALIGN="TOP"><TD NOWRAP><TT>Request ID is Printer-123</TT></TD><TD>
&nbsp;&nbsp;&nbsp;</TD><TD>Screen output.</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR VALIGN="TOP"><TD NOWRAP><KBD>lp -d printer filename ENTER</KBD></TD><TD>
&nbsp;&nbsp;&nbsp;</TD><TD>Literal user input; special keys like <KBD>ENTER</KBD> are
 in ALL CAPS.</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR VALIGN="TOP"><TD>12.3</TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD>Numbers in the text are
 written using the period (.) to indicate the decimal point.</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 3in -->
</P>
<H2><A NAME="1_4">Abbreviations</A></H2>
 The following abbreviations are used throughout this manual:
<UL>
<DL>
<DT>kb</DT>
<DD>Kilobytes, or 1024 bytes
<BR>&nbsp;</DD>
<DT>Mb</DT>
<DD>Megabytes, or 1048576 bytes
<BR>&nbsp;</DD>
<DT>Gb</DT>
<DD>Gigabytes, or 1073741824 bytes
<BR>&nbsp;</DD>
</DL>
</UL>
<H2><A NAME="1_5">Other References</A></H2>
<UL>
<DL>
<DT>CUPS Software Programmers Manual</DT>
<DD>A programmer guide for interfacing with and/or extending the CUPS
 software.
<BR>&nbsp;</DD>
<DT>CUPS Software Users Manual</DT>
<DD>An end-user guide for using the CUPS software.
<BR>&nbsp;</DD>
</DL>
</UL>
<H1 ALIGN="RIGHT"><A NAME="OVERVIEW">1 - Printing System Overview</A></H1>
<P>This chapter provides an overview of how the Common UNIX Printing
 System works.</P>
<H2><A NAME="2_1">The Printing Problem</A></H2>
<P>For years<I> the printing problem</I> has plagued UNIX. Unlike
 Microsoft&reg; Windows&reg; or Mac OS, UNIX has no standard interface or system
 in place for supporting printers. Among the solutions currently
 available, the Berkeley and System V printing systems are the most
 prevalent.</P>
<P>These printing systems support line printers (text only) or
 PostScript printers (text and graphics), and with some coaxing they can
 be made to support a full range of printers and file formats. However,
 because each varient of the UNIX operating system uses a different
 printing system than the next developing printer drivers for a wide
 range of printers and operating systems is extremely difficult. That
 combined with the limited volume of customers for each UNIX varient has
 forced most printer vendors to give up supporting UNIX entirely.</P>
<P>CUPS is designed to eliminate<I> the printing problem</I>. One common
 printing system can be used by all UNIX varients to support the
 printing needs of users. Printer vendors can use its modular filter
 interface to develop a single driver program that supports a wide range
 of file formats with little or no effort. Since CUPS provides both the
 System V and Berkeley printing commands, users (and applications) can
 reap the benefits of this new technology with no changes.</P>
<H2><A NAME="2_2">The Technology</A></H2>
<P>CUPS is based upon an emerging Internet standard called the Internet
 Printing Protocol. IPP has been embraced by dozens of printer and
 printer server manufacturers and is supported by Microsoft Windows
 2000.</P>
<P>IPP defines a standard protocol for printing as well as managing
 print jobs and printer options like media size, resolution, and so
 forth. Like all IP-based protocols, IPP can be used locally or over the
 Internet to printers hundreds or thousands of miles away. Unlike other
 protocols, however, IPP also supports access control, authentication,
 and encryption, making it a much more capable and secure printing
 solution than older ones.</P>
<P>IPP is layered on top of the Hyper-Text Transport Protocol (&quot;HTTP&quot;)
 which is the basis of web servers on the Internet. This allows users to
 view documentation, check status information on a printer or server,
 and manage their printers, classes, and jobs using their web browser.</P>
<P>CUPS provides a complete IPP/1.1 based printing system that provides
 Basic, Digest, and local certificate authentication and user, domain,
 or IP-based access control. TLS encryption will be available in future
 versions of CUPS.</P>
<H2><A NAME="2_3">Jobs</A></H2>
<P>Each file or set of files that is submitted for printing is called a<I>
 job</I>. Jobs are identified by a unique number starting at 1 and are
 assigned to a particular destination, usually a printer. Jobs can also
 have options associated with them such as media size, number of copies,
 and priority.</P>
<H2><A NAME="2_4">Classes</A></H2>
<P>CUPS supports collections of printers known as<I> classes</I>. Jobs
 sent to a class are forwarded to the first available printer in the
 class.</P>
<H2><A NAME="2_5">Filters</A></H2>
<P>Filters allow a user or application to print many types of files
 without extra effort. Print jobs sent to a CUPS server are filtered
 before sending them to a printer. Some filters convert job files to
 different formats that the printer can understand. Others perform page
 selection and ordering tasks.</P>
<P>CUPS provides filters for printing many types of image files, HP-GL/2
 files, PDF files, and text files. CUPS also supplies PostScript and
 image file Raster Image Processor (&quot;RIP&quot;) filters that convert
 PostScript or image files into bitmaps that can be sent to a raster
 printer.</P>
<H2><A NAME="2_6">Backends</A></H2>
<P>Backends perform the most important task of all - they send the
 filtered print data to the printer.</P>
<P>CUPS provides backends for printing over parallel, serial, and USB
 ports, and over the network via the IPP, JetDirect (AppSocket), and
 Line Printer Daemon (&quot;LPD&quot;) protocols. Additional backends are
 available in network service packages such as the SMB backend included
 with the popular SAMBA software.</P>
<P>Backends are also used to determine the available devices. On startup
 each backend is asked for a list of devices it supports, and any
 information that is available. This allows the parallel backend to tell
 CUPS that an EPSON Stylus Color 600 printer is attached to parallel
 port 1, for example.</P>
<H2><A NAME="2_7">Printer Drivers</A></H2>
<P>Printer drivers in CUPS consist of one of more filters specific to a
 printer. CUPS includes sample printer drivers for Hewlett-Packard
 LaserJet and DeskJet printers and EPSON 9-pin, 24-pin, Stylus Color,
 and Stylus Photo printers. While these drivers do not generate optimal
 output for the different printer models, they do provide basic printing
 and demonstrate how you can write your own printer drivers and
 incorporate them into CUPS.</P>
<H2><A NAME="2_8">Networking</A></H2>
<P>Printers and classes on the local system are automatically shared
 with other systems on the network. This allows you to setup one system
 to print to a printer and use this system as a printer server or spool
 host for all of the others. Users may then select a local printer by
 name or a remote printer using &quot;name@server&quot;.</P>
<P>CUPS also provides<I> implicit classes</I>, which are collections of
 printers and/or classes with the same name. This allows you to setup
 multiple servers pointing to the same physical network printer, for
 example, so that you aren't relying on a single system for printing.
 Because this also works with printer classes, you can setup multiple
 servers and printers and never worry about a single point of failure
 unless all of the printers and servers go down!</P>
<H1 ALIGN="RIGHT"><A NAME="BUILDING_INSTALLING">2 - Building and
 Installing CUPS</A></H1>
<P>This chapter shows how to build and install the Common UNIX Printing
 System. If you are installing a binary distribution from the CUPS web
 site, proceed to the section titled,<A HREF="#BINARY"> Installing a
 Binary Distribution</A>.</P>
<H2><A NAME="3_1">Installing a Source Distribution</A></H2>
<P>This section describes how to compile and install CUPS on your system
 from the source code.</P>
<H3><A NAME="REQUIREMENTS">Requirements</A></H3>
<P>You'll need ANSI-compliant C and C++ compilers to build CUPS on your
 system. As its name implies, CUPS is designed to run on the UNIX
 operating system, however the CUPS interface library and most of the
 filters and backends supplied with CUPS should also compile and run
 under Microsoft Windows.</P>
<P>For the image file filters and PostScript RIP, you'll need the JPEG,
 PNG, TIFF, and ZLIB libraries. CUPS will build without these, but with
 significantly reduced functionality. Easy Software Products maintains a
 mirror of the current versions of these libraries at:</P>
<UL>
<PRE>
<A HREF="ftp://ftp.easysw.com/pub/libraries">ftp://ftp.easysw.com/pub/libraries</A>
</PRE>
</UL>
<P>If you make changes to the man pages you'll need GNU groff or another
 nroff-like package. GNU groff is available from:</P>
<UL>
<PRE>
<A HREF="ftp://ftp.gnu.org/pub/groff">ftp://ftp.gnu.org/pub/groff</A>
</PRE>
</UL>
<P>The documentation is formatted using the HTMLDOC software. If you
 need to make changes you can get the HTMLDOC software from:</P>
<UL>
<PRE>
<A HREF="http://www.easysw.com/htmldoc">http://www.easysw.com/htmldoc</A>
</PRE>
</UL>
<P>Finally, you'll need a <CODE>make</CODE> program that understands the
 <CODE>include</CODE> directive - FreeBSD, NetBSD, and OpenBSD
 developers should use the <CODE>gmake</CODE> program.</P>
<H3><A NAME="COMPILING">Compiling CUPS</A></H3>
<P>CUPS uses GNU autoconf to configure the makefiles and source code for
 your system. Type the following command to configure CUPS for your
 system:</P>
<UL>
<PRE>
<B>./configure ENTER</B>
</PRE>
</UL>
<P>The default installation will put the CUPS software in the<VAR> /etc</VAR>
,<VAR> /usr</VAR>, and<VAR> /var</VAR> directories on your system, which
 will overwrite any existing printing commands on your system. Use the <CODE>
--prefix</CODE> option to install the CUPS software in another location:</P>
<UL>
<PRE>
<B>./configure --prefix=/some/directory ENTER</B>
</PRE>
</UL>
<P>If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in a
 system default location (typically<VAR> /usr/include</VAR> and<VAR>
 /usr/lib</VAR>) you'll need to set the <CODE>CFLAGS</CODE>, <CODE>
CXXFLAGS</CODE>, and <CODE>LDFLAGS</CODE> environment variables prior to
 running configure:</P>
<UL>
<PRE>
<B>setenv CFLAGS &quot;-I/some/directory&quot; ENTER</B>
<B>setenv CXXFLAGS &quot;-I/some/directory&quot; ENTER</B>
<B>setenv LDFLAGS &quot;-L/some/directory&quot; ENTER</B>
<B>setenv DSOFLAGS &quot;-L/some/directory&quot; ENTER</B>
<B>./configure ... ENTER</B>
</PRE>
</UL>
<P>or:</P>
<UL>
<PRE>
<B>CFLAGS=&quot;-I/some/directory&quot;; export CFLAGS ENTER</B>
<B>CXXFLAGS=&quot;-I/some/directory&quot;; export CXXFLAGS ENTER</B>
<B>LDFLAGS=&quot;-L/some/directory&quot;; export LDFLAGS ENTER</B>
<B>DSOFLAGS=&quot;-L/some/directory&quot;; export DSOFLAGS ENTER</B>
<B>./configure ... ENTER</B>
</PRE>
</UL>
<P>To enable support for encryption, you'll also want to add the
 &quot;--enable-ssl&quot; option:</P>
<UL>
<PRE>
./configure --enable-ssl
</PRE>
</UL>
<P>SSL and TLS support require the OpenSSL library, available at:</P>
<UL>
<PRE>
<A HREF="http://www.openssl.org">http://www.openssl.org</A>
</PRE>
</UL>
<P>If the OpenSSL headers and libraries are not installed in the
 standard directories, use the <CODE>--with-openssl-includes</CODE> and <CODE>
--with-openssl-libs</CODE> options:</P>
<UL>
<PRE>
./configure --enable-ssl \
    --with-openssl-includes=/foo/bar/include \
    --with-openssl-libs=/foo/bar/lib
</PRE>
</UL>
<P>Once you have configured things, just type:</P>
<UL>
<PRE>
<B>make ENTER</B>
</PRE>
</UL>
<P>to build the software.
<!-- NEED 4in -->
</P>
<H3><A NAME="INSTALLING">Installing the Software</A></H3>
<P>Use the &quot;install&quot; target to install the software:</P>
<UL>
<PRE>
<B>make install ENTER</B>
</PRE>
</UL>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> WARNING:</B>
<P>Installing CUPS will overwrite your existing printing system. If you
 experience difficulties with the CUPS software and need to go back to
 your old printing system, you will need to reinstall the old printing
 system from your operating system CDs.</P>
</TD></TR>
</TABLE>
</CENTER>
<H3><A NAME="RUNNING">Running the Software</A></H3>
<P>Once you have installed the software you can start the CUPS server by
 typing:</P>
<UL>
<PRE>
<B>/usr/sbin/cupsd ENTER</B>
</PRE>
</UL>

<!-- NEED 4in -->
<H2><A NAME="BINARY">Installing a Binary Distribution</A></H2>
<P>CUPS comes in a variety of binary distribution formats. Easy Software
 Products provides binaries in TAR format with installation and removal
 scripts (&quot;portable&quot; distributions), and in RPM and DPKG formats for Red
 Hat and Debian-based distributions. Portable distributions are
 available for all platforms, while the RPM and DPKG distributions are
 only available for Linux.
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> WARNING:</B>
<P>Installing CUPS will overwrite your existing printing system. If you
 experience difficulties with the CUPS software and need to go back to
 your old printing system, you will need to remove the CUPS software
 with the provided script and/or reinstall the old printing system from
 your operating system CDs.</P>
</TD></TR>
</TABLE>
</CENTER>
</P>
<H3><A NAME="PORTABLE-BINARY">Installing a Portable Distribution</A></H3>
<P>To install the CUPS software from a portable distribution you will
 need to be logged in as root; doing an <CODE>su</CODE> is good enough.
 Once you are the root user, run the installation script with:</P>
<UL>
<PRE>
<B>./cups.install ENTER</B>
</PRE>
</UL>
<P>After asking you a few yes/no questions the CUPS software will be
 installed and the scheduler will be started automatically.
<!-- NEED 2in -->
</P>
<H3><A NAME="RPM-BINARY">Installing an RPM Distribution</A></H3>
<P>To install the CUPS software from an RPM distribution you will need
 to be logged in as root; doing an <CODE>su</CODE> is good enough. Once
 you are the root user, run RPM with:</P>
<UL>
<PRE>
<B>rpm -e lpr</B>
<B>rpm -i cups-1.1-linux-M.m.n-intel.rpm ENTER</B>
</PRE>
</UL>
<P>After a short delay the CUPS software will be installed and the
 scheduler will be started automatically.</P>
<H3><A NAME="DPKG-BINARY">Installing an Debian Distribution</A></H3>
<P>To install the CUPS software from a Debian distribution you will need
 to be logged in as root; doing an <CODE>su</CODE> is good enough. Once
 you are the root user, run dpkg with:</P>
<UL>
<PRE>
<B>dpkg -i cups-1.1-linux-M.m.n-intel.deb ENTER</B>
</PRE>
</UL>
<P>After a short delay the CUPS software will be installed and the
 scheduler will be started automatically.</P>
<H1 ALIGN="RIGHT"><A NAME="MANAGING_PRINTERS">3 - Managing Printers</A></H1>
<P>This chapter describes how to add your first printer and how to
 manage your printers.</P>
<H2><A NAME="4_1">The Basics</A></H2>
<P>Each printer queue has a name associated with it; the printer name
 must start with a letter and can contain up to 127 letters, numbers,
 and the underscore (_). Case is not significant, e.g. &quot;PRINTER&quot;,
 &quot;Printer&quot;, and &quot;printer&quot; are considered to be the same name.</P>
<P>Printer queues also have a device associated with them. The device
 can be a parallel port, a network interface, and so forth. Devices
 within CUPS use Uniform Resource Identifiers (&quot;URIs&quot;) which are a more
 general form of Uniform Resource Locators (&quot;URLs&quot;) that are used in
 your web browser. For example, the first parallel port in Linux usually
 uses a device URI of <CODE>parallel:/dev/lp1</CODE>.
<!-- NEED 2.5in -->
</P>
<P>You can see a complete list of supported devices by running the <CODE>
lpinfo(8)</CODE> command:</P>
<UL>
<PRE>
<B>lpinfo -v ENTER</B>
file file
network socket
network http
network ipp
network lpd
direct parallel:/dev/lp1
serial serial:/dev/ttyS1?baud=115200
serial serial:/dev/ttyS2?baud=115200
direct usb:/dev/usb/lp0
network smb
</PRE>
</UL>
<P>The <CODE>-v</CODE> option specifies that you want a list of
 available devices. The first word in each line is the type of device
 (direct, file, network, or serial) and is followed by the device URI or
 method name for that device. File devices have device URIs of the form <CODE>
file:/directory/filename</CODE> while network devices use the more
 familiar <CODE>method://server</CODE> or <CODE>method://server/path</CODE>
 format.</P>
<P>Finally, printer queues usually have a PostScript Printer Description
 (&quot;PPD&quot;) file associated with them. PPD files describe the capabilities
 of each printer, the page sizes supported, etc., and are used for
 PostScript and non-PostScript printers. CUPS includes PPD files for HP
 LaserJet, HP DeskJet, EPSON 9-pin, EPSON 24-pin, and EPSON Stylus
 printers.</P>
<H2><A NAME="4_2">Adding Your First Printer</A></H2>
<P>CUPS provides two methods for adding printers: a command-line program
 called <CODE>lpadmin(8)</CODE> and a Web interface. The <CODE>lpadmin</CODE>
 command allows you to perform most printer administration tasks from
 the command-line and is located in<VAR> /usr/sbin</VAR>. The Web
 interface is located at:</P>
<UL>
<PRE>
<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
</PRE>
</UL>
<P>and steps you through printer configuration. If you don't like
 command-line interfaces, try the<A HREF="#ADD_WEB"> Web interface</A>
 instead.</P>
<H3><A NAME="4_2_1">Adding Your First Printer from the Command-Line</A></H3>
<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> option
 to add a printer to CUPS:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> -E -v <I>device</I> -m <I>ppd</I> ENTER</B>
</PRE>
</UL>
<P>For a HP DeskJet printer connected to the parallel port this would
 look like:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p DeskJet -E -v parallel:/dev/lp1 -m deskjet.ppd ENTER</B>
</PRE>
</UL>
<P>Similarly, a HP LaserJet printer using a JetDirect network interface
 at IP address 11.22.33.44 would be added with the command:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p LaserJet -E -v socket://11.22.33.44 -m laserjet.ppd ENTER</B>
</PRE>
</UL>
<P>As you can see, <CODE>deskjet.ppd</CODE> and <CODE>laserjet.ppd</CODE>
 are the PPD files for the HP DeskJet and HP LaserJet drivers included
 with CUPS. You'll find a complete list of PPD files and the printers
 they will work with in<A HREF="#PRINTER_DRIVERS"> Appendix C, &quot;Printer
 Drivers&quot;</A>.</P>
<P>For a dot matrix printer connected to the serial port this would
 might look like:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p DotMatrix -E -v serial:/dev/ttyS0?baud=9600+size=8+parity=none+flow=soft deskjet.ppd ENTER</B>
</PRE>
</UL>
<P>Here you specify the serial port (e.g. S0,S1, d0, d1), baud rate
 (e.g. 9600, 19200, 38400, 115200, etc.), number of bits, parity, and
 flow control. If you do not need flow control, delete the &quot;+flow=soft&quot;
 portion.</P>
<H3><A NAME="ADD_WEB">Adding Your First Printer from the Web</A></H3>
<P>The CUPS web server provides a user-friendly &quot;wizard&quot; interface for
 adding your printers. Rather than figuring out which device URI and PPD
 file to use, you can instead click on the appropriate listings and fill
 in some simple information. Enter the following URL in your web browser
 to begin:</P>
<UL>
<PRE>
<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
</PRE>
</UL>
<P>Click on the<VAR> Add Printer</VAR> button to add a printer.</P>
<H2><A NAME="4_3">Managing Printers from the Command-Line</A></H2>
<P>The <CODE>lpadmin</CODE> command enables you to perform most printer
 administration tasks from the command-line. You'll find <CODE>lpadmin</CODE>
 in the<VAR> /usr/sbin</VAR> directory.</P>
<H3><A NAME="4_3_1">Adding and Modifying Printers</A></H3>
<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> option
 to add or modify a printer:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> <I>options</I> ENTER</B>
</PRE>
</UL>
<P>The<I> options</I> arguments can be any of the following:</P>
<UL>
<DL>
<DT>-c<I> class</I></DT>
<DD>Adds the named printer to printer class<VAR> class</VAR>. If the
 class does not exist then it is created.</DD>
<DT>-i<I> interface</I></DT>
<DD>Copies the named<VAR> interface</VAR> script to the printer.
 Interface scripts are used by System V printer drivers. Since all
 filtering is disabled when using an interface script, scripts generally
 should not be used unless there is no other driver for a printer.</DD>
<DT>-m<I> model</I></DT>
<DD>Specifies a standard printer driver which is usually a PPD file. A
 list of all available models can be displayed using the <CODE>lpinfo</CODE>
 command with the <CODE>-m</CODE> option. A list of printer drivers
 included with CUPS can be found in<A HREF="#PRINTER_DRIVERS"> Appendix
 C, &quot;Printer Drivers&quot;</A>.</DD>
<DT>-r<I> class</I></DT>
<DD>Removes the named printer from printer class<VAR> class. If the
 resulting class becomes empty then it is removed.</VAR></DD>
<DT>-v<I> device-uri</I></DT>
<DD>Sets the device for communicating with the printer. If a job is
 currently printing on the named printer then the job will be restarted
 and sent to the new device.</DD>
<DT>-D<I> info</I></DT>
<DD>Provides a textual description of the printer, e.g. &quot;John's Personal
 Printer&quot;.</DD>
<DT>-E</DT>
<DD>Enables the printer and accepts job. This option is equivalent to
 running the <CODE>enable(1)</CODE> and <CODE>accept(8)</CODE> commands
 on the printer.</DD>
<DT>-L<I> location</I></DT>
<DD>Provides a textual location for the printer, e.g. &quot;Computer Lab 5&quot;.</DD>
<DT>-P<I> ppd-file</I></DT>
<DD>Specifies a local PPD file for the printer driver.</DD>
</DL>
</UL>
<H3><A NAME="4_3_2">Deleting Printers</A></H3>
<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-x</CODE> option
 to delete a printer:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -x <I>printer</I> ENTER</B>
</PRE>
</UL>
<H3><A NAME="4_3_3">Setting the Default Printer</A></H3>
<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-d</CODE> option
 to set a default printer:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -d <I>printer</I> ENTER</B>
</PRE>
</UL>
<P>The default printer can be overridden by the user using the <CODE>
lpoptions(1)</CODE> command.</P>
<H3><A NAME="4_3_4">Starting and Stopping Printers</A></H3>
<P>The <CODE>enable</CODE> and <CODE>disable</CODE> commands start and
 stop printer queues, respectively:</P>
<UL>
<PRE>
<B>/usr/bin/enable <I>printer</I> ENTER</B>
<B>/usr/bin/disable <I>printer</I> ENTER</B>
</PRE>
</UL>
<P>Printers that are disabled may still accept jobs for printing, but
 won't actually print any files until they are restarted. This is useful
 if the printer malfunctions and you need time to correct the problem.
 Any queued jobs are printed after the printer is enabled (started).</P>
<H3><A NAME="4_3_5">Accepting and Rejecting Print Jobs</A></H3>
<P>The <CODE>accept</CODE> and <CODE>reject</CODE> commands accept and
 reject print jobs for the named printer, respectively:</P>
<UL>
<PRE>
<B>/usr/sbin/accept <I>printer</I> ENTER</B>
<B>/usr/sbin/reject <I>printer</I> ENTER</B>
</PRE>
</UL>
<P>As noted above, a printer can be stopped but accepting new print
 jobs. A printer can also be rejecting new print jobs while it finishes
 those that have been queued. This is useful for when you must perform
 maintenance on the printer and will not have it available to users for
 a long period of time.</P>
<H3><A NAME="4_3_6">Setting Quotas on a Printer</A></H3>
<P>CUPS supports page and size-based quotas for each printer. The quotas
 are tracked individually for each user, but a single set of limits
 applies to all users for a partiuclar printer. For example, you can
 limit every user to 5 pages per day on an expensive printer, but you
 cannot limit every user except Johnny.</P>
<P>The<I> job-k-limit</I>,<I> job-page-limit</I>, and<I> job-quota-peiod</I>
 options determine whether and how quotas are enforced for a printer.
 The<I> job-quota-period</I> option determines the time interval for
 quota tracking. The interval is expressed in seconds, so a day is
 86,400, a week is 604,800 and a month is 2,592,000 seconds. The<I>
 job-k-limit</I> option specifies the job size limit in killobytes. The<I>
 job-page-limit</I> option specifies the number of pages limit.</P>
<P>For quotas to be enforced, the period and at least one of the limits
 must be set to a non-zero value. The following options will enable
 quotas:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 -o job-k-limit=1024 <I>ENTER</I></B>
<B>/usr/sbin/lpadmin -p <I>printer</I> -o job-quota-period=604800 -o job-page-limit=100 <I>ENTER</I></B>
</PRE>
</UL>
<P>Or, you can combine all three options on the same line.</P>
<H3><A NAME="4_3_7">Restricting User Access to a Printer</A></H3>
<P>The <CODE>-u</CODE> option of the <CODE>lpadmin</CODE> command
 controls which users can print to a printer. The default configuration
 allows all users to print to a printer:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> -u allow:all <I>ENTER</I></B>
</PRE>
</UL>
<P>CUPS supports allow and deny lists so that you can specify a list of
 users who are allowed to print or not allowed to print. Along with your
 list of users, you can specify whether they are allowed or not allowed
 to use the printer:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> -u allow:peter,paul,mary <I>ENTER</I></B>
</PRE>
</UL>
<P>This command allows peter, paul, and mary to print to the named
 printer, but all other users cannot print. The command:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> -u deny:peter,paul,mary <I>ENTER</I></B>
</PRE>
</UL>
<P>has the opposite effect. All users except peter, paul, and mary will
 be able to print to the named printer.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B>NOTE:</B>
<P>The<I> allow</I> and<I> deny</I> options are not cummulative. That
 is, you must provide the complete list of users to allow or deny each
 time.</P>
<P>Also, CUPS only maintains one list of users - the list can allow or
 deny users from printing. If you specify an allow list and then specify
 a deny list, the deny list will replace the allow list - only one list
 is active at any time.</P>
</TD></TR>
</TABLE>
</CENTER>
<H2><A NAME="4_4">Managing Printers from the Web</A></H2>
<P>The Web interface is located at:</P>
<UL>
<PRE>
<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
</PRE>
</UL>
<P>From there you can perform all printer management tasks with a few
 simple mouse clicks.</P>
<H1 ALIGN="RIGHT"><A NAME="PRINTER_CLASSES">4 - Printer Classes</A></H1>
<P>This chapter describes what printer classes are and how to manage
 them.</P>
<H2><A NAME="5_1">The Basics</A></H2>
<P>CUPS provides collections of printers called<I> printer classes</I>.
 Jobs sent to a class are forwarded to the first available printer in
 the class. Classes can themselves be members of other classes, so it is
 possible for you to define very large, distributed printer classes for
 high-availability printing.</P>
<P>CUPS also supports<I> implicit classes</I>. Implicit classes work
 just like printer classes, but they are created automatically based
 upon the available printers and classes on the network. This allows you
 to setup multiple print servers with identical printer configurations
 and have the client machines send their print jobs to the first
 available server. If one or more servers go down, the jobs are
 automatically redirected to the servers that are running, providing
 fail-safe printing.</P>
<H2><A NAME="5_2">Managing Printer Classes from the Command-Line</A></H2>
<P>Run the <CODE>lpadmin</CODE> command with the <CODE>-p</CODE> and <CODE>
-c</CODE> options to add a printer to a class:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> -c <I>class</I> ENTER</B>
</PRE>
</UL>
<P>The<I> class</I> is created automatically if it doesn't exist. To
 remove a printer from a class use the <CODE>-r</CODE> option:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -p <I>printer</I> -r <I>class</I> ENTER</B>
</PRE>
</UL>
<P>To remove the entire class just use the <CODE>-x</CODE> option:</P>
<UL>
<PRE>
<B>/usr/sbin/lpadmin -x <I>class</I> ENTER</B>
</PRE>
</UL>
<H2><A NAME="5_3">Managing Printer Classes from the Web Interface</A></H2>
<P>The Web interface is located at:</P>
<UL>
<PRE>
<A HREF="http://localhost:631/admin">http://localhost:631/admin</A>
</PRE>
</UL>
<P>The<VAR> Add Class</VAR> and<VAR> Modify Class</VAR> interfaces
 provide a list of available printers; click on the printers of interest
 to add them to the class.</P>
<H2><A NAME="5_4">Implicit Classes</A></H2>
<P>A noted earlier, implicit classes are created automatically from the
 available network printers and classes. To disable this functionality,
 set the<A HREF="#ImplicitClasses"> <CODE>ImplicitClasses</CODE></A>
 directive to <CODE>Off</CODE> in the <CODE>cupsd.conf</CODE> file. You
 will find more information on doing this in<A HREF="#PRINTING_MANAGEMENT">
 Chapter 6, &quot;Printing System Management&quot;</A>.</P>
<H1 ALIGN="RIGHT"><A NAME="CLIENT_SETUP">5 - Client Setup</A></H1>
<P>This chapter discusses several ways to configure CUPS clients for
 printing.</P>
<H2><A NAME="6_1">The Basics</A></H2>
<P>A client is any machine that sends print jobs to another machine for
 final printing. Clients can also be servers if they communicate
 directly with any printers of their own.</P>
<P>CUPS supports several methods of configuring client machines:</P>
<UL>
<LI><A HREF="#CLIENT_MANUAL">Manual configuration of print queues.</A></LI>
<LI><A HREF="#CLIENT_SERVER">Specifying a single server for printing.</A>
</LI>
<LI><A HREF="#CLIENT_AUTO">Automatic configuration of print queues.</A></LI>
<LI><A HREF="#CLIENT_POLL">Specifying multiple servers for printing.</A></LI>
<LI><A HREF="#CLIENT_RELAY">Relaying printers to other clients.</A></LI>
</UL>
<H3><A NAME="CLIENT_MANUAL">Manual Configuration of Print Queues</A></H3>
<P>The most tedious method of configuring client machines is to
 configure each remote queue by hand using the <CODE>lpadmin</CODE>
 command:</P>
<UL>
<PRE>
<B>lpadmin -p <I>printer</I> -E -v ipp://<I>server</I>/printers/<I>printer</I> ENTER</B>
</PRE>
</UL>
<P>The <CODE>printer</CODE> name is the name of the printer on the
 server machine. The <CODE>server</CODE> name is the hostname or IP
 address of the server machine. Repeat the <CODE>lpadmin</CODE> command
 for each remote printer you wish to use.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Manual configuration of print queues is not recommended for large
 numbers of client machines because of the administration nightmare it
 creates. For busy networks, consider subnetting groups of clients and
 polling and relaying printer information instead.</P>
</TD></TR>
</TABLE>
</CENTER>
<H3><A NAME="CLIENT_SERVER">Specifying a Single Server for Printing</A></H3>
<P>CUPS can be configured to run without a local spooler and send all
 jobs to a single server. However, if that server goes down then all
 printing will be disabled. Use this configuration only as absolutely
 needed.</P>
<P>The default server is normally &quot;localhost&quot;. To override the default
 server create a file named<VAR> /etc/cups/client.conf</VAR> and add a
 line reading:</P>
<UL>
<PRE>
ServerName <I>server</I>
</PRE>
</UL>
<P>to the file. The<VAR> server</VAR> name can be the hostname or IP
 address of the default server.</P>
<P>The default server can also be customized on a per-user basis. To set
 a user-specific server create a file named<VAR> ~/.cupsrc</VAR> and add
 a line reading:</P>
<UL>
<PRE>
ServerName <I>server</I>
</PRE>
</UL>
<P>to the file. The<VAR> server</VAR> name can be the hostname or IP
 address of the default server.</P>
<H3><A NAME="CLIENT_AUTO">Automatic Configuration of Print Queues</A></H3>
<P>CUPS supports automatic client configuration of printers on the same
 subnet. To configure printers on the same subnet,<I> do nothing</I>.
 Each client should see the available printers within 30 seconds
 automatically. The printer and class lists are updated automatically as
 printers and servers are added or removed.</P>
<P>If you want to see printers on other subnets as well, use the<A HREF="#BrowsePoll">
 <CODE>BrowsePoll</CODE></A> directive as described next.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>The<A HREF="#BrowseAddress"> <CODE>BrowseAddress</CODE></A> directive
 enables broadcast traffic from your server. The default configuration
 braodcasts printer information every 30 seconds. Although this printer
 information does not use much bandwidth, typically about 80 bytes per
 printer, it can add up with large numbers of servers and printers.</P>
<P>Use the<A HREF="#BrowseInterval"> <CODE>BrowseInterval</CODE></A> and<A
HREF="#BrowseTimeout"> <CODE>BrowseTimeout</CODE></A> directives to tune
 the amount of data that is added to your network load. In addition,
 subnets can be used to minimize the amount of traffic that is carried
 by the &quot;backbone&quot; of your large network.</P>
</TD></TR>
</TABLE>
</CENTER>
<H3><A NAME="CLIENT_POLL">Specifying Multiple Servers for Printing</A></H3>
<P>If you have CUPS servers on different subnets, then you should
 configure CUPS to poll those servers. Polling provides the benefits of
 automatic configuration without significant configuration on the
 clients, and multiple clients on the same subnet can share the same
 configuration information.</P>
<P>Polling is enabled by specifying one or more<A HREF="#BrowsePoll"> <CODE>
BrowsePoll</CODE></A> directives in the<VAR> /etc/cups/cupsd.conf</VAR>
 file. For information on making these changes, see<A HREF="#PRINTING_MANAGEMENT">
 Chapter 6, &quot;Printing System Management&quot;</A>.</P>
<P>Multiple<A HREF="#BrowsePoll"> <CODE>BrowsePoll</CODE></A> lines can
 be used to poll multiple CUPS servers. To limit the amount of polling
 you do from client machines, you can have only one of the clients do
 the polling and relay that information to the others on the same subnet
 (described next).</P>
<H3><A NAME="CLIENT_RELAY">Relaying Printers to Other Clients</A></H3>
<P>When you have clients and servers spread across multiple subnets, the
 polling method is inefficient. CUPS provides a<A HREF="#BrowseRelay"> <CODE>
BrowseRelay</CODE></A> directive that enables a single client to relay
 (broadcast) the polled printer information to the local subnet.</P>
<P>For example, Server A and Server B are on subnet 1 and subnet 2,
 while the clients are on subnet 3. To provide printers to all of the
 clients in subnet 3, client C will be configured with the following
 directives in<VAR> /etc/cups/cupsd.conf</VAR>:</P>
<UL>
<PRE>
# Poll the two servers
<B>
BrowsePoll ServerA ENTER
BrowsePoll ServerB ENTER
</B>

# Relay the printers to the local subnet
<B>
BrowseRelay 127.0.0.1 192.168.3.255 ENTER
</B></PRE>
</UL>
<P>The<A HREF="#BrowseRelay"> <CODE>BrowseRelay</CODE></A> line
 specifies a source address and mask. Any browse packets coming from a
 matching address wil be sent to the given broadcast address. In this
 case, we want the packets from the local machine (127.0.0.1) relayed to
 the other clients.</P>
<P>As printers are found using polling, they are relayed from client C
 to the rest of the clients through a broadcast on subnet 3. The rest of
 the clients can use the standard<VAR> cupsd.conf</VAR> configuration.</P>
<P>The<A HREF="#BrowseRelay"> <CODE>BrowseRelay</CODE></A> directive can
 also be used to relay browsing packets from one network interface to
 another. For example, if client C in the previous example had network
 interfaces attaches to both subnet 1 and subnet 2, it could use the<A HREF="#BrowseRelay">
 <CODE>BrowseRelay</CODE></A> directive exclusively:</P>
<UL>
<PRE>
# Relay the printers from subnet 1 and 2 to subnet 3
<B>
BrowseRelay 192.168.1 192.168.3.255 ENTER
BrowseRelay 192.168.2 192.168.3.255 ENTER
</B></PRE>
</UL>
<H2><A NAME="6_2">Load Balancing and Failsafe Operation</A></H2>
<P>When using server polling or broadcasting, CUPS clients can
 automatically merge identical printers on multiple servers into a
 single<I> implicit class</I> queue. Clients assume that printers with
 the same name on multiple servers are in fact the same printer or type
 of printer being served by multiple machines.</P>
<P>If you have two printers, LaserJet@ServerA and LaserJet@ServerB, a
 third implicit class called<I> LaserJet</I> will be created
 automatically on the client that refers to both printers. If the client
 also has a local printer with the name LaserJet then an implicit class
 named<I> AnyLaserJet</I> will be created instead.</P>
<P>The client will alternate between servers and automatically stop
 sending jobs to a server if it goes down, providing a load-balancing
 effect and fail-safe operation with automatic switchover.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Note that implicit classes (<A HREF="#ImplicitClasses"><CODE>
ImplicitClasses</CODE></A>) are enabled by default.</P>
</TD></TR>
</TABLE>
</CENTER>
<H1 ALIGN="RIGHT"><A NAME="PRINTING_MANAGEMENT">6 - Printing System
 Management</A></H1>
<P>This chapter shows how you can configure the CUPS server.</P>
<H2><A NAME="7_1">The Basics</A></H2>
<P>Several text files are used to configure CUPS. All of the server
 configuration files are located in the<VAR> /etc/cups</VAR> directory:</P>
<UL>
<DL>
<!-- NEED 1in -->

<DT>classes.conf</DT>
<DD>This file contains information on each printer class. Normally you
 manipulate this file using the <CODE>lpadmin</CODE> command or the Web
 interface.
<BR>&nbsp;
<!-- NEED 1in -->
</DD>
<DT>client.conf</DT>
<DD>This file provides the default server name for client machines. See<A
HREF="#CLIENT_SETUP"> Chapter 5, &quot;Client Setup&quot;</A> for more
 information.
<BR>&nbsp;
<!-- NEED 1in -->
</DD>
<DT>cupsd.conf</DT>
<DD>This file controls how the CUPS server (<VAR>/usr/sbin/cupsd</VAR>)
 operates and is normally edited by hand.
<BR>&nbsp;
<!-- NEED 1in -->
</DD>
<DT>mime.convs</DT>
<DD>This file contains a list of standard file conversion filters and
 their costs. You normally do not edit this file.
<BR>&nbsp;
<!-- NEED 1in -->
</DD>
<DT>mime.types</DT>
<DD>This file contains a list of standard file formats and how to
 recognize them. You normally do not edit this file.
<BR>&nbsp;
<!-- NEED 1in -->
</DD>
<DT>printers.conf</DT>
<DD>This file contains information on each printer. Normally you
 manipulate this file using the <CODE>lpadmin</CODE> command or the Web
 Interface.
<BR>&nbsp;</DD>
</DL>
</UL>
<H2><A NAME="RESTARTING">Restarting the CUPS Server</A></H2>
<P>Once you have made a change to a configuration file you need to
 restart the CUPS server by sending it a <CODE>HUP</CODE> signal or
 using the supplied initialization script. The CUPS distributions
 install the script in the<VAR> init.d</VAR> directory with the name<VAR>
 cups</VAR>. The location varies based upon the operating system:</P>
<UL>
<PRE>
<B>/etc/software/init.d/cups restart ENTER</B>
<B>/etc/rc.d/init.d/cups restart ENTER</B>
<B>/etc/init.d/cups restart ENTER</B>
<B>/sbin/init.d/cups restart ENTER</B>
</PRE>
</UL>
<H2><A NAME="7_3">Changing the Server Configuration</A></H2>
<P>The<VAR> /etc/cups/cupsd.conf</VAR> file contains configuration<I>
 directives</I> that control how the server functions. Each directive is
 listed on a line by itself followed by its value. Comments are
 introduced using the number sign (&quot;#&quot;) character at the beginning of a
 line. Since the server configuration file consists of plain text, you
 can use your favorite text editor to make changes to it.
<!-- NEED 4in -->
</P>
<H2><A NAME="7_4">Server Directives</A></H2>
<P>The<VAR> cupsd.conf</VAR> file contains many directives that
 determine how the server operates:</P>
<UL>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<TR><TD VALIGN="TOP">
<LI><A HREF="#AccessLog"><CODE>AccessLog</CODE></A></LI>
<LI><A HREF="#Allow"><CODE>Allow</CODE></A></LI>
<LI><A HREF="#AuthClass"><CODE>AuthClass</CODE></A></LI>
<LI><A HREF="#AuthGroupName"><CODE>AuthGroupName</CODE></A></LI>
<LI><A HREF="#AuthType"><CODE>AuthType</CODE></A></LI>
<LI><A HREF="#AutoPurgeJobs"><CODE>AutoPurgeJobs</CODE></A></LI>
<LI><A HREF="#BrowseAddress"><CODE>BrowseAddress</CODE></A></LI>
<LI><A HREF="#BrowseAllow"><CODE>BrowseAllow</CODE></A></LI>
<LI><A HREF="#BrowseDeny"><CODE>BrowseDeny</CODE></A></LI>
<LI><A HREF="#BrowseInterval"><CODE>BrowseInterval</CODE></A></LI>
<LI><A HREF="#BrowseOrder"><CODE>BrowseOrder</CODE></A></LI>
<LI><A HREF="#BrowsePoll"><CODE>BrowsePoll</CODE></A></LI>
<LI><A HREF="#BrowsePort"><CODE>BrowsePort</CODE></A></LI>
<LI><A HREF="#BrowseProtocols"><CODE>BrowseProtocols</CODE></A></LI>
<LI><A HREF="#BrowseRelay"><CODE>BrowseRelay</CODE></A></LI>
<LI><A HREF="#BrowseShortNames"><CODE>BrowseShortNames</CODE></A></LI>
<LI><A HREF="#BrowseTimeout"><CODE>BrowseTimeout</CODE></A></LI>
<LI><A HREF="#Browsing"><CODE>Browsing</CODE></A></LI>
<LI><A HREF="#Classification"><CODE>Classification</CODE></A></LI>
<LI><A HREF="#ClassifyOverride"><CODE>ClassifyOverride</CODE></A></LI>
<LI><A HREF="#ConfigFilePerm"><CODE>ConfigFilePerm</CODE></A></LI>
<LI><A HREF="#DataDir"><CODE>DataDir</CODE></A></LI>
<LI><A HREF="#DefaultCharset"><CODE>DefaultCharset</CODE></A></LI>
<LI><A HREF="#DefaultLanguage"><CODE>DefaultLanguage</CODE></A></LI>
<LI><A HREF="#Deny"><CODE>Deny</CODE></A></LI>
<LI><A HREF="#DocumentRoot"><CODE>DocumentRoot</CODE></A></LI>
<LI><A HREF="#Encryption"><CODE>Encryption</CODE></A></LI>
</TD><TD VALIGN="TOP"> &nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
<LI><A HREF="#ErrorLog"><CODE>ErrorLog</CODE></A></LI>
<LI><A HREF="#FilterLimit"><CODE>FilterLimit</CODE></A></LI>
<LI><A HREF="#FontPath"><CODE>FontPath</CODE></A></LI>
<LI><A HREF="#Group"><CODE>Group</CODE></A></LI>
<LI><A HREF="#HideImplicitMembers"><CODE>HideImplicitMembers</CODE></A></LI>
<LI><A HREF="#HostNameLookups"><CODE>HostNameLookups</CODE></A></LI>
<LI><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A></LI>
<LI><A HREF="#ImplicitAnyClasses"><CODE>ImplicitAnyClasses</CODE></A></LI>
<LI><A HREF="#Include"><CODE>Include</CODE></A></LI>
<LI><A HREF="#KeepAliveTimeout"><CODE>KeepAliveTimeout</CODE></A></LI>
<LI><A HREF="#KeepAlive"><CODE>KeepAlive</CODE></A></LI>
<LI><A HREF="#Limit"><CODE>Limit</CODE></A></LI>
<LI><A HREF="#LimitExcept"><CODE>LimitExcept</CODE></A></LI>
<LI><A HREF="#LimitRequestBody"><CODE>LimitRequestBody</CODE></A></LI>
<LI><A HREF="#Listen"><CODE>Listen</CODE></A></LI>
<LI><A HREF="#Location"><CODE>Location</CODE></A></LI>
<LI><A HREF="#LogFilePerm"><CODE>LogFilePerm</CODE></A></LI>
<LI><A HREF="#LogLevel"><CODE>LogLevel</CODE></A></LI>
<LI><A HREF="#MaxClients"><CODE>MaxClients</CODE></A></LI>
<LI><A HREF="#MaxJobs"><CODE>MaxJobs</CODE></A></LI>
<LI><A HREF="#MaxJobsPerPrinter"><CODE>MaxJobsPerPrinter</CODE></A></LI>
<LI><A HREF="#MaxJobsPerUser"><CODE>MaxJobsPerUser</CODE></A></LI>
<LI><A HREF="#MaxLogSize"><CODE>MaxLogSize</CODE></A></LI>
<LI><A HREF="#MaxRequestSize"><CODE>MaxRequestSize</CODE></A></LI>
<LI><A HREF="#Order"><CODE>Order</CODE></A></LI>
<LI><A HREF="#PageLog"><CODE>PageLog</CODE></A></LI>
</TD><TD VALIGN="TOP"> &nbsp;&nbsp;&nbsp;</TD><TD VALIGN="TOP">
<LI><A HREF="#Port"><CODE>Port</CODE></A></LI>
<LI><A HREF="#PreserveJobFiles"><CODE>PreserveJobFiles</CODE></A></LI>
<LI><A HREF="#PreserveJobHistory"><CODE>PreserveJobHistory</CODE></A></LI>
<LI><A HREF="#Printcap"><CODE>Printcap</CODE></A></LI>
<LI><A HREF="#PrintcapFormat"><CODE>PrintcapFormat</CODE></A></LI>
<LI><A HREF="#PrintcapGUI"><CODE>PrintcapGUI</CODE></A></LI>
<LI><A HREF="#RemoteRoot"><CODE>RemoteRoot</CODE></A></LI>
<LI><A HREF="#RequestRoot"><CODE>RequestRoot</CODE></A></LI>
<LI><A HREF="#Require"><CODE>Require</CODE></A></LI>
<LI><A HREF="#RIPCache"><CODE>RIPCache</CODE></A></LI>
<LI><A HREF="#RunAsUser"><CODE>RunAsUser</CODE></A></LI>
<LI><A HREF="#Satisfy"><CODE>Satisfy</CODE></A></LI>
<LI><A HREF="#ServerAdmin"><CODE>ServerAdmin</CODE></A></LI>
<LI><A HREF="#ServerBin"><CODE>ServerBin</CODE></A></LI>
<LI><A HREF="#ServerCertificate"><CODE>ServerCertificate</CODE></A></LI>
<LI><A HREF="#ServerKey"><CODE>ServerKey</CODE></A></LI>
<LI><A HREF="#ServerName"><CODE>ServerName</CODE></A></LI>
<LI><A HREF="#ServerRoot"><CODE>ServerRoot</CODE></A></LI>
<LI><A HREF="#SSLListen"><CODE>SSLListen</CODE></A></LI>
<LI><A HREF="#SSLPort"><CODE>SSLPort</CODE></A></LI>
<LI><A HREF="#SystemGroup"><CODE>SystemGroup</CODE></A></LI>
<LI><A HREF="#TempDir"><CODE>TempDir</CODE></A></LI>
<LI><A HREF="#Timeout"><CODE>Timeout</CODE></A></LI>
<LI><A HREF="#User"><CODE>User</CODE></A></LI>
</TD></TR>
</TABLE>
</UL>

<!-- NEED 3in -->
<H3><A NAME="AccessLog">AccessLog</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
AccessLog /var/log/cups/access_log
AccessLog /var/log/cups/access_log-%s
AccessLog syslog
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>AccessLog</CODE> directive sets the name of the access log
 file. If the filename is not absolute then it is assumed to be relative
 to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE></A> directory. The
 access log file is stored in &quot;common log format&quot; and can be used by any
 web access reporting tool to generate a report on CUPS server activity.</P>
<P>The server name can be included in the filename by using <CODE>%s</CODE>
 in the name.</P>
<P>The special name &quot;syslog&quot; can be used to send the access information
 to the system log instead of a plain file.</P>
<P>The default access log file is<VAR> /var/log/cups/access_log</VAR>.
<!-- NEED 6in -->
</P>
<H3><A NAME="Allow">Allow</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Allow from All
Allow from None
Allow from *.domain.com
Allow from .domain.com
Allow from host.domain.com
Allow from nnn.*
Allow from nnn.nnn.*
Allow from nnn.nnn.nnn.*
Allow from nnn.nnn.nnn.nnn
Allow from nnn.nnn.nnn.nnn/mm
Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
Allow from @LOCAL
Allow from @IF(name)
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Allow</CODE> directive specifies a hostname, IP address, or
 network that is allowed access to the server. <CODE>Allow</CODE>
 directives are cummulative, so multiple <CODE>Allow</CODE> directives
 can be used to allow access for multiple hosts or networks. The <CODE>
/mm</CODE> notation specifies a CIDR netmask:
<CENTER>
<TABLE BORDER="1">
<TR><TH WIDTH="10%">mm</TH><TH WIDTH="20%">netmask</TH><TH WIDTH="10%">
mm</TH><TH WIDTH="20%">netmask</TH></TR>
<TR><TD ALIGN="CENTER">0</TD><TD ALIGN="CENTER">0.0.0.0</TD><TD ALIGN="CENTER">
8</TD><TD ALIGN="CENTER">255.0.0.0</TD></TR>
<TR><TD ALIGN="CENTER">1</TD><TD ALIGN="CENTER">128.0.0.0</TD><TD ALIGN="CENTER">
16</TD><TD ALIGN="CENTER">255.255.0.0</TD></TR>
<TR><TD ALIGN="CENTER">2</TD><TD ALIGN="CENTER">192.0.0.0</TD><TD ALIGN="CENTER">
24</TD><TD ALIGN="CENTER">255.255.255.0</TD></TR>
<TR><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">
32</TD><TD ALIGN="CENTER">255.255.255.255</TD></TR>
</TABLE>
</CENTER>
</P>
<P>The <CODE>@LOCAL</CODE> name will allow access from all local network
 interfaces, but not remote point-to-point interfaces. The <CODE>
@IF(name)</CODE> name will allow access from the named interface.</P>
<P>The <CODE>Allow</CODE> directive must appear inside a<A HREF="#Location">
 <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="AuthClass">AuthClass</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
AuthClass Anonymous
AuthClass User
AuthClass System
AuthClass Group
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>AuthClass</CODE> directive defines what level of
 authentication is required:</P>
<UL>
<LI><CODE>Anonymous</CODE> - No authentication should be performed
 (default.)</LI>
<LI><CODE>User</CODE> - A valid username and password is required.</LI>
<LI><CODE>System</CODE> - A valid username and password is required, and
 the username must belong to the &quot;sys&quot; group; this can be changed using
 the<A HREF="#SystemGroup"> <CODE>SystemGroup</CODE></A> directive.</LI>
<LI><CODE>Group</CODE> - A valid username and password is required, and
 the username must belong to the group named by the <CODE>AuthGroupName</CODE>
 directive.</LI>
</UL>
<P>The <CODE>AuthClass</CODE> directive must appear inside a<A HREF="#Location">
 <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="AuthGroupName">AuthGroupName</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
AuthGroupName mygroup
AuthGroupName lp
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>AuthGroupName</CODE> directive sets the group to use for <CODE>
Group</CODE> authentication.</P>
<P>The <CODE>AuthGroupName</CODE> directive must appear inside a<A HREF="#Location">
 <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="AuthType">AuthType</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
AuthType None
AuthType Basic
AuthType Digest
AuthType BasicDigest
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>AuthType</CODE> directive defines the type of
 authentication to perform:</P>
<UL>
<LI><CODE>None</CODE> - No authentication should be performed (default.)</LI>
<LI><CODE>Basic</CODE> - Basic authentication should be performed using
 the UNIX password and group files.</LI>
<LI><CODE>Digest</CODE> - Digest authentication should be performed
 using the<VAR> /etc/cups/passwd.md5</VAR> file.</LI>
<LI><CODE>BasicDigest</CODE> - Basic authentication should be performed
 using the<VAR> /etc/cups/passwd.md5</VAR> file.</LI>
</UL>
<P>When using <CODE>Basic</CODE>, <CODE>Digest</CODE>, or <CODE>
BasicDigest</CODE> authentication, clients connecting through the <CODE>
localhost</CODE> interface can also authenticate using<A HREF="#CERTIFICATES">
 certificates</A>.</P>
<P>The <CODE>AuthType</CODE> directive must appear inside a<A HREF="#Location">
 <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="AutoPurgeJobs">AutoPurgeJobs</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
AutoPurgeJobs Yes
AutoPurgeJobs No
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>AutoPurgeJobs</CODE> directive specifies whether or not to
 purge completed jobs once they are no longer required for quotas. This
 option has no effect if quotas are not enabled. The default setting is <CODE>
No</CODE>.
<!-- NEED 5in -->
</P>
<H3><A NAME="BrowseAddress">BrowseAddress</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseAddress 255.255.255.255:631
BrowseAddress 192.0.2.255:631
BrowseAddress host.domain.com:631
BrowseAddress @LOCAL
BrowseAddress @IF(name)
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseAddress</CODE> directive specifies an address to send
 browsing information to. Multiple <CODE>BrowseAddress</CODE> directives
 can be specified to send browsing information to different networks or
 systems.</P>
<P>The <CODE>@LOCAL</CODE> name will broadcast printer information to
 all local interfaces. The <CODE>@IF(name)</CODE> name will broadcast to
 the named interface.</P>
<P>No browse addresses are set by default.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>If you are using HP-UX 10.20 and a subnet that is not 24, 16, or 8
 bits, printer browsing (and in fact all broadcast reception) will not
 work. This problem appears to be fixed in HP-UX 11.0.</P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 4in -->
<H3><A NAME="BrowseAllow">BrowseAllow</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseAllow from all
BrowseAllow from none
BrowseAllow from 192.0.2
BrowseAllow from 192.0.2.0/24
BrowseAllow from 192.0.2.0/255.255.255.0
BrowseAllow from *.domain.com
BrowseAllow from @LOCAL
BrowseAllow from @IF(name)
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseAllow</CODE> directive specifies a system or network
 to accept browse packets from. The default is to accept browse packets
 from all hosts.</P>
<P>Host and domain name matching require that you enable the<A HREF="#HostNameLookups">
 <CODE>HostNameLookups</CODE></A> directive.</P>
<P>IP address matching supports exact matches, partial addresses that
 match networks using netmasks of 255.0.0.0, 255.255.0.0, and
 255.255.255.0, or network addresses using the specified netmask or bit
 count.</P>
<P>The <CODE>@LOCAL</CODE> name will allow browse data from all local
 network interfaces, but not remote point-to-point interfaces. The <CODE>
@IF(name)</CODE> name will allow browse data from the named interface.
<!-- NEED 4in -->
</P>
<H3><A NAME="BrowseDeny">BrowseDeny</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseDeny from all
BrowseDeny from none
BrowseDeny from 192.0.2
BrowseDeny from 192.0.2.0/24
BrowseDeny from 192.0.2.0/255.255.255.0
BrowseDeny from *.domain.com
BrowseDeny from @LOCAL
BrowseDeny from @IF(name)
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseDeny</CODE> directive specifies a system or network
 to reject browse packets from. The default is to deny browse packets
 from no hosts.</P>
<P>Host and domain name matching require that you enable the<A HREF="#HostNameLookups">
 <CODE>HostNameLookups</CODE></A> directive.</P>
<P>IP address matching supports exact matches, partial addresses that
 match networks using netmasks of 255.0.0.0, 255.255.0.0, and
 255.255.255.0, or network addresses using the specified netmask or bit
 count.</P>
<P>The <CODE>@LOCAL</CODE> name will block browse data from all local
 network interfaces, but not remote point-to-point interfaces. The <CODE>
@IF(name)</CODE> name will block browse data from the named interface.
<!-- NEED 3in -->
</P>
<H3><A NAME="BrowseOrder">BrowseOrder</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseOrder allow,deny
BrowseOrder deny,allow
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseOrder</CODE> directive specifies the order of
 allow/deny processing. The default order is <CODE>deny,allow</CODE>:</P>
<UL>
<LI><CODE>allow,deny</CODE> - Browse packets are accepted unless
 specifically denied.</LI>
<LI><CODE>deny,allow</CODE> - Browse packets are rejected unless
 specifically allowed.</LI>
</UL>

<!-- NEED 3in -->
<H3><A NAME="BrowseInterval">BrowseInterval</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseInterval 0
BrowseInterval 30
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseInterval</CODE> directive specifies the maximum
 amount of time between browsing updates. Specifying a value of 0
 seconds disables outgoing browse updates but allows a server to receive
 printer information from other hosts.</P>
<P>The <CODE>BrowseInterval</CODE> value should always be less than the<A
HREF="#BrowseTimeout"> <CODE>BrowseTimeout</CODE></A> value. Otherwise
 printers and classes will disappear from client systems between
 updates.
<!-- NEED 3in -->
</P>
<H3><A NAME="BrowsePoll">BrowsePoll</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowsePoll 192.0.2.2:631
BrowsePoll host.domain.com:631
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowsePoll</CODE> directive polls a server for available
 printers once every<A HREF="#BrowseInterval"> <CODE>BrowseInterval</CODE>
</A> seconds. Multiple <CODE>BrowsePoll</CODE> directives can be
 specified to poll multiple servers.</P>
<P>If <CODE>BrowseInterval</CODE> is set to 0 then the server is polled
 once every 30 seconds.
<!-- NEED 3in -->
</P>
<H3><A NAME="BrowsePort">BrowsePort</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowsePort 631
BrowsePort 9999
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowsePort</CODE> directive specifies the UDP port number
 used for browse packets. The default port number is 631.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>You must set the <CODE>BrowsePort</CODE> to the same value on all of
 the systems that you want to see.</P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 3in -->
<H3><A NAME="BrowseProtocols">BrowseProtocols</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseProtocols CUPS
BrowseProtocols SLP
BrowseProtocols CUPS SLP
BrowseProtocols all
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseProtocols</CODE> directive specifies the protocols to
 use when collecting and distributing shared printers on the local
 network. The default protocol is <CODE>CUPS</CODE>, which is a
 broadcast-based protocol.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>When using the <CODE>SLP</CODE> protocol, you must have at least one
 Directory Agent (DA) server on your network. Otherwise the CUPS
 scheduler (<CODE>cupsd</CODE>) will not respond to client requests for
 several seconds while polling the network.</P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 4in -->
<H3><A NAME="BrowseRelay">BrowseRelay</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseRelay 193.0.2.1 192.0.2.255
BrowseRelay 193.0.2.0/255.255.255.0 192.0.2.255
BrowseRelay 193.0.2.0/24 192.0.2.255
BrowseRelay *.domain.com 192.0.2.255
BrowseRelay host.domain.com 192.0.2.255
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseRelay</CODE> directive specifies source and
 destination addresses for relaying browsing information from one host
 or network to another. Multiple <CODE>BrowseRelay</CODE> directives can
 be specified as needed.</P>
<P><CODE>BrowseRelay</CODE> is typically used on systems that bridge
 multiple subnets using one or more network interfaces. It can also be
 used to relay printer information from polled servers with the line:</P>
<UL>
<PRE>
BrowseRelay 127.0.0.1 255.255.255.255
</PRE>
</UL>
<P>This effectively provides access to printers on a WAN for all clients
 on the LAN(s).
<!-- NEED 3in -->
</P>
<H3><A NAME="BrowseShortNames">BrowseShortNames</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseShortNames Yes
BrowseShortNames No
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseShortNames</CODE> directive specifies whether or not
 short names are used for remote printers when possible. Short names are
 just the remote printer name, without the server (&quot;printer&quot;). If more
 than one remote printer is detected with the same name, the printers
 will have long names (&quot;printer@server1&quot;, &quot;printer@server2&quot;.)</P>
<P>The default value for this option is <CODE>Yes</CODE>.
<!-- NEED 3in -->
</P>
<H3><A NAME="BrowseTimeout">BrowseTimeout</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
BrowseTimeout 300
BrowseTimeout 60
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>BrowseTimeout</CODE> directive sets the timeout for printer
 or class information that is received in browse packets. Once a printer
 or class times out it is removed from the list of available
 destinations.</P>
<P>The <CODE>BrowseTimeout</CODE> value should always be greater than
 the<A HREF="#BrowseInterval"> <CODE>BrowseInterval</CODE></A> value.
 Otherwise printers and classes will disappear from client systems
 between updates.
<!-- NEED 4in -->
</P>
<H3><A NAME="Browsing">Browsing</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Browsing On
Browsing Off
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Browsing</CODE> directive controls whether or not network
 printer browsing is enabled. The default setting is <CODE>On</CODE>.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>If you are using HP-UX 10.20 and a subnet that is not 24, 16, or 8
 bits, printer browsing (and in fact all broadcast reception) will not
 work. This problem appears to be fixed in HP-UX 11.0.</P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 3in -->
<H3><A NAME="Classification">Classification</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Classification
Classification classified
Classification confidential
Classification secret
Classification topsecret
Classification unclassified
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Classification</CODE> directive sets the classification
 level on the server. When this option is set, at least one of the
 banner pages is forced to the classification level, and the
 classification is placed on each page of output. The default is no
 classification level.
<!-- NEED 3in -->
</P>
<H3><A NAME="ClassifyOverride">ClassifyOverride</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ClassifyOverride Yes
ClassifyOverride No
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ClassifyOverride</CODE> directive specifies whether users
 can override the default classification level on the server. When the
 server classification is set, users can change the classification using
 the <CODE>job-sheets</CODE> option and can choose to only print one
 security banner before or after the job. If the <CODE>job-sheets</CODE>
 option is set to <CODE>none</CODE> then the server default
 classification is used.</P>
<P>The default is to not allow classification overrides.
<!-- NEED 3in -->
</P>
<H3><A NAME="ConfigFilePerm">ConfigFilePerm</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ConfigFilePerm 0644
ConfigFilePerm 0600
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ConfigFilePerm</CODE> directive specifies the permissions
 to use when writing configuration files. The default is 0600.
<!-- NEED 3in -->
</P>
<H3><A NAME="DataDir">DataDir</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
DataDir /usr/share/cups
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>DataDir</CODE> directive sets the directory to use for data
 files.
<!-- NEED 3in -->
</P>
<H3><A NAME="DefaultCharset">DefaultCharset</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
DefaultCharset utf-8
DefaultCharset iso-8859-1
DefaultCharset windows-1251
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>DefaultCharset</CODE> directive sets the default character
 set to use for client connections. The default character set is <CODE>
utf-8</CODE> but is overridden by the character set for the language
 specified by the client or the <CODE>DefaultLanguage</CODE> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="DefaultLanguage">DefaultLanguage</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
DefaultLanguage de
DefaultLanguage en
DefaultLanguage es
DefaultLanguage fr
DefaultLanguage it
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>DefaultLanguage</CODE> directive specifies the default
 language to use for client connections. Setting the default language
 also sets the default character set if a language localization file
 exists for it. The default language is &quot;en&quot; for English.
<!-- NEED 5in -->
</P>
<H3><A NAME="Deny">Deny</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Deny from All
Deny from None
Deny from *.domain.com
Deny from .domain.com
Deny from host.domain.com
Deny from nnn.*
Deny from nnn.nnn.*
Deny from nnn.nnn.nnn.*
Deny from nnn.nnn.nnn.nnn
Deny from nnn.nnn.nnn.nnn/mm
Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
Deny from @LOCAL
Deny from @IF(name)
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Deny</CODE> directive specifies a hostname, IP address, or
 network that is allowed access to the server. <CODE>Deny</CODE>
 directives are cummulative, so multiple <CODE>Deny</CODE> directives
 can be used to allow access for multiple hosts or networks. The <CODE>
/mm</CODE> notation specifies a CIDR netmask:
<CENTER>
<TABLE BORDER="1">
<TR><TH WIDTH="10%">mm</TH><TH WIDTH="20%">netmask</TH><TH WIDTH="10%">
mm</TH><TH WIDTH="20%">netmask</TH></TR>
<TR><TD ALIGN="CENTER">0</TD><TD ALIGN="CENTER">0.0.0.0</TD><TD ALIGN="CENTER">
8</TD><TD ALIGN="CENTER">255.0.0.0</TD></TR>
<TR><TD ALIGN="CENTER">1</TD><TD ALIGN="CENTER">128.0.0.0</TD><TD ALIGN="CENTER">
16</TD><TD ALIGN="CENTER">255.255.0.0</TD></TR>
<TR><TD ALIGN="CENTER">2</TD><TD ALIGN="CENTER">192.0.0.0</TD><TD ALIGN="CENTER">
24</TD><TD ALIGN="CENTER">255.255.255.0</TD></TR>
<TR><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">...</TD><TD ALIGN="CENTER">
32</TD><TD ALIGN="CENTER">255.255.255.255</TD></TR>
</TABLE>
</CENTER>
</P>
<P>The <CODE>@LOCAL</CODE> name will deny access from all local network
 interfaces, but not remote point-to-point interfaces. The <CODE>
@IF(name)</CODE> name will deny access from the named interface.</P>
<P>The <CODE>Deny</CODE> directive must appear inside a<A HREF="#Location">
 <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="DocumentRoot">DocumentRoot</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
DocumentRoot /usr/share/doc/cups
DocumentRoot /foo/bar/doc/cups
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>DocumentRoot</CODE> directive specifies the location of web
 content for the HTTP server in CUPS. If an absolute path is not
 specified then it is assumed to be relative to the<A HREF="#ServerRoot">
 <CODE>ServerRoot</CODE></A> directory. The default directory is<VAR>
 /usr/share/doc/cups</VAR>.</P>
<P>Documents are first looked up in a sub-directory for the primary
 language requested by the client (e.g.<VAR> /usr/share/doc/cups/fr/...</VAR>
) and then directly under the <CODE>DocumentRoot</CODE> directory (e.g.<VAR>
 /usr/share/doc/cups/...</VAR>), so it is possible to localize the web
 content by providing subdirectories for each language needed.
<!-- NEED 3in -->
</P>
<H3><A NAME="Encryption">Encryption</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Encryption Never
Encryption IfRequested
Encryption Required
Encryption Always
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Encryption</CODE> directive must appear instead a<A HREF="#Location">
 <CODE>Location</CODE></A> section and specifies the encryption settings
 for that location. The default setting is <CODE>IfRequested</CODE> for
 all locations.
<!-- NEED 3in -->
</P>
<H3><A NAME="ErrorLog">ErrorLog</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ErrorLog /var/log/cups/error_log
ErrorLog /var/log/cups/error_log-%s
ErrorLog syslog
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ErrorLog</CODE> directive sets the name of the error log
 file. If the filename is not absolute then it is assumed to be relative
 to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE></A> directory. The
 default error log file is<VAR> /var/log/cups/error_log</VAR>.</P>
<P>The server name can be included in the filename by using <CODE>%s</CODE>
 in the name.</P>
<P>The special name &quot;syslog&quot; can be used to send the error information
 to the system log instead of a plain file.
<!-- NEED 3in -->
</P>
<H3><A NAME="FilterLimit">FilterLimit</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
FilterLimit 0
FilterLimit 200
FilterLimit 1000
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>FilterLimit</CODE> directive sets the maximum cost of all
 running job filters. It can be used to limit the number of filter
 programs that are run on a server to minimize disk, memory, and CPU
 resource problems. A limit of 0 disables filter limiting.</P>
<P>An average print to a non-PostScript printer needs a filter limit of
 about 200. A PostScript printer needs about half that (100). Setting
 the limit below these thresholds will effectively limit the scheduler
 to printing a single job at any time.</P>
<P>The default limit is 0.
<!-- NEED 3in -->
</P>
<H3><A NAME="FontPath">FontPath</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
FontPath /foo/bar/fonts
FontPath /usr/share/cups/fonts:/foo/bar/fonts
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>FontPath</CODE> directive specifies the font path to use
 when searching for fonts. The default font path is <CODE>
/usr/share/cups/fonts</CODE>.
<!-- NEED 3in -->
</P>
<H3><A NAME="Group">Group</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Group sys
Group system
Group root
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Group</CODE> directive specifies the UNIX group that filter
 and CGI programs run as. The default group is <CODE>sys</CODE>, <CODE>
system</CODE>, or <CODE>root</CODE> depending on the operating system.
<!-- NEED 3in -->
</P>
<H3><A NAME="HideImplicitMembers">HideImplicitMembers</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
HideImplicitMembers Yes
HideImplicitMembers No
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>HideImplicitMembers</CODE> directive controls whether the
 individual printers in an implicit class are shown to the user. The
 default is <CODE>No</CODE>.</P>
<P><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A> must be
 enabled for this directive to have any effect.</P>

<!-- NEED 3in -->
<H3><A NAME="HostNameLookups">HostNameLookups</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
HostNameLookups On
HostNameLookups Off
HostNameLookups Double
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>HostNameLookups</CODE> directive controls whether or not
 CUPS looks up the hostname for connecting clients. The <CODE>Double</CODE>
 setting causes CUPS to verify that the hostname resolved from the
 address matches one of the addresses returned for that hostname. <CODE>
Double</CODE> lookups also prevent clients with unregistered addresses
 from connecting to your server. The default is <CODE>Off</CODE> to
 avoid the potential server performance problems with hostname lookups.
 Set this option to <CODE>On</CODE> or <CODE>Double</CODE> only if
 absolutely required.
<!-- NEED 3in -->
</P>
<H3><A NAME="ImplicitClasses">ImplicitClasses</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ImplicitClasses On
ImplicitClasses Off
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ImplicitClasses</CODE> directive controls whether implicit
 classes are created based upon the available network printers and
 classes. The default setting is <CODE>On</CODE> but is automatically
 turned <CODE>Off</CODE> if<A HREF="#Browsing"> <CODE>Browsing</CODE></A>
 is turned <CODE>Off</CODE>.
<!-- NEED 3in -->
</P>
<H3><A NAME="ImplicitAnyClasses">ImplicitAnyClasses</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ImplicitAnyClasses On
ImplicitAnyClasses Off
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ImplicitAnyClasses</CODE> directive controls whether
 implicit classes for local and remote printers are created with the
 name <CODE>AnyPrinter</CODE>. The default setting is <CODE>Off</CODE>.</P>
<P><A HREF="#ImplicitClasses"><CODE>ImplicitClasses</CODE></A> must be
 enabled for this directive to have any effect.</P>

<!-- NEED 3in -->
<H3><A NAME="Include">Include</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Include filename
Include /foo/bar/filename
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Include</CODE> directive includes the named file in the <CODE>
cupsd.conf</CODE> file. If no leading path is provided, the file is
 assumed to be relative to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE>
</A> directory.</P>

<!-- NEED 3in -->
<H3><A NAME="KeepAlive">KeepAlive</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
KeepAlive On
KeepAlive Off
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>KeepAlive</CODE> directive controls whether or not to
 support persistent HTTP connections. The default is <CODE>On</CODE>.</P>
<P>HTTP/1.1 clients automatically support persistent connections, while
 HTTP/1.0 clients must specifically request them using the <CODE>
Keep-Alive</CODE> attribute in the <CODE>Connection:</CODE> field of
 each request.
<!-- NEED 3in -->
</P>
<H3><A NAME="KeepAliveTimeout">KeepAliveTimeout</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
KeepAliveTimeout 60
KeepAliveTimeout 30
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>KeepAliveTimeout</CODE> directive controls how long a
 persistent HTTP connection will remain open after the last request. The
 default is 60 seconds.
<!-- NEED 3in -->
</P>
<H3><A NAME="Limit">Limit</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
&lt;Limit GET POST&gt;
...
&lt;/Limit&gt;

&lt;Limit ALL&gt;
...
&lt;/Limit&gt;
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Limit</CODE> directive groups access control directives for
 specific types of HTTP requests and must appear inside a<A HREF="#Location">
 <CODE>Location</CODE></A> section. Access can be limited for individual
 request types (<CODE>DELETE</CODE>, <CODE>GET</CODE>, <CODE>HEAD</CODE>
, <CODE>OPTIONS</CODE>, <CODE>POST</CODE>, <CODE>PUT</CODE>, and <CODE>
TRACE</CODE>) or for all request types (<CODE>ALL</CODE>). The request
 type names are case-sensitive for compatibility with Apache.
<!-- NEED 3in -->
</P>
<H3><A NAME="LimitExcept">LimitExcept</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
&lt;LimitExcept GET POST&gt;
...
&lt;/LimitExcept&gt;
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>LimitExcept</CODE> directive groups access control
 directives for specific types of HTTP requests and must appear inside a<A
HREF="#Location"> <CODE>Location</CODE></A> section. Unlike the<A HREF="#Limit">
 <CODE>Limit</CODE></A> directive, <CODE>LimitExcept</CODE> restricts
 access for all requests<I> except</I> those listed on the <CODE>
LimitExcept</CODE> line.
<!-- NEED 3in -->
</P>
<H3><A NAME="LimitRequestBody">LimitRequestBody</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
LimitRequestBody 10485760
LimitRequestBody 10m
LimitRequestBody 0
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>LimitRequestBody</CODE> directive controls the maximum size
 of print files, IPP requests, and HTML form data in HTTP POST requests.
 The default limit is 0 which disables the limit check.</P>
<P>Also see the identical<A HREF="#MaxRequestSize"> <CODE>MaxRequestSize</CODE>
</A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="Listen">Listen</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Listen 127.0.0.1:631
Listen 192.0.2.1:631
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Listen</CODE> directive specifies a network address and
 port to listen for connections. Multiple <CODE>Listen</CODE> directives
 can be provided to listen on multiple addresses.</P>
<P>The <CODE>Listen</CODE> directive is similar to the<A HREF="#Port"> <CODE>
Port</CODE></A> directive but allows you to restrict access to specific
 interfaces or networks.
<!-- NEED 3in -->
</P>
<H3><A NAME="Location">Location</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
&lt;Location /&gt;
...
&lt;/Location&gt;

&lt;Location /admin&gt;
...
&lt;/Location&gt;

&lt;Location /printers&gt;
...
&lt;/Location&gt;

&lt;Location /printers/name&gt;
...
&lt;/Location&gt;

&lt;Location /classes&gt;
...
&lt;/Location&gt;

&lt;Location /classes/name&gt;
...
&lt;/Location&gt;
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Location</CODE> directive specifies access control and
 authentication options for the specified HTTP resource or path. The<A HREF="#Allow">
 <CODE>Allow</CODE></A>,<A HREF="#AuthClass"> <CODE>AuthClass</CODE></A>
,<A HREF="#AuthGroupName"> <CODE>AuthGroupName</CODE></A>,<A HREF="#AuthType">
 <CODE>AuthType</CODE></A>,<A HREF="#Deny"> <CODE>Deny</CODE></A>,<A HREF="#Encryption">
 <CODE>Encryption</CODE></A>,<A HREF="#Limit"> <CODE>Limit</CODE></A>,<A HREF="#LimitExcept">
 <CODE>LimitExcept</CODE></A>,<A HREF="#Order"> <CODE>Order</CODE></A>,<A
HREF="#Require"> <CODE>Require</CODE></A>, and<A HREF="#Satisfy"> <CODE>
Satisfy</CODE></A> directives may all appear inside a location.
<CENTER>
<TABLE BORDER="1"><CAPTION>Locations on the Server.</CAPTION>
<TR><TH>Location</TH><TH>Description</TH></TR>
<TR><TD>/</TD><TD>The path for all get operations (get-printers,
 get-jobs, etc.)</TD></TR>
<TR><TD>/admin</TD><TD>The path for all administration operations
 (add-printer, delete-printer, start-printer, etc.)</TD></TR>
<TR><TD>/admin/conf</TD><TD>The path for access to the ESP Print Pro
 configuration files (cupsd.conf, client.conf, etc.)</TD></TR>
<TR><TD>/classes</TD><TD>The path for all classes</TD></TR>
<TR><TD>/classes/name</TD><TD>The resource for class <CODE>name</CODE></TD>
</TR>
<TR><TD>/jobs</TD><TD>The path for all jobs (hold-job, release-job,
 etc.)</TD></TR>
<TR><TD>/jobs/id</TD><TD>The resource for job <CODE>id</CODE></TD></TR>
<TR><TD>/printers</TD><TD>The path for all printers</TD></TR>
<TR><TD>/printers/name</TD><TD>The path for printer <CODE>name</CODE></TD>
</TR>
<TR><TD>/printers/name.ppd</TD><TD>The PPD file path for printer <CODE>
name</CODE></TD></TR>
</TABLE>
</CENTER>
</P>
<P>Note that more specific resources override the less specific ones. So
 the directives inside the <CODE>/printers/name</CODE> location will
 override ones from <CODE>/printers</CODE>. Directives inside <CODE>
/printers</CODE> will override ones from <CODE>/</CODE>. &nbsp; None of the
 directives are inherited. More information can be found in section<A HREF="#PRINTING_SECURITY">
 &quot;Printing System Security&quot;</A>.
<!-- NEED 3in -->
</P>
<H3><A NAME="LogFilePerm">LogFilePerm</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
LogFilePerm 0644
LogFilePerm 0600
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>LogFilePerm</CODE> directive specifies the permissions to
 use when writing configuration files. The default is 0644.
<!-- NEED 3in -->
</P>
<H3><A NAME="LogLevel">LogLevel</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
LogLevel none
LogLevel emerg
LogLevel alert
LogLevel crit
LogLevel error
LogLevel warn
LogLevel notice
LogLevel info
LogLevel debug
LogLevel debug2
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>LogLevel</CODE> directive specifies the level of logging
 for the<A HREF="#ErrorLog"> <CODE>ErrorLog</CODE></A> file. The
 following values are recognized (each level logs everything under the
 preceding levels):</P>
<UL>
<LI><CODE>none</CODE> - Log nothing.</LI>
<LI><CODE>emerg</CODE> - Log emergency conditions that prevent the
 server from running.</LI>
<LI><CODE>alert</CODE> - Log alerts that must be handled immediately.</LI>
<LI><CODE>crit</CODE> - Log critical errors that don't prevent the
 server from running.</LI>
<LI><CODE>error</CODE> - Log general errors.</LI>
<LI><CODE>warn</CODE> - Log errors and warnings.</LI>
<LI><CODE>notice</CODE> - Log temporary error conditions.</LI>
<LI><CODE>info</CODE> - Log all requests and state changes (default).</LI>
<LI><CODE>debug</CODE> - Log basic debugging information.</LI>
<LI><CODE>debug2</CODE> - Log all debugging information.</LI>
</UL>

<!-- NEED 3in -->
<H3><A NAME="MaxClients">MaxClients</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
MaxClients 100
MaxClients 1024
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>MaxClients</CODE> directive controls the maximum number of
 simultaneous clients that will be allowed by the server. The default is
 100 clients.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Since each print job requires a file descriptor for the status pipe,
 the CUPS server internally limits the <CODE>MaxClients</CODE> value to
 1/3 of the available file descriptors to avoid possible problems when
 printing large numbers of jobs.</P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 3in -->
<H3><A NAME="MaxJobs">MaxJobs</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
MaxJobs 100
MaxJobs 9999
MaxJobs 0
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>MaxJobs</CODE> directive controls the maximum number of
 jobs that are kept in memory. Once the number of jobs reaches the
 limit, the oldest completed job is automatically purged from the system
 to make room for the new one. If all of the known jobs are still
 pending or active then the new job will be rejected.</P>
<P>Setting the maximum to 0 disables this functionality. The default
 setting is 0.
<!-- NEED 3in -->
</P>
<H3><A NAME="MaxJobsPerPrinter">MaxJobsPerPrinter</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
MaxJobsPerPrinter 100
MaxJobsPerPrinter 9999
MaxJobsPerPrinter 0
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>MaxJobsPerPrinter</CODE> directive controls the maximum
 number of active jobs that are allowed for each printer or class. Once
 a printer or class reaches the limit, new jobs will be rejected until
 one of the active jobs is completed, stopped, aborted, or cancelled.</P>
<P>Setting the maximum to 0 disables this functionality. The default
 setting is 0.
<!-- NEED 3in -->
</P>
<H3><A NAME="MaxJobsPerUser">MaxJobsPerUser</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
MaxJobsPerUser 100
MaxJobsPerUser 9999
MaxJobsPerUser 0
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>MaxJobsPerUser</CODE> directive controls the maximum number
 of active jobs that are allowed for each user. Once a user reaches the
 limit, new jobs will be rejected until one of the active jobs is
 completed, stopped, aborted, or cancelled.</P>
<P>Setting the maximum to 0 disables this functionality. The default
 setting is 0.
<!-- NEED 3in -->
</P>
<H3><A NAME="MaxLogSize">MaxLogSize</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
MaxLogSize 1048576
MaxLogSize 1m
MaxLogSize 0
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>MaxLogSize</CODE> directive controls the maximum size of
 each log file. Once a log file reaches or exceeds the maximum size it
 is closed and renamed to<VAR> filename.O</VAR>. This allows you to
 rotate the logs automatically. The default size is 1048576 bytes (1MB).</P>
<P>Setting the maximum size to 0 disables log rotation.
<!-- NEED 3in -->
</P>
<H3><A NAME="MaxRequestSize">MaxRequestSize</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
MaxRequestSize 10485760
MaxRequestSize 10m
MaxRequestSize 0
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>MaxRequestSize</CODE> directive controls the maximum size
 of print files, IPP requests, and HTML form data in HTTP POST requests.
 The default limit is 0 which disables the limit check.</P>
<P>Also see the identical<A HREF="#LimitRequestBody"> <CODE>
LimitRequestBody</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="Order">Order</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Order Allow,Deny
Order Deny,Allow
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Order</CODE> directive defines the default access control.
 The following values are supported:</P>
<UL>
<LI><CODE>Allow,Deny</CODE> - Allow requests from all systems<I> except</I>
 for those listed in a <CODE>Deny</CODE> directive.</LI>
<LI><CODE>Deny,Allow</CODE> - Allow requests only from those listed in
 an <CODE>Allow</CODE> directive.</LI>
</UL>
<P>The <CODE>Order</CODE> directive must appear inside a<A HREF="#Location">
 <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="PageLog">PageLog</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
PageLog /var/log/cups/page_log
PageLog /var/log/cups/page_log-%s
PageLog syslog
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>PageLog</CODE> directive sets the name of the page log
 file. If the filename is not absolute then it is assumed to be relative
 to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE></A> directory. The
 default page log file is<VAR> /var/log/cups/page_log</VAR>.</P>
<P>The server name can be included in the filename by using <CODE>%s</CODE>
 in the name.</P>
<P>The special name &quot;syslog&quot; can be used to send the page information to
 the system log instead of a plain file.
<!-- NEED 3in -->
</P>
<H3><A NAME="Port">Port</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Port 631
Port 80
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Port</CODE> directive specifies a port to listen on.
 Multiple <CODE>Port</CODE> lines can be specified to listen on multiple
 ports. The default port is 631.
<!-- NEED 3in -->
</P>
<H3><A NAME="PreserveJobHistory">PreserveJobHistory</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
PreserveJobHistory On
PreserveJobHistory Off
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>PreserveJobHistory</CODE> directive controls whether the
 history of completed, cancelled, or aborted print jobs is stored on
 disk.</P>
<P>A value of <CODE>On</CODE> (the default) preserves job information
 until the administrator purges it with the <CODE>cancel</CODE> command.</P>
<P>A value of <CODE>Off</CODE> removes the job information as soon as
 each job is completed, cancelled, or aborted.
<!-- NEED 3in -->
</P>
<H3><A NAME="PreserveJobFiles">PreserveJobFiles</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
PreserveJobFiles On
PreserveJobFiles Off
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>PreserveJobFiles</CODE> directive controls whether the
 document files of completed, cancelled, or aborted print jobs are
 stored on disk.</P>
<P>A value of <CODE>On</CODE> preserves job files until the
 administrator purges them with the <CODE>cancel</CODE> command. Jobs
 can be restarted (and reprinted) as desired until they are purged.</P>
<P>A value of <CODE>Off</CODE> (the default) removes the job files as
 soon as each job is completed, cancelled, or aborted.
<!-- NEED 3in -->
</P>
<H3><A NAME="Printcap">Printcap</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Printcap
Printcap /etc/printcap
Printcap /etc/printers.conf
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Printcap</CODE> directive controls whether or not a
 printcap file is automatically generated and updated with a list of
 available printers. If specified with no value, then no printcap file
 will be generated. The default is to generate a file named<VAR>
 /etc/printcap</VAR>.</P>
<P>When a filename is specified (e.g.<VAR> /etc/printcap</VAR>), the
 printcap file is written whenever a printer is added or removed. The
 printcap file can then be used by applications that are hardcoded to
 look at the printcap file for the available printers.
<!-- NEED 3in -->
</P>
<H3><A NAME="PrintcapFormat">PrintcapFormat</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
PrintcapFormat BSD
PrintcapFormat Solaris
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>PrintcapFormat</CODE> directive controls the output format
 of the printcap file. The default is to generate a BSD printcap file.
<!-- NEED 3in -->
</P>
<H3><A NAME="PrintcapGUI">PrintcapGUI</A></H3>
<HR>
<H4>Example</H4>
<UL>
<PRE>
PrintcapGUI /usr/bin/glpoptions
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>PrintcapGUI</CODE> directive sets the program to use when
 displaying an option panel from an IRIX application that uses the
 Impressario print API. The default program is the ESP Print Pro
 &quot;glpoptions&quot; GUI.</P>
<P>The program must accept the <CODE>-d</CODE> option to specify a
 printer and the <CODE>-o</CODE> option to specify one or more options.
 After allowing the user to select/change options, the program must then
 write the list of printing options without the <CODE>-o</CODE> to the
 standard output.
<!-- NEED 3in -->
</P>
<H3><A NAME="RemoteRoot">RemoteRoot</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
RemoteRoot remroot
RemoteRoot root
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>RemoteRoot</CODE> directive sets the username for
 unauthenticated root requests from remote hosts. The default username
 is<VAR> remroot</VAR>. Setting <CODE>RemoteRoot</CODE> to<VAR> root</VAR>
 effectively disables this security mechanism.
<!-- NEED 3in -->
</P>
<H3><A NAME="RequestRoot">RequestRoot</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
RequestRoot /var/spool/cups
RequestRoot /foo/bar/spool/cups
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>RequestRoot</CODE> directive sets the directory for
 incoming IPP requests and HTML forms. If an absolute path is not
 provided then it is assumed to be relative to the<A HREF="#ServerRoot">
 <CODE>ServerRoot</CODE></A> directory. The default request directory is<VAR>
 /var/spool/cups</VAR>.
<!-- NEED 4in -->
</P>
<H3><A NAME="Require">Require</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Require group foo bar
Require user john mary
Require valid-user
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Require</CODE> directive specifies that authentication is
 required for the resource. The <CODE>group</CODE> keyword specifies
 that the authenticated user must be a member of one or more of the
 named groups that follow.</P>
<P>The <CODE>user</CODE> keyboard specifies that the authenticated user
 must be one of the named users that follow.</P>
<P>The <CODE>valid-user</CODE> keyword specifies that any authenticated
 user may access the resource.</P>
<P>The default is to do no authentication. This directive must appear
 inside a<A HREF="#Location"> <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="RIPCache">RIPCache</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
RIPCache 8m
RIPCache 1g
RIPCache 2048k
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>RIPCache</CODE> directive sets the size of the memory cache
 used by Raster Image Processor (&quot;RIP&quot;) filters such as <CODE>
imagetoraster</CODE> and <CODE>pstoraster</CODE>. The size can be
 suffixed with a &quot;k&quot; for kilobytes, &quot;m&quot; for megabytes, or &quot;g&quot; for
 gigabytes. The default cache size is &quot;8m&quot;, or 8 megabytes.
<!-- NEED 3in -->
</P>
<H3><A NAME="RunAsUser">RunAsUser</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
RunAsUser Yes
RunAsUser No
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>RunAsUser</CODE> directive controls whether the scheduler
 runs as the unpriviledged user account (usually <CODE>lp</CODE>). The
 default is <CODE>No</CODE> which leaves the scheduler running as the <CODE>
root</CODE> user.</P>
<P><B>Note:</B> Running as a non-priviledged user may prevent LPD and
 locally connected printers from working due to permission problems. The
 <CODE>lpd</CODE> backend will automatically use a non-priviledged mode
 that is not 100% compliant with RFC 1179. The <CODE>parallel</CODE>, <CODE>
serial</CODE>, and <CODE>usb</CODE> backends will need write access to
 the corresponding device files.
<!-- NEED 3in -->
</P>
<H3><A NAME="Satisfy">Satisfy</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Satisfy all
Satisfy any
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Satisfy</CODE> directive specifies whether all conditions
 must be satisfied to allow access to the resource. If set to <CODE>all</CODE>
, then all authentication and access control conditions must be satified
 to allow access.</P>
<P>Setting <CODE>Satisfy</CODE> to <CODE>any</CODE> allows a user to
 gain access if the authentication or access control requirements are
 satisfied. For example, you might require authentication for remote
 access, but allow local access without authentication.</P>
<P>The default is <CODE>all</CODE>. This directive must appear inside a<A
HREF="#Location"> <CODE>Location</CODE></A> directive.
<!-- NEED 3in -->
</P>
<H3><A NAME="ServerAdmin">ServerAdmin</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ServerAdmin user@host
ServerAdmin root@foo.bar.com
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ServerAdmin</CODE> directive identifies the email address
 for the administrator on the system. By default the administrator email
 address is <CODE>root@server</CODE>, where <CODE>server</CODE> is the
 server name.
<!-- NEED 3in -->
</P>
<H3><A NAME="ServerBin">ServerBin</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ServerBin /usr/lib/cups
ServerBin /foo/bar/lib/cups
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ServerBin</CODE> directive sets the directory for
 server-run executables. If an absolute path is not provided then it is
 assumed to be relative to the<A HREF="#ServerRoot"> <CODE>ServerRoot</CODE>
</A> directory. The default executable directory is<VAR> /usr/lib/cups</VAR>
.
<!-- NEED 3in -->
</P>
<H3><A NAME="ServerCertificate">ServerCertificate</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ServerCertificate /etc/cups/ssl/server.crt
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ServerCertificate</CODE> directive specifies the location
 of the SSL certificate file used by the server when negotiating
 encrypted connections. The certificate must not be encrypted (password
 protected) since the scheduler normally runs in the background and will
 be unable to ask for a password. The default certificate file is<VAR>
 /etc/cups/ssl/server.crt</VAR>.
<!-- NEED 3in -->
</P>
<H3><A NAME="ServerKey">ServerKey</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ServerKey /etc/cups/ssl/server.key
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ServerKey</CODE> directive specifies the location of the
 SSL private key file used by the server when negotiating encrypted
 connections. The default key file is<VAR> /etc/cups/ssl/server.crt</VAR>
.
<!-- NEED 3in -->
</P>
<H3><A NAME="ServerName"></A>ServerName</H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ServerName foo.domain.com
ServerName myserver.domain.com
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ServerName</CODE> directive specifies the hostname that is
 reported to clients. By default the server name is the hostname.
<!-- NEED 3in -->
</P>
<H3><A NAME="ServerRoot">ServerRoot</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
ServerRoot /etc/cups
ServerRoot /foo/bar/cups
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>ServerRoot</CODE> directive specifies the absolute path to
 the server configuration and state files. It is also used to resolve
 relative paths in the<VAR> cupsd.conf</VAR> file. The default server
 directory is<VAR> /etc/cups</VAR>.
<!-- NEED 3in -->
</P>
<H3><A NAME="SSLListen">SSLListen</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
SSLListen 127.0.0.1:443
SSLListen 192.0.2.1:443
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>SSLListen</CODE> directive specifies a network address and
 port to listen for secure connections. Multiple <CODE>SSLListen</CODE>
 directives can be provided to listen on multiple addresses.</P>
<P>The <CODE>SSLListen</CODE> directive is similar to the<A HREF="#SSLPort">
 <CODE>SSLPort</CODE></A> directive but allows you to restrict access to
 specific interfaces or networks.
<!-- NEED 3in -->
</P>
<H3><A NAME="SSLPort">SSLPort</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
SSLPort 443
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>SSLPort</CODE> directive specifies a port to listen on for
 secure connections. Multiple <CODE>SSLPort</CODE> lines can be
 specified to listen on multiple ports.
<!-- NEED 3in -->
</P>
<H3><A NAME="SystemGroup">SystemGroup</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
SystemGroup sys
SystemGroup system
SystemGroup root
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>SystemGroup</CODE> directive specifies the system
 administration group for <CODE>System</CODE> authentication. More
 information can be found later in this chapter in<A HREF="#PRINTING_SECURITY">
 &quot;Printing System Security&quot;</A>.
<!-- NEED 3in -->
</P>
<H3><A NAME="TempDir">TempDir</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
TempDir /var/tmp
TempDir /foo/bar/tmp
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>TempDir</CODE> directive specifies an absolute path for the
 directory to use for temporary files. The default directory is<VAR>
 /var/tmp</VAR>.</P>
<P>Temporary directories must be world-writable and should have the
 &quot;sticky&quot; permission bit enabled so that other users cannot delete
 filter temporary files. The following commands will create an
 appropriate temporary directory called<VAR> /foo/bar/tmp</VAR>:</P>
<UL>
<PRE>
<B>mkdir /foo/bar/tmp ENTER</B>
<B>chmod a+rwxt /foo/bar/tmp ENTER</B>
</PRE>
</UL>

<!-- NEED 3in -->
<H3><A NAME="Timeout">Timeout</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
Timeout 300
Timeout 90
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>Timeout</CODE> directive controls the amount of time to
 wait before an active HTTP or IPP request times out. The default
 timeout is 300 seconds.
<!-- NEED 3in -->
</P>
<H3><A NAME="User">User</A></H3>
<HR>
<H4>Examples</H4>
<UL>
<PRE>
User lp
User guest
</PRE>
</UL>
<H4>Description</H4>
<P>The <CODE>User</CODE> directive specifies the UNIX user that filter
 and CGI programs run as. The default user is <CODE>lp</CODE>.
<!-- NEW PAGE -->
</P>
<H2><A NAME="PRINTING_SECURITY">Printing System Security</A></H2>
<P>CUPS provides support for address, certificate, and password (Basic
 and Digest) based authentication and access control. Certificate and
 password authentication provide ways to limit access to individual
 people or groups.</P>
<P>Address based access control allows you to limit access to specific
 systems, networks, or domains. While this does not provide
 authentication, it does allow you to limit the potential users of your
 system efficiently.</P>
<P>CUPS maintains a list of locations that have access control and/or
 authentication enabled. Locations are specified using the<A HREF="#Location">
 <CODE>Location</CODE></A> directive:</P>
<UL>
<PRE>
&lt;Location /resource&gt;
<A HREF="#AuthClass">AuthClass</A> ...
<A HREF="#AuthGroupName">AuthGroupName</A> ...
<A HREF="#AuthType">AuthType</A> ...

<A HREF="#Order">Order</A> ...
<A HREF="#Allow">Allow</A> from ...
<A HREF="#Deny">Deny</A> from ...
&lt;/Location&gt;
</PRE>
</UL>
<P>Locations generally follow the directory structure of the<A HREF="#DocumentRoot">
 <CODE>DocumentRoot</CODE></A> directory, however CUPS does have several
 virtual locations for administration, classes, jobs, and printers:
<CENTER>
<TABLE BORDER="1">
<TR><TH>Location</TH><TH>Description</TH></TR>
<TR><TD>/admin</TD><TD>The path for all administration operations.</TD></TR>
<TR><TD>/classes</TD><TD>The path for all classes.</TD></TR>
<TR><TD>/classes/name</TD><TD>The resource for class <CODE>name</CODE>.</TD>
</TR>
<TR><TD>/jobs</TD><TD>The path for all jobs.</TD></TR>
<TR><TD>/jobs/id</TD><TD>The resource for job <CODE>id</CODE>.</TD></TR>
<TR><TD>/printers</TD><TD>The path for all printers.</TD></TR>
<TR><TD>/printers/name</TD><TD>The path for printer <CODE>name</CODE>.</TD>
</TR>
<TR><TD>/printers/name.ppd</TD><TD>The PPD file path for printer <CODE>
name</CODE>.</TD></TR>
</TABLE>
</CENTER>
</P>
<H3><A NAME="CERTIFICATES">Authentication Using Certificates</A></H3>
<P>CUPS supports a local certificate-based authentication scheme that
 can be used in place of <CODE>Basic</CODE> or <CODE>Digest</CODE>
 authentication by clients connecting through the <CODE>localhost</CODE>
 interface. Certificate authentication is not supported or allowed from
 clients on any other interface.</P>
<P>Certificates are 128-bit random numbers that refer to an internal
 authentication record in the server. A client connecting via the <CODE>
localhost</CODE> interface sends a request with an authorization header
 of:</P>
<UL>
<PRE>
Authorization: Local 0123456789ABCDEF0123456789ABCDEF
</PRE>
</UL>
<P>The server then looks up the local certificate and authenticates
 using the username associated with it.</P>
<P>Certificates are generated by the server automatically and stored in
 the<VAR> /etc/cups/certs</VAR> directory using the process ID of the
 CGI program started by the server. Certificate files are only readable
 by the<A HREF="#User"> <CODE>User</CODE></A> and<A HREF="#Group"> <CODE>
Group</CODE></A> defined in the<VAR> cupsd.conf</VAR> file. When the CGI
 program ends the certificate is removed and invalidated automatically.</P>
<P>The special file<VAR> /etc/cups/certs/0</VAR> defines the<I> root
 certificate</I> which can be used by any client running as the
 super-user or another user that is part of the group defined by the<A HREF="#SystemGroup">
 <CODE>SystemGroup</CODE></A> directive. The root certificate is
 automatically regenerated every 5 minutes.</P>
<H3><A NAME="7_5_2">Using Basic Authentication</A></H3>
<P>Basic authentication uses UNIX users and passwords to authenticate
 access to resources such as printers and classes, and to limit access
 to administrative functions.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Basic authentication sends the username and password Base64 encoded
 from the client to the server, so it offers no protection against
 eavesdropping. This means that a malicious user can monitor network
 packets and discover valid users and passwords that could result in a
 serious compromise in network security. Use Basic authentication with
 extreme care.</P>
</TD></TR>
</TABLE>
</CENTER>
<P>The CUPS implementation of Basic authentication does not allow access
 through user accounts without a password. If you try to authenticate
 using an account without a password, your access will be immediately
 blocked.</P>
<P>Once a valid username and password is authenticated by CUPS, any
 additional group membership requirements are checked.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>The root user is considered by CUPS to be a member of every group.</P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 1in -->
<P>Use the <CODE>AuthType</CODE> directive to enable Basic
 authentication:</P>
<UL>
<PRE>
AuthType Basic
</PRE>
</UL>

<!-- NEED 7in -->
<H3><A NAME="7_5_3">Using Digest Authentication</A></H3>
<P>Digest authentication uses users and passwords defined in the<VAR>
 /etc/cups/passwd.md5</VAR> file to authenticate access to resources
 such as printers and classes, and to limit access to administrative
 functions.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Unlike Basic authentication, Digest passes the MD5 sum (basically a
 complicated checksum) of the username and password instead of the
 strings themselves. Also, Digest authentication does not use the UNIX
 password file, so if an attacker does discover the original password it
 is less likely to result in a serious security problem so long as you
 use a different UNIX password than the corresponding Digest password.</P>
<P>The current CUPS implementation of Digest authentication uses the
 client's hostname or IP address for the &quot;nonce&quot; value. The nonce value
 is an additional string added to the username and password to make
 guessing the password more difficult. The server checks that the nonce
 value matches the client's hostname or address and rejects the MD5 sum
 if it doesn't. Future versions of CUPS will support Digest &quot;session&quot;
 authentication which adds the request data to the MD5 sum, providing
 even better authentication and security.</P>
<P>Digest authentication does not guarantee that an attacker cannot gain
 unauthorized access, but it is safer than Basic authentication and
 should be used in place of Basic authentication whenever possible.<B>
 Support for Digest authentication in web browsers is not yet
 universally available.</B></P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 2in -->
<P>The <CODE>lppasswd(1)</CODE> command is used to add, change, or
 remove accounts from the<VAR> passwd.md5</VAR> file. To add a user to
 the default system group, type:</P>
<UL>
<PRE>
<B>lppasswd -a user ENTER</B>
Password: <B>(password) ENTER</B> [password is not echoed]
Password again: <B>(password) ENTER</B> [password is not echoed]
</PRE>
</UL>

<!-- NEED 2in -->
<P>Once added, a user can change his/her password by typing:</P>
<UL>
<PRE>
<B>lppasswd ENTER</B>
Old password: <B>(password) ENTER</B> [password is not echoed]
Password: <B>(password) ENTER</B> [password is not echoed]
Password again: <B>(password) ENTER</B> [password is not echoed]
</PRE>
</UL>

<!-- NEED 1in -->
<P>To remove a user from the password file, type:</P>
<UL>
<PRE>
<B>lppasswd -x user ENTER</B>
</PRE>
</UL>
<P>Once a valid username and password is authenticated by CUPS, any
 additional group membership requirements are checked.</P>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>The root user is considered by CUPS to be a member of every group.</P>
</TD></TR>
</TABLE>
</CENTER>
<P>Use the <CODE>AuthType</CODE> directive to enable Digest
 authentication:</P>
<UL>
<PRE>
AuthType Digest
</PRE>
</UL>
<H3><A NAME="7_5_4">System and Group Authentication</A></H3>
<P>The<A HREF="#AuthClass"> <CODE>AuthClass</CODE></A> directive
 controls the level of authentication to perform. <CODE>System</CODE>
 and <CODE>Group</CODE> authentication extend the normal user-based
 authentication to require membership in a UNIX group. For <CODE>System</CODE>
 authentication each user must belong to the <CODE>sys</CODE>, <CODE>
system</CODE>, or <CODE>root</CODE> group; the actual group depends on
 the operating system.</P>
<P>For <CODE>Group</CODE> authentication each user must belong to the
 group named by the<A HREF="#AuthGroupName"> <CODE>AuthGroupName</CODE></A>
 directive:</P>
<UL>
<PRE>
&lt;Location /path&gt;
AuthType Digest
AuthClass Group
AuthGroupName mygroup
&lt;/Location&gt;
</PRE>
</UL>
<P>The named group must be a valid UNIX user group, usually defined in
 the<VAR> /etc/group</VAR> or<VAR> /etc/netgroup</VAR> files.
 Additionally, when using Digest authentication you need to create user
 accounts with the named group:</P>
<UL>
<PRE>
<B>lppasswd -g mygroup -a user ENTER</B>
Password: <B>(password) ENTER</B> [password is not echoed]
Password again: <B>(password) ENTER</B> [password is not echoed]
</PRE>
</UL>

<!-- NEW PAGE -->
<H2><A NAME="PRINTER_ACCOUNTING">Printer Accounting</A></H2>
<P>CUPS maintains a log of all accesses, errors, and pages that are
 printed. The log files are normally stored in the<VAR> /var/log/cups</VAR>
 directory. You can change this by editing the<VAR> /etc/cups/cupsd.conf</VAR>
 configuration file.</P>
<H3><A NAME="7_6_1">The access_log File</A></H3>
<P>The<VAR> access_log</VAR> file lists each HTTP resource that is
 accessed by a web browser or CUPS/IPP client. Each line is in the
 so-called &quot;Common Log Format&quot; used by many web servers and web
 reporting tools:</P>
<UL>
<PRE>
host group user date-time \&quot;method resource version\&quot; status bytes

127.0.0.1 - - [20/May/1999:19:20:29 +0000] &quot;POST /admin/ HTTP/1.1&quot; 401 0
127.0.0.1 - mike [20/May/1999:19:20:31 +0000] &quot;POST /admin/ HTTP/1.1&quot; 200 0
</PRE>
</UL>
<P>The<I> host</I> field will normally only be an IP address unless you
 have enabled the<A HREF="#HostNameLookups"> <CODE>HostNameLookups</CODE>
</A> directive in the<VAR> cupsd.conf</VAR> file.</P>
<P>The<I> group</I> field always contains &quot;-&quot; in CUPS.</P>
<P>The<I> user</I> field is the authenticated username of the requesting
 user. If no username and password is supplied for the request then this
 field contains &quot;-&quot;.</P>
<P>The<I> date-time</I> field is the date and time of the request in
 local time and is in the format:</P>
<UL>
<PRE>
[DD/MON/YYYY:HH:MM:SS +ZZZZ]
</PRE>
</UL>
<P>where<I> ZZZZ</I> is the timezone offset in hours and minutes from
 Greenwich Mean Time (a.k.a. GMT a.k.a. ZULU.)</P>
<P>The<I> method</I> field is the HTTP method used (&quot;GET&quot;, &quot;PUT&quot;,
 &quot;POST&quot;, etc.)</P>
<P>The<I> resource</I> field is the filename of the requested resource.</P>
<P>The<I> version</I> field is the HTTP specification version used by
 the client. For CUPS clients this will always be &quot;HTTP/1.1&quot;.</P>
<P>The<I> status</I> field contains the HTTP result status of the
 request. Usually it is &quot;200&quot;, but other HTTP status codes are possible.
 For example, 401 is the &quot;unauthorized access&quot; status in the example
 above.</P>
<P>The<I> bytes</I> field contains the number of bytes in the request.
 For POST requests the<I> bytes</I> field contains the number of bytes
 that was received from the client.</P>
<H3><A NAME="7_6_2">The error_log File</A></H3>
<P>The<VAR> error_log</VAR> file lists messages from the scheduler
 (errors, warnings, etc.):</P>
<UL>
<PRE>
level date-time message

I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.
I [20/May/1999:19:21:02 +0000] Job 2 queued on 'DeskJet' by 'mike'.
I [20/May/1999:19:22:24 +0000] Job 2 was cancelled by 'mike'.
</PRE>
</UL>
<P>The<I> level</I> field contains the type of message:</P>
<UL>
<LI><CODE>E</CODE> - An error occurred.</LI>
<LI><CODE>W</CODE> - The server was unable to perform some action.</LI>
<LI><CODE>I</CODE> - Informational message.</LI>
<LI><CODE>D</CODE> - Debugging message.</LI>
</UL>
<P>The<I> date-time</I> field contains the date and time of when the
 page started printing. The format of this field is identical to the<I>
 data-time</I> field in the<VAR> access_log</VAR> file.</P>
<P>The<I> message</I> fields contains a free-form textual message.</P>
<H3><A NAME="7_6_3">The page_log File</A></H3>
<P>The<VAR> page_log</VAR> file lists each page that is sent to a
 printer. Each line contains the following information:</P>
<UL>
<PRE>
printer user job-id date-time page-number num-copies job-billing

DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 0 acme-123
</PRE>
</UL>
<P>The<I> printer</I> field contains the name of the printer that
 printed the page. If you send a job to a printer class, this field will
 contain the name of the printer that was assigned the job.</P>
<P>The<I> user</I> field contains the name of the user (the IPP <CODE>
requesting-user-name</CODE> attribute) that submitted this file for
 printing.</P>
<P>The<I> job-id</I> field contains the job number of the page being
 printed. Job numbers are reset to 1 whenever the CUPS server is
 started, so don't depend on this number being unique!</P>
<P>The<I> date-time</I> field contains the date and time of when the
 page started printing. The format of this field is identical to the<I>
 data-time</I> field in the<VAR> access_log</VAR> file.</P>
<P>The<I> page-number</I> and<I> num-pages</I> fields contain the page
 number and number of copies being printed of that page. For printer
 that can not produce copies on their own, the<I> num-pages</I> field
 will always be 1.</P>
<P>The<I> job-billing</I> field contains a copy of the <CODE>job-billing</CODE>
 attribute provided with the IPP <CODE>create-job</CODE> or <CODE>
print-job</CODE> requests or &quot;-&quot; if none was provided.
<!-- NEW PAGE -->
</P>
<H2><A NAME="FILE_TYPING_FILTERING">File Typing and Filtering</A></H2>
<P>CUPS provides a MIME-based file typing and filtering mechanism to
 convert files to a printable format for each printer. On startup the
 CUPS server reads MIME database files from the<VAR> /etc/cups</VAR>
 directory (or a directory specified by the<A HREF="#ServerRoot"> <CODE>
ServerRoot</CODE></A> directive) to build a file type and conversion
 database in memory. These database files are plain ASCII text and can
 be edited with your favorite text editor.</P>
<P>The<VAR> mime.types</VAR> and<VAR> mime.convs</VAR> files define the
 standard file types and filters that are available on the system.</P>
<H3><A NAME="7_7_1">mime.types</A></H3>
<P>The<VAR> mime.types</VAR> file defines the known file types. Each
 line of the file starts with the MIME type and may be followed by one
 or more file type recognition rules. For example, the <CODE>text/html</CODE>
 file type is defined as:</P>
<UL>
<PRE>
text/html       html htm \
                printable(0,1024) + \
                (string(0,&quot;&lt;HTML&gt;&quot;) string(0,&quot;&lt;!DOCTYPE&quot;))
</PRE>
</UL>
<P>The first two rules say that any file with an extension of<VAR> .html</VAR>
 or<VAR> .htm</VAR> is a HTML file. The third rule says that any file
 whose first 1024 characters are printable text and starts with the
 strings <CODE>&lt;HTML&gt;</CODE> or <CODE>&lt;!DOCTYPE</CODE> is a HTML file as
 well.</P>
<P>The first two rules deal solely with the name of the file being
 typed. This is useful when the original filename is known, however for
 print files the server doesn't have a filename to work with. The third
 rule takes care of this possibility and automatically figures out the
 file type based upon the contents of the file instead.</P>
<P>The available tests are:</P>
<UL>
<LI><CODE>( expr )</CODE> - Parenthesis for expression grouping</LI>
<LI><CODE>+</CODE> - Logical AND</LI>
<LI><CODE>,</CODE> or whitespace - Logical OR</LI>
<LI><CODE>!</CODE> - Logical NOT</LI>
<LI><CODE>match(&quot;pattern&quot;)</CODE> - Pattern match on filename</LI>
<LI><CODE>extension</CODE> - Pattern match on &quot;*.extension&quot;</LI>
<LI><CODE>ascii(offset,length)</CODE> - True if bytes are valid
 printable ASCII (CR, NL, TAB, BS, 32-126)</LI>
<LI><CODE>printable(offset,length)</CODE> - True if bytes are printable
 8-bit chars (CR, NL, TAB, BS, 32-126, 160-254)</LI>
<LI><CODE>string(offset,&quot;string&quot;)</CODE> - True if bytes are identical
 to string</LI>
<LI><CODE>contains(offset,range,&quot;string&quot;)</CODE> - True if the range of
 bytes contains the string</LI>
<LI><CODE>char(offset,value)</CODE> - True if byte is identical</LI>
<LI><CODE>short(offset,value)</CODE> - True if 16-bit integer is
 identical (network or &quot;big-endian&quot; byte order)</LI>
<LI><CODE>int(offset,value)</CODE> - True if 32-bit integer is identical
 (network or &quot;big-endian&quot; byte order)</LI>
<LI><CODE>locale(&quot;string&quot;)</CODE> - True if current locale matches
 string</LI>
</UL>
<P>All numeric values can be in decimal (123), octal (0123), or
 hexadecimal (0x123) as desired.
<!-- NEED 2.5in -->
</P>
<P>Strings can be in quotes, all by themselves, as a string of
 hexadecimal values, or some combination:</P>
<UL>
<PRE>
&quot;string&quot;
'string'
string
&lt;737472696e67&gt;
&lt;7374&gt;ring
</PRE>
</UL>
<P>As shown in the <CODE>text/html</CODE> example, rules can continue on
 multiple lines using the backslash (\) character. A more complex
 example is the <CODE>image/jpeg</CODE> rules:</P>
<UL>
<PRE>
image/jpeg      jpeg jpg jpe string(0,&lt;FFD8FF&gt;) &amp;&amp;\
                (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
                 char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
                 char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
                 char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
</PRE>
</UL>
<P>This rule states that any file with an extension of<VAR> .jpeg</VAR>,<VAR>
 .jpg</VAR>, or<VAR> .jpe</VAR> is a JPEG file. In addition, any file
 starting with the hexadecimal string <CODE>&lt;FFD8FF&gt;</CODE> (JPEG
 Start-Of-Image) followed by a character between and including <CODE>
0xe0</CODE> and <CODE>0xef</CODE> (JPEG APPn markers) is also a JPEG
 file.</P>
<H3><A NAME="7_7_2">mime.convs</A></H3>
<P>The<VAR> mime.convs</VAR> file defines all of the filter programs
 that are known to the system. Each line consists of:</P>
<UL>
<PRE>
source destination cost program

text/plain application/postscript 50 texttops
application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
image/* application/vnd.cups-postscript 50 imagetops
image/* application/vnd.cups-raster 50 imagetoraster
</PRE>
</UL>
<P>The<I> source</I> field is a MIME type, optionally using a wildcard
 for the super-type or sub-type (e.g. &quot;text/plain&quot;, &quot;image/*&quot;,
 &quot;*/postscript&quot;).</P>
<P>The<I> destination</I> field is a MIME type defined in the<VAR>
 mime.types</VAR> file.</P>
<P>The<I> cost</I> field defines a relative cost for the filtering
 operation from 1 to 100. The cost is used to choose between two
 different sets of filters when converting a file. For example, to
 convert from <CODE>image/jpeg</CODE> to <CODE>
application/vnd.cups-raster</CODE>, you could use the <CODE>imagetops</CODE>
 and <CODE>pstoraster</CODE> filters for a total cost of 100, or the <CODE>
imagetoraster</CODE> filter for a total cost of 50.</P>
<P>The<I> program</I> field defines the filter program to run; the
 special program &quot;-&quot; can be used to make two file types equivalent. The
 program must accept the standard filter arguments and environment
 variables described in the CUPS Interface Design Description and CUPS
 Software Programmers Manual:</P>
<UL>
<PRE>
program job user title options [filename]
</PRE>
</UL>
<P>If specified, the<I> filename</I> argument defines a file to read
 when filtering, otherwise the filter must read from the standard input.
 All filtered output must go to the standard output.
<!-- NEED 4in -->
</P>
<H3><A NAME="7_7_3">Adding Filetypes and Filters</A></H3>
<P>Adding a new file type or filter is fairly straight-forward. Rather
 than adding the new type and filter to the<VAR> mime.types</VAR> and<VAR>
 mime.convs</VAR> files which are overwritten when you upgrade to a new
 version of CUPS, you simple need to create new files with<VAR> .types</VAR>
 and<VAR> .convs</VAR> extensions in the<VAR> /etc/cups</VAR> directory.
 We recommend that you use the product or format name, e.g.:</P>
<UL>
<PRE>
myproduct.types
myproduct.convs
</PRE>
</UL>
<P>If you are providing a filter for a common file format or printer,
 add the company or author name:</P>
<UL>
<PRE>
acme-msword.types
acme.msword.convs
</PRE>
</UL>
<P>This will help to prevent name collisions if you install many
 different file types and filters.</P>
<P>Once you choose the names for these files, create them using your
 favorite text editor as described earlier in this chapter. Once you
 have created the files, restart the <CODE>cupsd</CODE> process as
 described earlier in<A HREF="#RESTARTING"> &quot;Restarting the CUPS Server&quot;</A>
.</P>
<H3><A NAME="7_7_4">Printer Drivers and PPD Files</A></H3>
<P>Most CUPS printer drivers utilize one or more printer-specific
 filters and a PPD file for each printer model. Printer driver filters
 are registered via the PPD file using <CODE>cupsFilter</CODE>
 attributes:</P>
<UL>
<PRE>
*cupsFilter: &quot;application/vnd.cups-raster 0 rastertohp&quot;
</PRE>
</UL>
<P>The filter is specified using the source file type only; the
 destination file type is assumed to be <CODE>printer/name</CODE> -
 suitable for sending to the printer.</P>
<H3><A NAME="7_7_5">Writing Your Own Filter or Printer Driver</A></H3>
<P>CUPS supports an unlimited number of file formats and filters, and
 can handle any printer. If you'd like to write a filter or printer
 driver for your favorite file format or printer, consult the CUPS
 Software Programmers Manual for step-by-step instructions.</P>
<H1 ALIGN="RIGHT"><A NAME="PRINTING_OTHER">7 - Printing with Other
 Systems</A></H1>
<P>This chapter describes how to print from client systems that use the
 LPD, Mac OS, or Windows printing protocols.</P>
<H2><A NAME="8_1">The Basics</A></H2>
<P>CUPS is based on the IPP protocol, so any system that supports IPP
 can send jobs to and receive jobs from CUPS automatically. However, not
 all systems support IPP yet. This chapter will show you how to connect
 these systems to your CUPS server, either to accept jobs from your
 server for printing, or to send jobs to your server.</P>
<H2><A NAME="8_2">Printing from LPD Clients</A></H2>
<P>CUPS supports limited functionality for LPD-based clients. With LPD
 you can print files to specific printers, list the queue status, and so
 forth. However, the automatic client configuration and printer options
 are not supported by the LPD protocol, so you must manually configure
 each client for the printers it needs to access.</P>
<P>The <CODE>cups-lpd(8)</CODE> program provides support for LPD clients
 and can be used from either the <CODE>inetd(8)</CODE> or <CODE>
xinetd(8)</CODE> programs. Add the following line to the<VAR>
 /etc/inetd.conf</VAR> file to enable LPD support on your server through
 the <CODE>inetd</CODE> program:</P>
<UL>
<PRE>
printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd
</PRE>
</UL>
<P>The path to the <CODE>cups-lpd</CODE> may vary depending on your
 installation.</P>
<P>Once you have added this line, send the <CODE>inetd</CODE> process a <CODE>
HUP</CODE> signal or reboot the system:</P>
<UL>
<PRE>
<B>killall -HUP inetd ENTER</B> [IRIX and some versions of Linux]
<B>kill -HUP <I>pid</I> ENTER [Others]</B>
<B>reboot ENTER [For all systems if the HUP signal fails]</B>
</PRE>
</UL>
<P>If you are using the <CODE>xinetd</CODE> program, create a file named<VAR>
 /etc/xinetd.d/printer</VAR> containing the following lines:</P>
<UL>
<PRE>
service printer
{
    socket_type = stream
    protocol = tcp
    wait = no
    user = lp
    server = /usr/lib/cups/daemon/cups-lpd
}
</PRE>
</UL>
<P>The <CODE>xinetd</CODE> program automatically reads the new
 configuration file and enables LPD printing support.
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B>Warning:</B>
<P><CODE>cups-lpd</CODE> currently does not perform any access control
 based on the settings in<VAR> cupsd.conf</VAR> or in the<VAR>
 hosts.allow</VAR> or<VAR> hosts.deny</VAR> files used by TCP wrappers.
 Therefore, running <CODE>cups-lpd</CODE> on your server will allow any
 computer on your network (and perhaps the entire Internet) to print to
 your server.</P>
<P>While <CODE>xinetd</CODE> has built-in access control support, you
 should use the TCP wrappers package with <CODE>inetd</CODE> to limit
 access to only those computers that should be able to print through
 your server.</P>
</TD></TR>
</TABLE>
</CENTER>
</P>
<H2><A NAME="8_3">Printing to LPD Servers</A></H2>
<P>CUPS provides the <CODE>lpd</CODE> backend for printing to LPD-based
 servers and printers. Use a device URI of <CODE>lpd://server/name</CODE>
 to print to a printer on an LPD server, where <CODE>server</CODE> is
 the hostname or IP address of the server and <CODE>name</CODE> is the
 queue name.</P>
<P>Microsoft Windows NT provides an LPD service under the name &quot;TCP/IP
 Printing Services&quot;. To enable LPD printing on NT, open the &quot;Services&quot;
 control panel, select the &quot;TCP/IP Printing Services&quot; service, and click
 on the &quot;Start&quot; button. Any shared printer will then be available via
 the LPD protocol.</P>
<H2><A NAME="8_4">Printing from Mac OS Clients</A></H2>
<P>CUPS does not provide Mac OS support directly. However, there are
 several free and commercial software packages that do.</P>
<H3><A NAME="8_4_1">Columbia Appletalk Package (CAP)</A></H3>
<P>Because the CAP LaserWriter server (<CODE>lwsrv(8)</CODE>) does not
 support specification of PPD files, we do not recommend that you use
 CAP with CUPS. However, you can run the <CODE>lpsrv</CODE> program for
 limited printing with the command:</P>
<UL>
<PRE>
lwsrv -n &quot;<I>Name</I>&quot; -p <I>printer</I> -a /usr/lib/adicts -f /usr/lib/LW+Fonts
</PRE>
</UL>
<P>where <CODE>Name</CODE> is the name you want to use when sharing the
 printer, and <CODE>printer</CODE> is the name of the CUPS print queue.
<!-- NEED 3in -->
</P>
<H3><A NAME="8_4_2">XINET KA/Spool</A></H3>
<P>To use your system as a print server for Mac OS clients, configure
 each printer using a <CODE>papserver(8)</CODE> in the<VAR>
 /usr/adm/appletalk/services</VAR> file, specifying the corresponding
 PPD file in the<VAR> /etc/cups/ppd</VAR> directory for each printer.
 For a printer named <CODE>MyPrinter</CODE> the entry would look like:</P>
<UL>
<PRE>
/usr/etc/appletalk/papserver -I -L -P /etc/cups/ppd/MyPrinter.ppd \
&quot;Printer Description&quot; MyPrinter
</PRE>
</UL>
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Enter the text above on a single line without the backslash (\)
 character.</P>
</TD></TR>
</TABLE>
</CENTER>
<H3><A NAME="8_4_3">NetATalk</A></H3>
<P>To use your system as a print server for Mac OS clients, configure
 each printer in the<VAR> papd.conf</VAR> file, specifying the
 corresponding PPD file in the<VAR> /etc/cups/ppd</VAR> directory for
 each printer. For a printer named <CODE>MyPrinter</CODE> the entry
 would look like:</P>
<UL>
<PRE>
Printer Description:MyPrinter@MyServer:\
        :pr=|/usr/bin/lp -d MyPrinter:\
        :op=daemon:\
        :pd=/etc/cups/ppd/MyPrinter.ppd:
</PRE>
</UL>

<!-- NEED 2in -->
<H2><A NAME="8_5">Printing to Mac OS Servers</A></H2>
<P>CUPS currently does not provide a backend to communicate with a Mac
 OS server. However, you can write and install a short shell script in
 the<VAR> /usr/lib/cups/backend</VAR> directory that sends a print file
 using the appropriate command. The following is a short script that
 will run the <CODE>papif</CODE> command provided with CAP.</P>
<P>After copying this script to<VAR> /usr/lib/cups/backend/cap</VAR>,
 specify a device URI of <CODE>cap://server/printer</CODE> to use this
 backend with a print queue.
<!-- NEED 8in -->
</P>
<UL>
<PRE>
<I>&quot;/usr/lib/cups/backend/cap&quot;</I>
#!/bin/sh
#
# Usage: cap job user title copies options [filename]
#

# No arguments means show available devices...

if test ${#argv} = 0; then
	echo &quot;network cap \&quot;Unknown\&quot; \&quot;Mac OS Printer via CAP\&quot;&quot;
	exit 0
fi

# Collect arguments...

user=$2
copies=$4

if test ${#argv} = 5; then
	# Get print file from stdin; copies have already been handled...
	file=/var/tmp/$$.prn
	copies=1
	cat &gt; $file
else
	# Print file is on command-line...
	file=$6
fi

# Create a dummy cap.printers file for this printer based
# upon a device URI of &quot;cap://server/printer&quot;...

echo $PRINTER/$DEVICE_URI | \
	awk -F/ '{print $1 &quot;=&quot; $5 &quot;:LaserWriter@&quot; $4}' &gt; /var/tmp/$$.cap

CAPPRINTERS=/var/tmp/$$.cap; export CAPPRINTERS

# Send the file to the printer, once for each copy. This assumes that you
# have properly initialized the cap.printers file...

while [ $copies -gt 0 ]; do
	papif -n $user &lt; $file

        copies=`expr $copies - 1`
done

# Remove any temporary files...
if test ${#argv} = 5; then
	/bin/rm -f $file
fi

/bin/rm -f /var/tmp/$$.cap

exit 0
</PRE>
</UL>

<!-- NEED 2in -->
<H2><A NAME="8_6">Printing from Windows Clients</A></H2>
<P>While CUPS does not provide Windows support directly, the free SAMBA
 software package does. SAMBA version 2.0.6 is the first release of
 SAMBA that supports CUPS. You can download SAMBA from:</P>
<UL>
<PRE>
<A HREF="http://www.samba.org">http://www.samba.org</A>
</PRE>
</UL>
<P>To configure SAMBA for CUPS, edit the<VAR> smb.conf</VAR> file and
 replace the existing printing commands and options with the line:</P>
<UL>
<PRE>
printing = cups
printcap name = cups
</PRE>
</UL>
<P>That's all there is to it! Remote users will now be able to browse
 and print to printers on your system.</P>
<H3><A NAME="8_6_1">Exporting Printer Drivers</A></H3>
<P>You can optionally export printer drivers from your CUPS server using
 the <CODE>cupsaddsmb</CODE> command and the SAMBA 2.2.0 or higher
 software.</P>
<P>Before you can export the printers you must download the current
 Adobe PostScript printer drivers from the Adobe web site (<A HREF="http://www.adobe.com/">
http://www.adobe.com/</A>). Use the free <CODE>unzip</CODE> software to
 extract the files from the self-extracting ZIP file containing the
 drivers; you will need the following files:</P>
<UL>
<PRE>
ADFONTS.MFM
ADOBEPS4.DRV
ADOBEPS4.HLP
ADOBEPS5.DLL
ADOBEPSU.DLL
ADOBEPSU.HLP
DEFPRTR2.PPD
ICONLIB.DLL
PSMON.DLL
</PRE>
</UL>
<P>Copy these files to the<VAR> /usr/share/cups/drivers</VAR> directory
 - you may need to rename some of the files so the filenames are all
 UPPERCASE.</P>
<P>Next, add a <CODE>print$</CODE> share for the printer drivers to your<VAR>
 smb.conf</VAR> file:</P>
<UL>
<PRE>
[print$]
    comment = Printer Drivers
    path = /etc/samba/drivers
    browseable = yes
    guest ok = no
    read only = yes
    write list = root
</PRE>
</UL>
<P>The directory for your printer drivers can be anywhere on the system;
 just make sure it is writable by the users specified by the <CODE>write
 list</CODE> directive. Also, make sure that you have SAMBA passwords
 defined for each user in the <CODE>write list</CODE> using the <CODE>
smbpasswd(1)</CODE> command. Otherwise you will not be able to
 authenticate</P>
<P>Finally, run the <CODE>cupsaddsmb</CODE> command to export the
 printer drivers for one or more queues:</P>
<UL>
<PRE>
<B>cupsaddsmb -U root printer1 ... printerN <I>ENTER</I></B>
</PRE>
</UL>
<P>Running <CODE>cupsaddsmb</CODE> with the <CODE>-a</CODE> option will
 export all printers:</P>
<UL>
<PRE>
<B>cupsaddsmb -U root -a <I>ENTER</I></B>
</PRE>
</UL>
<H2><A NAME="8_7">Printing to Windows Servers</A></H2>
<P>CUPS can print to Windows servers in one of two ways. The first way
 uses the LPD protocol on the CUPS system and the &quot;TCP/IP Printing
 Services&quot; on the Windows system. You can find out more about this
 configuration in the<A HREF="#LPD"> LPD</A> section earlier in this
 chapter.</P>
<P>The second way is through the Microsoft Server Message Block (&quot;SMB&quot;)
 protocol. Support for this protocol is provided with the free SAMBA
 software package. You can download SAMBA from:</P>
<UL>
<PRE>
<A HREF="http://www.samba.org">http://www.samba.org</A>
</PRE>
</UL>
<P>To configure CUPS for SAMBA, run the following command:</P>
<UL>
<PRE>
<B>ln -s `which smbspool` /usr/lib/cups/backend/smb ENTER</B>
</PRE>
</UL>
<P>The <CODE>smbspool(1)</CODE> program is provided with SAMBA starting
 with SAMBA 2.0.6. Once you have made the link you can configure your
 printers with one of the following device URIs:</P>
<UL>
<PRE>
smb://workgroup/server/sharename
smb://server/sharename
smb://user:pass@workgroup/server/sharename
smb://user:pass@server/sharename
</PRE>
</UL>
<P>The <CODE>workgroup</CODE> name need only be specified if your system
 is using a different workgroup. The <CODE>user:pass</CODE> strings are
 required when printing to Windows NT servers or to shares with
 passwords enabled under Windows 95 and 98.</P>
<H1 ALIGN="RIGHT"><A NAME="LICENSE">A - Software License Agreement</A></H1>
<H2 ALIGN="CENTER"><A NAME="9_1">Common UNIX Printing System License
 Agreement</A></H2>
<P ALIGN="CENTER">Copyright 1997-2002 by Easy Software Products
<BR> 44141 AIRPORT VIEW DR STE 204
<BR> HOLLYWOOD, MARYLAND 20636-3111 USA
<BR>
<BR> Voice: +1.301.373.9600
<BR> Email:<A HREF="mailto:cups-info@cups.org"> cups-info@cups.org</A>
<BR> WWW:<A HREF="http://www.cups.org"> http://www.cups.org</A></P>
<H3><A NAME="9_1_1">Introduction</A></H3>
<P>The Common UNIX Printing System<SUP>TM</SUP>, (&quot;CUPS<SUP>TM</SUP>&quot;),
 is provided under the GNU General Public License (&quot;GPL&quot;) and GNU
 Library General Public License (&quot;LGPL&quot;), Version 2, with exceptions for
 Apple operating systems and the OpenSSL toolkit. A copy of the
 exceptions and licenses follow this introduction.</P>
<P>The GNU LGPL applies to the CUPS API library, located in the &quot;cups&quot;
 subdirectory of the CUPS source distribution and in the &quot;cups&quot; include
 directory and library files in the binary distributions. The GNU GPL
 applies to the remainder of the CUPS distribution, including the
 &quot;pdftops&quot; filter which is based upon Xpdf and the CUPS imaging library.</P>
<P>For those not familiar with the GNU GPL, the license basically allows
 you to:</P>
<UL>
<LI>Use the CUPS software at no charge.</LI>
<LI>Distribute verbatim copies of the software in source or binary form.</LI>
<LI>Sell verbatim copies of the software for a media fee, or sell
 support for the software.</LI>
<LI>Distribute or sell printer drivers and filters that use CUPS so long
 as source code is made available under the GPL.</LI>
</UL>
<P>What this license<B> does not</B> allow you to do is make changes or
 add features to CUPS and then sell a binary distribution without source
 code. You must provide source for any new drivers, changes, or
 additions to the software, and all code must be provided under the GPL
 or LGPL as appropriate. The only exceptions to this are the portions of
 the CUPS software covered by the Apple operating system license
 exceptions outlined later in this license agreement.</P>
<P>The GNU LGPL relaxes the &quot;link-to&quot; restriction, allowing you to
 develop applications that use the CUPS API library under other licenses
 and/or conditions as appropriate for your application.</P>
<H3><A NAME="9_1_2">License Exceptions</A></H3>
<P>In addition, as the copyright holder of CUPS, Easy Software Products
 grants the following special exceptions:</P>
<OL>
<LI><B>Apple Operating System Development License Exception</B>;
<OL TYPE="a">
<LI>Software that is developed by any person or entity for an Apple
 Operating System (&quot;Apple OS-Developed Software&quot;), including but not
 limited to Apple and third party printer drivers, filters, and backends
 for an Apple Operating System, that is linked to the CUPS imaging
 library or based on any sample filters or backends provided with CUPS
 shall not be considered to be a derivative work or collective work
 based on the CUPS program and is exempt from the mandatory source code
 release clauses of the GNU GPL. You may therefore distribute linked
 combinations of the CUPS imaging library with Apple OS-Developed
 Software without releasing the source code of the Apple OS-Developed
 Software. You may also use sample filters and backends provided with
 CUPS to develop Apple OS-Developed Software without releasing the
 source code of the Apple OS-Developed Software.</LI>
<LI>An Apple Operating System means any operating system software
 developed and/or marketed by Apple Computer, Inc., including but not
 limited to all existing releases and versions of Apple's Darwin, Mac OS
 X, and Mac OS X Server products and all follow-on releases and future
 versions thereof.</LI>
<LI>This exception is only available for Apple OS-Developed Software and
 does not apply to software that is distributed for use on other
 operating systems.</LI>
<LI>All CUPS software that falls under this license exception have the
 following text at the top of each source file:<BLOCKQUOTE>This file is
 subject to the Apple OS-Developed Software exception.</BLOCKQUOTE></LI>
</OL>
</LI>
<LI><B>OpenSSL Toolkit License Exception</B>;
<OL TYPE="a">
<LI>Easy Software Products explicitly allows the compilation and
 distribution of the CUPS software with the OpenSSL Toolkit.</LI>
</OL>
</LI>
</OL>
<P>No developer is required to provide these exceptions in a derived
 work.</P>
<H3><A NAME="9_1_3">Trademarks</A></H3>
<P>Easy Software Products has trademarked the Common UNIX Printing
 System, CUPS, and CUPS logo. These names and logos may be used freely
 in any direct port or binary distribution of CUPS. Please contract Easy
 Software Products for written permission to use them in derivative
 products. Our intention is to protect the value of these trademarks and
 ensure that any derivative product meets the same high-quality
 standards as the original.</P>
<H3><A NAME="9_1_4">Binary Distribution Rights</A></H3>
<P>Easy Software Products also sells rights to the CUPS source code
 under a binary distribution license for vendors that are unable to
 release source code for their drivers, additions, and modifications to
 CUPS under the GNU GPL and LGPL. For information please contact us at
 the address shown above.</P>
<P>The Common UNIX Printing System provides a &quot;pdftops&quot; filter that is
 based on the Xpdf software. For binary distribution licensing of this
 software, please contact:<BLOCKQUOTE> Derek B. Noonburg
<BR> Email:<A HREF="mailto:derekn@foolabs.com"> derekn@foolabs.com</A>
<BR> WWW:<A HREF="http://www.foolabs.com/xpdf/">
 http://www.foolabs.com/xpdf/</A></BLOCKQUOTE></P>
<H3><A NAME="9_1_5">Support</A></H3>
<P>Easy Software Products sells software support for CUPS as well as a
 commercial printing product based on CUPS called ESP Print Pro. You can
 find out more at our web site:</P>
<UL>
<PRE>
<A HREF="http://www.easysw.com/">http://www.easysw.com/</A>
</PRE>
</UL>

<!-- NEW PAGE -->
<H2><A NAME="9_2">GNU GENERAL PUBLIC LICENSE</A></H2>
<P>Version 2, June 1991</P>
<PRE>
Copyright 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Everyone is permitted to copy and distribute verbatim
copies of this license document, but changing it is not allowed.
</PRE>
<PRE>

</PRE>
<H4>Preamble</H4>
<P>The licenses for most software are designed to take away your freedom
 to share and change it. By contrast, the GNU General Public License is
 intended to guarantee your freedom to share and change free
 software--to make sure the software is free for all its users. This
 General Public License applies to most of the Free Software
 Foundation's software and to any other program whose authors commit to
 using it. (Some other Free Software Foundation software is covered by
 the GNU Library General Public License instead.) You can apply it to
 your programs, too.</P>
<P>When we speak of free software, we are referring to freedom, not
 price. Our General Public Licenses are designed to make sure that you
 have the freedom to distribute copies of free software (and charge for
 this service if you wish), that you receive source code or can get it
 if you want it, that you can change the software or use pieces of it in
 new free programs; and that you know you can do these things.</P>
<P>To protect your rights, we need to make restrictions that forbid
 anyone to deny you these rights or to ask you to surrender the rights.
 These restrictions translate to certain responsibilities for you if you
 distribute copies of the software, or if you modify it.</P>
<P>For example, if you distribute copies of such a program, whether
 gratis or for a fee, you must give the recipients all the rights that
 you have. You must make sure that they, too, receive or can get the
 source code. And you must show them these terms so they know their
 rights.</P>
<P>We protect your rights with two steps: (1) copyright the software,
 and (2) offer you this license which gives you legal permission to
 copy, distribute and/or modify the software.</P>
<P>Also, for each author's protection and ours, we want to make certain
 that everyone understands that there is no warranty for this free
 software. If the software is modified by someone else and passed on, we
 want its recipients to know that what they have is not the original, so
 that any problems introduced by others will not reflect on the original
 authors' reputations.</P>
<P>Finally, any free program is threatened constantly by software
 patents. We wish to avoid the danger that redistributors of a free
 program will individually obtain patent licenses, in effect making the
 program proprietary. To prevent this, we have made it clear that any
 patent must be licensed for everyone's free use or not licensed at all.</P>
<P>The precise terms and conditions for copying, distribution and
 modification follow.</P>
<H4>GNU GENERAL PUBLIC LICENSE
<BR> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
<OL START="0">
<LI>This License applies to any program or other work which contains a
 notice placed by the copyright holder saying it may be distributed
 under the terms of this General Public License. The &quot;Program&quot;, below,
 refers to any such program or work, and a &quot;work based on the Program&quot;
 means either the Program or any derivative work under copyright law:
 that is to say, a work containing the Program or a portion of it,
 either verbatim or with modifications and/or translated into another
 language. (Hereinafter, translation is included without limitation in
 the term &quot;modification&quot;.) Each licensee is addressed as &quot;you&quot;.
<P>Activities other than copying, distribution and modification are not
 covered by this License; they are outside its scope. The act of running
 the Program is not restricted, and the output from the Program is
 covered only if its contents constitute a work based on the Program
 (independent of having been made by running the Program). Whether that
 is true depends on what the Program does.</P>
<LI>You may copy and distribute verbatim copies of the Program's source
 code as you receive it, in any medium, provided that you conspicuously
 and appropriately publish on each copy an appropriate copyright notice
 and disclaimer of warranty; keep intact all the notices that refer to
 this License and to the absence of any warranty; and give any other
 recipients of the Program a copy of this License along with the
 Program.
<P>You may charge a fee for the physical act of transferring a copy, and
 you may at your option offer warranty protection in exchange for a fee.</P>
<LI>You may modify your copy or copies of the Program or any portion of
 it, thus forming a work based on the Program, and copy and distribute
 such modifications or work under the terms of Section 1 above, provided
 that you also meet all of these conditions:
<OL TYPE="a">
<LI>You must cause the modified files to carry prominent notices stating
 that you changed the files and the date of any change.</LI>
<LI>You must cause any work that you distribute or publish, that in
 whole or in part contains or is derived from the Program or any part
 thereof, to be licensed as a whole at no charge to all third parties
 under the terms of this License.</LI>
<LI>if the modified program normally reads commands interactively when
 run, you must cause it, when started running for such interactive use
 in the most ordinary way, to print or display an announcement including
 an appropriate copyright notice and a notice that there is no warranty
 (or else, saying that you provide a warranty) and that users may
 redistribute the program under these conditions, and telling the user
 how to view a copy of this License. (Exception: if the Program itself
 is interactive but does not normally print such an announcement, your
 work based on the Program is not required to print an announcement.)</LI>
</OL>
<P>These requirements apply to the modified work as a whole. If
 identifiable sections of that work are not derived from the Program,
 and can be reasonably considered independent and separate works in
 themselves, then this License, and its terms, do not apply to those
 sections when you distribute them as separate works. But when you
 distribute the same sections as part of a whole which is a work based
 on the Program, the distribution of the whole must be on the terms of
 this License, whose permissions for other licensees extend to the
 entire whole, and thus to each and every part regardless of who wrote
 it.</P>
<P>Thus, it is not the intent of this section to claim rights or contest
 your rights to work written entirely by you; rather, the intent is to
 exercise the right to control the distribution of derivative or
 collective works based on the Program.</P>
<P>In addition, mere aggregation of another work not based on the
 Program with the Program (or with a work based on the Program) on a
 volume of a storage or distribution medium does not bring the other
 work under the scope of this License.</P>
<LI>You may copy and distribute the Program (or a work based on it,
 under Section 2) in object code or executable form under the terms of
 Sections 1 and 2 above provided that you also do one of the following:
<OL TYPE="a">
<LI>Accompany it with the complete corresponding machine-readable source
 code, which must be distributed under the terms of Sections 1 and 2
 above on a medium customarily used for software interchange; or,</LI>
<LI>Accompany it with a written offer, valid for at least three years,
 to give any third party, for a charge no more than your cost of
 physically performing source distribution, a complete machine-readable
 copy of the corresponding source code, to be distributed under the
 terms of Sections 1 and 2 above on a medium customarily used for
 software interchange; or,</LI>
<LI>Accompany it with the information you received as to the offer to
 distribute corresponding source code. (This alternative is allowed only
 for noncommercial distribution and only if you received the program in
 object code or executable form with such an offer, in accord with
 Subsection b above.)</LI>
</OL>
<P>The source code for a work means the preferred form of the work for
 making modifications to it. For an executable work, complete source
 code means all the source code for all modules it contains, plus any
 associated interface definition files, plus the scripts used to control
 compilation and installation of the executable. However, as a special
 exception, the source code distributed need not include anything that
 is normally distributed (in either source or binary form) with the
 major components (compiler, kernel, and so on) of the operating system
 on which the executable runs, unless that component itself accompanies
 the executable.</P>
<P>If distribution of executable or object code is made by offering
 access to copy from a designated place, then offering equivalent access
 to copy the source code from the same place counts as distribution of
 the source code, even though third parties are not compelled to copy
 the source along with the object code.</P>
<LI>You may not copy, modify, sublicense, or distribute the Program
 except as expressly provided under this License. Any attempt otherwise
 to copy, modify, sublicense or distribute the Program is void, and will
 automatically terminate your rights under this License. However,
 parties who have received copies, or rights, from you under this
 License will not have their licenses terminated so long as such parties
 remain in full compliance.</LI>
<LI>You are not required to accept this License, since you have not
 signed it. However, nothing else grants you permission to modify or
 distribute the Program or its derivative works. These actions are
 prohibited by law if you do not accept this License. Therefore, by
 modifying or distributing the Program (or any work based on the
 Program), you indicate your acceptance of this License to do so, and
 all its terms and conditions for copying, distributing or modifying the
 Program or works based on it.</LI>
<LI>Each time you redistribute the Program (or any work based on the
 Program), the recipient automatically receives a license from the
 original licensor to copy, distribute or modify the Program subject to
 these terms and conditions. You may not impose any further restrictions
 on the recipients' exercise of the rights granted herein. You are not
 responsible for enforcing compliance by third parties to this License.</LI>
<LI>If, as a consequence of a court judgment or allegation of patent
 infringement or for any other reason (not limited to patent issues),
 conditions are imposed on you (whether by court order, agreement or
 otherwise) that contradict the conditions of this License, they do not
 excuse you from the conditions of this License. If you cannot
 distribute so as to satisfy simultaneously your obligations under this
 License and any other pertinent obligations, then as a consequence you
 may not distribute the Program at all. For example, if a patent license
 would not permit royalty-free redistribution of the Program by all
 those who receive copies directly or indirectly through you, then the
 only way you could satisfy both it and this License would be to refrain
 entirely from distribution of the Program.
<P>If any portion of this section is held invalid or unenforceable under
 any particular circumstance, the balance of the section is intended to
 apply and the section as a whole is intended to apply in other
 circumstances.</P>
<P>It is not the purpose of this section to induce you to infringe any
 patents or other property right claims or to contest validity of any
 such claims; this section has the sole purpose of protecting the
 integrity of the free software distribution system, which is
 implemented by public license practices. Many people have made generous
 contributions to the wide range of software distributed through that
 system in reliance on consistent application of that system; it is up
 to the author/donor to decide if he or she is willing to distribute
 software through any other system and a licensee cannot impose that
 choice.</P>
<P>This section is intended to make thoroughly clear what is believed to
 be a consequence of the rest of this License.</P>
<LI>If the distribution and/or use of the Program is restricted in
 certain countries either by patents or by copyrighted interfaces, the
 original copyright holder who places the Program under this License may
 add an explicit geographical distribution limitation excluding those
 countries, so that distribution is permitted only in or among countries
 not thus excluded. In such case, this License incorporates the
 limitation as if written in the body of this License.</LI>
<LI>The Free Software Foundation may publish revised and/or new versions
 of the General Public License from time to time. Such new versions will
 be similar in spirit to the present version, but may differ in detail
 to address new problems or concerns.
<P>Each version is given a distinguishing version number. If the Program
 specifies a version number of this License which applies to it and &quot;any
 later version&quot;, you have the option of following the terms and
 conditions either of that version or of any later version published by
 the Free Software Foundation. If the Program does not specify a version
 number of this License, you may choose any version ever published by
 the Free Software Foundation.</P>
<LI>If you wish to incorporate parts of the Program into other free
 programs whose distribution conditions are different, write to the
 author to ask for permission. For software which is copyrighted by the
 Free Software Foundation, write to the Free Software Foundation; we
 sometimes make exceptions for this. Our decision will be guided by the
 two goals of preserving the free status of all derivatives of our free
 software and of promoting the sharing and reuse of software generally.</LI>
</LI>
</LI>
</LI>
</LI>
</LI>
</LI>
</OL>
<H4>NO WARRANTY</H4>
<OL START="11">
<LI>BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 PROVIDE THE PROGRAM &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER
 EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
 ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
 YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
 NECESSARY SERVICING, REPAIR OR CORRECTION.</LI>
<LI>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
 WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
 AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
 FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
 CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
 PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
 RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
 FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
 SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 DAMAGES.</LI>
</OL>
<H4>END OF TERMS AND CONDITIONS</H4>

<!-- NEW PAGE -->
<H2><A NAME="9_3">GNU LIBRARY GENERAL PUBLIC LICENSE</A></H2>
<P>Version 2, June 1991</P>
<PRE>
Copyright (C) 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

[This is the first released version of the library GPL.  It is
 numbered 2 because it goes with version 2 of the ordinary GPL.]
</PRE>
<H4>Preamble</H4>
<P>The licenses for most software are designed to take away your freedom
 to share and change it. By contrast, the GNU General Public Licenses
 are intended to guarantee your freedom to share and change free
 software--to make sure the software is free for all its users.</P>
<P>This license, the Library General Public License, applies to some
 specially designated Free Software Foundation software, and to any
 other libraries whose authors decide to use it. You can use it for your
 libraries, too.</P>
<P>When we speak of free software, we are referring to freedom, not
 price. Our General Public Licenses are designed to make sure that you
 have the freedom to distribute copies of free software (and charge for
 this service if you wish), that you receive source code or can get it
 if you want it, that you can change the software or use pieces of it in
 new free programs; and that you know you can do these things.</P>
<P>To protect your rights, we need to make restrictions that forbid
 anyone to deny you these rights or to ask you to surrender the rights.
 These restrictions translate to certain responsibilities for you if you
 distribute copies of the library, or if you modify it.</P>
<P>For example, if you distribute copies of the library, whether gratis
 or for a fee, you must give the recipients all the rights that we gave
 you. You must make sure that they, too, receive or can get the source
 code. If you link a program with the library, you must provide complete
 object files to the recipients so that they can relink them with the
 library, after making changes to the library and recompiling it. And
 you must show them these terms so they know their rights.</P>
<P>Our method of protecting your rights has two steps: (1) copyright the
 library, and (2) offer you this license which gives you legal
 permission to copy, distribute and/or modify the library.</P>
<P>Also, for each distributor's protection, we want to make certain that
 everyone understands that there is no warranty for this free library.
 If the library is modified by someone else and passed on, we want its
 recipients to know that what they have is not the original version, so
 that any problems introduced by others will not reflect on the original
 authors' reputations.</P>
<P>Finally, any free program is threatened constantly by software
 patents. We wish to avoid the danger that companies distributing free
 software will individually obtain patent licenses, thus in effect
 transforming the program into proprietary software. To prevent this, we
 have made it clear that any patent must be licensed for everyone's free
 use or not licensed at all.</P>
<P>Most GNU software, including some libraries, is covered by the
 ordinary GNU General Public License, which was designed for utility
 programs. This license, the GNU Library General Public License, applies
 to certain designated libraries. This license is quite different from
 the ordinary one; be sure to read it in full, and don't assume that
 anything in it is the same as in the ordinary license.</P>
<P>The reason we have a separate public license for some libraries is
 that they blur the distinction we usually make between modifying or
 adding to a program and simply using it. Linking a program with a
 library, without changing the library, is in some sense simply using
 the library, and is analogous to running a utility program or
 application program. However, in a textual and legal sense, the linked
 executable is a combined work, a derivative of the original library,
 and the ordinary General Public License treats it as such.</P>
<P>Because of this blurred distinction, using the ordinary General
 Public License for libraries did not effectively promote software
 sharing, because most developers did not use the libraries. We
 concluded that weaker conditions might promote sharing better.</P>
<P>However, unrestricted linking of non-free programs would deprive the
 users of those programs of all benefit from the free status of the
 libraries themselves. This Library General Public License is intended
 to permit developers of non-free programs to use free libraries, while
 preserving your freedom as a user of such programs to change the free
 libraries that are incorporated in them. (We have not seen how to
 achieve this as regards changes in header files, but we have achieved
 it as regards changes in the actual functions of the Library.) The hope
 is that this will lead to faster development of free libraries.</P>
<P>The precise terms and conditions for copying, distribution and
 modification follow. Pay close attention to the difference between a
 &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The
 former contains code derived from the library, while the latter only
 works together with the library.</P>
<P>Note that it is possible for a library to be covered by the ordinary
 General Public License rather than by this special one.</P>
<H4>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H4>
<P><STRONG>0.</STRONG> This License Agreement applies to any software
 library which contains a notice placed by the copyright holder or other
 authorized party saying it may be distributed under the terms of this
 Library General Public License (also called &quot;this License&quot;). Each
 licensee is addressed as &quot;you&quot;.</P>
<P>A &quot;library&quot; means a collection of software functions and/or data
 prepared so as to be conveniently linked with application programs
 (which use some of those functions and data) to form executables.</P>
<P>The &quot;Library&quot;, below, refers to any such software library or work
 which has been distributed under these terms. A &quot;work based on the
 Library&quot; means either the Library or any derivative work under
 copyright law: that is to say, a work containing the Library or a
 portion of it, either verbatim or with modifications and/or translated
 straightforwardly into another language. (Hereinafter, translation is
 included without limitation in the term &quot;modification&quot;.)</P>
<P>&quot;Source code&quot; for a work means the preferred form of the work for
 making modifications to it. For a library, complete source code means
 all the source code for all modules it contains, plus any associated
 interface definition files, plus the scripts used to control
 compilation and installation of the library.</P>
<P>Activities other than copying, distribution and modification are not
 covered by this License; they are outside its scope. The act of running
 a program using the Library is not restricted, and output from such a
 program is covered only if its contents constitute a work based on the
 Library (independent of the use of the Library in a tool for writing
 it). Whether that is true depends on what the Library does and what the
 program that uses the Library does.</P>
<P><STRONG>1.</STRONG> You may copy and distribute verbatim copies of
 the Library's complete source code as you receive it, in any medium,
 provided that you conspicuously and appropriately publish on each copy
 an appropriate copyright notice and disclaimer of warranty; keep intact
 all the notices that refer to this License and to the absence of any
 warranty; and distribute a copy of this License along with the Library.</P>
<P>You may charge a fee for the physical act of transferring a copy, and
 you may at your option offer warranty protection in exchange for a fee.</P>
<P><STRONG>2.</STRONG> You may modify your copy or copies of the Library
 or any portion of it, thus forming a work based on the Library, and
 copy and distribute such modifications or work under the terms of
 Section 1 above, provided that you also meet all of these conditions:</P>
<OL TYPE="a">
<LI>The modified work must itself be a software library.
<P></P>
<LI>You must cause the files modified to carry prominent notices stating
 that you changed the files and the date of any change.
<P></P>
<LI>You must cause the whole of the work to be licensed at no charge to
 all third parties under the terms of this License.
<P></P>
<LI>If a facility in the modified Library refers to a function or a
 table of data to be supplied by an application program that uses the
 facility, other than as an argument passed when the facility is
 invoked, then you must make a good faith effort to ensure that, in the
 event an application does not supply such function or table, the
 facility still operates, and performs whatever part of its purpose
 remains meaningful.
<P>(For example, a function in a library to compute square roots has a
 purpose that is entirely well-defined independent of the application.
 Therefore, Subsection 2d requires that any application-supplied
 function or table used by this function must be optional: if the
 application does not supply it, the square root function must still
 compute square roots.)</P>
</LI>
</LI>
</LI>
</LI>
</OL>
<P>These requirements apply to the modified work as a whole. If
 identifiable sections of that work are not derived from the Library,
 and can be reasonably considered independent and separate works in
 themselves, then this License, and its terms, do not apply to those
 sections when you distribute them as separate works. But when you
 distribute the same sections as part of a whole which is a work based
 on the Library, the distribution of the whole must be on the terms of
 this License, whose permissions for other licensees extend to the
 entire whole, and thus to each and every part regardless of who wrote
 it.</P>
<P>Thus, it is not the intent of this section to claim rights or contest
 your rights to work written entirely by you; rather, the intent is to
 exercise the right to control the distribution of derivative or
 collective works based on the Library.</P>
<P>In addition, mere aggregation of another work not based on the
 Library with the Library (or with a work based on the Library) on a
 volume of a storage or distribution medium does not bring the other
 work under the scope of this License.</P>
<P><STRONG>3.</STRONG> You may opt to apply the terms of the ordinary
 GNU General Public License instead of this License to a given copy of
 the Library. To do this, you must alter all the notices that refer to
 this License, so that they refer to the ordinary GNU General Public
 License, version 2, instead of to this License. (If a newer version
 than version 2 of the ordinary GNU General Public License has appeared,
 then you can specify that version instead if you wish.) Do not make any
 other change in these notices.</P>
<P>Once this change is made in a given copy, it is irreversible for that
 copy, so the ordinary GNU General Public License applies to all
 subsequent copies and derivative works made from that copy.</P>
<P>This option is useful when you wish to copy part of the code of the
 Library into a program that is not a library.</P>
<P><STRONG>4.</STRONG> You may copy and distribute the Library (or a
 portion or derivative of it, under Section 2) in object code or
 executable form under the terms of Sections 1 and 2 above provided that
 you accompany it with the complete corresponding machine-readable
 source code, which must be distributed under the terms of Sections 1
 and 2 above on a medium customarily used for software interchange.</P>
<P>If distribution of object code is made by offering access to copy
 from a designated place, then offering equivalent access to copy the
 source code from the same place satisfies the requirement to distribute
 the source code, even though third parties are not compelled to copy
 the source along with the object code.</P>
<P><STRONG>5.</STRONG> A program that contains no derivative of any
 portion of the Library, but is designed to work with the Library by
 being compiled or linked with it, is called a &quot;work that uses the
 Library&quot;. Such a work, in isolation, is not a derivative work of the
 Library, and therefore falls outside the scope of this License.</P>
<P>However, linking a &quot;work that uses the Library&quot; with the Library
 creates an executable that is a derivative of the Library (because it
 contains portions of the Library), rather than a &quot;work that uses the
 library&quot;. The executable is therefore covered by this License. Section
 6 states terms for distribution of such executables.</P>
<P>When a &quot;work that uses the Library&quot; uses material from a header file
 that is part of the Library, the object code for the work may be a
 derivative work of the Library even though the source code is not.
 Whether this is true is especially significant if the work can be
 linked without the Library, or if the work is itself a library. The
 threshold for this to be true is not precisely defined by law.</P>
<P>If such an object file uses only numerical parameters, data structure
 layouts and accessors, and small macros and small inline functions (ten
 lines or less in length), then the use of the object file is
 unrestricted, regardless of whether it is legally a derivative work.
 (Executables containing this object code plus portions of the Library
 will still fall under Section 6.)</P>
<P>Otherwise, if the work is a derivative of the Library, you may
 distribute the object code for the work under the terms of Section 6.
 Any executables containing that work also fall under Section 6, whether
 or not they are linked directly with the Library itself.</P>
<P><STRONG>6.</STRONG> As an exception to the Sections above, you may
 also compile or link a &quot;work that uses the Library&quot; with the Library to
 produce a work containing portions of the Library, and distribute that
 work under terms of your choice, provided that the terms permit
 modification of the work for the customer's own use and reverse
 engineering for debugging such modifications.</P>
<P>You must give prominent notice with each copy of the work that the
 Library is used in it and that the Library and its use are covered by
 this License. You must supply a copy of this License. If the work
 during execution displays copyright notices, you must include the
 copyright notice for the Library among them, as well as a reference
 directing the user to the copy of this License. Also, you must do one
 of these things:</P>
<OL TYPE="a">
<LI>Accompany the work with the complete corresponding machine-readable
 source code for the Library including whatever changes were used in the
 work (which must be distributed under Sections 1 and 2 above); and, if
 the work is an executable linked with the Library, with the complete
 machine-readable &quot;work that uses the Library&quot;, as object code and/or
 source code, so that the user can modify the Library and then relink to
 produce a modified executable containing the modified Library. (It is
 understood that the user who changes the contents of definitions files
 in the Library will not necessarily be able to recompile the
 application to use the modified definitions.)
<P></P>
<LI>Accompany the work with a written offer, valid for at least three
 years, to give the same user the materials specified in Subsection 6a,
 above, for a charge no more than the cost of performing this
 distribution.
<P></P>
<LI>If distribution of the work is made by offering access to copy from
 a designated place, offer equivalent access to copy the above specified
 materials from the same place.
<P></P>
<LI>Verify that the user has already received a copy of these materials
 or that you have already sent this user a copy.</LI>
</LI>
</LI>
</LI>
</OL>
<P>For an executable, the required form of the &quot;work that uses the
 Library&quot; must include any data and utility programs needed for
 reproducing the executable from it. However, as a special exception,
 the source code distributed need not include anything that is normally
 distributed (in either source or binary form) with the major components
 (compiler, kernel, and so on) of the operating system on which the
 executable runs, unless that component itself accompanies the
 executable.</P>
<P>It may happen that this requirement contradicts the license
 restrictions of other proprietary libraries that do not normally
 accompany the operating system. Such a contradiction means you cannot
 use both them and the Library together in an executable that you
 distribute.</P>
<P><STRONG>7.</STRONG> You may place library facilities that are a work
 based on the Library side-by-side in a single library together with
 other library facilities not covered by this License, and distribute
 such a combined library, provided that the separate distribution of the
 work based on the Library and of the other library facilities is
 otherwise permitted, and provided that you do these two things:</P>
<OL TYPE="a">
<LI>Accompany the combined library with a copy of the same work based on
 the Library, uncombined with any other library facilities. This must be
 distributed under the terms of the Sections above.
<P></P>
<LI>Give prominent notice with the combined library of the fact that
 part of it is a work based on the Library, and explaining where to find
 the accompanying uncombined form of the same work.</LI>
</LI>
</OL>
<P><STRONG>8.</STRONG> You may not copy, modify, sublicense, link with,
 or distribute the Library except as expressly provided under this
 License. Any attempt otherwise to copy, modify, sublicense, link with,
 or distribute the Library is void, and will automatically terminate
 your rights under this License. However, parties who have received
 copies, or rights, from you under this License will not have their
 licenses terminated so long as such parties remain in full compliance.</P>
<P><STRONG>9.</STRONG> You are not required to accept this License,
 since you have not signed it. However, nothing else grants you
 permission to modify or distribute the Library or its derivative works.
 These actions are prohibited by law if you do not accept this License.
 Therefore, by modifying or distributing the Library (or any work based
 on the Library), you indicate your acceptance of this License to do so,
 and all its terms and conditions for copying, distributing or modifying
 the Library or works based on it.</P>
<P><STRONG>10.</STRONG> Each time you redistribute the Library (or any
 work based on the Library), the recipient automatically receives a
 license from the original licensor to copy, distribute, link with or
 modify the Library subject to these terms and conditions. You may not
 impose any further restrictions on the recipients' exercise of the
 rights granted herein. You are not responsible for enforcing compliance
 by third parties to this License.</P>
<P><STRONG>11.</STRONG> If, as a consequence of a court judgment or
 allegation of patent infringement or for any other reason (not limited
 to patent issues), conditions are imposed on you (whether by court
 order, agreement or otherwise) that contradict the conditions of this
 License, they do not excuse you from the conditions of this License. If
 you cannot distribute so as to satisfy simultaneously your obligations
 under this License and any other pertinent obligations, then as a
 consequence you may not distribute the Library at all. For example, if
 a patent license would not permit royalty-free redistribution of the
 Library by all those who receive copies directly or indirectly through
 you, then the only way you could satisfy both it and this License would
 be to refrain entirely from distribution of the Library.</P>
<P>If any portion of this section is held invalid or unenforceable under
 any particular circumstance, the balance of the section is intended to
 apply, and the section as a whole is intended to apply in other
 circumstances.</P>
<P>It is not the purpose of this section to induce you to infringe any
 patents or other property right claims or to contest validity of any
 such claims; this section has the sole purpose of protecting the
 integrity of the free software distribution system which is implemented
 by public license practices. Many people have made generous
 contributions to the wide range of software distributed through that
 system in reliance on consistent application of that system; it is up
 to the author/donor to decide if he or she is willing to distribute
 software through any other system and a licensee cannot impose that
 choice.</P>
<P>This section is intended to make thoroughly clear what is believed to
 be a consequence of the rest of this License.</P>
<P><STRONG>12.</STRONG> If the distribution and/or use of the Library is
 restricted in certain countries either by patents or by copyrighted
 interfaces, the original copyright holder who places the Library under
 this License may add an explicit geographical distribution limitation
 excluding those countries, so that distribution is permitted only in or
 among countries not thus excluded. In such case, this License
 incorporates the limitation as if written in the body of this License.</P>
<P><STRONG>13.</STRONG> The Free Software Foundation may publish revised
 and/or new versions of the Library General Public License from time to
 time. Such new versions will be similar in spirit to the present
 version, but may differ in detail to address new problems or concerns.</P>
<P>Each version is given a distinguishing version number. If the Library
 specifies a version number of this License which applies to it and &quot;any
 later version&quot;, you have the option of following the terms and
 conditions either of that version or of any later version published by
 the Free Software Foundation. If the Library does not specify a license
 version number, you may choose any version ever published by the Free
 Software Foundation.</P>
<P><STRONG>14.</STRONG> If you wish to incorporate parts of the Library
 into other free programs whose distribution conditions are incompatible
 with these, write to the author to ask for permission. For software
 which is copyrighted by the Free Software Foundation, write to the Free
 Software Foundation; we sometimes make exceptions for this. Our
 decision will be guided by the two goals of preserving the free status
 of all derivatives of our free software and of promoting the sharing
 and reuse of software generally.</P>
<P><STRONG>NO WARRANTY</STRONG></P>
<P><STRONG>15.</STRONG> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE,
 THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY
 APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
 HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT
 WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
 OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU
 ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</P>
<P><STRONG>16.</STRONG> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
 AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
 MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
 LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL
 OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
 LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
 RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
 FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
 SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 DAMAGES.</P>
<H4>END OF TERMS AND CONDITIONS</H4>
<H1 ALIGN="RIGHT"><A NAME="COMMON_NETWORK">B - Common Network Settings</A>
</H1>
<P>This appendix covers many of the popular TCP/IP network interfaces
 and printer servers available on the market today.</P>
<H2><A NAME="10_1">Configuring a Network Interface</A></H2>
<P>When you first install a network printer or print server on your LAN,
 you need to set the Internet Protocol (&quot;IP&quot;) address. On most
 higher-end &quot;workgroup&quot; printers, you can set the address through the
 printer control panel. However, in most cases you will want to assign
 the addresses remotely from your workstation. This makes administration
 a bit easier and avoids assigning duplicate addresses accidentally.</P>
<P>To setup your printer or print server for remote address assignment,
 you'll need the Ethernet Media Access Control (&quot;MAC&quot;) address, also
 sometimes called a node address, and the IP address you want to use for
 the device. The Ethernet MAC address can often be found on the printer
 test page or bottom of the print server.
<!-- NEED 3in -->
</P>
<H3><A NAME="10_1_1">Configuring the IP Address Using ARP</A></H3>
<P>The easiest way to set the IP address of a network device is to use
 the <CODE>arp(8)</CODE> command. The <CODE>arp</CODE> sends an Address
 Resolution Protocol (&quot;ARP&quot;) packet to the specified Ethernet MAC
 address, setting the network device's IP address:</P>
<UL>
<PRE>
<B>arp -s ip-address ethernet-address ENTER</B>
<B>arp -s host.domain.com 08:00:69:00:12:34 ENTER</B>
<B>arp -s 192.0.2.2 08:00:69:00:12:34 ENTER</B>
</PRE>
</UL>
<H3><A NAME="10_1_2">Configuring the IP Address Using RARP</A></H3>
<P>The most flexible way to remotely assign IP addresses under UNIX is
 through the Reverse Address Resolution Protocol (&quot;RARP&quot;). RARP allows a
 network device to request an IP address using its Ethernet MAC address,
 and one or more RARP servers on the network will respond with an ARP
 packet with the IP address the device can use.</P>
<P>RARP should be used when you have to manage many printers or print
 servers, or when you have a network device that does not remember its
 IP address after a power cycle. If you just have a single printer or
 print server, the <CODE>arp</CODE> command is the way to go.</P>
<P>Some UNIX operating systems use a program called <CODE>rarpd(8)</CODE>
 to manage RARP. Others, like Linux, support this protocol in the
 kernel. For systems that provide the <CODE>rarpd</CODE> program you
 will need to start it before RARP lookups will work:</P>
<UL>
<PRE>
<B>rarpd ENTER</B>
</PRE>
</UL>
<P>Under IRIX you can enable this functionality by default using:</P>
<UL>
<PRE>
<B>chkconfig rarpd on ENTER</B>
</PRE>
</UL>
<P>Both the <CODE>rarpd</CODE> program and kernel RARP support read a
 list of Ethernet and IP addresses from the file<VAR> /etc/ethers</VAR>.
 Each line contains the Ethernet address (colon delimited) followed by
 an IP address or hostname like:</P>
<UL>
<PRE>
08:00:69:00:12:34 myprinter.mydomain.com
08:00:69:00:12:34 192.0.2.2
</PRE>
</UL>
<P>Add a line to this file and cycle the power on the printer or print
 server to set its address.
<!-- NEED 2in -->
</P>
<H3><A NAME="10_1_3">Configuring the IP Address Using BOOTP</A></H3>
<P>The BOOTP protocol is used when you need to provide additional
 information such as the location of a configuration file to the network
 interface. Using the standard <CODE>bootpd(8)</CODE> program supplied
 with UNIX you simply need to add a line to the<VAR> /etc/bootptab</VAR>
 file; for IRIX:</P>
<UL>
<PRE>
myprinter 08:00:69:00:12:34 192.0.2.2 <VAR>myprinter.boot</VAR>
</PRE>
</UL>

<!-- NEED 1in -->
<P>Newer versions of <CODE>bootpd</CODE> use a different format:</P>
<UL>
<PRE>
myprinter:ha=080069001234:ip=192.0.2.2:<VAR>t144=myprinter.boot</VAR>
</PRE>
</UL>
<P>The<VAR> myprinter.boot</VAR> file resides in the<VAR>
 /usr/local/boot</VAR> directory by default. If you do not need to
 provide a boot file you may leave the last part of the line blank.</P>

<!-- NEED 2in -->
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Some versions of UNIX do not enable the BOOTP service by default. The<VAR>
 /etc/inetd.conf</VAR> usually contains a line for the BOOTP service
 that can be uncommented if needed.</P>
</TD></TR>
</TABLE>
</CENTER>
<H2><A NAME="10_2">Verifying the Printer Connection</A></H2>
<P>To test that the IP address has been successfully assigned and that
 the printer is properly connected to your LAN, type:</P>
<UL>
<PRE>
<B>ping ip-address ENTER</B>
</PRE>
</UL>
<P>If the connection is working properly you will see something like:</P>
<UL>
<PRE>
<B>ping myprinter ENTER</B>
PING myprinter (192.0.2.2): 56 data bytes
64 bytes from 192.0.2.2: icmp_seq=0 ttl=15 time=5 ms
64 bytes from 192.0.2.2: icmp_seq=1 ttl=15 time=3 ms
64 bytes from 192.0.2.2: icmp_seq=2 ttl=15 time=3 ms
64 bytes from 192.0.2.2: icmp_seq=3 ttl=15 time=3 ms
</PRE>
</UL>
<P>If not, verify that the printer or print server is connected to the
 LAN, it is powered on, the LAN cabling is good, and the IP address is
 set correctly. You can usually see the current IP address and network
 status by printing a configuration or test page on the device.
<!-- NEED 4in -->
</P>
<H2><A NAME="10_3">Common Network Interface Settings</A></H2>
<P>Once you have set the IP address you can access the printer or print
 server using the <CODE>ipp</CODE>, <CODE>lpd</CODE>, or <CODE>socket</CODE>
 backends. The following is a list of common network interfaces and
 printer servers and the settings you should use with CUPS:
<CENTER>
<TABLE BORDER="1">
<TR ALIGN="LEFT" VALIGN="TOP"><TH>Model/Manufacturer</TH><TH>Device
 URI(s)</TH></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Apple LaserWriter</TD><TD>lpd://<I>
address</I>/PASSTHRU</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Axis w/o IPP
<BR><A HREF="#AXIS"> (see directions)</A></TD><TD>socket://<I>address</I>
:9100
<BR> socket://<I>address</I>:9101
<BR> socket://<I>address</I>:9102</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Axis w/IPP</TD><TD>ipp://<I>address</I>
/LPT1
<BR> ipp://<I>address</I>/LPT2
<BR> ipp://<I>address</I>/COM1</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Castelle LANpress<SUP>TM</SUP></TD><TD>
lpd://<I>address</I>/pr1
<BR> lpd://<I>address</I>/pr2
<BR> lpd://<I>address</I>/pr3</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>DPI NETPrint</TD><TD>lpd://<I>address</I>
/pr1
<BR> lpd://<I>address</I>/pr2
<BR> lpd://<I>address</I>/pr3</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>EFI&reg; Fiery&reg; RIP</TD><TD>lpd://<I>
address</I>/print</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>EPSON&reg; Multiprotocol Ethernet
 Interface Board</TD><TD>socket://<I>address</I></TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Extended System ExtendNET</TD><TD>
lpd://<I>address</I>/pr1
<BR> lpd://<I>address</I>/pr2
<BR> lpd://<I>address</I>/pr3</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Hewlett Packard JetDirect w/o IPP</TD><TD>
socket://<I>address</I>:9100
<BR> socket://<I>address</I>:9101
<BR> socket://<I>address</I>:9102</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Hewlett Packard JetDirect w/IPP</TD><TD>
ipp://<I>address</I>/ipp
<BR> ipp://<I>address</I>/ipp/port1
<BR> ipp://<I>address</I>/ipp/port2
<BR> ipp://<I>address</I>/ipp/port3</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Intel&reg; NetportExpress XL, PRO/100</TD><TD>
lpd://<I>address</I>/LPT1_PASSTHRU
<BR> lpd://<I>address</I>/LPT2_PASSTHRU
<BR> lpd://<I>address</I>/COM1_PASSTHRU</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Lexmark<SUP>TM</SUP> MarkNet</TD><TD>
lpd://<I>address</I>/ps</TD></TR>

<!-- NEED 1in -->
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Linksys EtherFast&reg;
<BR><A HREF="#LINKSYS"> (see directions)</A></TD><TD>socket://<I>address</I>
:4010
<BR> socket://<I>address</I>:4020
<BR> socket://<I>address</I>:4030</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Kodak&reg;</TD><TD>lpd://<I>address</I>/ps</TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>QMS&reg; CrownNet<SUP>TM</SUP></TD><TD>
lpd://<I>address</I>/ps</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>Tektronix&reg; PhaserShare<SUP>TM</SUP></TD><TD>
socket://<I>address</I>:9100</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>XEROX&reg; 4512 NIC</TD><TD>lpd://<I>
address</I>/PORT1</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>XEROX&reg; XNIC</TD><TD>lpd://<I>address</I>
/PASSTHRU</TD></TR>
<TR ALIGN="LEFT" VALIGN="TOP"><TD>XEROX&reg; (most others)</TD><TD>socket://<I>
address</I>:5503</TD></TR>
</TABLE>
</CENTER>
</P>
<H2><A NAME="AXIS">Configuring Axis Print Servers</A></H2>
<P>The Axis print servers can be configured using ARP, RARP, or BOOTP.
 However, on models that do not provide IPP support an additional step
 must be performed to configure the TCP/IP portion of the print server
 for use with CUPS.
<!-- NEED 3in -->
</P>
<P>Each print server contains a configuration file named<VAR> config</VAR>
 that contains a list of network parameters used by the server. To
 modify this file you must first download it from the print server using
 the <CODE>ftp(1)</CODE> program:</P>
<UL>
<PRE>
<B>ftp ip-address ENTER</B>
Connected to ip-address.
220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
ftp&gt; <B>user root ENTER</B>
331 User name ok, need password
Password: <B>pass ENTER</B> <I>(this is not echoed)</I>
230 User logged in
ftp&gt; <B>get config ENTER</B>
local: config remote: config
200 PORT command successful.
150 Opening data connection for config (192,0,2,2),
(mode ascii).
226 Transfer complete.
##### bytes received in #.## seconds (##### Kbytes/s)
ftp&gt; <B>quit ENTER</B>
221 Goodbye.
</PRE>
</UL>

<!-- NEED 2in -->
<P>Next, edit the file with your favorite text editor and locate the
 lines beginning with:</P>
<UL>
<PRE>
RTN_OPT.     : YES
RTEL_PR1.    : 0
RTEL_PR2.    : 0
RTEL_PR3.    : 0
RTEL_PR4.    : 0
RTEL_PR5.    : 0
RTEL_PR6.    : 0
RTEL_PR7.    : 0
RTEL_PR8.    : 0
</PRE>
</UL>

<!-- NEED 1in -->
 Change the <CODE>RTN_OPT</CODE> line to read:
<UL>
<PRE>
RTN_OPT.     : <B>NO</B>
</PRE>
</UL>

<!-- NEED 2in -->
<P>This disables the Reverse TELNET protocol and enables the standard
 TELNET protocol on the print server. Next, assign a port number for
 each parallel and serial port on the server as follows:</P>
<UL>
<PRE>
RTEL_PR1.    : <B>9100</B>
RTEL_PR2.    : <B>9101</B>
RTEL_PR3.    : <B>9102</B>
RTEL_PR4.    : <B>9103</B>
RTEL_PR5.    : <B>9104</B>
RTEL_PR6.    : <B>9105</B>
RTEL_PR7.    : <B>9106</B>
RTEL_PR8.    : <B>9107</B>
</PRE>
</UL>

<!-- NEED 4in -->
<P>This essentially makes the Axis print server look like a Hewlett
 Packard JetDirect EX print server. Save the file and then upload the
 new<VAR> config</VAR> file using the <CODE>ftp</CODE> command:</P>
<UL>
<PRE>
<B>ftp ip-address ENTER</B>
Connected to ip-address.
220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
ftp&gt; <B>user root ENTER</B>
331 User name ok, need password
Password: <B>pass ENTER</B> <I>(this is not echoed)</I>
230 User logged in
ftp&gt; <B>put config CONFIG ENTER</B>
local: config remote: CONFIG
200 PORT command successful.
150 Opening data connection for config (192,0,2,2), (mode ascii).
226 Transfer complete.
##### bytes received in #.## seconds (##### Kbytes/s)
ftp&gt; <B>get hardreset ENTER</B>
local: hardreset remote: hardreset
200 PORT command successful.
421 Axis NPS ### hard reset, closing connection.
ftp&gt; <B>quit ENTER</B>
221 Goodbye.
</PRE>
</UL>
<P>Your Axis print server is now ready for use!</P>
<H2><A NAME="LINKSYS">Configuring Linksys Print Servers</A></H2>
<P>The Linksys print servers can be configured using ARP, RARP, or
 BOOTP. Like older Axis print servers, an additional step must be
 performed to configure the TCP/IP portion of the print server for use
 with CUPS.
<!-- NEED 3in -->
</P>
<P>Each print server contains a configuration file named<VAR> CONFIG</VAR>
 that contains a list of network parameters used by the server. To
 modify this file you must first download it from the print server using
 the <CODE>ftp(1)</CODE> program:</P>
<UL>
<PRE>
<B>ftp -n ip-address ENTER</B>
Connected to ip-address.
220 Print Server Ready.
Remote system type is Print.
ftp&gt; <B>get CONFIG ENTER</B>
local: CONFIG remote: CONFIG
200 Command OK.
150 Open ASCII Mode Connection.
WARNING! 68 bare linefeeds received in ASCII mode
File may not have transferred correctly.
226 Transfer complete.
##### bytes received in #.## seconds (##### Kbytes/s)
ftp&gt; <B>quit ENTER</B>
221 Goodbye.
</PRE>
</UL>

<!-- NEED 2in -->
<P>Next, edit the file with your favorite text editor and locate the
 lines beginning with:</P>
<UL>
<PRE>
0100 L1_PROUT:P1
0120 L2_PROUT:P1
0140 L3_PROUT:P1
</PRE>
</UL>
<P>Change the port number for each parallel and serial port on the
 server as follows:</P>
<UL>
<PRE>
0100 L1_PROUT:<B>P1</B>
0120 L2_PROUT:<B>P2</B>
0140 L3_PROUT:<B>P3</B>
</PRE>
</UL>

<!-- NEED 4in -->
<P>This maps each virtual printer with a physical port. Save the file
 and then upload the new<VAR> CONFIG</VAR> file using the <CODE>ftp</CODE>
 command:</P>
<UL>
<PRE>
<B>ftp -n ip-address ENTER</B>
Connected to ip-address.
220 Print Server Ready.
Remote system type is Print.
ftp&gt; <B>put CONFIG ENTER</B>
local: CONFIG remote: CONFIG
200 Command OK.
150 Open ASCII Mode Connection.
226 Transfer complete.
##### bytes received in #.## seconds (##### Kbytes/s)
ftp&gt; <B>quit ENTER</B>
221 Goodbye.
</PRE>
</UL>
<P>Your Linksys print server is now ready for use!</P>
<H1 ALIGN="RIGHT"><A NAME="PRINTER_DRIVERS">C - Printer Drivers</A></H1>
<P>This appendix lists the printer drivers that are provided with CUPS.</P>
<H2><A NAME="11_1">Printer Drivers</A></H2>
<P>CUPS includes the following printer drivers:</P>
<UL>
<LI><A HREF="#EPSON9">EPSON 9-pin Dot Matrix</A>,<VAR> epson9.ppd</VAR></LI>
<LI><A HREF="#EPSON24">EPSON 24-pin Dot Matrix</A>,<VAR> epson24.ppd</VAR>
</LI>
<LI><A HREF="#STCOLOR">EPSON Stylus Color</A>,<VAR> stcolor.ppd</VAR></LI>
<LI><A HREF="#STPHOTO">EPSON Stylus Photo</A>,<VAR> stphoto.ppd</VAR></LI>
<LI><A HREF="#DESKJET">HP DeskJet</A>,<VAR> deskjet.ppd</VAR></LI>
<LI><A HREF="#LASERJET">HP LaserJet</A>,<VAR> laserjet.ppd</VAR></LI>
</UL>
<H2><A NAME="EPSON9">EPSON 9-pin Dot Matrix</A></H2>
<P>The EPSON 9-pin Dot Matrix driver (<VAR>epson9.ppd</VAR>) supports
 9-pin dot matrix printers that implement the ESC/P command set. It
 provides 60x72, 120x72, and 240x72 DPI output in black only.</P>
<H2><A NAME="EPSON24">EPSON 24-pin Dot Matrix</A></H2>
<P>The EPSON 24-pin Dot Matrix driver (<VAR>epson9.ppd</VAR>) supports
 24-pin dot matrix printers that implement the ESC/P command set. It
 provides 120x180, 180x180, 360x180, and 360x360 DPI output in black
 only.</P>
<H2><A NAME="STCOLOR">EPSON Stylus Color</A></H2>
<P>The EPSON Stylus Color driver (<VAR>stcolor.ppd</VAR>) supports EPSON
 Stylus Color printers that implement the ESC/P2 command set. It
 provides 180, 360, and 720 DPI output in black and color (CMYK).</P>
<H2><A NAME="STPHOTO">EPSON Stylus Photo</A></H2>
<P>The EPSON Stylus Photo driver (<VAR>stphoto.ppd</VAR>) supports EPSON
 Stylus Photo printers that implement the ESC/P2 command set. It
 provides 180, 360, and 720 DPI output in black and color (CMYKcm).</P>
<H2><A NAME="DESKJET">HP DeskJet</A></H2>
<P>The HP DeskJet driver (<VAR>deskjet.ppd</VAR>) supports HP DeskJet
 printers that implement the PCL command set. It provides 150, 300, and
 600 DPI output in black and color (CMYK).</P>
<P>The DeskJet printers that implement the HP-PPA command set (720C,
 722C, 820C, and 1100C) are<B> not</B> supported due to a complete lack
 of documentation and support from Hewlett Packard.</P>
<P>The duplexer provided with the HP DeskJet 900 series printers is also
 not supported for similar reasons.</P>
<H2><A NAME="LASERJET">HP LaserJet</A></H2>
<P>The HP LaserJet driver (<VAR>laserjet.ppd</VAR>) supports HP LaserJet
 printers that implement the PCL command set. It provides 150, 300, and
 600 DPI output in black only and supports the duplexer if installed.</P>
<P>LaserJet printers that do not implement PCL (3100, 3150) are not
 supported due to a complete lack of documentation and support from
 Hewlett Packard.</P>
<H1 ALIGN="RIGHT"><A NAME="FILES">D - List of Files</A></H1>
<P>This appendix lists the files and directories that are installed for
 the Common UNIX Printing System.
<CENTER>
<TABLE BORDER="1" WIDTH="80%">
<TR VALIGN="TOP"><TH>Pathname</TH><TH>Description</TH></TR>
<TR VALIGN="TOP"><TD>/etc/cups/certs/</TD><TD>The location of
 authentication certificate files for local HTTP clients.</TD></TR>
<TR VALIGN="TOP"><TD>/etc/cups/classes.conf</TD><TD>The printer classes
 configuration file for the scheduler.</TD></TR>
<TR VALIGN="TOP"><TD>/etc/cups/cupsd.conf</TD><TD>The scheduler
 configuration file.</TD></TR>
<TR VALIGN="TOP"><TD>/etc/cups/interfaces/</TD><TD>The location of
 System V interface scripts for printers.</TD></TR>
<TR VALIGN="TOP"><TD>/etc/cups/mime.convs</TD><TD>The list of standard
 file filters included with CUPS.</TD></TR>
<TR VALIGN="TOP"><TD>/etc/cups/mime.types</TD><TD>The list of recognized
 file types for CUPS.</TD></TR>
<TR VALIGN="TOP"><TD>/etc/cups/ppd/</TD><TD>The location of PostScript
 Printer Description (&quot;PPD&quot;) files for printers.</TD></TR>
<TR VALIGN="TOP"><TD>/etc/cups/printers.conf</TD><TD>The printer
 configuration file for the scheduler.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/bin/cancel</TD><TD>The System V cancel job(s)
 command.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/bin/disable</TD><TD>The System V disable
 printer command.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/bin/enable</TD><TD>The System V enable printer
 command.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/bin/lp</TD><TD>The System V print command.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/bin/lpoptions</TD><TD>Sets user-defined
 printing options and defaults.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/bin/lppasswd</TD><TD>Adds, changes, or removes
 Digest password accounts.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/bin/lpq</TD><TD>The Berkeley status command.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/bin/lpr</TD><TD>The Berkeley print command.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/bin/lprm</TD><TD>The Berkeley cancel job(s)
 command.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/bin/lpstat</TD><TD>The System V status
 command.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/include/cups/</TD><TD>CUPS API header files.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/lib32/libcups.a
<BR> /usr/lib32/libcupsimage.a</TD><TD>Static libraries (IRIX 6.5)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib/libcups.a
<BR> /usr/lib/libcupsimage.a</TD><TD>Static libraries (all others)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib/libcups.sl.2
<BR> /usr/lib/libcupsimage.sl.2</TD><TD>Shared libraries (HP-UX)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib32/libcups.so.2
<BR> /usr/lib32/libcupsimage.so.2</TD><TD>Shared libraries (IRIX 6.5)</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/lib/libcups.so.2
<BR> /usr/lib/libcupsimage.so.2</TD><TD>Shared libraries (all others)</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/lib/cups/backend/</TD><TD>Backends for various
 types of printer connections.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib/cups/cgi-bin/</TD><TD>CGI programs for the
 scheduler.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib/cups/daemon/</TD><TD>Daemons for polling
 and LPD support.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib/cups/filter/</TD><TD>Filters for various
 types of files.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib/locale/</TD><TD>The location of
 language-specific message files. (System V)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/lib/nls/msg/</TD><TD>The location of
 language-specific message files. (Compaq Tru64 UNIX)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/locale/</TD><TD>The location of
 language-specific message files. (Linux, *BSD)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/sbin/accept</TD><TD>The accept-jobs command.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/sbin/cupsd</TD><TD>The CUPS print scheduler.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/sbin/lpadmin</TD><TD>The System V printer
 administration tool.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/sbin/lpc</TD><TD>The Berkeley printer
 administration tool.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/sbin/lpinfo</TD><TD>The get-devices and
 get-ppds command.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/sbin/lpmove</TD><TD>The move-jobs command.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/sbin/reject</TD><TD>The reject-jobs command.</TD>
</TR>
<TR VALIGN="TOP"><TD>/usr/share/catman/a_man/
<BR> /usr/share/catman/u_man/</TD><TD>Man pages (IRIX)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/man/</TD><TD>Man pages (Compaq Tru64
 UNIX, HP-UX, Solaris)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/man/</TD><TD>Man pages (all others)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/cups/data/</TD><TD>The location of
 filter data files.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/cups/data/testprint.ps</TD><TD>The
 PostScript test page file.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/cups/fonts/</TD><TD>The location of
 PostScript fonts for the PostScript RIP.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/cups/model/</TD><TD>The location of
 PostScript Printer Description (&quot;PPD&quot;) files and interface scripts that
 may be used to setup a printer queue.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/cups/pstoraster/</TD><TD>Other
 PostScript RIP initialization files.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/cups/pstoraster/Fontmap</TD><TD>The font
 mapping file (converts filenames to fontnames)</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/cups/templates/</TD><TD>The location of
 HTML template files for the web interfaces.</TD></TR>
<TR VALIGN="TOP"><TD>/usr/share/doc/cups/</TD><TD>Documentation and web
 page data for the scheduler.</TD></TR>
<TR VALIGN="TOP"><TD>/var/log/cups/</TD><TD>The location of scheduler
 log files.</TD></TR>
<TR VALIGN="TOP"><TD>/var/spool/cups/</TD><TD>The location of print
 files waiting to be printed.</TD></TR>
</TABLE>
</CENTER>
</P>
<H1 ALIGN="RIGHT"><A NAME="FAQ">E - Troubleshooting Common Problems</A></H1>
<P>This appendix covers some of the common problems first-time users
 encounter when installing and configuring CUPS.</P>
<P>Commercial support for CUPS is available from Easy Software Products.
 For more information please contact us at:</P>
<UL>
<LI>WWW:<A HREF="http://www.easysw.com"> <CODE>http://www.easysw.com</CODE>
</A></LI>
<LI>EMail:<A HREF="mailto:info@easysw.com"> info@easysw.com</A></LI>
<LI>Telephone (M-F, 9-5 EST): +1.301.373.9600</LI>
</UL>
<H2><A NAME="13_1">My Applications Don't See the Available Printers</A></H2>
<P>Many applications read the<VAR> /etc/printcap</VAR> file to get a
 list of available printers.</P>
<P>The default CUPS configuration does not create the<VAR> /etc/printcap</VAR>
 file automatically. To enable automatic creation and updating of this
 file, use the<A HREF="#Printcap"> <CODE>Printcap</CODE></A> directive
 described in<A HREF="#PRINTING_MANAGEMENT"> Chapter 6, &quot;Printing System
 Management&quot;</A>.</P>
<H2><A NAME="13_2">CUPS Doesn't Recognize My Username or Password!</A></H2>
<P>CUPS will ask you for a UNIX username and password when you perform
 printer administration tasks remotely or via a web browser. The default
 configuration requires that you use the <CODE>root</CODE> username and
 the corresponding password to authenticate the request.</P>
<P>CUPS does not allow you to authenticate an administration request
 with an account that has no password for security reasons. If you do
 not have a password on your <CODE>root</CODE> account then you won't be
 able to add printers remotely or via the web interface!
<!-- NEED 2in -->
</P>
<P>To disable password authentication you need to edit the<VAR>
 /etc/cups/cupsd.conf</VAR> file and comment out the lines reading:</P>
<UL>
<PRE>
AuthType Basic
AuthClass System
</PRE>
</UL>
 for the<VAR> /admin</VAR> location. Then restart the CUPS server as
 described in<A HREF="#PRINTING_MANAGEMENT"> Chapter 6, &quot;Printing System
 Management&quot;</A>.
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Disabling password checks will allow any local user to change your
 printer and class configuration, but remote administration from another
 machine will still not be allowed.</P>
</TD></TR>
</TABLE>
</CENTER>
<H2><A NAME="ALLOW_REMOTE">I Can't Do Administration Tasks from Another
 Machine!</A></H2>
<P>The default CUPS configuration limits administration to the local
 machine. To open up access, edit the<VAR> /etc/cups/cupsd.conf</VAR>
 and comment out the lines reading:</P>
<UL>
<PRE>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</PRE>
</UL>
 for the<VAR> /admin</VAR> location. Then restart the CUPS server as
 described in<A HREF="#PRINTING_MANAGEMENT"> Chapter 6, &quot;Printing System
 Management&quot;</A>.
<CENTER>
<TABLE BGCOLOR="#cccccc" BORDER="1" CELLPADDING="5" WIDTH="80%">
<TR><TD><B> NOTE:</B>
<P>Allowing administration access from all hosts is a potential security
 risk. Please read<A HREF="#PRINTING_SECURITY"> Chapter 6, &quot;Printing
 System Management&quot;</A> for a description of these risks and ways to
 minimize them.</P>
</TD></TR>
</TABLE>
</CENTER>

<!-- NEED 4in -->
<H2><A NAME="13_4">I Can't Do Administration Tasks from My Web Browser!</A>
</H2>
<P>This problem is usually caused by:</P>
<OL>
<LI>not specifying the correct password for the root account.</LI>
<LI>accessing the CUPS server using the hostname or IP address of the
 server without enabling remote access for administration functions.
 This can be corrected by following the instructions in the<A HREF="#ALLOW_REMOTE">
 &quot;I Can't Do Administration Tasks from Another Machine!&quot;</A> section
 earlier in this appendix.</LI>
<LI>not setting a password on the root account. CUPS will not
 authenticate a user account that does not have a password for security
 reasons.</LI>
<LI>authenticating using an account other than root, but the account you
 are using is not a member of the system group.</LI>
<LI>configuring CUPS to use Digest authentication, but your web browser
 does not support Digest authentication.</LI>
</OL>
<H2><A NAME="13_5">Connection Refused Messages</A></H2>
<P>Under normal circumstances, &quot;connection refused&quot; messages for a
 networked printer should be expected from time to time. Most network
 interfaces only allow a single connection to be made at any given time
 (one job at a time) and will refuse access to all other systems while
 the first connection is active. CUPS automatically retries the
 connection once every 30 seconds.</P>
<P>If the problem persists and you are unable to print any jobs to the
 printer, verify that another machine is not maintaining a connection
 with the printer, and that you have selected the proper port or printer
 name for the printer.</P>
<P>Also, most external print servers will refuse connections if the
 connected printer is turned off or is off-line. Verify that the
 affected printer is turned on and is online.</P>
<H2><A NAME="13_6">Write Error Messages</A></H2>
<P>If you get &quot;write error&quot; messages on a printer queue the printer
 interface (usually a Hewlett Packard JetDirect interface) has timed out
 and reset the network connection from your workstation.</P>
<P>The error is caused by that startup delay between the initial setup
 of the printer or plotter and the first page of print data that is
 sent.
<!-- NEED 3in -->
</P>
<P>To correct the problem, change the idle timeout on the interface to
 at least 180 seconds or 3 minutes. To change the timeout on a Hewlett
 Packard JetDirect interface, type:</P>
<UL>
<PRE>
<B>telnet ip-address ENTER</B>

Trying ip-address...
Connected to ip-address.
Escape character is `^]'.

Please type [Return] two times, to initialize telnet configuration
For HELP type &quot;?&quot;
&gt; <B>idle-timeout: 180 ENTER</B>
&gt; <B>quit ENTER</B>
</PRE>
</UL>
</BODY>
</HTML>