lpd man page on BSDOS

Man page or keyword search:  
man Server   6284 pages
apropos Keyword Search (all sections)
Output format
BSDOS logo
[printable version]



LPD(8)							   LPD(8)

NAME
       lpd - line printer daemon

SYNOPSIS
       lpd [-Llogfile] [-F] [-V] [-Ddebugopt]

DESCRIPTION
       The lpd program is the printer server program of the LPRng
       software suite.	This software is an enhanced and modified
       version of the Berkeley LPD software.

OPTIONS
       -L logfile
	    specifies  an  alternate  file to be used for logging
	    error and debugging messages.  The syslog(8) facility
	    is used to log critical messages as well.

       -F   Under  normal  operation,  the LPD server will run in
	    background mode.  The -F flag forces  it  to  run  in
	    forground mode, where it is more easily debugged.

       -V   Print program version information.

       -D debugopt
	    Debugging  is  controlled  using  the -D option. This
	    accepts a comma-separated list of debugging settings.
	    These  settings take one of two forms: facility=value
	    , or value to set  an  overall  default  value.   The
	    available  facilities  can	be determined by invoking
	    LPD with the -D= parameter.

OPERATION
       Lpd is the line printer daemon (spool queue  handler)  and
       is  normally  invoked at boot time from the rc(8) file; it
       can also be started by a user.  Note that the  lpd  server
       needs  only  run	 on  systems  where  actual  printing  or
       spooling	 is  taking  place.   lpr(1)  and  other  related
       programs	 transfer  files  using network facilities to the
       lpd .

       When started, lpd reads a  configuration	 file  to  obtain
       basic   operational   parameters	  and	then   reads  the
       printcap(5) database information to  determine  the  which
       printers have spool queues and to start spool queue server
       processes.  If running as a  background	server,	 it  will
       disconnect  from	 its  control  terminal	 and  run  in the
       background.   It	 uses  the  system  calls  listen(2)  and
       accept(2) to receive requests to print files in the queue,
       transfer files to the spooling area,  display  the  queue,
       remove  jobs  from  the	queue,	or  perform a spool queue
       control function.  In each case it  creates  one	 or  more
       server processes to handle the request and the lpd process
       will listen for more requests.

LPRng			LPRng-3.6.14beta28			1

LPD(8)							   LPD(8)

       Sending the server a SIGHUP signal causes  the  server  to
       reread  the  various  configuration  and	 inititialization
       files.  This action is similar to that of  the  INETD  and
       other  servers.	 The  same  action  is	taken when sent a
       reread command by the lpc(1) program.   At  an  interveral
       specified  by  the  poll_time  configuration variable, lpd
       will check for spool queues  with  jobs	and  no	 printing
       activity, and start printing.

       LPD  access  control  is	 done  using a rule set and match
       algorithm similar to a packet filter.   Each  request  for
       printing, status, or control operations is matched against
       the rule	 set,  and  the	 first	ACCEPT	or  REJECT  value
       determines   if	the  operation	can  be	 performed.   The
       following is a typical permissions file:
	      # Set default permissions
	      DEFAULT ACCEPT
	      # Reject any connections from outside our subnet
	      REJECT SERVICE=X NOT IP=130.191.0.0/255.255.0.0
	      # Only accept Printing (P) and spooling (LPR) from
	      # Engineering Lab or the Dean's office
	      REJECT SERVICE=P,R NOT REMOTEHOST=*.eng.astart.com,dean.astart.com
	      # Do not accept forwarded jobs for printing
	      REJECT SERVICE=P FORWARD
	      # Allow only the administrators control access
	      ACCEPT SERVICE=C,M REMOTEHOST=spooler.eng.astart.com USER=root,papowell
	      ACCEPT SERVICE=C,M SERVER REMOTEUSER=root,papowell
	      # Allow only the user on the same host who spooled job to remove it
	      ACCEPT SERVICE=M SAMEUSER SAMEHOST
	      REJECT SERVICE=M,C

       Permission checking is done by using a  set  of	keys  (or
       fields)	with  associated  values to check for permission.
       The  SERVICE  key  has  value  P	  for	printing   (i.e.-
       unspooling),  R	for spooling (i.e.- LPR request), C and S
       for printer control and	status	respectively  (i.e.-  LPC
       request),  M for removal (i.e.- LPRM request), Q for queue
       information (i.e.- LPRM request), and so forth.	 The  key
       indicates  the  initial connection to the LPD spooler, and
       can be used to control connections  from	 remote	 systems.
       The  values  of the USER, HOST, and IP keys taken from the
       control file  which  is	being  received	 or  checked  for
       permissions.  The REMOTEUSER, REMOTEHOST and REMOTEIP keys
       are those either sent as part of	 a  command,  or  derived
       from  information  about	 the  current network connection.
       Each line of the permissions file is scanned for key names
       and values, and these are matched against the request keys
       information.  When all matches on a line	 are  made,  then
       search	 terminates    with    the    specified	   action
       (ACCEPT/REJECT).	  If  no  match	 is  found  the	  default
       permission  value  is  used.   The  DEFAULT key is used to
       specify the current default  permission	to  be	used  for
       successful  matches or if there is no match after scanning

LPRng			LPRng-3.6.14beta28			2

LPD(8)							   LPD(8)

       the entire permissions database.

       The GROUP entry is  used	 to  check  that  the  USER  name
       appears	in  a  group  entry  in	 the  system  user  group
       database.  For example, GROUP=student*,staff* would  check
       to  see	if  any	 of  the  group name matching student* or
       staff* have the specified user name in them.  If a  system
       has the netgroups capability, a group name starting with a
       @ will be treated as a netgroup	name,  and  current  user
       name  from  the job file will bechecked to see if it is in
       the group.  Similarly, the REMOTEGROUP entry will check	a
       remote  user  name.   The PORT entry can be used to ensure
       that a connection to the server orignates from a specified
       range of ports.	For more details, see the lpd.perm(5) man
       page.

       The permissions database is scanned in order of the  fixed
       file  entries  and  then by invoking the specified filters
       for each of the permissions lists.  It is recommended that
       the filters be placed at the end of the permissions lists.
       The user name is one  of	 the  parameters  passed  to  the
       filter,	and  can  be  used  to	determine  if  a user has
       permissions to print a file.

       Key	    Match Connect Job	Job    LPQ  LPRM  LPC
				  Spool Print
       SERVICE	    S	  'X'	  'R'	'P'    'Q'  'M'	  'C,S'
       USER	    S	  -	  JUSR	JUSR   JUSR JUSR  JUSR
       HOST	    S	  RH	  JH	JH     JH   JH	  JH
       GROUP	    S	  -	  JUSR	JUSR   JUSR JUSR  JUSR
       IP	    IP	  RIP	  JIP	JIP    RIP  JIP	  JIP
       PORT	    N	  PORT	  PORT	-      PORT PORT  PORT
       REMOTEUSER   S	  -	  JUSR	JUSR   JUSR CUSR  CUSR
       REMOTEHOST   S	  RH	  RH	JH     RH   RH	  RH
       REMOTEGROUP  S	  -	  JUSR	JUSR   JUSR CUSR  CUSR
       REMOTEIP	    IP	  RIP	  RIP	JIP    RIP  RIP	  RIP
       CONTROLLINE  S	  -	  CL	CL     CL   CL	  CL
       PRINTER	    S	  -	  PR	PR     PR   PR	  PR
       FORWARD	    V	  -	  SA	-      -    SA	  SA SA
       SAMEHOST	    V	  -	  SA	-      SA   SA	  SA
       SAMEUSER	    V	  -	  -	-      SU   SU	  SU
       SERVER	    V	  -	  SV	-      SV   SV	  SV
       AUTH	    V	  -	  AU	-      AU   AU	  AU
       AUTHTYPE	    S	  -	  AU	-      AU   AU	  AU
       AUTHUSER	    S	  -	  AU	-      AU   AU	  AU
       FWDUSER	    S	  -	  AU	-      AU   AU	  AU

       KEY:
	  JH = HOST	     host in control file
	  RH = REMOTEHOST    connecting host name
	  JUSR = USER	     user in control file
	  CUSR = REMOTEUSER  user from control request
	  JIP= IP	     IP address of host in control file

LPRng			LPRng-3.6.14beta28			3

LPD(8)							   LPD(8)

	  RIP= REMOTEIP	     IP address of requesting host
	  PORT=		     connecting host origination port
	  CONTROLLINE=	     pattern match of control line in control file
	  FW= IP of source of request = IP of host in control file
	  SA= IP of source of request = IP of host in control file
	  SU= user from request = user in control file
	  SA= IP of source of request = IP of server host
	  SV= matches if remote host is the server
	  AU= authentication information
	  IFIP= IP address of remote end of connection

       Match: S = string with wild card, IP = IPaddress[/netmask],
	  N = low[-high] number range, V = exact value match
       SERVICE: 'X' - Connection request; 'R' - lpr request from remote host;
	   'P' - print job in queue; 'Q' - lpq request, 'M' - lprm request;
	   'C' - lpc spool control request; 'S' - lpc spool status request
       NOTE: when printing (P action), the remote and job check values
	  (i.e. - RUSR, JUSR) are identical.

       The special key letter=patterns searches the control  file
       line starting with the (upper case) letter, and is usually
       used with printing  and	spooling  checks.   For	 example,
       C=A*,B* would check that the class information (i.e.- line
       in the control file starting with C) had a value	 starting
       with A or B.

PERMISSIONS, MULTIHOMED HOSTS, IPV6
       There  is  a  subtle  problem  with names and IP addresses
       which are obtained for 'multi-homed hosts', i.e.	 -  those
       with  multiple  ethernet	 interfaces,   and  for	 IPV6 (IP
       Version 6),  in which a host can have multiple  addresses,
       and  for	 the normal host which can have both a short name
       and a fully qualified domain name.  In  addition,  a  host
       can   have   multiple   IP  addresses,  depending  on  the
       complexity of its configuration.

       The IFIP (interface IP) field can be used to check the  IP
       address of the origination of the request,  as reported by
       the information returned	 by  the  accept()  system  call.
       Note   that   this   information	  may  be  IPV4	 or  IPV6
       information,  depending on the origination of the  system.
       This  information is used by gethostbyaddr() to obtain the
       orginating host fully qualified domain name (FQDN) and set
       of  IP  addresses.   Note  that	this FQDN will be for the
       originating interface,  and may not be the cannonical host
       name.  Some systems which use the Domain Name Server (DNS)
       system may add the cannonical system name as an alias.

       When performing an IP address match,  the entire	 list  of
       IP  addresses for a system will now be checked.	If one of
       these matches, then success is reported.	 Similarly,   the
       entire list of host names and aliases will be checked.  If
       one of these matches,  then success will be reported.

LPRng			LPRng-3.6.14beta28			4

LPD(8)							   LPD(8)

       In addition,  when checking  for	 printing,  if	the  name
       lookup  for  the	 host reported in the control file fails,
       then we assume that the host  is	 unknown  and  all  match
       checks  for  names  or  IP  addresses  will fail.  You can
       determine if a host has an entry by  using  the	following
       check,  which  will  reject all requests from a remotehost
       which does not have a DNS entry.
	 REJECT NOT REMOTEHOST=*

PRINTCAP DATABASE
       Individual printer operations are controlled by values  in
       the printcap database.  See printcap(5) for details of the
       format and content of the various entries.  The	following
       are  typical  printer  entries  for  a  local  and  remote
       printer.

	      # main or shared printcap file - usually /etc/printcap
	      # remote postscript printer
	      fullpage
		 |postscript
		 :lp=postscript@farside.astart.com
	      # give access to (remote) hosts
	      t1|postscript2
		 :cm=Test Printer 1
		 :lp=postscript2@nearside.astart.com

	      # local printcap file
	      # specification for local printer on nearside
	      t1|postscript2
		 :oh=nearside.astart.com
		 :cd=/usr/spool/LPD/safe
		 :sd=/usr/spool/LPD/t1
	      #
	      # /usr/spool/LPD/t1/printcap file -
	      t1:
		 :lp=/dev/pr
		 :if=/usr/lib/pr/if
		 :of=/usr/lib/pr/if

       Printcap information  can  be  distributed  by  individual
       files  or  shared  using	 NSF,  YP,  or other methods; see
       lpd.conf(5) for the  exact  details  of	the  location  of
       printcap	 files	and  programs, given by the printcap_path
       and lpd_printcap_path configuration  information.   The	a
       common  printcap	 configuration is to have a main (shared)
       printcap	 database  which  is  used  by	all  hosts.   The
       printcap	  information	is   usually   extremely  simple,
       consisting only of the  printer	name  and  host	 (i.e.	-
       fullpage printer entry).

       On  hosts  which	 have  printers	 attached or which are to
       provide	spooling  queue	  directories,	 more	extensive
       printcap	 information  is needed.  In the shared database,

LPRng			LPRng-3.6.14beta28			5

LPD(8)							   LPD(8)

       oh (options for specified host only) field  restricts  use
       of  this	 entry	to  the	 specified  host.  This entry can
       contain host specific information, such as the location of
       the  spool  queue  and/or  actual  device  to  be used for
       output.

       In the above example,  the  main	 printcap  file,  usually
       /etc/printcap,  has  entries  for all printers.	Note that
       these entries do not specify the spool directories (sd and
       cd  fields), but this could be provided.	 On a host with a
       printer specific information can be provided  in	 serveral
       ways.   The  simplest is to simply put an additional entry
       in the shared printcap file, with the oh field set to  the
       support host name.  An alternative would be to specify the
       spool  directories  (sd	and  cd	 fields)  in  the  shared
       information,  and  to put the printer specific information
       in a printcap file.

       In addition to the oh flag, the server flag indicates that
       this entry is for a the LPD server only.	 This can be used
       to simplify the management of client and server entries.

       The printcap information	 is  obtained  in  the	following
       order.  All programs use the contents of the configuration
       printcap_path variable to  get  a  list	of  locations  of
       printcap	 files.	 In addition, the lpd program appends the
       contents	  of	the    lpd_printcap_path    configuration
       information.   Next,  each  of these entries is processed,
       and the printcap information is extracted.  Entries  which
       have  oh	 fields are only used by the specified host.  The
       files and information is processed in linear order,  later
       entries overriding preceeding ones.

       When  processing	 jobs  or performing spool queue specific
       requests, the LPD server will check to see if there  is	a
       printcap file in the control directory for the spool queue
       and the contents will be processed.  Since  only	 the  LPD
       server  has  access  to the spool and control queues, this
       information is processed only by the server.

       In addition to files, printcap information can be obtained
       from  programs or filters.  For example, the printcap_path
       of the form  /etc/printcap:|/usr/lib/getpr  will	 use  the
       contents	 of  the  /etc/printcap	 file,	and  then use the
       /usr/lib/getpr program to get information about a specific
       printer.	  When information about a particular spool queue
       is needed and one or more filters  are  specified  as  the
       source  of  printcap  information, then the filter will be
       started and the	printer	 name  written	on  its	 standard
       input.	The  filter must provide a printcap entry for the
       requested printer on its standard output.

       The filter can  be  used	 to  interface	to  databases  or
       nonstandard  information	 sources  which	 do  not  produce

LPRng			LPRng-3.6.14beta28			6

LPD(8)							   LPD(8)

       printcap information in an acceptible form.

SPOOL DIRECTORY CONTENTS
       Each spool queue has a spool directory (sd)  and	 optional
       control	directory (cd)	where job and control information
       is kept.	 Under normal operation	 the  spool  and  control
       directories  are	 identical, but if the spool directory is
       NFS exported for use by other printer spoolers which write
       files   directly	  into	 the  spool  queue,  then  it  is
       recommended that	 the  control  directory  be  a	 separate
       directory  and  not  NFS mounted.  The following files are
       used for printer operations.  Per job entries  are  marked
       with an asterisk (*).

       File Name	   Dir	   Purpose
       printer		   CD	   lock file and server process PID
       unspooler.printer   CD	   subserver process PID
       control.printer	   CD	   queue control information
       *hfAnnn		   SD	   job hold file
       *cfAnnnHOST	   SD	   job control file
       *dfAnnnHOST	   SD	   job data file
       *bfAnnn.*	   SD	   tempory files

       The  nnn	 in  the  file	names  stands for the job number.
       RFC1179 requires this to be a  3	 digit	number,	 but  the
       longnumber   printcap   flag   or   a  nonzero  longnumber
       configuration variable will enable 6 digit numbers.

       The lock file  is  used	to  prevent  multiple  job  queue
       servers	from becoming active simultaneously, and to store
       the server process id.  The lock file name is the name  as
       the printer name; all other control files have the printer
       name appended as indicated above.

       The  printer  spool  control  file  contains   information
       controlling the queue operations.  It consists of a series
       of lines with keywords and  values  to  control	printing,
       spooling,  and  automatic  job  holding	operations.   The
       following is an example of a typical spool control file.

	      spooling_disabled 0
	      printing_disabled 1
	      holdall 0
	      redirect p1@host2
	      debug 10,log=/tmp/log
	      class A

       The  spooling_disabled	and   printing_disabled	  entries
       control	spooling  and  printing; the lpc enable, disable,
       start, and stop command alter these values.   The  holdall
       entry   will  prevent  jobs  from  being	 processed  until
       released with the lpc hold or  release  comands;	 the  lpc

LPRng			LPRng-3.6.14beta28			7

LPD(8)							   LPD(8)

       holdall and noholdall commands alter these values.

       The  redirect  entry causes the lpd server to forward jobs
       to the specified remote printer; the lpc redirect  command
       alters  this field.  The class field controls the class of
       jobs being printed.  By default,	 the  class  value  is	a
       pattern	that  matches  the  class  entry  in  a job file;
       however a entry of the  form  letter=patterns  will  print
       jobs  whose control file line starting with letter matches
       one of the patterns.  The debug line  provides  a  set  of
       debugging  parameters  for  diagnostic information for the
       particular spool queue.

       Each print job consists of a control file and one or  more
       data  files.   Lines  in the control file file specify the
       job data files or parameters for the job and  the  general
       format  of  the	file  is specified by RFC1179.	Each line
       consists of a flag character and a parameter;  upper  case
       and  digit  characters  specify	options	 and  lower  case
       letters specify the printing  format  and  names	 of  data
       files.	The  following is a list of the control file flag
       characters.

       A      Identifier  A  job  identifier  to  be  used   when
	      displaying  job  information  and/or  status.   The
	      insertion	 of  this  line	 is  controlled	 by   the
	      use_identifier printcap/configuration variable.

       C      Class  String  to be used for the class line on the
	      burst page.

       H      Host Name.  Name	of  the	 machine  where	 lpr  was
	      invoked.

       I      Indent.	The  number  of	 characters to indent the
	      output by (in ascii).

       J      Job Name.	 String to be used for the  job	 name  on
	      the burst page.

       L      Banner user name.	 Information for banner page.

       P      Person.	Login name of the person who invoked lpr.
	      This is used to verify ownership by lprm.

       M      Send mail to the specified user  when  the  current
	      print job completes.

       N      File  name.  The original name of a data file which
	      is in the job.

       T      Title.  String to be used as the	title  for  pr(1)

LPRng			LPRng-3.6.14beta28			8

LPD(8)							   LPD(8)

	      when the LPR -p option was specified.

       U      Unlink.	 Job   file   to   remove  when	 printing
	      completed.

       W      Width. The page width (in characters) to	used  for
	      printing.

       Z      zoptions.	 Options passed by lpr -Zzoptions.  These
	      are passed to output filters to aid in printing.

       f      Formatted File.  Name of a file to print	which  is
	      already formatted.

       l      Like  ``f''  but passes control characters and does
	      not make page breaks.

       p      Name of a file to print using pr(1) as a filter.

       t      Troff File.  The file contains troff(1) output (cat
	      phototypesetter commands).

       d      DVI  File.   The	file  contains Tex(l) output (DVI
	      format from Stanford).

       g      Graph File.  The file  contains  data  produced  by
	      plot(3X).

       c      Cifplot  File.  The  file contains data produced by
	      cifplot.

       v      The file contains a raster image.

       r      The file contains text data with	FORTRAN	 carriage
	      control characters.

       1      Troff  Font R. Name of the font file to use instead
	      of the default.  (Obsolete)

       2      Troff Font I. Name of the font file to use  instead
	      of the default.  (Obsolete)

       3      Troff  Font B. Name of the font file to use instead
	      of the default.  (Obsolete)

       4      Troff Font S. Name of the font file to use  instead
	      of the default.  (Obsolete)

       Each  job  in  the  spool queue can have an associated job
       hold file which is used by the server process  to  control
       the  printing  of  the  job.   The  status  file	 contains
       information controlling the  job	 hold  status  and  error
       status.	 The  spool  server will attempt to print a job a

LPRng			LPRng-3.6.14beta28			9

LPD(8)							   LPD(8)

       limited number of times before abandoning it or setting an
       error  status  in the job status file.  The following is a
       typical job hold file.
	      hold	   0  priority	   0   active	     2135
	      redirect remove	   0 error

       A  nonzero  hold	 entry	will  prevent  the job from being
       processed; the lpc hold and release commands  update  this
       field.	The  priority field overrides the normal first-in
       first-out printing priority; jobs with  non-zero	 priority
       fields  are  printed  first.  The lpc topq command updates
       this field.  If the active field is non-zero, the  job  is
       being printed by the server with the specified process id.
       The redirect field allows individual jobs to be	forwarded
       to  a different printer; the lpc move command updates this
       field.  Finally, the remove and error fields are	 used  to
       control printing of problem jobs.  The remove field is set
       when a job should be  removed;  the  error  field  records
       information that would prevent a job from being printed.

JOB SUBMISSION
       The  LPR	 program  is  used  to	submit a job to the LPRng
       system.	The LPR program opens a	 connection  to	 the  LPD
       server  and  then  transfer  the job control file and data
       files.  The LPD server checks to see if	the  remote  host
       and  user  has  permissions  to	spool  to  the	requested
       printer,	 and  then  checks  to	see  if	 the  printer  is
       accepting  jobs.	  If  both conditions are met, the job is
       accepted and the control and data files are placed int the
       spool  directory.   The	LPRng  software sends the control
       file first, followed by the data files.

       If the LPR program is  acting  as  a  filter,  it  is  not
       necessary  to temporarily store the print job on the local
       machine.	 The input data can be sent directly to	 the  LPD
       server  for  spooling  using an implicit job size of 0 and
       sending data until the connection  is  terminated  to  the
       server.	 However,  some	 LPD servers do not accept 0 size
       jobs, even though it is specified by the	 RFC1179,  so  by
       default	LPR  will  create  a  temporary file.  The LPR -k
       (seKure) option specifies this direct transmission mode be
       used.

JOB TRANSMISSION
       When LPR is to send a job to the server, it must determine
       the location of the server.  It does this by examining the
       values of the specified printer and host.

       If  the	printer	 and host are explicitly specified in the
       form pr@host then the LPR program will send the job to the
       specified  spool	 queue	pr  and	 to the server running on
       host.  This can be explicitly  specified	 by  the  PRINTER
       environment variable or by the LPR -P option.

LPRng			LPRng-3.6.14beta28		       10

LPD(8)							   LPD(8)

       If  the	printer	 is  specified	only  by a name, then the
       information  in	the  printcap  database	 is  used.    The
       printcap	 entry	for  the  printer is searched for and the
       remote host and printer information extracted.  The job is
       sent to the server running on the specified host.

       This  action  can be modified by the following printcap or
       configuration tags.

       1. default_host=host
	    (Configuration) If there is no printcap entry for the
	    printer, the job is sent to the LPD server running on
	    host.

       2. force_localhost
	    (Configuration  or	printcap)   If	 this	flag   is
	    specified,	 then  LPR and other client programs will
	    send the job to the server running on the  localhost.
	    This overrides the default_host information.

FORWARDING OPERATIONS
       The  LPD	 system can forward jobs from one spool directory
       to another.  This is controlled by the following	 options.

       1.   The	 forward  field	 in  the spool control file has a
	    value rp@rm.  This can be set using the  LPC  forward
	    command.

       2.   The	 lp  (line  printer)  printcap entry has the form
	    rp@rm.  There is a rm (remote machine)  and	 optional
	    rp (remote printer) printcap entry.

       The first of the above conditions to be met will determine
       the destination.	 If printing is enabled, then  jobs  will
       be forwarded to the remote destination.	Example:
       # using lp=rp@host
       test:sd=/usr/spool/test
	 :lp=test@host
       test:sd=/usr/spool/test
	 :lp=test@host%port
       # using :rp:rm:
       test:sd=/usr/spool/test
	 :rp=test:rm=host

       3.   The	 LPD  server  uses the same algorithm for sending
	    jobs as the LPR program.  A connection is made to the
	    remote server and the files are copied to the server.
	    A set of timeouts is used to  control  error  recover
	    and retry operations.  The printcap and configuration
	    variables	  connect_timeout,	connect_interval,
	    connect_grace, and send_try control connecting to the
	    remote host.  A connection is attempted to the remote
	    server  from  a  random  port  in  the range of ports
	    specified  by  the	originate_port	variable.   If	a

LPRng			LPRng-3.6.14beta28		       11

LPD(8)							   LPD(8)

	    connection	is  not	 completed within connect_timeout
	    seconds, the connection is aborted,	 and  then  after
	    the	 connect_interval  seconds  it	is  retried.  The
	    procedure repeated	indefinately  for  printing,  but
	    only  once	for  status  or	 control  operations.	A
	    connect_timeout value of 0 indicates  no  timeout;	a
	    value of 0 specifies infinite timeout After a job has
	    been successfully printed, the connection  is  closed
	    and the server waits for connect_grace seconds before
	    trying to reconnect.

BOUNCE QUEUES
       Normally job files are  forwarded  to  a	 printer  without
       modification.  The flag makes the queue a bounce queue and
       allows banners to be generated and data	files  to  passed
       through	the appropriate format filter.	The entire output
       of this process is then passed to the destination with the
       format  specified  by  the  bq_format option (default l or
       binary).	  See  PRINTING	 OPERATIONS  for  details   about
       filters.	  For  example, the following printcap entry will
       filter format f files.
       testbq:sd=/usr/spool/testbq:
	 :lpd_bounce
	 :bq_format=l
	 :lp=final@host
	 :if=/usr/lib/filter_for_f
	 :mf=/usr/lib/filter_for_m
	 :pf=/usr/lib/filter_for_pr

CHANGING FORMAT OF DATAFILES
       Sometimes only the indicated  format  of	 the  data  files
       needs   to  be  changed.	  This	can  be	 done  using  the
       translate_format option.	 This entry consists of pairs  of
       lower  case  characters	of  the	 form  SdSd...;	 S is the
       original and d is the translated format.
       changeformat:
	 :sd=/usr/spool/changeformat:
	 :translate_format=mfpf
	 :lp=final@host

       In the example above, the  m  format  is	 processed  by	a
       filter,	and  then  its format type is changed to f; the p
       format is processed  similarly.	 Note  that  the  lpr  -p
       option  specifies  that	the  job will be processed by the
       /bin/pr	command	 -  the	 filter	 must  do  both	 the   pr
       processing and any necessary format conversions.

LPR FILTER PROCESSING
       The :lpr_bounce: printcap flag will cause LPR to do bounce
       queue filtering before  sending	the  job  to  the  remote
       queue.	This  can  have unexpected effects if the filters
       are not available on the local host.

       A typical entry which will cause LPR to	do  filtering  is

LPRng			LPRng-3.6.14beta28		       12

LPD(8)							   LPD(8)

       shown below.
       testbq:lpr_bounce
	 :lp=printer@host
	 :if=/usr/lib/filter_for_f
	 :vf=/usr/lib/filter_for_v
	 :mf=/usr/lib/filter_for_m
	 :translate_format=mfvf

       This entry will force LPR to run jobs with formats f, m, and v
       through the appropriate filter.
       It will also rename the formats to the f format.

ROUTING JOBS TO PRINTERS
       When  a	job  is	 submitted  for printing, sometimes it is
       desirable to have it dynamically rerouted to another spool
       queue,  or  multiple  copies  send to various destination.
       This can be done by using a routing_filter.

       When a job is accepted by the  LPD  server,  part  of  the
       processing  includes  passing it to a program specified by
       the printcap router entry.  This filter	is  invoked  with
       the original control file as STDIN, and the default set of
       filter options.	The output of the routing filter will  be
       a set of directives used by LPD when forwarding the job to
       another printer or in processing the job.  The environment
       and  options flags are set as for a standard filter.  (See
       "FILTERS" for details.)	Here is a sample printcap entry:
       t2|Test Printer 2
	   :sd=/var/spool/LPD/t2
	   :lf=log
	   :lp=t2@printserver
	   :bq=t1@localhost
	   :destinations=t1@localhost,t2@localhost
	   :router=/usr/local/libexec/filters/router

       The routing filter exit status is used as follows:
			   0  (JSUCC) - normal processing
			   37 (JHOLD) - job is held
			   any other value - job is deleted from queue

       The router filter returns one or more routing entries with
       the  following  format.	 Note  that  entry  order  is not
       important, but each entry will end  with	 the  'end'  tag.
       dest  <destination  queue>  copies <number of copies to be
       made> X<controlfile modifications> end

       Example of router output:
       dest t1@localhost
       copies 2
       CA
       end
       dest t2@localhost
       CZ
       end

LPRng			LPRng-3.6.14beta28		       13

LPD(8)							   LPD(8)

       The above routing information will have copies of the job sent to
       the t1 and t2 spool queue servers.  If no valid routing information
       is returned by the router filter the job will be sent to the default
       bounce queue destination.

REFORMATING CONTROL FILES
       Sometimes it is	desirable  to  reformat	 a  control  file
       before	sending	  to   a   remote  destination.	  If  the
       control_filter printcap entry is present, then the control
       file  is	 passed	 through the filter.  If the filter exits
       with status JSUCC,  then	 the  job  is  process	normally;
       status  JABORT  causes  the  job processing to be aborted,
       status JREMOVE causes the job processing	 to  be	 removed,
       and any other status is treated as JFAIL.

       After passing the control file through the control_filter,
       the LPD server will reread it, and transfer only the  data
       files   specified   in	the   new  control  file  to  the
       destination.

SPOOL QUEUE NAME OPTION
       The qq printcap entry and the use_queuename  configuration
       entry  causes  the name of the spool queue to be placed in
       the job control file.  This  value  can	be  used  by  the
       filter  to  determine how to process a job.  When combined
       with the use of the Bounce Queue,  this	can  be	 used  to
       reformat	 jobs  before  sending to another printer spooler
       system.

PRINTING OPERATIONS
       When printing is enabled, the LPD  server  will	create	a
       spool  server  process  to  carry out printing operations.
       For each job in the queue, the spool server  process  will
       create  a  subserver  process  to  carry	 out  the  actual
       printing operations.  If the subserver process fails,  the
       server  process	will  initiate	recovery operations.  Job
       will be attempted to be printed until all are  done  or	a
       subserver  returns  an  ABORT  indication; the server will
       then terminate operations.

       The server process  normally  scans  the	 queue	once,  at
       initiation; if the spool control file is modified, usually
       by using the lpc command, the spool  queue  is  rescanned.
       The overall algorithm for job printing is:
       open the print device;
       send some initialization strings;
       send a banner to the device;
       send the job data files to the device;
       send some termination strings;
       close the print device;

       In  order  to  handle the various device requirements, the
       subserver process in turn uses 'filter' programs specified

LPRng			LPRng-3.6.14beta28		       14

LPD(8)							   LPD(8)

       in the printcap entry to carry out the individual steps.

       OF Filter
	    The	 'of'  filter  is used for initialization, banner
	    printing and the termination  strings.   It	 has  the
	    peculiar  property	of  suspending itself when sent a
	    special escape string, allowing other filters  to  be
	    used to print the individual job files.

       Data Filters
	    Each  data	file  in  a job has format specified by a
	    lower  case	 character  and	 an   associated   filter
	    specified in the printcap file.  For example, the 'g'
	    format is printed by the 'gf' filter, and  so  forth.
	    By	convention,  the 'if' filter is used to print 'f'
	    (ordinary text) and 'l' (binary) format jobs.

       lp-pipe Filters
	    If the printcap device  specification  has	the  form
	    |program  then  the	 output device is accessed by the
	    specified program.	This allows the program	 to  take
	    care  of any required initialization or communication
	    requirements.

       The following is a concise summary of the actual algorithm
       used  to print files.  Note that LP stands for the printer
       device or filter specified by the 'lp' printcap entry;  OF
       stands  for  the	 'of'  printcap filter; IF is the default
       'if' filter; BP is the  banner  printing	 filter;  and  ?F
       stands  for  the	 filter	 for  data file.  The '??' values
       stand for entries from the printcap file.

       LP = open( 'lp' );  // open device, filter, or network connection
       OF = IF = LP;	   // set defaults
       set up accounting according to 'af' entry;
       if( 'of' ) OF = filter( 'of' ) -> LP;// make OF filter
       if 'as' then record start of job accounting information.
       if 'achk' then check for accounting limits.
       if( leader on open 'ld' ) `ld` -> OF// send leader
       if( FF on open 'fo' ) `fo` -> OF	   // send leader

       // print a banner
       // first check to see if required
       //   and then to see if not suppressed by printcap
       //   or by user
       do_banner =
	   (always banner 'ab'
	       || (!suppress banner 'sb' && job has banner ));
       if( ! header last 'hl' && do_banner ){
	   if( banner program 'bp' ){
	       fork and exec bp to generate banner, but into temp file.
	       cat temp file -> OF;
	   } else {
	       short banner info -> OF;

LPRng			LPRng-3.6.14beta28		       15

LPD(8)							   LPD(8)

	   }
       }

       // now we suspend the OF filter, use other filters
       if( OF != LP ) suspend OF filter;

       for each data file df in job do
	   // send FF between files of job
	   if( !first job && ! no FF separator 'sf' ){
	       if( OF != LP ) wake up OF filter;
	       'ff' -> OF;
	       if( OF != LP ) suspend OF filter;
	   }

	   // get filter for job
	   format = jobformat;
	   if( jobformat == 'f' or jobformat = 'l' ){
	       format = 'f';
	   }
	   filter = check pc for filter for format;
	   ?F = LP; // default - no filter
	   if( filter ){
	       ?F = filter( filter ) -> LP;
	   }

	   data file -> ?F;
	   // note: if :direct_read: flag set, filter input
	   // is directly from the file,  otherwise the
	   // file contents are written to the filter input.

	   if( ?F != LP ) close( ?F )
       endfor

       // finish printing

       if( OF != LP ) wake up OF filter;
       if( header last 'hl' && do_banner ){
	   if( ! no FF separator 'sf' ){
	       'ff' -> OF;
	   }
	   if( banner program 'bp' ){
	       fork and exec bp to generate banner, but into temp file.
	       cat temp file -> OF;
	   } else {
	       short banner info -> OF;
	   }
       }

       if( ff on close 'fq' ){
	   'ff' -> OF;
       }

       if( trailer on close 'tr' ){
	   tr -> OF;

LPRng			LPRng-3.6.14beta28		       16

LPD(8)							   LPD(8)

       }

       if 'ae' then record end of job accounting information.

       if( OF != LP ) close( OF );
       close( LP );

       When printing or transferring  a	 job  to  a  spool  queue
       fails,  it is retried the number of times specified by the
       rt (or send_try ) printcap variable.  A 0 value	specifies
       an  infinite  number  or retries.  When the retry count is
       exceeded, then the send_failure_action  printcap	 variable
       determines  the	action	to be taken.  The variable can be
       the values succ , fail , abort , remove , ignore , or hold
       ,  which	 will  cause  the  job	to be treated as normally
       completed,  retried,  aborted,  removed,	 or  ignored  and
       retried	 at  a	later  time  respectively.   These  names
       correspond to  the  JSUCC  ,  JFAIL  ,  etc.  error  codes
       returned	 by  filters.	If  the	 variable  has	the  form
       |/filter , then the filter is run and passed the number of
       attempts	 on  the  standard  input.  The filter must exits
       with a JSUCC, JFAIL, etc., error code and the server  will
       take the appropriate action as listed above.

       The  print filters normally have their input provided by a
       process via a pipe.  However, if the direct_read	 printcap
       flag  is set, then the filter input is taken directly from
       the job file.  This is compatible  with	the  vintage  BSD
       method, but loses the ability to track the job progress.

       After  the job print or transfer attempt, if the job is to
       be removed and  the  printcap  variable	save_on_error  is
       true, the job will not be removed from the spool queue but
       only flagged with an error.  The job can then  be  retried
       at a later time.	 If the job is successfully printed it is
       usually removed from the spool  queue.	However,  if  the
       printcap	 variable  save_when_done  is  true  the job will
       merely be marked as completed and  not  removed	from  the
       queue.

FILTERS
       As  described in the previous section, filters are created
       to handle output to devices or other filters.  The command
       line  to	 invoke	 a  filter  is generated in the following
       manner.

       1.   The printcap entry or  configuration  value	 defining
	    the filter command is obtained.

       2.   The	 file  to  be  printed	or  the	 banner line/file
	    generated by the banner printer will  be  written  to
	    STDIN  (file descriptor 0) of the filter.  The output
	    device (or	/dev/null  if  this  is	 not  a	 printing

LPRng			LPRng-3.6.14beta28		       17

LPD(8)							   LPD(8)

	    filter)  will  be  be STDOUT  (file descriptor 1) and
	    STDERR (file descriptor 2) will be connected  to  the
	    error  logging  file.   If this is a printing filter,
	    the error log will be determined by the :af: printcap
	    field.   If	 accounting is enabled, file descriptor 3
	    will be connected to be the accounting file or filter
	    as specified by the printcap :af: entry.

       3.   If the ROOT_PERMS_TO_FILTER_SECURITY_LOOPHOLE compile
	    time option is enabled,  then  filter  specifications
	    starting  with  ROOT  filtername  will be run as root
	    (EUID = 0).	 This can be a serious security loophole,
	    and should only be used as a last resort for specific
	    problems.

       4.   The options for  the  filter  command  line	 will  be
	    replaced	 by	appropriate    values.	   Option
	    specifications have	 the  form  $[0|  ][-][']X.   The
	    default   option   expansion   has	the  form  $X  ->
	    -X'value'; the form $0X or	$(space)X  adds	 a  space
	    after  the	-X, i.e.- $0X -> -X 'value'; the form $-X
	    suppresses the -X, i.e. - $-X  ->  'value';	 and  the
	    form  $'X'	suppresses  the	 quotes around the value.
	    Note that  the  0,-,  and  '  can  be  combined.  For
	    example,  $-'X -> value.  The options will be exanded
	    as follows:

	    Key	 Value
	    a	 Accounting file (printcap 'af')
	    b	 Job size, i.e.- total data file size, in bytes
	    c	 if binary (format 'l') expands to -c
	    d	 Control directory
	    e	 job data file
	    f	 original print file name (control file N field)
	    h	 Control file hostname
	    i	 Control file indent (I) field
	    j	 job number from control file name
	    k	 Control file name
	    l	 printcap Page length (pl) value
	    m	 printcap Cost factor (co) value
	    n	 Control file user logname (P) field
	    p	 Remote Printer name for forwarded jobs
	    r	 Remote Host name for forwarded jobs
	    s	 printer Status file (ps) value
	    t	 current time in simple format
	    w	 printcap Page width (pw) value
	    x	 printcap x dimension (px) value
	    y	 printcap y dimension (py) value
	    F	 data file format character
	    P	 Printer name
	    S	 printcap Comment tag (cm) value
	    Upper Case	 control file line starting with letter
	    Digit control file line starting with digit

LPRng			LPRng-3.6.14beta28		       18

LPD(8)							   LPD(8)

       5.   The options specified by the filter_options (for none
	    OF	filters) or of_filter_options (for the OF filter)
	    will be appended to the command  line  and	expanded.
	    To	suppress adding options, you can use the form '-$
	    filter',  i.e.  -  of=-$/bin/cat.	 If   the   'bkf'
	    (backwards	compatible  filter options) printcap flag
	    is set, the of filter is given the options	specified
	    by	bk_of_filter_options  and  other filters those by
	    bk_filter_options.	The following shows  the  various
	    combinations  possible,  and  typical  values for the
	    options.

	    Options
	    filter_options    $C $F $H $J $L $P $Q $R $Z $a $c $d $e $f $h $i \
			      $j $k $l $n $s $w $x $y $-a
	    bk_filter_options $P $w $l $x $y $F $c $L $i $J $C $0n $0h $-a
	    bk_of_filter_options $w $l $x $y

       6.   A printing filter which executes correctly and completely should
	    exit with a 0 error status.
	    A nonzero error status will be interpreted as follows:
	    JFAIL    32	  failed - retry later
	    JABORT   33	  aborted - do not try again, but keep job
	    JREMOVE  34	  failed - remove job

       The JFAIL will cause the job to	be  retried  at	 a  later
       time.   A  limit	 can  be  placed on the number of retries
       using the :rt: or  :send_try:  printcap	entry.	 A  retry
       value  of  0  will  cause  infinite  retries.   The JABORT
       indicates  serious  problems  and  will	 cause	 printing
       operations  on the job to stop until restarted by operator
       intervention.  The JREMOVE status indicates problems,  and
       the job should be removed from the spool queue.

       The   environment   variables   for   filters  are  highly
       restricted, due to the possibility  for	abuse  by  users.
       The following variables are set:

       USER and LOGNAME
	    user name or daemon name.

       LOGDIR
	    home directory of user or daemon.

       PATH from the filter_path configuration variable.

       LD_LIBRARY_PATH
	    from the filter_ld_path configuration variable.

       SHELL
	    set to /bin/sh

       IFS  set to blank and tab.

LPRng			LPRng-3.6.14beta28		       19

LPD(8)							   LPD(8)

       TZ   the TZ environment variable.

       SPOOL_DIR
	    the spool directory for the printer

       CONTROL_DIR
	    the control directory for the printer

       PRINTCAP_ENTRY
	    the printcap entry for the printer

       CONTROL
	    the control file for the print job

       pass_env environment variables
	    Values   of	  environment  variables  listed  in  the
	    pass_env configuration variable.

ACCOUNTING
       The LPRng software provides several methods of  performing
       accounting.  The printcap af (accounting field), as and ae
       (accounting start and end), and	achk  (accounting  check)
       provide a basic set of facilities.  The af field specifies
       a file, filter, or TCP network connection to an accounting
       server.	 If  af has the form |filter or |-$ filter then a
       filter will be started and all accounting information will
       be  sent	 to the filter.	 The first form passes the filter
       the command line options specified by  the  filter_options
       configuration  variable	and  the second suppresses option
       passing.	  If  af  has  the  form  host%port  then  a  TCP
       connection  will	 be  opened  to the port on the specified
       host and accounting information	sent  there.   All  other
       forms  will be treated as a pathname relative to the queue
       spool directory.

       If af specifies a file, then the accounting information is
       appended to an existing file; the accounting file will not
       be created.

       When af specifies a filter or network connection	 and  the
       achk   flag  is	set,  then  after  writting  the  initial
       accounting information (see as printcap field  below)  the
       server  will  wait for a reply of the form ACCEPT from the
       filter or server.  If not received, the job  will  not  be
       printed.

       The  as	(accounting start) and ae (accounting end) fields
       can specify a string to be printed or a	filter.	  Options
       in  the	string	will  be expanded as for filters, and the
       strings	printed	 to  either  the  accounting  information
       destination.  If the as field specifies a filter, then the
       print server will wait  for  the	 filter	 to  exit  before
       printing	 the  job.  If the exit status is 0 (successful),
       the job will be printed.	 A non-zero JREMOVE  status  will

LPRng			LPRng-3.6.14beta28		       20

LPD(8)							   LPD(8)

       remove  the  job,  while	 any  other status will terminate
       queue printing operations.  After printing the job, the ae
       filter  will be started and the server will wait for it to
       complete before printing the next job.

       The as and ae filters will have STDOUT set to the printing
       device  and or filter, and the STDERR set to the error log
       file for the print queue, and fild descriptor 3 set to the
       destination specified by the af field.

       As  a convenience, all format filters for printing will be
       started with file descriptor  3	set  to	 the  destination
       (file or filter) specified by the printcap af field.  This
       allows special filters which can query  devices	for  page
       counts to pass their information directly to an accounting
       program.	 The descriptor will READ/WRITE, allowing filters
       to   query   the	 accounting  program  and/or  update  the
       information directly.

LOGGING INFORMATION
       In order to provide a centrallized  method  to  track  job
       status and information, the printcap/configurtion variable
       logger_destination enable the send  of  status  and  other
       information     to     a	   remote    destination.     The
       logger_destination value has the form
	      host[%port][,protocol]
	  Examples:
	      taco%451,UDP
	      dickory%2001,TCP
       where host is the host name or  IP  address,  port  is  an
       optional port number, and protocol is an optional protocol
       type such as UDP	 or  TCP.   The	 configuration	variables
       default_logger_port  and	 default_logger_protocol  can  be
       used to	override  the  default	port  number  (2001)  and
       protocol	 (UDP)	to be used if none is specified.  Logging
       information has the format below.
	      IDENTIFIER jobid [PRINTER name] at timestamp \
		 STATUS | TRACE | FILTER_STATUS PID nnn
	      [ status information]

       The status information format consists  of  an  identifier
       line,  followed	by  a  specifier of the status type.  The
       logging information entry is terminated by a line  with	a
       single  period  on  it.	Lines with a starting period have
       the period duplicated.

AUTHENTICATION
       Rather than building authentication facilties into  LPRng,
       an  interface  to  authentication programs is defined, and
       will be used as follows.	 The printcap  and  configuration
       entries	   auth,     auth_client_filter,    auth_forward,
       auth_forward_id, auth_forward_filter, auth_receive_filter,
       and  auth_server_id  entries  control authentication.  The
       auth value specifies the type of authentication to be used

LPRng			LPRng-3.6.14beta28		       21

LPD(8)							   LPD(8)

       for client to server authentication.  Typical values would
       be pgp, kerberos, etc.  If the authentication type is  not
       built-in,  the  client programs use the auth_client_filter
       program to perform authentication.  When a server gets and
       an    authentication    request,	   it	 will	use   the
       auth_receive_filter  program  to	 perform  authentication.
       The  auth_server_id  is	the  remote server id used when a
       client is sending jobs to the server or when the server is
       originating  a request.	When a server forwards a request,
       it uses auth_forward value to determine if  authentication
       is  to be done, and the auth_forward_id as the destination
       server id.

Client To Server Authentication
       1.  The client will open a connection to	 the  server  and
	   sends  a  command  with  the	 following  format.   The
	   REQ_SECURE field in the  command  corresponds  to  the
	   one-byte command type used by the LPR protocol.
	      Commands:
		  \REQ_SECUREprinter C user\n
	      Print job transfers:
		  \REQ_SECUREprinter C user controfilename\n

       2.  On  reception of this command,  the server will send a
	   one byte success code as below.  An error code may  be
	   followed  by additional error information.  The values
	   used by LPRng include:
	      ACK_SUCCESS     0	  success, no error
	      ACK_STOP_Q      1	  failed; no spooling to the remote queue
	      ACK_RETRY	      2	  failed; retry later
	      ACK_FAIL	      3	  failed; job rejected, no retry

       3.  If  there  is  an  error  the   connection	will   be
	   terminated.	  The	server	 will	then   start   an
	   authentication process, and provide the following open
	   file	 descriptors  for  it.	The authenticator process
	   will run as the  UID	 of  the  server  (i.e.-  usually
	   daemon).
	      FD    Options Purpose
	      0	    R/W	    socket connection to remote host (R/W)
	      1	    W	    pipe or file descriptor
			    for information for server
	      2	    W	    error log
	      3	    R	    pipe or file descriptor
			    for responses to client

	   The command line arguments will have the form:
	      program -S -Pprinter -nuser -Rserver_user -Ttempfile

	   The printer and user information will be obtained from
	   the	command	  line	 sent	to   the   server.    The
	   authenticator   can	create	additional  temporary  or
	   working files with the pathnames tempfile.ext;   these
	   should be deleted after the authentication process has

LPRng			LPRng-3.6.14beta28		       22

LPD(8)							   LPD(8)

	   been completed.

       4.  After receiving \ACK_SUCCESS,  the  client  starts  an
	   authenticator process, and provides the following open
	   file descriptors for it.   The  authenticator  process
	   will run UID user.
	      FD    Options Purpose
	      0	    R/W	    socket connection to remote host (R/W)
	      1	    W	    pipe or file descriptor
			    for responses to client
	      2	    W	    error log

	   The command line arguments will have the form:
	      program -C -Pprinter -nuser -Rserver_user -Ttempfile

       5.  The	authenticator  can create additional temporary or
	   working files with the pathnames tempfile.ext;   these
	   will	 be  deleted after the authentication process has
	   been completed.   The  client  authenticator	 will  be
	   running as the client user.

       6.  After   exchanging	authentication	information,  the
	   client authenticator will transfer the contents of the
	   temporary  file  to the server authenticator, using FD
	   0.  It will then wait for reply status on FD	 0.    If
	   the	transfer  step fails, or there is no reply status
	   of the correct format,  the client authenticator  will
	   print   any	 recieved  information	on  FD	1,  error
	   information on FD 2, and then  exit	with  error  code
	   JFAIL.

       7.  After  receiving  the  files	 on  FD	 0,   the  server
	   authenticator will perform the required authentication
	   procedures  and  leave  the	results in tempfile.  The
	   server authentictor will write the following to FD  1,
	   for use by the server:
	      authentication_info\n

	   If  the  transfer  step or authentication fails,  then
	   the server will write an error message  to  FD  2  and
	   exit	 with error code JFAIL.	 The server will use this
	   authentication information to determine if the  remote
	   user has permission to access the system.

       8.  The server authentication process will read input from
	   FD 3 until and  end	of  file,  and	then  proceed  to
	   transfer  the  input	 to the client authenticator.  If
	   the data transfer fails,  then the process  will  exit
	   with	 error	code  JFAIL,  otherwise it will exit with
	   error code JSUCC.

       9.  The	client	authenticator  will   read   the   status
	   information	 from	FD   0,	   and	after  performing
	   authentication  will	 write	it  to	FD  1.	 If  data

LPRng			LPRng-3.6.14beta28		       23

LPD(8)							   LPD(8)

	   transfer  or	 authentication fails,	the authenticator
	   will write an error message to  FD  2  and  exit  with
	   error  code	JFAIL,	otherwise it will exit with error
	   code JSUCC.

Server to Server Authentication
       The Server to Server authentication procedure is	 used  by
       one  server to forward jobs or commands to another server.
       It should be noted that this forwarding operation puts  an
       implicit	 trust in the security of the client to server to
       server chain.  In the description below, src and	 dst  are
       the   userid   of   the	source	and  destination  servers
       respectively.

       1.  The originating host takes the part of the client, and
	   will	 transfer  a  job  acting  like	 the client.  The
	   initial  information	 transfer  from	 the  originating
	   (src) server will have the format:
	      Commands:
		  \REQ_SECUREprinter F user\n
	      Print job transfers:
		  \REQ_SECUREprinter F user controfilename\n

	   After  receiving  a	0  acknowlegement  byte,  the src
	   server  will	 invoke	 its   authenticator   with   the
	   arguments  below.  The forward_user value will default
	   to the server_user value if not explicitly provided.
	      program -C -Pprinter -nserver_user \
		  -Rforward_user -Ttempfile

       2.  On  the  destintation  server  the  authenticator   is
	   invoked with the arguments:
	      program -S -Pprinter -nserver_user \
		  -Rforward_user -Ttempfile

	   The	authentication is performed to determine that the
	   transfer was between the two servers,  rather than the
	   user to server.

KERBEROS AUTHENTICATION
       As a convenience, Kerberos 5 authentication has been built
       into the LPD clients and servers.  If you are not familiar
       with  Kerberos, then you should obtain other documentation
       and/or assistance before	 attempting  to	 use  this.   The
       following  facilities/configuration  values  are	 used  to
       support Kerberos.

       A Kerberos principal is the name used  for  authentication
       purposes	 by  Kerberos.	For example, user principals have
       the form	 user@REALM;  for  example,  papowell@ASTART.COM.
       Services	 and/or servers have the form service/host@REALM;
       for example, the lpd server  on	dickory	 would	have  the
       form:
	    lpr/astart2.astart.com@ASTART.COM

LPRng			LPRng-3.6.14beta28		       24

LPD(8)							   LPD(8)

       User  to server authenticaiton process will use the user's
       principal name,	and  generate  a  service  name	 for  the
       server.	  The	name  generation  is  controlled  by  the
       following configuration and/or printcap values.

       service
	      The name of the service to be used to identify  the
	      service.	This is usually "lpr".

       kerberos_keytab
	      The location of the server keytab file.  The keytab
	      file corresponds to the user password, and must  be
	      considered  a security risk.  It should be owned by
	      the LPD server user, and readable/writable only  by
	      the server.

       kerberos_life
	      The  lifetime  of the authentication ticket used by
	      the server.  This usually defaults to 10 hours.

       kerberos_renew
	      The renewal time of the ticket.

       In addition to the  default  values,  an	 explicit  server
       principal  can be specified in the printcap file using the
       kerberos_server_principal   This	  allows   cross   domain
       authentication to be done.

       When  setting up Kerberos authentication, you will need to
       establish principals for each server,  and  to  distribute
       and install the keytab files on each server.

AUTHENTICATION PERMISSIONS
       The  following  permissions tags are available to check on
       authentication procedures.
	      AUTH=[NONE,USER,FWD]    - authentication
		  AUTH=NONE   - no authentication
		  AUTH=USER   - authentication from a client
		  AUTH=FWD    - forwarded authentication from a lpd server
	      AUTHTYPE=globmatch
	      AUTHUSER=globmatch
	      FWDUSER=globmatch

       1.  The AUTH tag can be used  to	 determine  the	 type  of
	   authentication  being  done.	  The AUTHTYPE tag can be
	   used to match the authentication type  being	 used  or
	   requested   by  the	client	or  remote  server.   The
	   authentication  process  returns   an   authentication
	   identifier  for  the	 user;	this  information  can be
	   matched by the AUTHUSER tag.

       2.  For a command sent from a client or forwarded  from	a
	   server, AUTHUSER matches the auth_user_id provided for
	   the user when sent to  a  server.   (This  information

LPRng			LPRng-3.6.14beta28		       25

LPD(8)							   LPD(8)

	   will be forwared by a remote server).  For a forwarded
	   command,  FWDUSER   refers	to   the   authentication
	   information for the server doing the forwarding.

       3.  For	example,  to reject non-authenticated operations,
	   the following line could be	put  in	 the  permissions
	   file.
	      REJECT AUTH=NONE

       4.  To  reject server forwarded authentication as well, we
	   use REJECT AUTH=NONE,FWD.  If  a  remote  server  with
	   name serverhost has id information FFEDBEEFDEAF,  then
	   the following will accept  only  forwarded  jobs  from
	   this server.
	      ACCEPT FWDUSER=FFEDBEEFDEAF REMOTEHOST=serverhost
	      REJECT AUTH=FWD

FILES
       The  files  used by LPRng are set by values in the printer
       configuration file.  The following are a commonly used set
       of default values.
       /etc/lpd.conf				    LPRng configuration file
       /etc/printcap				    printer description file
       /etc/lpd.perms				    printer permissions
       /var/spool/printer*			    spool directories
       /var/spool/printer*/printcap		    printer specific printcap information
       /var/spool/printer*/printer		    lock file for queue control
       /var/spool/printer*/control.printer	    queue control
       /var/spool/printer*/active.printer	    active job
       /var/spool/printer*/log.printer		    log file

SEE ALSO
       lpd.conf(5),  lpc(8), checkpc(8), lpr(1), lpq(1), lprm(1),
       printcap(5), lpd.perms(5), pr(1).

DIAGNOSTICS
       Most of the diagnostics are self explanatory.
       If you are puzzled over the exact cause of failure,
       set the debugging level on (-D5) and run again.
       The debugging information will
       help you to pinpoint the exact cause of failure.

HISTORY
       LPRng  is  a  enhanced	printer	  spooler   system   with
       functionality  similar  to the Berkeley LPR software.  The
       LPRng  mailing  list  is	 lprng@lprng.com;  subscribe   by
       sending	mail  to  lprng-request@lprng.com  with	 the word
       subscribe in the body.  The  software  is  available  from
       ftp://ftp.astart.com/pub/LPRng.

AUTHOR
       Patrick Powell <papowell@astart.com>.

LPRng			LPRng-3.6.14beta28		       26

[top]
                             _         _         _ 
                            | |       | |       | |     
                            | |       | |       | |     
                         __ | | __ __ | | __ __ | | __  
                         \ \| |/ / \ \| |/ / \ \| |/ /  
                          \ \ / /   \ \ / /   \ \ / /   
                           \   /     \   /     \   /    
                            \_/       \_/       \_/ 
More information is available in HTML format for server BSDOS

List of man pages available for BSDOS

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net