https://wiki.preterhuman.net/index.php?title=CAP_LaserWriter_Spooler&feed=atom&action=historyCAP LaserWriter Spooler - Revision history2024-03-29T00:24:53ZRevision history for this page on the wikiMediaWiki 1.35.0https://wiki.preterhuman.net/index.php?title=CAP_LaserWriter_Spooler&diff=8777&oldid=prevNetfreak: Created page with "<pre> cap60/applications/lwsrv/README Last update: Mon Aug 28 10:08:35 EST 1995 LWSRV is a LaserWriter print spooler that runs on a UNIX workstation. In normal operation, L..."2019-07-16T18:37:39Z<p>Created page with "<pre> cap60/applications/lwsrv/README Last update: Mon Aug 28 10:08:35 EST 1995 LWSRV is a LaserWriter print spooler that runs on a UNIX workstation. In normal operation, L..."</p>
<p><b>New page</b></p><div><pre><br />
cap60/applications/lwsrv/README<br />
<br />
Last update:<br />
Mon Aug 28 10:08:35 EST 1995<br />
<br />
LWSRV is a LaserWriter print spooler that runs on a UNIX workstation.<br />
<br />
In normal operation, LWSRV registers an NBP name (as specified by the -n<br />
command line argument) of NBP type 'LaserWriter' on the local AppleTalk<br />
Network. It accepts print jobs from Macintosh workstations and submits<br />
them to the standard UNIX print queue (using lpr or lp) for printing. <br />
<br />
A single LWSRV process may be used to advertise a number of LaserWriter<br />
spoolers. LWSRV is also multi-threaded in that it accepts multiple<br />
incoming print jobs.<br />
<br />
This release of LWSRV builds as two versions, 'lwsrv' for use with<br />
LaserWriter drivers version 7.N and earlier, and 'lwsrv8' for use with<br />
LaserWriter drivers version 8.N and later that support level 3 DSC queries.<br />
In some future release, 'lwsrv8' will replace the current 'lwsrv' which<br />
is currently included for backward compatibility.<br />
<br />
For more information, see:<br />
<br />
cap60/man/lwsrv.8<br />
cap60/man/papif.8<br />
cap60/doc/print.cookbook<br />
<br />
http://www.cs.mu.OZ.AU/appletalk/atalk.html<br />
<br />
"Inside Appletalk, 2nd Edition", Sidhu/Andrews/Oppenheimer<br />
Chapter 14, "Print Spooling Architecture".<br />
<br />
Setting up<br />
------- --<br />
<br />
Before you can use LWSRV, you need to already have the ability to send<br />
UNIX print jobs to a Postcript printer using the UNIX lpr(1) or lp(1)<br />
print commands. You can do this with a serial-line connected printer,<br />
or via the CAP 'papif' program to an AppleTalk connected LaserWriter<br />
(see cap60/doc/print.cookbook or if on a Solaris host, use the script<br />
cap60/applications/papif/add_at_printer).<br />
<br />
The LWSRV program is normally started from the 'start-cap-servers' file<br />
which is run at UNIX boot time by an 'rc' startup script. An example<br />
file is provided in the CAP distribution as cap60/etc/start-cap-servers.<br />
<br />
<br />
lwsrv for LaserWriter 7.N and below<br />
----- --- ----------- --- --- -----<br />
<br />
To use the 'lwsrv' program, you need to provide it with at least four,<br />
usually five command-line arguments;<br />
<br />
-n nameOfPrinter<br />
-p unixPrintQueue<br />
-a dictionaryDirectory<br />
-f fontFile<br />
<br />
The "nameOfPrinter" is the name to be advertised in the Macintosh Chooser.<br />
It cannot be the same name as another LaserWriter or print spooler.<br />
<br />
The "unixPrintQueue" is the string you normally provide as the lpr -P<br />
option to send jobs to a Postscript printer.<br />
<br />
"dictionaryDirectory" is a directory where LWSRV can keep copies of any<br />
printer dictionaries (procsets) that it uploads. This would normally be<br />
"/usr/local/lib/cap/procsets".<br />
<br />
"fontFile" is the name of a file that lists the fonts available for the<br />
printer. This would normally be "/usr/local/lib/cap/LWPlusFonts" which<br />
you copy from cap60/applications/lwsrv/LWPlusFonts.<br />
<br />
When using 'lwsrv' with System 7, you should also specify the -N option<br />
which indicates to 'lwsrv' that it should not collect new Procsets.<br />
<br />
There are other possible command line options, including the -k option to<br />
prevent DDP checksums from breaking some printers, see cap60/man/lwsrv.8.<br />
<br />
<br />
lwsrv8 for LaserWriter 8.N<br />
------ --- ----------- ---<br />
<br />
This is the version of LWSRV that supports level 3 DSC queries as used<br />
by the Macintosh LaserWriter 8.N drivers.<br />
<br />
'lwsrv8' also supports use of a configuration file which can contain<br />
the normal command line options to LWSRV, answers for level 3 DSC<br />
queries and a pointer to a library database of templates that describe<br />
the features associated with each printer.<br />
<br />
To set up 'lwsrv8', copy the file 'DBfile' to /usr/local/lib/cap, then<br />
<br />
cd /usr/local/lib/cap<br />
lwsrvconfig -c DB DBfile<br />
mkdir procsets<br />
<br />
This creates an ndbm(3) database of the printer descriptions available<br />
in DBfile. If the printer you have is not included in DBfile, send<br />
the Postscript file 'query.ps' to your printer, transcribe the printed<br />
settings to DBFile and re-run 'lwsrvconfig'. See the 'lwsrvconfig'<br />
description below.<br />
<br />
You then need to edit the file "lwsrv.conf" to add your printer NBP<br />
name, include an appropriate printer description and UNIX printer queue.<br />
<br />
The following is an example of a simple "lwsrv.conf" configuration file<br />
that contains an entry naming the library database, the 'lwsrv8' options<br />
and the specification for spooler name and name of the UNIX print queue.<br />
<br />
Library = /usr/local/lib/cap/DB;<br />
<br />
Options = (<br />
DontCollect;<br />
ProcsetDir /usr/local/lib/cap/procsets;<br />
FontFile /usr/local/lib/cap/LW+Fonts;<br />
);<br />
<br />
"Technical Services Spool" = (<br />
include "LaserWriter IIf";<br />
printerqueue lw.tsa;<br />
);<br />
<br />
This would be run as<br />
<br />
lwsrv8 /usr/local/lib/cap/lwsrv.conf<br />
<br />
and is approximately equivalent to running 'lwsrv' as<br />
<br />
lwsrv -N -a /usr/local/lib/cap/procsets<br />
-f /usr/local/lib/cap/LW+Fonts<br />
-n "Technical Services Spool"<br />
-p lw.tsa<br />
<br />
The 'include "LaserWriter IIf"' entry includes information from the DB<br />
database that describes features associated with the printer, in this<br />
case a LaserWriter IIf. The DBfile entry for a IIf is<br />
<br />
"LaserWriter IIf" = (<br />
include "LaserWriter Plus";<br />
FeatureQuery *ColorDevice Unknown;<br />
FeatureQuery *LanguageLevel '"2"';<br />
FeatureQuery *PSVersion '"(2010.113) 1"';<br />
FeatureQuery *FreeVM '"2381689"';<br />
FeatureQuery *TTRasterizer Type42;<br />
FeatureQuery *Product '"(LaserWriter IIf)"';<br />
Query ADORamSize '"8388608"';<br />
);<br />
<br />
Note that a base set of entries, including a font list, is included<br />
from the "LaserWriter Plus" DBfile description.<br />
<br />
There are some new compile time options for 'lwsrv8'. One new option is<br />
-DJOBNOPAREN (append to CFLAGS in makefile). This option replaces any<br />
parenthesis () in the job string with square brackets []. The only reason<br />
for this if you have a spooler (like that for the DEC PrintServer 20)<br />
that doesn't handle parenthesis very intelligently when printing the<br />
job string on the banner page.<br />
<br />
Another new compile time option is -DTIMESTAMP (append to LWFLAGS in<br />
makefile). This puts a time stamp on log messages.<br />
<br />
<br />
lwsrvconfig<br />
-----------<br />
<br />
The program 'lwsrvconfig' has two main uses. First, it is used to create<br />
databases of templates, using the ndbm routines (if you don't have ndbm,<br />
but do have the older dbm routines, use -DNONDBM).<br />
<br />
% lwsrvconfig -c DB DBfile<br />
<br />
will read the file "DBfile" and then create a set of dbm database DB.dat,<br />
DB.dir and DB.pag (where the "DB" root in the name is the argument after<br />
the -c).<br />
<br />
Secondly, 'lwsrvconfig' can be used to scan configuration files for syntax<br />
errors. 'lwsrvconfig' reads a configuration file and parses it the same<br />
way as 'lwsrv8' does and reports any errors it finds. It outputs the<br />
printer options to standard output. The -v option will, in addition,<br />
output all templates used.<br />
<br />
% lwsrvconfig lwsrv.conf<br />
% lwsrvconfig -v lwsrv.conf<br />
<br />
<br />
Terminology<br />
-----------<br />
<br />
Options are divided into two types. Global options pertain to all printers<br />
spooled by a lwsrv process. Per-printer options usually pertain to each<br />
particular printer spooled by a lwsrv process. Refer to the lwsrv.8 manual<br />
entry for command line option details.<br />
<br />
Global Option<br />
Options Name<br />
<br />
-C LPRCommand<br />
-S Singlefork<br />
-X AUFSSecurity<br />
-d Debug<br />
-l Logfile<br />
-v Verbose<br />
<br />
Per-Printer Option<br />
Options Name<br />
<br />
-A DSC<br />
-L LPRArgument<br />
-N NoCollect<br />
-P PassThru<br />
-R NeXTResolution<br />
-T TranScriptOption<br />
-a ProcsetDir<br />
-e AllowEEXEC<br />
-f FontFile<br />
-h SuppressBanner<br />
-k NoChecksum<br />
-q QueryFile<br />
-r KeepSpoolFile<br />
-t TraceFile<br />
<br />
<br />
Each 'lwsrv8' spooler is specified by a spooler name and a lpr printer name.<br />
These correspond with the -n and -p options. Global options are those that<br />
come before the first -n and -p options. The per-printer options come<br />
after the -n and -p options, but before the next -n and -p set.<br />
<br />
A per-printer option specified before the first -n and -p options becomes<br />
global and so applies to all printers, unless overridden by on a per-printer<br />
basis. A global option specified after the first -n and -p options still<br />
has global scope. (Note: there is currently no way to turn off the effect<br />
of a per-printer option used globally on a per-printer basis.)<br />
<br />
<br />
Examples<br />
--------<br />
<br />
% lwsrv8 -S -n "My Spooler" -p lp2 -a myprocsets -f myfonts \<br />
-n "Another Spooler" -p lp4 -a procset3 -f morefonts<br />
<br />
The two spoolers have their own set of procset directories and font files.<br />
The -S specifies singleforking for both spoolers.<br />
<br />
% lwsrv8 -a procsets -f fonts -n "Jane's Spooler" -p janelp \<br />
-n "John's Spooler" -p johnlp -f johnfonts -l logfile -T crtolf<br />
<br />
The two spoolers share the same procset directory and would have shared the<br />
same font file if "John's Spooler" had not overridden the font file using<br />
"johnfonts". "John's Spooler" also specifies the -T crtolf option, whereas<br />
"Jane's Spooler" does not. Even though -l logfile is specified for<br />
"John's Spooler", since it is a global option, it still applies to both<br />
spoolers.<br />
<br />
<br />
Using a Configuration File<br />
----- - ------------- ----<br />
<br />
You can specify a configuration file which lwsrv uses for all its options:<br />
<br />
% lwsrv lwsrv.conf [db]<br />
<br />
where db is an optional library of templates (created by lwsrvconfig).<br />
<br />
In the configuration file, statements have the following syntax:<br />
<br />
Name = Value;<br />
<br />
Statements with multiple values are included in parenthesis or curly brackets:<br />
<br />
Name = (<br />
Value1;<br />
Value2 argument;<br />
(etc...)<br />
);<br />
<br />
(The parser is free-form; indentation is used for readability only.)<br />
<br />
Names, values and arguments can be quoted if they contain whitespace or other<br />
special characters. Either single or double quotes can be used, especially<br />
to quote the other kind:<br />
<br />
Value '"Quoted Argument"';<br />
<br />
Two single or double quotes in a row means a single occurrence of that<br />
character:<br />
<br />
Value John''s;<br />
<br />
The configuration file is composed of three parts, of which only the last<br />
part is required. The first (optional) part is the Library section, specified<br />
with the "Library" keyword:<br />
<br />
Library = DB;<br />
<br />
If specified, the Library option specifies a library of templates (this is<br />
overridden by the command line argument). In this example, DB is taken to<br />
be the root of the ndbm files, DB.dat, DB.dir and DB.pag.<br />
<br />
The second (option) part are the global options, specified with the "Options"<br />
keyword:<br />
<br />
Options = (<br />
-S;<br />
LogFile logfile;<br />
);<br />
<br />
Options can be either the commandline option (like -S) or the option name<br />
(like SingleFork, matched case-insensitively).<br />
<br />
The last part of the configuration file includes templates and printer<br />
definitions. Here is the above examples in configuration file format:<br />
<br />
Options = -S;<br />
<br />
"My Spooler" = (<br />
-p lp2;<br />
-a myprocsets;<br />
-f myfonts;<br />
);<br />
<br />
"Another Spooler" = (<br />
-p lp4;<br />
-a procset3;<br />
-f morefonts;<br />
);<br />
<br />
Using option names for the second example:<br />
<br />
Options = (<br />
ProcsetDir procsets;<br />
FontFile fonts;<br />
);<br />
<br />
"Jane's Spooler" = PrinterQueue janelp;<br />
<br />
"John's Spooler" = (<br />
PrinterQueue johnlp;<br />
FontFile johnfonts;<br />
LogFile logfile;<br />
TranScriptOption crtolf;<br />
);<br />
<br />
These examples don't use templates, nor do they include the ability to<br />
respond to LaserWriter 8.0 queries. Here is an example of both the use<br />
of templates and queries:<br />
<br />
Options = (<br />
ProcsetDir procsets;<br />
LogFile logfile;<br />
);<br />
<br />
"LaserWriter Plus" = (<br />
Query ADOIsBinaryOK? True;<br />
FeatureQuery *ColorDevice False;<br />
FeatureQuery *FaxSupport None;<br />
FeatureQuery *LanguageLevel '"1"';<br />
FeatureQuery *TTRasterizer None;<br />
Query ADOSpooler spooler;<br />
FeatureQuery *?Resolution 300dpi;<br />
FeatureQuery *PSVersion '"(42.2) 3"';<br />
FeatureQuery *FreeVM '"172414"';<br />
FeatureQuery *Product '"(LaserWriter Plus)"';<br />
font (<br />
AvantGarde-Book,<br />
AvantGarde-BookOblique,<br />
AvantGarde-Demi,<br />
AvantGarde-DemiOblique,<br />
Bookman-Demi,<br />
Bookman-DemiItalic,<br />
Bookman-Light,<br />
Bookman-LightItalic,<br />
Courier,<br />
Courier-Bold,<br />
Courier-BoldOblique,<br />
Courier-Oblique,<br />
Helvetica,<br />
Helvetica-Bold,<br />
Helvetica-BoldOblique,<br />
Helvetica-Narrow,<br />
Helvetica-Narrow-Bold,<br />
Helvetica-Narrow-BoldOblique,<br />
Helvetica-Narrow-Oblique,<br />
Helvetica-Oblique,<br />
NewCenturySchlbk-Bold,<br />
NewCenturySchlbk-BoldItalic,<br />
NewCenturySchlbk-Italic,<br />
NewCenturySchlbk-Roman,<br />
Palatino-Bold,<br />
Palatino-BoldItalic,<br />
Palatino-Italic,<br />
Palatino-Roman,<br />
Symbol,<br />
Times-Bold,<br />
Times-BoldItalic,<br />
Times-Italic,<br />
Times-Roman,<br />
ZapfChancery-MediumItalic,<br />
ZapfDingbats,<br />
);<br />
);<br />
<br />
"My Spooler" = (<br />
include "LaserWriter Plus";<br />
printerqueue lp1;<br />
);<br />
<br />
"LaserWriter Plus" is a template, because it does not include a printerqueue<br />
(-p) option, and so does not correspond to a real printer. Templates can<br />
be included in the definition of a real printer (or another template) by<br />
the use of the include keyword. Templates can be nested to any depth, and<br />
can even be forward-referenced in the file (the scan is two pass in nature,<br />
so forward references are taken care of).<br />
<br />
Note that the "font" resource definition is used instead of<br />
the FontFile option.<br />
<br />
An important aspect of templates is that when a printer (or another template)<br />
definition includes a template, the value structures in memory are actually<br />
shared, thus saving on memory usage. When a value is overridden, a new<br />
value structure is created in memory.<br />
<br />
Note that printers can also be included, like any other template:<br />
<br />
"My Trace Spooler" = (<br />
include "My Spooler";<br />
TraceFile TRACE;<br />
);<br />
<br />
The library file contains printer template definitions, which can be used<br />
by a configuration file:<br />
<br />
Library = DB;<br />
<br />
Options = (<br />
LogFile logfile;<br />
ProcsetDir procsets;<br />
);<br />
<br />
"My Printer" = (<br />
include "QMS-PS 410";<br />
printerqueue qmslp;<br />
);<br />
<br />
"Another Printer" = (<br />
include "LaserWriter IIg";<br />
printerqueue lp5;<br />
FeatureQuery *FreeVM '"3579932"';<br />
Query ADORamSize '"5242880"';<br />
);<br />
<br />
Note that you can override queries, as in the above example, where "Another<br />
Printer" has only 5 MB of memory instead of the 8 MB specified in the database.<br />
<br />
<br />
Creating Templates<br />
-------- ---------<br />
<br />
There is a file, "query.ps", that contains PostScript code that will print<br />
the answers to the LaserWriter 8.0 queries. Just send the file to the printer.<br />
Or you can edit the query.ps file and remove the beginning section of the<br />
file, so that the responses go to the printer's standard output and then<br />
(usually) into the log file. This is especially useful if you have lots<br />
of fonts.<br />
<br />
Edit your database file (DBfile in the above examples, and as shipped with<br />
this software), and add the next template. Then run lwsrvconfig to rebuild<br />
the database:<br />
<br />
% lwsrvconfig -c DB DBfile<br />
<br />
<br />
Future Possibilities<br />
------ -------------<br />
<br />
lwsrvconfig could be made to build its database from a set of files in a<br />
directory rather than a single file. This could make maintaining the database<br />
a bit easier.<br />
<br />
lwsrvconfig should have a option to dump the contents of the database into<br />
a text format that can be used to recreate the database.<br />
<br />
<br />
Summary of Changes from the Original lwsrv<br />
------- -- ------- ---- --- -------- -----<br />
<br />
Many existing routines, as well as all the new routines rely on a set of<br />
functions provided in list.c. The List structure is a variable length list<br />
of arbitrary objects. Normally, the order of objects in a List is significant,<br />
or it can be sorted and a binary search can be used to search through the List.<br />
The KVTree structure is an AVL (self-balancing, binary) tree of key-value pairs.<br />
This is used for binary searching and replacement of key-values.<br />
<br />
The printer_instance structure has been moved to query.h, and has been expanded<br />
to allow many more options to be specified on a per-printer basis. Now only<br />
the -X, -C, -S, -d, -v and -l options apply to all printers, while -T, -e, -N,<br />
-r, -h, -k, -a, -f, -t, -A, -L, -P and -R are per-printer flags. The -n and -p<br />
flags are used to specify a printer. When the other per-printer flags are<br />
specified before the first -n or -p, they are taken as defaults values for all<br />
subsequent printers. The per-printer options used after the -n and -p options<br />
will override the default options.<br />
<br />
lwsrv8 can be called without options as in:<br />
<br />
lwsrv8 lwsrv.config [database]<br />
<br />
where "lwsrv.config" is the name of a text file that contains configuration<br />
information. This not only includes the normal options to lwsrv, but also<br />
the answers to PostScript queries, as used in LaserWriter 8.0. For example,<br />
the line:<br />
<br />
FeatureQuery *ColorDevice False;<br />
<br />
in "lwsrv.config" for a particular printer, causes the PostScript query:<br />
<br />
%%?BeginFeatureQuery: *ColorDevice<br />
(PostScript code...)<br />
%%?EndFeatureQuery: Unknown<br />
<br />
to be answered with "False". Resources (such as fonts, patterns, but not<br />
procsets, since we still use the original lwsrv way of doing this, namely<br />
to scan a specified directory for procset resources) can also be specified:<br />
<br />
font = (<br />
Times-Roman,<br />
Times-Italics,<br />
...<br />
);<br />
<br />
A template is a set of options and/or query responses, and may include other<br />
templates and override values, but can not specify a Unix printer name (-p).<br />
<br />
"LaserWriter Plus" = (<br />
include LaserWriter;<br />
FeatureQuery *Product '"LaserWriter Plus"';<br />
...<br />
);<br />
<br />
A printer is like a template, but does include the Unix printer name.<br />
<br />
"My Spooler" = (<br />
include "LaserWriter IIg";<br />
PrinterQueue lp;<br />
...<br />
);<br />
<br />
Options can be entered using the original lwsrv option (like -p) or with a<br />
case-insensitive name (like PrinterQueue).<br />
<br />
The option second argument "database" is a ndbm (or dbm) database of templates<br />
that will be used to satisfy unknown template references in the "config" file.<br />
The database can also be specified in the configuration file itself, as the<br />
first line:<br />
<br />
Database db;<br />
<br />
The reading of the configuration file and the building of the templates and<br />
printers is handled by parse.c, parsey.y (yacc) and parsel.l (lex). There is<br />
also an include file parse.h.<br />
<br />
The program lwsrvconfig is designed to do several things. First, it reads a<br />
configuration file the same way that lwsrv would, and can be used to detect<br />
syntax errors and other problems (syntax error checking is primitive, as it<br />
aborts on the first error). lwsrvconfig can also be used to create the ndbm<br />
(or dbm) database of templates.<br />
<br />
Set mode 0600 on normal temp file and 0644 on trace file.<br />
<br />
Variable "tracing" set to true if we are doing tracing.<br />
<br />
Tracing now includes responses sent back to client. These lines begin with<br />
"--lwsrv=>".<br />
<br />
scantoken() has been totally re-written, mainly to support binary data that<br />
can be sent by LaserWriter 8.0, but also to make it more modular and efficient.<br />
In addition, tokens are normally passed through (before, some were and some<br />
were not passed through) so that better post-processing of the document<br />
structure can be done.<br />
<br />
tokval() was rewritten to do binary searching of the toktbl[] (it was a linear<br />
search before).<br />
<br />
The toktbl[] has been changed to include a variable called changeecho, which<br />
tells scantoken() to either leave echoing the same (ECHO_UNCHANGED), turn<br />
off echoing before dumping out the current token (ECHO_OFF) or turn on echoing<br />
but after trying to dump out the current token (ECHO_ON).<br />
<br />
A new flag -q specifies a file in which unknown queries are written. This can<br />
show you when you haven't specified all the necessary queries for a printer,<br />
should allow more easy updates to the query responses when future LaserWriter<br />
driver come out.<br />
<br />
NewStatus() now works even multi-forked. Status is written to a shared file<br />
named .lwsrvstatusXXXXX, where XXXXX is the process id of the original server.<br />
abpaps.c has been modified to provide a callback function when a status reply<br />
or an open reply occur. The callback function for the status calls checks to<br />
see if the requesting node is one with an open connection. If so, the status<br />
is read from the shared file and returned. For all other nodes, the status<br />
is either "idle" if there are no children running for that spooler, or<br />
"processing job(s)" if it is. scantoken() was also changed so that NewStatus()<br />
is called at the beginning of each page.<br />
<br />
The open reply callback function is used for LWSRV_AUFS_SECURITY. Just as the<br />
connection is to be opened, the callback does the usual LWSRV_AUFS_SECURITY<br />
checks and returns an error message if it fails, or sets a boolean in the<br />
aufssecurity array. The array is checked in the main loop, and the connection<br />
closed if the appropriate flag is not set. (This has not been tested.)<br />
<br />
childjob() was modified to set requname if LWSRV_AUFS_SECURITY is not set<br />
and LWSRV_LPR_LOG is set (otherwise, requname is never set and the log<br />
message contains <unknown> as the user).<br />
<br />
unparen() is a routine that removes the leading left and trailing right<br />
parenthesis from a string. This is used in getjob() to remove the parenthesis<br />
in the %%For: and %%Title: fields, which LaserWriter 8.0 now adds. Without<br />
this, RUN_AS_USER fails, since there isn't a user name with parenthesis.<br />
<br />
If you define JOBNOPAREN, all (remaining) parenthesis are converted to<br />
square brackets. This is useful for spooler that print the jobname on<br />
the banner page, but don't handle parenthesis well (the DEC PrintServer 20<br />
has problems with this, so changing to square brackets fixes the problem).<br />
<br />
You can specify a printer specified denied access message (LWSRV_AUFS_SECURITY)<br />
by specifying a "DeniedMessage" line in the configuration file:<br />
<br />
printer = (<br />
AUFSSecurity /tmp/xxx;<br />
DeniedMessage "No can do from %s";<br />
...<br />
);<br />
<br />
This string is passed through fprintf, with %s being replaced by the hostname.<br />
(Note: you will need to escape percent signs by doubling %%.)<br />
<br />
Now, when a child is forked, all other PAP connections are closed. Before,<br />
one child would wait until another child was done, even if the children<br />
were for different printers. Now the children act independently, as they<br />
should.<br />
</pre><br />
<br />
<br />
[[Category:Computing]]</div>Netfreak