mouse:~ppr/src/History.txt

This file contains a history of changes to PPR which occured after the
release of version 1.00.


1.00, 26 April 1995

First public release.


1.10, 27 April 1995--7 June 1995

Removed "From:" line from message passed to Sendmail by pprd when sending
a message listing the remaining printer faults.  This is so that Sendmail
will take the "real name" from the password file and put it in the "From:"
line.

Removed dotmatrix/input.epson, a GIF file which had been inadvertently
included in the distribution.

Moved the contents of include/atalk_streams.h into
interfaces/atalk_streams.c since it was not long enough to justify an
include file, nor was it of interest to any other program.

Added code to ppad to classify members of the group "ppradmin" as PPR
addministrators who can edit printer and group configurations.

Added -v switch to ppad.

Removed uid's 1-99 from the list of priveledged users.

Fixed ppad(8) so that it considers the group "ppradmin" as priveledged
rather than "ppr".

Changed ppr(1) so that it will accept the members of the group "pprprox" as
priveledged as well as the members of "ppr".  This is for security reasons
as one may not want to grant a user who has the privedge of using the -f
switch the priveledge of deleting other people's jobs.

Modified ppop(1) and pprd(8) so that user's can request to see the queue
entry for a single job.  Previously, the only options were all jobs for a
certain destination or all jobs in all queues.

Rewrote and renamed the undocumented "ppop qdebug" command to become the new
documented command "ppop details".  (This was done primarily to support
wwwppop, an experimental managment interface for PPR.  Since it was still
incomplete it was not released with this version of PPR.)

Renamed interfaces/atalk_streams.c to atalk_ali.c and
papsrv/papsrv_streams.c to papsrv_ali.c

Removed code from "make dirs" so that it doesn't create the directory
"/etc/ppr/groups.ppd".

Added sleep=N and eoftimeout=N options to tcpip interface.

Added -C _filename_ switch to ppr invokation in xppr.

Added "-default okay" to xmessage invokation in xppr.

Added the "ppop lpq" sub-command to the "ppop help" information, thus
making it a documented sub-command.

Extended automatic bin selection to multiple media types when "%%PageMedia:"
comments are present.  This has not yet been well tested.

Made "%%EndProcset" an acceptable substitute for "%%EndProcSet" due to a
reputed bug in QuickDraw GX.

Changed rule in ppr_infile.c for detecting PCL code so that documents with
only one escape would still be detected.


1.20, 8 June 1995--10 January 1996

Fixed code in ppr_infile.c so that the ppr -o switch will work even if there
is no "DefFiltOpts:" line in the printer or group configuration file.

Added '(' to list of likely second characters for HP escape codes
in ppr_infile.c

Replaced printing of errno value with strerror(errno) output in some places,
eliminated printing of errno=x from other places where both were printed.

Fixed ppr(1) so that it sets the environment variables "PATH", "IFS", and
"SHELL" so that filters and responders it invokes are less easy to subvert.

Removed setting of PATH from ~ppr/src/misc_filters/tex.perl and changed
shell name from "/usr/bin/tainperl" to "/usr/bin/perl".

Changed code which determins default responder address so that the
environment variables "USER" and "LOGNAME" are used in preference to the
current uid.

Added prompts in Configure to set the directory into which the links to PPR
binaries will be written and the path to the X-Windows binaries such as
xterm.

Modified papsrv so that it will pass the network and node number of the
client to ppr with the -r switch.  (This is for use with an experimental
AppleTalk responder.)

Modified papsrv.c, renaming cleanup() to termination_handler() and causing
it to call fatal() only the first time it is called.  Without this, name
could be left on the network if the CAP version received two terminate
signals in rapid sucession.

Added code to re-line-wrap responder messages for certain responders.
(The library function responder_width() returns the width for a responder.
Currently it is hard coded to return zero for all responders except "samba".
A return value of zero indicates that the message should not be
re-line-wrapped.)

Dropt reading of LPDEST and PRINTER by ppr(1).  (I can not really remember
why I put this feature in.  I don't think the reasons where very good.  It
may have been that I thought that the same printer would be available thru
two spooling systems so one might want to set the default destination for
both with one variable.  That now seems a little far fetched.)

Separated Solaris and Starserver sections of sysdep.h

Added PNG (Portable Network Graphics) format with magic number recognition
to ppr_infile.c.  This remains untested since I do not have any programs
which manipulate this graphics format.

In pprd.c, put sleep(1) between execl("pprdrv") and _exit(242) so that pprd
has time to record the PID before the child exits.  (If this is not done
and execl() fails immediately, a child which should have become pprdrv may
exit before the parent records its PID in the information structure for that
queue.  This result is that it will not recoginize the purpose of the child
when it receives notification of its death and will leave the queue in the
printing state indefinitely.)

Did same in pprdrv.c in code which executes interface.  Also changed
_exit(255) to _exit(242).  (Exit 242 is the new standard since PERL uses 255
as the exit code when die() is executed.)

Added automatic creation of "DefFiltOpts:" lines to ppad(8).  Manual
creation is supported by the the "ppad deffiltopts" and "ppad group
deffiltopts" command.

Modified ppop so that interactive mode restores the terminal settings when
it exits.  Also changed terminal setting code to use the POSIX method of
reading and setting terminal characteristics instead of the ioctl() method.

Modified code in serial interface so that it reads the port settings and
modifies them instead of writing entirely new settings.

Added the experimental commentator "audio".

Added HTML as an input file type.  Auto-detect works if the file begins with
the magic number "<HTML>".

Added -s to ar switches for Linux configuration in include/global.mk.master
because this seems to be necessary with the tools supplied with
Slackware 2.3.0.

Fixed information on -S switch default in "ppr -?".  The actual default is
"true".

Minor modifications to the DSC versions of the HP PPD files.

Renamed pputc(), pputs(), pputline(), pflush(), pprintf(), post(), and
quoted() in pprdrv to printer_putc(), printer_puts(), printer_putline(),
printer_flush(), printer_printf(), printer_puts_escaped(), and
printer_puts_QuotedValue() respectively.

Fixed ppad so that "ppad -- switchset" can be used to work around brain-dead
implemenations of getopt().

Fixed ppr2samba so that it would remove *~ (Emacs style backup) files from
the /etc/ppr/printers and /etc/ppr/groups directories before building the
dummy printcap file.

Removed a bug from ppad_conf.c print_switchset() which would cause
segmentation faults when displaying the configurations of printers or groups
with switchsets defined.

Fixed ppad_printer.c:printer_show() and ppad_group.c:group_show() so that
they deallocate all the memory they allocate.

Removed the experimental error trailer page code (which was not compiled in
due to NEWCODE not being defined) from pprdrv_flag.c.

Added "save/restore" and "newinterface" jobbreak methods.

Modified pprd so that it makes pprdrv its own process and session group
leader.  (That is, pprd calls setsid() in the child half just after the
fork().

Fixed pprdrv so it will only wait 60 seconds for commentators to exit.  It
they exists, hoping they will get SIGHUP.

Limited argc feed to getopt() in ppad.c:main() to 2 or less so that it will
not try to parse options in a switchset.  This makes "ppad -- switchset"
unnecessary.

Fixed bug in pprdrv_flag.c:select_flag_media() which prevented banner and
trailer pages from being printed on printers with no bins with mounted media
defined.  Going on the information that a mounted media list was found, it
assumed that the printer had bins and did not regard the fact that it was
reported to have zero bins.  This bug was almost certainly introduced before
version 1.00.

Added /etc/ppr/mfmodes database and code in ppad(8) to automatically put a
mfmode= in the DefFiltOpts:.

Added a "*Product:" line with the true product name to my HP 4M and HP 4M
Plus PPD files.

Modified the DVI filter so that it will create dvips config files on the
fly.

Added a define called "A4" which causes filter output and banner pages to be
formatted for A4 paper.

Fixed ppop so that when displaying the names of the media a document is
waiting for it does not display the second argument of the "Media:" line.

Fixed pprsync so that it works with Linux but no longer re-starts papsrv.

Fixed ppr/ppr_infile.c so that it will accept the file name "-" to mean
stdin.

Fixed pprd so that it will create /var/spool/ppr/logs with the permissions
755 instead of 700.

Defined the global #defines VERSION and COPYRIGHT in version.h

Added pprdrv_progress.c module.

Added reporting of percent sent, pages started, and pages completed to queue
display of currently printing job.

Added indication of unfiltered and filtered size in bytes of the job to
"ppop details".

Replace use of sigpause() in pprdrv.c to wait for the SIGUSR1 that indicated
that the interface had set up its SIGUSR1 handler with Posix sigsuspend().

Added a signal() macro for Linux to sysdep.h because the Linux signal() is
System V compatible, not BSD compatible as PPR requires.  It is interesting
that Linux sigpause() is BSD compatible.

Put quotes around the file name in the redirect of diff output in
ppd/makepatches.sh so that bash will not say "Ambiguous redirect".

Some changes to "xwin" commentator.

Modified atalk_ali.c so it will print "%%[ status: xxxx ]%%" if the printer
is busy.

Added code to pprdrv so it will copy "%%[ status: xxxx ]%%" message to the
printers status file and send them to the commentators.

Fixed pprdrv.c so the status file is only removed before exiting if the job
was printed or resulted in a job error.

Fixed the CAP and ALI atalk interfaces so that they will continue to read
data from the printer even after pprdrv has ceased to send data.

Removed fatal() from atalk_ali.c interface code.

Added code to pprdrv so that when PJL is used, pprdrv will wait for the last
page to hit the output tray before exiting.

Added wwwppop to the distribution even though it is still incomplete and
very insecure.  No installation instructions are provided.

Added a patched verion of the the Adobe Windows 2.0 proceedure set to the
distribution.

Cleaned up atalk_cap.c and atalk_ali.c to make them neater and more
consistent with one another.

Increase use of const, strerror(), and strsignal().

Fixed atalk_cap.c so that if will correctly detect a printer that is busy
and print "%%[ status: xxxx ]%%" and return EXIT_ENGAGED.

Fixed "ppop lpq" so that is displays all the jobs even if one of them is
printing.

Disallowed an empty colour name as input to "ppad media put" since such an
entry could cause false matches in ppr_media.c:_write_media_line().

Fixed prompt for banner suitability in "ppad media put".  The prompting and
input range checking were broken.

Fixed code in ppr_media.c:_write_media_lines() so that an unspecified colour
requirement would match "white".  Previously this didn't work.

Added an "undefined command t42CSB" to pprdrv/pprdrv_reason.c to detect the
Adobe PostScript Driver for MS-Windows sending to an HP4M with an HP4M+ PPD
file.

Changed ppr_main.c:main() so that the default "%%For:" line uses the unix
/etc/passwd comment field in stead of the user name.  The "-u yes" switch
produces the former behavior.

Added setsockopt() to interfaces "tcpip" and "lpr" to turn on SO_KEEPALIVE.

Changed tcpip and lpr interfaces so that if DNS fails the printer will be
placed into fault-retry mode instead of fault-no-retry mode.

Added code to ppr_respond.c: respond() to wait until responder is done.

Changed papsrv_conf.c so that all the configuration file keywords are case
insensitive.

Added CAP AUFS -X authentication to papsrv.  Added the suporting keyword
"ForceAUFSSecurity:" to the papsrv configuration file.

Added debuging code to the interface "tcp/ip" in an attempt to figure out
why it sometimes doesn't report an error when attempting to communicated
with a crashed pocket print server.

In pprdrv.c: main(): changed fdopen(printlogfd,"w") to
fdopen(printlogfd,"a").  For some reason, the former sometimes didn't work
even though printlogfd had been opened for append.

In "ppad show" and "ppad group show" output changed "Default Filter
Options:" to "Default filter options:" and "Switchset:" to "Switchset
macro:".

Added code to pprd/pprd.c:reapchild() to put an error message in the log
file if a responder or other non-interface process terminates abnormally.

Added code to serial interface to detect a jobbreak method of "signal" or
"signal/pjl" and refuse to proceed.

Added code to serial interface to support an online= option which allows
DSR, CTS, or CD to be specified as a line which must be true before the
printer will be considered to be on line.

Renamed ~ppr/src/README to ~ppr/src/INSTALL.

Added options.c to libppr.a.

Moved convert_dimension from ppad/ppad_media to libppr/dimens.c.

Fixed the "tcpip" interface so that the SIGALRM handler only sets a flag.
Previously it would exit() from the signal handler, and if running with the
"patron=" option, it would send SIGUSR1 to its patron, sleep() end then
exit().  The sleep() did not work under Linux because it was inside a
SIGALRM handler.

Fixed the "pr" filter so that it would feed the options thru to filter_lp.

Fixed a problem in ppr_infile.c which made options such as
"fontnormal=Times-Roman" not work because the hyphen was mistaken for a
filter name delimiter even though it occurs after the = sign.

Modified filter_lp to use the functions in libppr/options.c.
Added numberous options to filter_lp.  Previously, the only option
was "charset=".  Changed MIN_COLUMNS from 80 to 70, changed MIN_LINES from
55 to 50.  Changed the point size limit from 80% of the line spacing to 100%
of the line spacing.

Put quotes around PostScript font name in log output of indexttf.

Changed ppr's -o switch so that multiple instances are concatenated together
rather than overriding previous ones.

Modified dotmatrix filter to use libppr/options.c; added the "colour=" and
"color=" options; Added the "noisy=" option.

Changed the name of ~ppr/install/install to ~ppr/install/fixup.

Changed "fortran" filter to use libppr/options.c.  The fortran filter may
not have worked at all in version 1.10 because it didn't like the number of
options it was getting.

Wrote a function libppr:foptions:filter_options_error() and fixed filter_lp,
dotmatrix, and fortran to use it.

Fixed texinfo filter so that it will use the dvi filter, passing the options
to it.

Fixed a problem in dotmatrix filter: the narrowcarriage= option changed the
left margin to 0.25 inch in stead of shifting everything right 0.25 inch.
This caused problems if the document contained its own margin settings or
absolute horizontal positioning commands.  Part of this involved taking the
revision of procset "Trincoll-Dotmatrix" from 0 to 1.

Removed the group "ppr" from the this of those who may use the -f switch to
pretend to be someone else.  Now only "root", "ppr", and the members of
"pprprox" may do so.

Changed "ppop" so that the authorized group is "ppop" rather than "ppr".

Changed "ppad" so that the authorization group is "ppad" rather than
"ppradmin".

Fixed misc_filters/pcl.perl to fool Perl so that it believes a safe PATH
is defined at the top.  (The PATH and IFS provided by ppr are safe already.)

Simplified the install procedure, making "make dirs" part of "make install".

Made all setuid "ppr" programs also setgid "ppop".  PPRD and PAPSRV also now
do setgid(getegid()) if they find they are running as root.

Fixed xppr.  If ppr returned non-zero, it wasn't properly printing the error
message when ppr failed.

Fixed pprdrv code related to correct output order when the input is reversed
and the printers has a face up tray.

Added an "HP DeskJet 500 Ghostscript" ppd file.  It differs from the
"HP LJ III Ghostscript PPD" in that the *DefaultOutputOrder is Reverse.

Added a second PSVersion line to the Ghostscript PPD files for revision 333.
(That is, Ghostscript 3.33.)

Modified misc_filters/tex.perl, adding a run_with_stdin() function to replace
the use of system().  Fixed a problem which caused the option parser to
fail if there was more than one option.

Added -fomit-frame_pointer and -m486 to Linux compile options.

Added www.conf authorization file to wwwppop.

Fixed "ppop lpq" command so it will not print "No entries" after printing
usage help.

Added %%DocumentData: Clean7Bit to filter_lp.

Added %%DocumentData: Clean7Bit to dotmatrix and made change to make it true.

Implemented rudimentry job splitting.  Jobs can be split into an arbitrary
number of segments but all segments have all the requirements of the whole.

Implemented printer configuration option "GrayOK:".

Changed Linux library making command in global.mk.master from "ar -sq" to
"ar -crs" to remove need to run ranlib with some versions of the Gnu
utilities.

Changed pprdrv/pprdrv_reason.c message from "No TT rasterizer,wrong PPD
file" to "No TrueType rasterizer,MS-Windows is using|wrong PPD file".

Made corresponding changes to ppop to break messages at "|".

Converted ppr2samba from a shell script to a C program so that we can make
it set user/group id so that anyone can run it.

Added qentry.attr.parts to give total number of parts in the job.  Also
added line to "ppop details" to display that information.

Added state_update() to pprd.c and code to call it to inform queue
monitoring programs of interesting events.

Moved debug("pprd starting") to a point after the old log files are renamed.

Reworked SIGCHLD and close_interface() code to pprdrv to get rid of obscure
lockup.  Greatly simplified code in the process.

Fixed "ppop details" so it will no longer show ".0" at the end of job ids.

Added -M switch to ppop and added "ppop qquery" command.

Expanded many of the help messages in ppop.

Made ppr use the file name as the default title if no -C switch is given.

Added -G switch to ppr.  (This belongs back there somewhere.)

Found and corrected several places in pprd.c where job->status was being set
directly rather than calling newstatus() to do it.

Removed code which printed "gunzip" or "uncompress" on stderr when printing
compressed files.

Added an interactive mode and an -M switch to ppad.

Changed ppop and ppad interactive mode so that an stty to set the backspace
character to control-h is not made unless BACKSPACE is defined.  BACKSPACE
will be defined in sysdep.h.

Changed "%%Orienation:" handling code do detect three states, Portrait,
Landscape, and Unknown.  Previously it only determined landscape true or
false.

Added code to papsrv to retry name advertising if it fails with CAP error -1025.

Added code to papsrv so it will announce when it has added all the names,
and on shutting down, when shutdown is complete.

Enhanced papsrv debug() so it datestamps its lines.

Added code to papsrv so it will print query information in the log file after
receiving SIGUSR1 and quit after receiving another SIGUSR1.

Added RamSize: as a valid line in the papsrv config file.

Changed papsrv so that appletalk_dependent_cleanup() is only called by the
daemon, not by its children.

Changed references to stderr in ppop.c to errors which can be redefined.
Redefined errors to stdout if -M switch is used.  This helps Tcl/Tk which
seems not to read stderr.

Removed code at start of ppop main which set stdout and stderr to line
buffering mode.

Changed references to stderr in ppad to references to "errors" and put code
in -M switch handler to define errors as stdout.

In "ppop status" displays, changed "printing xxxxx-yyy (stopping)" to
"stopping (printing xxxxxx-yyy)".

Modified the "ppad show" command to produce machine readable output with the
-M switch.

Fixed ppop to use the Posix sigsuspend() in stead of the deprecated sigpause().

Added a SIGPIPE handler to ppop so it can produce an inteligible response
when the spooler shuts down.

Fixed a bug in the ALI version of the AppleTalk interface which caused it to
write the message that there was a syntax error in the printer address into
an alert file with the wrong name.

Fixed bug in atalk ALI interface:  after hiding a printer it would sleep for
10 seconds and then look for it with the unhidden name which would always
fail.

Fixed a bug in the papsrv_ali.c module.  When trying to flush the output
buffer it used while(ocount) when it should have used while(ocount ||
blocked).  Was able to simplify flush_reply() after fixing this bug.

Made "open_retries", "lookup_retries", and "lookup_interval" interface
options in the ALI version of the atalk interface.

Fixed a bug in interfaces/atalk_ali.c: fatal_pap_error().  The switch
statement did not have breaks after to calls to alert() with the result that
more than one alert message would be posted for each error.

Fixed papsrv Makefile so that papsrv_ali.c and papsrv_cap.c will depend on
include/papsrv.h

Changed papsrv so that add_name() takes only the prnid as argument, the name
string was dropt.

Fixed a problem in pprd.c which caused it to write a new printer's first
media list to "/etc/ppr/mounted/<invalid>" because printer_count wasn't
updated soon enough.

Re-wrote interfaces/atalk_ali.c: copy_job() to use select() for better
handling of the data stream from stdin to the printer and the stream from
the printer to stdout.

Fixed bug in pprdrv_twoway.c:  when lines were received from the printer, if
the were written to the log they were only written correctly if they were
the first line in the data block.  This is because the code printed the
first n characters of the data block rather than the first n characters of
the line.

Slightly modified PJL handling in pprdrv_twoway.c to prevent PAGES=n lines
from appearing in the job log.

Modified pprdrv_nup.c so that it will use Trincoll-dmm-nup-3-3 only if
Trincoll-dmm-nup-3-4 is not available.  Created Trincoll-dmm-nup-3-4 which
will be a new version of the N-Up dictionary.

Modified Configure and include/global.mk.master to support NATALI/Netatalk
under Linux.

Modified ppr_main.c: main() so that the "%%Pages:" comments in jobs will be
rounded up to the next multiple of the smallest printable unit.

Added the shell script papsrv_kill and fixed pprsync to use it.

Added code to papsrv to answer *Option queries using information in
"PPDOpt:" lines in the printer configuration file.

Changed the papsrv message "%%[ Error: unspecified fatal ppr error ]%%\n"
to "%%[ Error: fatal error, see papsrv log ]%%\n".

Added squeeze.c from dvips.  Modified it so that it no longer strips out DSC
comments.  Modified procset Makefile so squeeze is applied to
Trincoll-dmm-nup-3-4.  This reduces to downloaded dictionary to 1/3 of its
former size.

Changed the gs and gstcpip interfaces so that if Ghostscript exits with
errorlevel 1 the job is arrested rather than putting the printer in
fault-no-retry mode.

Installed workarounds for NATALI in atalk_ali.c.  These are compiled in if
_NATALI_PAP is defined.

Relaxed the parsing of cpio output in pprsync.

Replaced various calls to poll() with calls to select() since select() seems
to be more widely supported.

Added -fno-strength-reduce to the gcc flags for Linux.

Added reference to "ppop help" to "ppop -?".

Changed installprogs/fixup.sh so that it will put " # -z 'Default Zone" at
the end of the papsrv line in rc.local.


1.30a1, 17 January 1996--26 February 1996

Fixed an echo command in pprsync to use $EECHO.

Removed unused code in pprdrv which could display the job title on a PJL
display.

Changed sigpause() to sigsuspend() in pprdrv.c:signal_jobbreak().

Fixed atalk_ali.c: copy_job() slightly so that it will only call
pap_write() if pap_look() return PAP_WRITE_ENABLED or 0.

Put writemon code in pprdrv_twoway.c: twoway_pjl_wait().

Applied the squeeze program to all of the Trincoll-PPR-* procedure sets and
re-aranged the top level Makefile so that the procsets directory will be
built before dotmatrix so that squeeze will exist when dotmatrix is built.

Modified pprdrv_twoway.c: twoway_pjl_wait() so it does not wait if a
PostScript error has been detected.  It is not clear if this ought to be
necessary.

Changed papsrv so it will try to read /etc/ppr/papsrv_default_zone if there
is no -z switch.

Removed commented out -z switch from code added to rc.local by fixup script.

Changed ppop lpq so that if there is no title it prints a file name of
"stdin" in stead of "(no title)" and so that it changes spaces in the title
to underscores.  (It was suggested that this may be necessary to get around
problems in the Samba lpq parser.)

In include/global.mk.master, Linux section, changed -ldbm in DBLIBS to
-lgdbm.  Old Slackware releases seem to have only libdbm which seems not
to include gdbm but in Slackware 2.0, libdbm is a link to libgdbm and
since libgdbm is really what we want, why not specify it?  Among other
things, if it is not there it will prompt the installer to install the
package himself.

Corrected bug in pprdrv_res.c:  _include_resource(), when searching the
resource list failed to check the version and revision numbers.  This caused
a problem if two versions of the same resource are contained in the same
file.  This _seems_ unlikely, but Freehand declares "FreeHand_header 3 1"
supplied but includes "Freehand_header 3 0".  (Reported by Damian Iveriegh.)

Fixed ppr_res.c so that warnings print the procset version and revision
numbers.  (Suggested by Damian Iveriegh.)

Modified ppr_res.c to accept procedure sets with version numbers but no
revision number and treate the missing revision number as zero.  (Per
RBIIpp. 637,638.)

Created a new library function ppr_get_command() to combine code from ppop
and ppad interactive modes and to get ready for eventual GNU readline
support.

Replaced previous library exit code variables with "lib_memory_fatal",
"lib_tokenize_fatal", and "lib_misc_fatal".

Broke ppop.c into ppop.c, ppop_cmds_listq.c, and ppop_cmds_other.c.

Removed "-Z true" from the arguments papsrv uses when it invokes ppr.  This
was necessary because QuickDraw GX goes not end the file with an "%%EOF"
line.

In the QFileEntry structure, deleted the redundant "principal" member
leaving the "proxy_for" member.

Deleted DNSLIBS from global.mk.master and replaced DNSLIBS in
lprsrv/Makefile with SOCKLIBS.

Converted ppr to use distributed job names.

Added ppr_get_nodename() to the library.

Added nodename_to_nodeid(), free_nodeid(), and nodeid_to_nodename() to the
library.

Added Configure, sysdep.h, and global.mk.master sections for SunOS 4.1.3_U1
(Info provided by Damian Iveriegh.)

Added Configure, sysdep.h, and global.mk.master sections for OSF/1 3.2 (Patches
and README.osf provided by Steve Swinnea <swinnea@weiss.che.utexas.edu>.)

Added mystrndup() to the library.

Changed function names in ppop_cmds_listq.c and ppop_cmds_other.c so that they
have prefixes based upon the commands which invoke them.

Various structures had members called "id", "qid", or "jobid", all of which
refered to the same thing.  Changed them all to "id".

Changed product string in Ghostscript PPD files from "(Ghostscript)" to
"(Alladin Ghostscript)" because that is what at least versions 3.33 and 3.51
of the interpreter return.  Also make a first Product string which is the
same as the ModelName and NickName.  This is so that LaserWriter 8.x can
pick the right one.

Added %hd to ppr_sscanf().

Changed "ppop list" protocol to eliminate passing of binary structures.

Various function name changes in ppop and pprd so that the ppop command
functions all have the form ppop_XXXX().

Added struct Destname and the parse_dest_name() function to ppop.c.

Numberous corrections to make the code compile properly under G++.

Converted the serial, tcpip, and atalk_cap interfaces to use the option
parsing library.

Copied the retry timer options code into atalk_cap but did not implement the
code to use the values.

Modified the libpprdb functions to call error() in stead of
calling fprintf(stderr,...).

Changed the name of the "HP LJ III Ghostscript" PPD file to
"HP LaserJet III Ghostscript".

Added "fullname" to ppuser records.

Changed the name of db.h to "userdb.h".

Fixed ppuser to always return values from util_exits.h

Added "ppuser help" command.

Changes in interfaces/lpr.c: Changed the socket() call to a
rresvport() call (remote lpd requires a connection from a priveledged
port). Look up port number for lpr service ("printer") in /etc/services
defaulting to 515 if not found. Added new option "lpr_typecode",
which may be either "o" or "f" (default to "f"). This is the letter
that is used before the data file name in the cf file sent to the
remote lpr.  "o" is officially used for Postscript, but older lpr
spoolers don't understand it. The data file is now sent before the
cf file so that remote deamons won't try to start printing before
the whole file has arrived.  (Damian Ivereigh)

Furthur changes to interfaces/lpr.c: made use of reserved port conditional on
geteuid() returning zero, added option to specify remote port with host:port
format just like tcpip interface.  Eliminated use of Berkeley rresvport()
function in favour of socket() and bind().  (David Chappell)

Eliminated WinNT w/Hippix from global.mk.master and simplified definition
of LIBCMD in Makefiles.

Added "PPRVersion: x.xx" to queue files.  The idea is that with the advent
of distributed printing it may be necessary to convert between new and old
queue file formats.

Changed "ppop status" so that when the status of a printer is displayed, if
it is "printing", the retry number will be displayed if it is greater than
zero.

pprdrv/pprdrv_twoway.c: changed name to pprdrv/pprdrv_feedback.c, combined
ready_twoway() and start_twoway() into feedback_start().

pprdrv/pprdrv.c: simplified main() by breaking large code chunks out into
separate functions.  Rearanged somewhat to accomodate future raw printing.

pprdrv/pprdrv.c: copy_pages(): changed variable name "thissheet" to
"sheetmember".

pprd/pprd.c: initialize_queue(): changed call to calloc() to call to
myalloc().

Made use of GNUC __attribute__ in global_defines.h conditional on the
definition of __GNUC__.

Added myalloc_checkpoint() and myalloc_assert() to libppr.

Converted Configure and global.mk.master to use cpp in stead of m4.  Removed
code in Configure to select system type manually.

Added -H switch to ppr and implemented "-H saveinfile", added opts.hacks to
struct QFileEntry.

Added member "portion" to struct QFileEntry.

Changed libppr/readqfile.c: read_queue_file() to read_struct_QFileEntry().
The new function takes an open file rather than a file name.  Also changed
the name of libppr/unreadqfile.c: destroy_queue_file() to destroy_struct_QFileEntry();

Added a "Time:" line to the queue file and effectively removed code in
pprdrv/pprdrv_progress.c which preserved the file dates on queue files when
writing the "Progress:" line.


1.30a2, 26 February 1996--17 May 1996

Changed myrealloc() to use number of members and size just like myalloc
does.  Previously it took the number of bytes desired.

Added -p switch with the settable values start=, stop=, even=, and odd= to
specify a subset of the pages to be printed.

Added code to make ppr "-s fronts", "-s backs" work.

Added automatic TBCP decoding via a special filter.

Made fixup.sh make lpr interface setuid root.

Modified ppr program so that level variable is replaced by calls to
functions in ppr_nesting.c.  Also added calls to functions in ppr_nesting.c
which keep track of which part of the outermost document is being parsed
(prolog, docsetup, script, etc.).

Made ppr_infile.c: stubborn rewind unlink() to temporary file immedately
after re-opening it instead of saving its name for later unlinking by
exec_filter().

In stubborn rewind, changed pointer in write() call from in_buffer to
in_ptr.

Added sleep= option to dummy interface.

Added binary token preservation code in ppr_infile.c: getline().  (Does not
support Binary Object Sequences at this time.)

ppr/*.c: changed variable name "eof" to "logical_eof".

ppr/ppr_main.c: main(): Changed severity of warning about character following
%%EOF mark from SEVERE to PEEVE if the number if characters is less than 50.

pprdrv, ppad: added jobbreak method "tbcp".  Added printer_TBCP_on_off()
function to pprdrv:pprdrv_buf.c but it doesn't do anything yet.

Modified the PPD file lexers for pprdrv and papsrv so that they can do
nested include files more than 1 deap.

Modified pprd so that it can expand its queue array if necessary.  Moved the
definition of the initial queue size from global_defines.h to pprd.h.

Corrected product string in HP 4M+ PPD file.  Appended "DSC" to ModelName in
HP 4M and HP 4M+ PPD files.  Changed PPD version from 4.1 to 4.2.  Added
"*LanguageEncoding: ISOLatin1".  Added halftone type option for HP4M+.
Changed "*Nickname:" to "NickName:" in HP4M+ PPD.  Added optional equipment
queries to HP4M and HP4M+ PPD files.

Modifications to pprd and pprdrv to reduce use of non-reentrant functions by
signal handlers.  Also fixed signal handlers to save and restore errno.

HP4M and HP4M+ PPD files: Removed reciprical options when they are obviously
reciprical.

Added "*ShortNickName:" lines to HP4M, HP4M+, Ghostscript, and QMS-PS 410
PPD files.

Added module ppad_readppd.c and made PPDDIR in global_defines.h an absolute
path in order to make ppad diagnostic messages clearer.

Converted ppad_filt.c to use ppad_readppd.c.

Converted "ppad ppdopts" command to use ppad_readppd.c  (Previously it did
not support PPD includes at all.)

Converted "ppad bins ppd" command to use ppad_readppd.c (It supported
include files previously.)

Made -H and -G table driven and added support of "no-" prefix.

Added -H badeps.

Added -G structure:nesting and -G structure:sections.

Restored system type menu to Configure, moved global.mk.master into
Configure using herefiles and other shell techniques to replace cpp.

Added "none" as a valid argument the the "online" option to the "serial"
interface.

Added HP PPD files for 4V, 4M Plus, and Color LaserJet.

Fixed "gs" interface.  If the port wasn't writable it was reporting that the
port did not exist.

Made pprdrv_reason.c: give_reason() reentrant so that
pprdrv_reason.c: describe_postscript_error() would be reentrant too.  As far
as I know, all of the rentrancy problems have been removed from pprd and
pprdrv.

Moved INSTALL.osf1 into INSTALL.

Fixed a timing bug in pprdrv, it would sometimes miss the SIGUSR1 in
start_interface().  It is unclear when in the 1.30 development this bug was
introduced.

Added a "nodename" argument to destination_protected() in libppr.  Currently
it will always return FALSE if the nodename is not that of the local node.
It will remain this way until such time as I choose to implement charging
for remote printing.

Cleaned up the code in pprd.c: main() which opened the FIFO, moving it to a
function called "open_fifo()".  Previously, pprd would block at this point
with the result that the open() was often interupted by SIGCHLD and SIGALRM
didn't work yet.

Added a second argument to libppr/readppd.c: ppd_open().  This second
argument is the stdio file pointer to use when writing error messages.

Reworked ppr2samba to create a smb.conf include file as well as the
pseudo-printcap file.

Added missing -l, and -p items to papsrv -? help.

Corrected ppr2samba Makefile, it was running installscript on the binary and
failing to strip it.

Added ~ppr/src/misc/ppdconv.perl to the distribution.

Added automatic detection of PDF input files.

Improved auto-detection of HTML files and added detection of other SGML
types.  (If the file is HTML, then ppr_infile.c runs filter_html on it, if it
is some other type of SGML, then ppr_infile.c runs filter_sgml on it.

Removed ppd/PPDrename since it has not been used in a long time.

Added to "ppad interface" so that it assigns new printers the default filter
options of the "Apple LaserWriter Plus" as well as its PPD file.

Added -d (debug) switch to ppad.

Fixed ppad and ppop so that they will send help messages to stdout if
invoked with -?, to stderr if they see an unrecognized switch.  Exit values
also fixed.

Changed "*Option4" in "HP LaserJet 4M Plus DSC" PPD file to
"*InstalledMemory".

Fixed "ppad ppdopts" so that it will do "*InstalledMemory" options as well
as *Option options.

Fixed ppad so that it will consider *InstalledMemory when generating default
filter options.

Removed a bug in ppad_filt.c which would cause a crash under certain
circumstances when a third printer was added to a group.  The problem
related to "*DefaultResolution" line parsing.

Fixed papsrv so that it will answer *InstalledMemory queries.

Enhancements to ppr so properly handle the result of printing with the Adobe
Acrobat reader version 2.1 under MS-Windows 95.  The Acrobat reader
stupidly prints the file by putting a 298 page document on one page using
"%%BeginDocument:".  What makes things so bad is that there is a colon missing
from a "%%BeginFile" comment.  The result is that the "%%EndFile" was
terminating the document structure with the result that ppr generated page
start records in the -pages file for all of those pages.  When pprdrv
interpreted it differently it would print all the pages as components of the
enclosing first page and then go on to the first real page.  The result was
two copies.  The solution is to enhance ppr_nest.c so that it does better
gabbing and so that it ignores the false terminator.


1.30a3, 31 May 1996--14 June 1996

Added ForLine, Time, and Reason arguments to responders.  Cleaned up
responder code in ppr and pprd somewhat.

Fixed a bug in pprd which was created by the expansion of the jobid syntax.
When a job was held or arrested, the chmod() would fail because the file name
had been build the old way.

Changed library function wrap_string() so that it modifies the origional
string rather than coping it.

Changed /etc/ppr/smb.conf to /etc/ppr/smb-include.conf.

Fixed dotmatrix problem: If underlineing was done by turning on underlining
and printing spaces interspersed with horizontal moves, the horizontal moves
were underlined as well as the spaces.

filter_dotmatrix:  changed Trincoll-Dotmatrix-1-1 to revision 2, changed
/bp so default downward shift was 12 pt in stead of 20.  Put the variables
in a procedure called pprdotmatrix_init.  Added xshift and yshift to
filter options.

Modified the audio commentator to work with pprpopup.

Changed pprdrv/pprdrv_commentary.c so that commentator stdout and stderr are
logged to the pprdrv log file.

Fixed startup code in pprd/pprd.c: main() so that if the uid is root it
calls setgid(0) before it tries to set the gid to the egid.

Added the program samba_submitter.

Modified ppr/ppr_respond.c: respond() so that it no longer redirects
responder stdout and stderr to /dev/null.

Modified papsrv/papsrv.c:main() so that it does setgid(0) before it does
setgid(egid).  This may be necessary for Linux and possibly other unixes.

Midified papsrv/papsrv.c:main() to use exit codes from include/util_exits.h
if it has to report an invokation error.

Added XWINBINDIR to include/global_defines.h and made appropriate change to
Configure.

Corrected problem in Configure due to some use of "/usr/X11/bin" where
"/usr/bin/X11" was meant.  This had resulted in CHANGE begin uncommented
when it shouldn't have been.

Added a new program, xpprgrant.  This is a setuid root program.  Changed
fixup.sh to set its permissions.

Removed xppr from the list of files linked into /usr/bin.  Caused creation
of /var/spool/ppr/pprclipr even if LANMAN X is not present since it will be
used for the audio commentator.

Set and exported HOME in xwin responder and xwin commentator so that they
will work properly when invoked from pprd.


1.30b1, 17 June 1996--18 July 1996.

Removed HOME setting and exporting code from xwin responder and xwin
commentator and moved it into pprd.c, ppr_main.c, and papsrv.c.

Sent pprd responder stdout and stderr to the pprd log file.

At some point, alert.c:valert() was broken so that it did not create a new
alert log if the old one was more than 1 hour old.  Fixed that.

Added #include <errno.h> to pprd/pprd_respond.c.

In papsrv/papsrv_ppd_parse.l: changed VMOPTION* to VMOPT* because some
versions of Lex appearently limit start condition names to 8 characters.

Added explainatory comments to misc/smb.conf.sample.

Fixed ppr/ppr_main.c: parse_d() so that it uses its argument rather than
optarg.  Before this fix, ppr would core dump if invoked with no option
arguments.

Fixed ppr/ppr_main.c: warning().  It was still using the [old?] job log
file name format.


1.30b2, 18 July 1996--2 October 1996

Fixed ppop/ppop.c: print_reply():  it was not correctly parsing the return
value at the start of the reply message.  This was because it initialized
retval to EXIT_INTERNAL and then tried to use it as an acumulator when
converting ASCII to binary.  Changed it to initialize retval to 0.

Fixed program name in papsrv_kill message, changed it from papsrv_restart to
papsrv_kill.

Fixed "ppop log" so that it would yield a reasonable error message for
syntax errors like "ppop log mcec_1".  Previosly it though that a job id of
-1 and a subid of -1 were meant.

Fixed papsrv/papsrv_ali.c/appletalk_dependent_cleanup() so that debug message
displayed nbp_errno and errno in the indicacted order.  Previously they were
reversed.

Changed smb-include.conf "drivername =" lines generated by ppr2samba to
"printer driver =" lines since that is appearently the name Andrew Tridgel
chose to use.

Fixed fixed pprsync.  The logic for deciding whether or not to restart
papsrv was reversed.

Fixed an error in libppr/readppd.c:ppd_open() which would cause a failure
with file not found to cause subsequent ppd_open()'s to fail with the error
"already open".

Changes to lprsrv:  changed o (postscript) input type to do "-T postscript"
with ppr; changed l (preserve all control codes) to do "-T dotmatrix" with
ppr; added x (no filtering type) from DEC Unix Lpr.

Fixed a problem with the definition of SIG_FRONTS, SIG_BACKS, and SIG_BOTH.
They were not bitvalues as pprdrv/pprdrv_signiture.c assumed they were, thus
causing signiture printing to fail.  This bug was introduced when the
backend code for "-s fronts" and "-s backs" was added.

ppr/ppr_mactt.c: Cast type mode_t to unsigned in 2 fatal() calls to suppress
gcc warnings.

Fixed interfaces/atalk_cap.c:basic_open_printer() so that it takes in
several possibly error messages from CAP PAPOpen() which can result from
CAP's use of an invalid sprintf() format specifier.

Added AUTHOR define to version.h and changed -v messages in ppr, ppop, and
ppad to print it.  Also printed in ppop and ppad interactive mode.

Changed "*READY" message of ppop machine readable interactive mode to print
SHORT_VERSION instead of VERSION.

Changed ppr/ppr_infile.c: check_for_PJL() so that after seeing "@PJL ENTER
LANGUAGE = postscript" it will eat up carriage returns and line feeds and
control-D's in any number.  Previously it would only eat up one control-D.

Changed the name of the variable the gstcpip interface uses to pass the
interface options to the tcpip interface from
GSTCPIP_TO_TCPIP_INTERFACE_OPTIONS to PPR_GS_INTERFACE_HACK_OPTIONS.

Added a new interface gsatalk.  Made changes to atalk_ali.c and atalk_cap.c
to support the patron= option and a new option, is_laserwriter=.  If
is_laserwriter is set to false, then the interface will not attempt to hide
the printer and will not wait for an end of file from the printer to
acknowledge the completion of the job.

Made tcpip interface options case sensitive for consistency with other
interfaces.

Changed Ghostscript PPD files so that the default free RAM figure is exactly
1MB instead of 1000000 bytes.  Added VM options for 512K, 1MB, 2MB, and 4MB
free RAM.

Fixed a bug in "ppad ppdopts" which could cause corrupted error messages if
a PPD file UI section wasn't closed and the next one wasn't an `interesting'
one.

Modified the definitions of the default paper dimensions for A4 paper to use
precomputed integer values rather than expressions.  Appearently rounding
errors could cause non-integer results which would result in a media
mismatch being reported.  (Thanks to Stefano Ferriani
<stefano@spike.bologna.enea.it>.)

Modified "ppop list" so that if the job name is too long for its field, it will be
allowed to overflow it and the next field will appear on the next line.

Moved media.sh from src/misc to src/ppad.

Added misc/README_MISC and a symbolic link to it at the top level.

Cleaned up the audio commentator and fixed a bug in the code which
determined the machine name.

Fixed overlapping file type numbers in ppr_infile.c which caused confusion
between HTML and RTF.

Changed pprdrv_infile.c: getline() so that Binary Token Encoding is ignored
within comments.  This is to avoid false triggering due to non-ASCII
values in comments.

Fixed the elapsed time indication in the printlog file.  (In pprdrv.c, the
entry was being based uppon the difference between the current time and the
modification time of the queue file.  Since the queue file modification time
is no longer being carefully preserved at its origional value, this wasn't
working.

Changed commentator argument format.  Rather than having one message
argument it now has three.  The first is the best human readable message.
The next two are the information on which the first is based or other
helpful information.

Changed the "file" commentator so that it prints the date and time before
each entry.

Fixed ppr_main.c: main() so that the -U switch code does setuid() before and
after the unlink() call.  The absence of this code often caused unlink() to fail.

Fixed problems with the -U switch.  The user id wasn't being set and the
current directory wasn't being set before the unlink.  For this to work, it
was necessary to change the file open code in ppr_infile.c: get_input_file()
to use seteuid() in stead of setuid().

Removed redundant chdir(HOMEDIR) from ppr_main.c: main().  (It was redundant
because ppr_input_file.c: get_input_file() does it.

Added library modules pprpopup.pl and speach.pl.  Adapted audio commentator
to use both.

Adapted pprpopup responder to use pprpopup.pl.

Added a tenth parameter to the responder parameters.  It is the number of
pages printed.

Added the ability to delete jobs to lprsrv.  Changed the value of the -X
switch used with ppr from "control.Person@control.Host" to
"control.Person@client_dns_name".

Added code to ppr/ppr_main.c: write_queue_file() to detect newlines in the
strings it writes to the queue file.

Added an options (4th) parameter to printer configuration file "Commentator:"
lines.

Added %Q to ppr_sscanf().  It reads an optionally quoted word, allocates
storage for it, and sets a pointer to the newly allocated storage.

Changed lprsrv so that, even in permissive mode, authorized clients must
connect from a reserved port.

Changed responder launching code in ppr and pprd so that the code number is
formatted with "%d" rather than "%2.2d" since the latter led to a leading
zero for one digit codes.

Added an "audio" responder.

Added PPD file "HP LaserJet 5Si".

Increased MAX_BINS in global_defines.h from 4 to 10.

Added the options "level=" and "voice=" to the audio commentator.

Changed ppdconf.perl so that it changes the PC file name to lower case
before using it.

libppr: Renamed nodename_to_nodeid() to assign_nodeid() as this more
accurately indicates its purpose since it increments a reference count.

Changed "samba" responder to dump smbclient stdout to /dev/null since stdout
is now logged.  Made the command with the smbclient -I option the default
again since current versions of smbclient don't seem to support NBNS (WINS) yet.

Changed "write" responder to throw away stdout and stderr from the write
command in order to keep messages like "write: chappell is not logged in"
out of the pprd log file.

Added code to pprdrv/pprdrv.c: reapchild() so that if waitpid() returned -1
and errno==ECHILD it will just return.  For some reason Solaris returns this
indication when there are no children to wait for.

Changed "From:" lines fed to Sendmail in pprd/pprd_alerts.c so that the
output of ppr_get_nodename() is included.

Changed pprdrv_feedback.c to remove "status:" from the start and "; source:"
stuff from end of printer status messages before using them.

Added DEC Ultrix lpr extensions for input tray, output tray, duplex, N-Up,
and orientation to lprsrv.

Removed prepending of "-" to -f argument when invoking ppr from lprsrv.

Changed pprdrv/pprdrv_ppd.c: insert_features() so that "*InputSlot"
insertions set strip_binselects to TRUE.

Changed ~ppr/src/installscript so that it will work even if there are spaces
surounding the = signs.

Made a new member in the printer structure in pprd.  The member is
"engaged_count" and keeps track of the number of sucessive times the printer
was found to be otherwise engaged or off-line.  Previously, retry_count
served this purpose as well.
This was done to fix a problem with negative alert frequencies resulting in
no alert messages followed by recovery messages refering to the non-existent
fault messages.  The problem was that an engaged printer could get the retry
count incremented past the trip value, then the printer would fault and then
recover.


1.30b3, 2 October 1996--21 November 1996

Expanded lprsrv support for DEC lpr's -K switch.  It now supports
"one_sided_duplex", "one_sided_tumble", and "two_sided_simplex".

Modified filter_lp so that the gutter is properly placed for simplex, duplex,
and duplex tumble in both portrait and landscape modes.  The gutter is not
used if the duplex mode is "undef".  The default gutter is now 0.375in.

Added support for orientation= option to filter_lp.

Added tests/filter_lp.sh.

Fixed problems in dotmatrix filter: FF on blank pages resulted in page end
code without page start code.  Trincoll-PPR-Dotmatrix-1-2 had a missing
"def" in "/yshift -12 def".  Makefile failed to squeeze the procsets.

Changed audio commentator to use speak_time_interval to announce the stalled
time.

Commented out debug() call in pprd.c: main() which occured before the
removal of the old log file.

Added "const" to some function prototypes in the "none" version of libpprdb.

Fixed pprdrv/pprdrv_tt.c and indexttf/indexttf.c so that they will compile
even if TT_DBM is set to something other than "gdbm" in include/global.mk.
(There is no alternative code yet, TrueType font handling will not work.
The program indexttf will be useless.)

Fixed what is appearently a bug in ppop/ppop.c:is_my_job().  This was
spurious "&"'s in front of strings passed to sscanf().

Fixed ppad Makefile so it does not install when it should only build.

Minor change to dotmatrix/escape.c:fs_pass1() to avoid an empty default case
in the switch.  It now has a break in it.  This change was made to avoid
annoying the DEC OSF C compiler.

Commented out DEC OSF prototype for ioctl() from sysdep.h.

Added fixed_cc_osf script and Configure support for use of the native
compiler on DEC OSF.

Fixed a place in global_defines.h where #ifdef __GNUC__ wasn't used to
surround GNUC specific syntax.

Added $(OSFLIBS) to ppr2samba Makefile entry and made lib_memory_fatal in
ppr2samba const.

Enhanced Configure to give option of using the native compiler on OSF and to
ask if GDBM should be used.  Also started to detect selection of incorrect
operating system thru use of uname.

Moved several shell scripts from the root level to "misc" and
"installprogs".  Added .sh to most shell scripts.  Removed
/var/spool/ppr/cache/file from the list of directories created by
makedirs.sh.

Added "is off line" printer status message to audio commentator.

Added "part x" to audio responder.

Added myalloc_checkpoint_get() and myalloc_checkpoint_put() and added calls
to them in nodeid.c and in the pprd.c signal handlers.

Added HP DeskJet 860C PPD file.

Combined ppop/ppop_cmds_other.c:ppop_hold() and ppop_release() into
ppop_hold_release().

Changed ppop/ppop.c:wait_for_pprd() so that it only returns a non-NULL file
handle if the other execute bit is set on the reply file.  Previosly the
behavior was the oposite.

Changed ppop/ppop_cmds_other.c so that callers of wait_for_pprd() ignore its
return value if they don't expect to read data from the reply file.

Changed the meaning of a set other-x bit on the ppop reply file.  It now
means that there is data rather than that there isn't.  Changed the function
pprd/pprd_ppopint.c:set_reply_error() to set_reply_data() and changed other
code to call it when there is a queue listing or some such thing in the
reply file rather than when there isn't.

Fixed pprdrv/pprdrv_commentary.c:commentary() so that the buffer for
building the time string is big enough.

Fixed pprd/pprd_ppopint.c:close_reply() so that if kill() fails it will
delete the reply file.  (If kill() failes it is probably because the user
got impatient and did control-C to ppop.)

Fixed pprdrv/pprdrv_feedback.c: sigpoll_handler() so that the <printer>.status
file is created with O_TRUNC so that vestiges of old messages don't remain.
(Thanks to Steve Hsieh <steveh@eecs.umich.edu>.)

Added code to pprdrv for the Kodak ColorEase PS so that when it drops the
AppleTalk connexion when it is supposed to be flushing, EXIT_PRNERR gets
converted to EXIT_JOBERR.  (Again thanks to
Steve Hsieh <steveh@eecs.umich.edu>.)

Added a new responder code RESP_FATAL_SYNTAX to indicate a fatal ppr error
due to invokation syntax.

Fixed audio commentator to understand messages without job id numbers.
(This goes along with a change to ppr which has it delay assigning the job
an ID number until just before it is submitted to pprd.)

Increased MAX_STATUS_MESSAGE (global_defines.h) from 40 to 60.

Removed code from ppr/ppr_main.c:main() that rounded the page count up to
the next multiple of the sheetfactor.  (I can't remember why I put this
in, but I don't like it.)

Removed the code that deleted most log files from pprd/pprd.c:main() and
replaced it with code which renamed the pprd logfile to pprd.old if it was
present.

Changed the wording ppop uses when telling a user that he has attempted an
operation with the wrong proxy id.  (Steve Hsieh <steveh@eecs.umich.edu>.)

Changed "ppop move" so that users may move their own jobs.

Changed "ppop cancel _dest_" to cancel only a user's own jobs, even for
operators.  Created "ppop purge _dest_" which operators may use to remove
all jobs.

Added "ppop -u _user_" which operators may use to specify a user whose
permissions should be adopted.

Added "ppop clean" which removes arrested jobs.

Changed ppr/ppr_nest.c: outermost_end() call warning() with a message about
a PPR bug rather than call fatal().

Changed ppr/ppr_dscdoc.c: read_prolog(): fixed a bug which would cause
document setup sections to cause fatal errors.  Added code and warnings to
deal with broken xfig output where "%%EndProlog" comes after "%%EndSetup".
(Thanks to Steve Hsieh <steveh@eecs.umich.edu> for diagnosing these problems.)

Made "any" or "all" wildcard destination names for "ppop cancel" and "ppop
purge".

Changed pprd/pprd_ppopint.c: ppop_list() to make "any" an alternative wildcard
destination name.  This also affects "ppop cancel destname" and "ppop
clean".

Changed the name of the pprd lock file from "pprd.lock" to "pprd.pid" and
changed the code to write the pid into the file.  Added code to
installprogs/fixup.sh to remove the old file.

Added code to pprd/pprd.c:fatal() so that the process kills itself with
SIGQUIT if the exit code is 100.  The idea is to provoke a core dump.

Edited ppr/ppr_split.c so that it uses fatal() rather than fprintf(stder and
exit().  I think it got left behind in some change.

Split DEST_DISALLOWED into DEST_DISALLOWED and DEST_DISALLOWED_LEADING.
Removed "." from DEST_DISALLOWED, moving it into
DEST_DISALLOWED_LEADING and added space, tab, carriage-return, and line-feed
to DEST_DISALLOWED.  Made cooresponding changes to ppr, ppop, and ppad.

Established macros in global_defines.h for the various user names and group
names used by PPR.

Fixed grammar in alert cancelation message for case when the printer had
only failed once.

Added code to installprogs/fixup.sh to remove /var/spool/ppr/cache/file.

In pprd, renamed the printers[] array structure member "next_retry" to
"next_error_retry" and "engaged_count" to "next_engaged_retry".  Fixed
ppop_status() so that it will return next_engaged_retry rather than
next_error_retry if the printer status is STATUS_ENGAGED.

The last printer message is now displayed by "ppop status" if the printer is
engaged, printing, or stopping.  Stopping was previously ommited.

Added printer status information to lpq.  (Thanks to Steve Hsieh
<steveh@eecs.umich.edu> for help with this one.)

Added /etc/hosts.lpd extensions from Steve Hsieh <steveh@eecs.umich.edu>.
Hosts may now be permitted by domain with lines like ".trincoll.edu".  The
file /etc/hosts.lpd_deny is also supported.  It overrides the others.

Added alarm() calls in pprdrv/pprdrv.c:jobbreak_signal() to monitor stalled
printers.

Added set_writemon_description() to pprdrv/pprdrv_buf.c.  Made the last
string set with set_writemon_description to last argument (the second raw
data field) to commentator() when it is called during a stall.

Added alarm() calls to the wait for SIGUSR1 code in pprdrv/pprdrv.c:
start_interface().  This is not quite right but it is better than nothing.

Added delete by user and delete all to lprsrv/lprsrv.c:remove_jobs().  Also
added -S (super root) option to lprsrv.

Added debugging code to libppr/myalloc.c.  Fixed bug in _myalloc_assert() so
that the assertion works even if it is non-zero.

Modified the ppop subcommands "hold", "release", "start", "stop", "wstop",
"halt", and "cancel" so that they can take any number of arguments.

Added "-w log" to ppr options used by lprsrv.  (Steve Hsieh
<steveh@eecs.umich.edu>.)

Changed "HP LaserJet 4M Plus DSC" PPD file: commented out AutoSelect bin,
changed translation strings for "Upper" and "Lower" bins to "Upper (250
sheet) Tray" and "Lower (500 sheet) Tray" respectively.

Re-wrote internals of lprsrv to seperate support for different spoolers
more.

Move the definition of TTDBNAME from pprdrv.h to global_defines.h.
Consequently, indexttf/indexttf.c no longer includes pprdrv.h.

Moved the definition of NEWPRN_CONFIG from ppad.h to global_defines.h.

Defined MFMODES in global_defines.h.  Previously the path has hard-coded in
ppad_filt.c.

Renamed many configuration files in the /etc/ppr directory to clearly
differentiate between plain text configuration files and various binary
formats such as gdbm databases.  Here are the changes:

	charge_users	-> charge_users.db
	fontsub		-> fontsub.conf
	media		-> media.db
	ttfonts		-> ttfonts.db
	newprn		-> newprn.conf
	mfmodes		-> mfmodes.conf

Added code to installprogs/fixup.sh to rename the above files.

Added LaserWriter message regularization to pprdrv.  The raw error and
status strings are now looked up in /etc/ppr/lw_errors.conf and
/etc/ppr/lw_status.conf respectively and if a translation is found it is
presented as the cooked commentator argument.

Made misc/pprsync.sh remove editor backup files from the printer and group
configuration directories before begining its work.

Added BUSINESS_HOURS define to global_defines.h.

Changed the print log format from:
TIME,NAME,PRINTER,FOR,SHEETS_PER_COPY,DURATION
to
TIME,NAME,PRINTER,FOR,USERNAME,PROXY_FOR,POSTSCRIPT_PAGES,TOTAL_SHEETS,TOTAL_SIDES,DURATION

Added CHARGE_BY_SIDES compile time option to global_defines.h.

Changed mail and errmail responders to move the name of the user into the
subject line, i.e. "Subject: David Chappell's print job".

Moved the code for processing "ppr -f -me" into the switch case statement.

Added option to make the title specified with the ppr -C switch the definitive
rather than the default one by preceeded it with "+"

Changed lprsrv so that it will allow "stdin" as the job title.

Renamed papsrv configuration files: papsrv -> papsrv.conf,
papsrv_default_zone -> papsrv_default_zone.conf.  Added code to fixup.sh
to rename old ones.

Added -A option to lprsrv which it passes thru to "ppop lpq" command.

Added prelimary code to remove jobs from lpr and lp spoolers.

Changed ppr/ppr_respond.c and pprd/pprd_response.c so that argv[0] is the
argument to ppr's -m switch rather than the path to the responder from
HOMEDIR.  (This change doesn't seem to be effective under Linux, at least
if the program is a script.)

Merged the responders "mail" and "errmail" into one.  (That is the reason
for the previous change.)  Added more information to subject line, added
printing of reason arrested to the body, added inclusion of job log when
available.  Changed the "write" responder to exec the "mail" responder
so that it doesn't have to contain the code for responding via email.

Put an extension of "*.sh" on all scripts in "responders".

Commented out "AutoSelect" bin in "HP LaserJet 4M DSC" PPD file.

Added misc/modes-3.1.mf for reference purposes.

Added a new commentator code, COM_MUNDANE_EXIT and moved EXIT_PRINTED and
EXIT_INCAPABLE from COM_EXIT to this new code.  Added this code to the audio
commentator.  Added ".sh" extension to the commentator source code file
names "samba" and "xwin".

Added globak.mk symbol LEX_LIB.  Changed Linux fragment in Configure to use
Flex directly.

Fixed a bad call to myfree() in "ppop deffiltopts" which was causing core
dumps.

Added "umask 0" to DVI filter to work around the problem that gftopk uses
access() before opening files.

Changed product string to "*" for GhostScript printers in mfmodes.conf.

Made the "ppad -d" switch take a numberic argument to indicate the desired
debug level.

Added warning to ppad/ppad_filt.c: add_printer() to give warning about extra
"PPDFile:" lines.

Fixed missing second line feed after "cannot recover on its own." in
pprd/pprd_nag.c:nag().

Fixed bugs in lpr interface which prevented it from working.

Changed ppad.c:dispatch(char *argc[], int optind) to dispatch(char *argv[]).

Commented out code in ppr/ppr_infile.c which gave special treatment to
overflow lines which contain only hexadecimal characters.  (Thanks to Steve
Hsieh <steveh@eecs.umich.edu> for suggesting this fix.)

Added ERROR_DIE and ERROR_DUMPCORE to pprd.h.

pprd/pprd.c:fatal(): Added kill(getpid(), SIGABRT) so that
fatal(ERROR_DUMPCORE, ...) will work even if pprd has been started by SunOS
5.5.1 cron.

Changed help in ppop and ppad to use <n> rather than _N_ to indicate
a variable.

Added long argument parsing function to library.

Changed ppop -v to --version and -? to --help and added long options for
other short options.

Changed ppad -v to --version and -? to --help and added long options for
other short options.  Also removed version information from help output.

Changed ppr -v to --version and -? to --help.

Made all char * members of struct QFileEntry const.  This required lots of
other things to be changed to const too.

Installed ppr_getopt() in lprsrv with --version and --help.

Installed ppr_getopt() in papsrv with --version and --help.

interfaces/atalk_ali.c: if pap_look() returned PAP_DISCONNECT, the interface
might not exit but rather would get caught in an infinite loop.

Changed #include <wait.h> to #include <sys/wait.h> in misc/xpprgrant.c.

Fixed ppad/Makefile so that it unlikes the old ppad before trying to copy
over it.

Fixed serious job in get_ and set_ myalloc_checkpoint().

Moved free_nodeid() out of unlink_job() and unlink_new_job() in pprd.c.

Commented out code in installprogs/fixup.sh to rename /etc/ppr/media
to /etc/ppr/media.db and replaced it with code in ppad/Makefile.

Changed assignment of queue id number in ppr_main.c:main() so that it is defered
until just before the output files are created.  ppr_infile.c has code to
assign it early if it creates a "-infile" file.

interfaces/atalk_ali.c: Fixed code for pap_open() failure so that it doesn't
print errno unless pap_errno is PAPSYSERR.

Added pprdrv/lw_status.conf and lw_errors.conf.

Added definitions of RMF and CP to include/global.mk.unconfigured so that
clean could be run twice in a row.

Increase %p in pprdrv/ppdrv_ppd_parse.l from 2700 to 3000.

Changed pprdrv/pprdrv_lw_messages.c:regularize_lw_message() so that rather
than writing unknown messages to a separate file it appends them to the
translation file in a section headed "[]" which it creates if necessary.

Changed pprdrv/pprdrv_feedback.c so that messages in the form "%%[ status:
PrinterError: xxxx ]%%" are looked up in lw_errors.conf in stead of
lw_status.conf.


1.30b4, 22 November 1996--26 November 1996

Added rule to filter_lp/Makefile to create the link to filter_lp_autolf.
(It is unclear when this was lost.)

Changed pprdrv/pprdrv_ppd_parse.l so that it calls order_dependency_1() thru 4
rather than just order_dependency.

Changed libppr/readppd.c so that the default directory for include files the
directory of the including file.

Changed pprdrv/pprdrv_ppd.c and pprdrv/pprdrv_ppd_parse.l too.

Changed papsrv/papsrv_conf.c and papsrv/papsrv_ppd_parse.l too.

Fixed papsrv/papsrv_conf.c:read_ppd() so that it doesn't prepend
"/usr/ppr/PPDFiles" if the PPD file name begins with "/".

Fixed "ppop release" (and ppop hold) so that it will print a rational error
message for commands such as "ppop release adshp4m".

Updated etc.init.d.ppr so that it uses the *.pid files and so that it stops
papsrv.  Also, it no longer uses ps which was a portability problem.

Added ENGAGED_NAG_TIME to pprd.h and use it as the value for sending
"remaining printer problems" messages about off-line printers in stead of
hard coding the value 20.  At the same time, added a second line feed to the
end of the engaged message when building the letter.

Added PRNSTATUS_FAULT to the list of states in which ppop status and ppop
lpq will print the last message from the printer.

Applied Steve Hsieh's fixes to pprdrv/pprdrv_lw_messages.c:
regularize_lw_messages().

Changed lprsrv to accept request to delete for user "-all".  Changed a
request with no specified jobs or users to delete active job rather than all
jobs.

Changed custom_list() so that it stops if the item routine returns TRUE.

Added ppop cancel-active and pop cancel-my-active.

Changed special ppop -X user from "root" to "*".  Added treatment of host "*"
as a wildcard.

Added preliminary long options to lprsrv.

Added standalone daemon mode to lprsrv.

Changed lprsrv.c: lprsrv_fatal() to fatal() with the usual arguments.

Added code to pprd/pprd.c: fatal() to remove the lock file.


1.30b5, 27 November 1996--10 December 1996

Fixed Configure so that -lgdbm is left out of DBLIBS if user opts out of
gdbm.

ppr/Makefile: strip ppr was commented out.

Made changes to ppop.c:is_my_job() that were previously made to
ppop.c:job_permission_check() so that it will allow "*@host", "user@*", and
"*@*".

Increased pprdrv_ppd_parse.l %p to 3200.

Fixed pprd.c:reapchild().  When a process terminated it searched the printer
list to find the printer for which the process had been launched.  If a
printer printed a job and then did not print another until the pid had
rolled around to the last pid used to run pprdrv for that printer and a
responder was launched, the termination of the responder would be
interpreted as the termination of pprdrv.  This would result in an attempt
to alter the state of a job that was long gone.  (Not supprisingly, this
error has been there for years.)

Changed ppr_main.c:main() so that it will read the default responder and
responder address from PPR_RESPONDER and PPR_RESPONDER_ADDRESS if they are
defined.  Previously it would use "write" and the user name.  Now it will
fall back to those if the environment variables are not defined.

Added errxwin responder.  (It is a link to xwin.)

Added commented out player code for Solaris 2.5.1 and OSF/1 3.2 to
libppr/play_local.pl.

Added code to ppr_infile.c to restart read() calls interupted by signals.
(For some reason this happens on DEC OSF/1 3.2.)

Corrected handling of "lprm -" by root.  (In this case, root claims to be
the user "-all" and submitts an empty delete list.)

Added MAILX to things defined in global.mk.  Added it to things replaced by
installscript.sh.  Used it in responders/mail.sh.  Added it to things put in
global.mk by Configure.

Changed ppr --in-type to --input-type and --bin-select to --auto-bin-select.

Changed libppr/pprpopup.pl open_connexion() so that some of the error
messages indicate what it was trying to connect to.

Added "*GhostscriptDriver:" lines to Ghostscript PPD files.  (This line is
my invention.  I intend to use it in the future.)

Added separate --version format for -M to ppop and ppad.

Added code to ppop lpq to replace spaces in the file name with _ so that
Samba won't fail to parse such lines properly.

Added feature to ppr2samba so that it will read "ppr2samba:" lines from the
configuration file and generate a record for the printer or group only if
the first argument is non-zero and use the second argument, if present, as
the prototype share in stead of "pprproto".  Changed "Drivername:" to
"ms-driver-name".

Removed ppr -C "+title" hack and replaced it with --ignore-dsc-title.

Added code to lprsrv to demote itself from root in standalone mode and to
make an lprsrv.pid file.  It is now a setuid ppr program.

Renamed LOCKFILE in global_defines.h to PPRD_LOCKFILE.

Added code to pprdrv_feedback.c for "%%[ PPR status updates follow ]%%" and
COM_PRINTER_STATUS_UPDATES.

Changed pprdrv_feedback.c so that "source: xxxx" is not longer included in
the status written to the printer's status file.

Added (x% sent, 1 of 10 pages completed) to ppop lpq.

Added pprdrv_jobname.c.  It inserts code in document setup to set the job
name string on the printer.

Fixed errors in installprogs/etc.init.d.ppr.sh and added stop code for
lprsrv and commented out code to start lprsrv in standalone mode.

Enhanced installprogs/remove_ppr.sh to remove the init scripts.

Fixed papsrv_kill so that it will not get stuck in a loop if papsrv died
without removing its .pid file.

Changed include/pap_proto.h

Fixed atalk_ali.c so that select() is called with a first argument that is
no larger than is necessary.

Added option status_update_interval to atalk_ali.c and as do-nothing option
to atalk_cap.c.

Turned off debugging in pprd and lprsrv for this release since most of the
bugs seem to be gone.

Improved fixup.sh System V init script installation so that it can support
various script directories and init level schemes.

Changed lprsrv behavior so that the lpr -p -T title is only passed to ppr's
-C switch if the lpr -J switch was not used.

Moved LPRSRV_USE_LPR_STYLE_JOB_NAME from lprsrv.h into global_defines.h.
Moved MIN_INODES and MIN_BLOCKS from lprsrv.h and papsrv.h to
global_defines.h.

Added s versions of ppop cancel, purge, cancel-active, and cancel-my-active
and modified lprsrv to use them when the agent is not root.  The idea is
that if the user is deleting his own job he does not need to be informed
that he has done it.

Added code to use PPRDEST to ppop_cmds_listq.c:custom_list() and ppop_lpq().

Fixed error in path to alert program in interfaces/gs.sh.

Improved error messages in interfaces/parallel.sh to better explain why the
port couldn't be opened.

Added gs= and set= options to interfaces gs.sh gstcpip.sh and gsatalk.sh.

Fixed misc/pprsync so that it doesn't copy papsrv_default_zones.conf or
lw_*.conf.

Changed samba responder so that it will accept addresses in the form
NETBIOS-DNS or NETBIOS-IP.  These may be represented in a Samba print
command as either %m-%M or %m-%I.

Changed samba_submitter so that the argument which was formerly a DNS domain
search list is now the DNS name or the IP address of the client.  These may
be represented by %M or %I in the Samba print command.

Added proxy for switch when ppr is invoked by papsrv.  The argument is the
AppleTalk network number, a colon, and the node number.

Added a lpqFileName: line to the queue file.  This line contains the actuall
name of the input file if know.  A --lpq-filename switch was added to ppr so
that lprsrv can pass it the actual file name.  Also, ppop lpq was modified
ot display the file name in stead of the title if the file name is know.
Also, ppop details was modified to display the additional information.
While I was at it I moved a few output lines arround and changed a few
labels.  The column name "lpqfilename" was added to ppop qquery.

Increased MAX_STATUS_MESSAGE in global_defines.h from 60 to 80.

Fixed pprd/pprd_ppopint.c:ppop_status().  Previosly, if a printer's .status
file was too long, it would truncate it to a length that was 1 byte too long
which would confuse ppop/ppop_cmds_listq.c:ppop_lpq_banner().

Enclosed "%%IncludeFeature: *PageSize X" in filter_lp.c in a stopped
context.

Added seconds to printlog print time.

Added arrest reason and page count to samba and xwin responders.

Added pages printed to pprpopup responder.

Added an additional field to the printjob log file: the run time of pprdrv
in seconds and hundredths of a second.

Corrected syntax errors in System V cancel code in lprsrv which prevented it
from being compiled.


1.30b6, 10 December 1996--8 January 1997

Fixed bug in lprsrv which caused it to fail if it received more than one job
during one connexion.  The index into the array of files received as part of
the current job was not being reset to zero at the end of each job.

Fixed errors in the commented out lprsrv start line in
installprogs/etc.init.d.ppr.sh.

Error in lprsrv: when the log file was opened to receive the output of ppr,
lp, or lpr it wasn't being opened in append mode.

Revamped lprsrv standalone mode code.  It is no longer suid anything.

Fixed pprd/pprd_ppopint.c:_ppop_status() so that the status string is
properly NULL terminated.

Expanded the code in ppr/ppr_infile.c:get_input_file() to swap GIDs as well
as UIDs.

Changed error message for read() failure on input file to be more formal.
(It was "input file read error:  xxxxxxx", now it is "read() failed on input
file, errno=x (xxxxxxx)".)  I did this because this should hardly ever
happen and the reasons why it might are unknown to me, therefor it should
have the format of those error messages which do not speculate as to the
cause.

Added timeout of 60 seconds for ppop's wait for pprd to respond except for
ppop wstop.

Improved atalk interface to cache the printer address and use nbp_confirm() if
the cached information is more than a few seconds old.  Added the interface
option "address_cache".

In pprdrv.h and pprdrv.c, changed DEBUG_PROGINIT and DODEBUG_PROGINIT(()) to
DEBUG_MAIN and DODEBUG_MAIN(()) and greatly increased the number of
debugging function calls.

Changed the status_update_countdown printf() in atalk_ali.c to a DODEBUG(())
call.

Modified atalk_ali.c and atalk_cap.c so that if pap_open() suceeds but the
status string begins with "status: PrinterError:" it will be printed to
stdout between "%%[ " and " ]%%".  (Previously, the status string was
printed only if pap_open() failed.)

Added argument to an interface, the "%%For:" line argument.  The lpr
interface now uses it for the P line.

Fixed missing "inform" parameter in ppop clean.

Changed gs* set= to gsopt= and changed the default ghostscript path from
/usr/local/bin/gs to /usr/bin/gs.

Added code to pprdrv/pprdrv_commentary.c:commentary() so that if the last
message was "busy" or "off line" and this message is EXIT_ENGAGED then the
message is supressed.

Fixed xwin responder so that it will not print -1 for the number of pages if
the number of pages is unknown.

In lw_status.conf, moved "waiting" from [busy] to [idle].

Removed spurious parentheses arround $why_arrested in samba and xwin
responders.

Declared two non-auto variables in pprdrv_patch.c static.

Added undefined "setuserparams" to pprdrv_reason.c with a message which
says "not a level 2 printer,wrong PPD file".

Fixed reversal of COM_PRINTER_STATUS and COM_PRINTER_STATUS_UPDATES when
calling commentator for "%%[ status:".

Reworked filter_lp noisy=true messages.  Changed ldeflines from 51 to 66.
Added code to compute landscape_lentrigger and landscape_asptrigger
automatically.

Added "psu" (PostScript Units) to the unit types accepted by
libppr/dimens.c:convert_dimension().  For now it is the same as points and
pt.

Added stubs for persistent download in the new module
pprdrv/pprdrv_persistent.  Moved add_resource() and add_resource_font() from
pprdrv.c to pprdrv_res.c.

Slight adjustments to papsrv's SIGUSR1 activated query debugging code.

Dropt the code in pprdrv which specifically detects the flushing message and
in its stead made the code which detects a bona-fide postscript error very
lax.  It no longer requires that the job be transmitted correctly.

Added totalpages, totalsides, and totalsheets to ppop qquery.

Fixed the ppop qquery field "lpqfilename" so that it will display the same
thing as the "title" field if the --lpqfilename switch was not used when the
job was submitted.

For consistency, changed the exit commentary reason "PostScript error" to
"postscript error".

Added to lw_errors.conf and changed the audio commentator to use the cooked
messages whenever possible.

Inserted code in pprdrv/pprdrv_commentary.c to suppress consecutive
identical printer status update comments but left it commented out.

Added ppr --hold option and support for it in pprd.

Fixed pprd/pprd_ppopint.c: _ppop_status() so that it will once again display
the job being printed when the status is PRNSTATUS_CANCELING or
PRNSTATUS_STOPPING.  It was displaying ?:?-0.0(?) or something like that.

Added more debugging messages to pprd_ppopint.c in the parts where pprdrv is
killed.

Added ability to hold a job that is currently printing.

Fixed a big problem with ppop purge:  pprd would not unlink the job files,
send messages, or write correct entries in the state_update file because it
tried to use the destid -1 (all) for all those operations.

Removed some dead code from pprd/pprd_ppopint.c:ppop_start_stop_printer()
for case when ppop start is executed on a printer that is stopping.

Added code to pprdrv.c to sleep in sigterm_handler() to facilitate
debugging.

Changed pprdrv.c:reapchild() so that it sets intpid to 0 after it reaps the
interface.  Presumably this resulted in occasional attempts to kill an
interface which had already exited.

Added "cancel_job" member to the printers[] array in pprd.  This member can
be set when pprdrv is killed to cancel a job that is being printed.
Intervening changes in the printer's state will no longer prevent deletion.

Slight corrections and improvements to fixup.sh messages.

Added "eof_timeout" as alternative form of "eoftimeout" for the tcpip
interface.  The form "eoftimeout" will be `undocumented'.

Added LaserWriter Select 360 PPD file.

A few changes for Cygnus Win32.  (Mainly braketing SA_RESTART with #ifdef.)

Moved lanmanx directory contents into misc.

Changed the pprd responder launching code so that the reason field is blank
if the job is not arrested.

In response.h, changed RESP_PRINTER_INCAPABLE to
RESP_ARRESTED_PRINTER_INCAPABLE and RESP_GROUP_INCAPABLE to
RESP_ARRESTED_GROUP_INCAPABLE.

Fixed bug in ppr/ppr_dscdoc.c:read_prolog() which caused it to insert
"%%%%EndSetup" in stead of "%%EndSetup" when it didn't find one.

Changed alert functions so that a printer name of "-" results in the alert
message being written to stderr.

Changed atalk_ali.c and atalk_cap.c so that they will use reasonable
defaults if they don't get the full number of command line parameters.  This
makes it more convenient to use them interactively.

Added --test switch to pprdrv.  When this is used, no interface is launched,
rather the output is sent to stdout and printer messages are looked for on
stdin.  Things which would ordinarily be sent to the job log, the printer
status file, or the commentators are in stead sent to stderr.

Added code to pprdrv/pprdrv.c:reapchild() to detect when it gets SIGCHLD for
the interface when the interface has not exited or died on a signal.  Why
this would happen I don't know, but it might.

Moved the commentator waiting code from the end of pprdrv.c:main() to
pprdrv_commentary:commentator_wait() so that it could be called by the new
function pprdrv.c:exit_with_commentary().  The function
exit_with_commentary() calls exit_commentary(), commentator_wait(), and
exit().  The fatal() function now calls exit_with_commentary() as its last
act.


1.30b7, 9 January 1997--7 March 1997.

Fixed audio commentator so it can handle events of type
COM_PRINTER_STATUS_UPDATES.

Fixed bug in pprd: it would not hold a job submitted with the --hold switch
if a suitable printer was idle.

Added "is idle" and "status update" and silly_sounds= to audio commentator.

Added "fulljobname" to ppop qquery.

Added tbcp2bin to Makefile clean clause.

Changed the wording of the audio commentator miscelanious error message.

Changed pprdrv/pprdrv.c:fatal() so that alert() is not called in --test mode.

Forced all progress messages to 0 bytes, 0 pages, 0 pages until more than
5120 bytes have been sent.  This is to avoid reporting progress which is
really just bytes stuffed into the communications chanel.

Added "state_update_pprdrv" file.

Fixed a bug which might cause pprdrv hangs.  This is because in version 1.30b5
reapchild() was corrected to set intpid to 0 when the interface exits.  The
problem is that if waitpid() returned 0 to indicate that there were no children
which could be waited for then this would be mistaken for interface
termination.  The exact consequence is unclear.

Reversed the assignements of interface_exit_code and
interface_termination_expected since this seemed to have the outside
potential to cause a race condition which also could have something to do
with the hangs.

Added paranoid code to reapchild() to check for the impossible interface
exit code -1 since it would definitely cause a hang.

Added code to reapchild() to specificly detect when the interface is stopped
by a signal.

Corrected SA_RESTART conditional code in pprdrv.c to set sa_flags to 0 if
SA_RESTART not defined.  Added #ifdef SA_RESTART to papsrv.c and lprsrv.c.

Increased BUFSIZE in pprdrv_buf.c from 512 to 4096.  In tests with the dummy
interface this cut the job time of a sample job from 5 or 6 seconds to about
2 seconds.  This should also limit the number of entries in
state_update_pprdrv.  This may have the undesired side effect of making
progress indications too rough on short jobs.

Eliminated MAX_THINGS from include/ppr.h, etc.

Eliminated MAX_DRVRES from include/pprdrv.h, etc.

Increased MAX_PPDTEXT to 8192.

Fixed problems with reapchild() in pprd.c which caused it to misidentify
certain bazzar pprdrv termination scenarios.

Changed the gs* filter gsopt= cut command from "cut -d'=' -f2"
to "cut -d'=' -f2-".  This allows values with embedded equals signs.

Commented out result code write for lprsrv lprm since it was appearing in
lprm output and RFC-1179 does not mention a result code byte.

Added code to set SO_REUSEADDR before bind() in lprsrv when operating in
standalone mode.

Improved XBM auto detect code to avoid falsely identifying C programs that
began with "#define" as XBM files.

Adjustments the form of some state_update PST messages and the "ppop status"
machine readable output format.

Fixed "ppop message" so that it can handle the new long status messages.

Added a "resolution" field to mfmodes.conf.

Changed top level Makefile so that it always makes the install directories
when make install is run.

Added support for the Ghostscript error message format "Unrecoverable error:
undefined in x".

Lengthened the xterm for the xwin responder to 7 lines.

Added a prototype for ioctl() in sysdep.h section for OSF.

Added code to setup_filters.sh to accept giftoppm as a substitute for
giftopnm.

Added responder options and environment variable PPR_RESPONDER_OPTIONS.  (As
a consequence, MAX_RESPONSE_ADDRESS was reduced from 256 to 100.)

Added printed=no option to xwin, mail, and audio responders.  Added voice=
option to audio responder.  Eliminated the errxwin responder since the xwin
responder now supports the option printed=n.  Retained the errmail responder
since it existed in version 1.20.

Added input file types wmf, emf, and fig.

Added auto detection for fig.

Added fig filter script which uses fig2dev.

Fixed "ppad options" so that "ppad options dummy ''" or "ppad options dummy
none" will delete the "Options:" line from the printer configuration file.

Fixed the dummy interface so that it names the unrecognized option in the
error message.  Fixed the gs interface so it detects unrecognized options.
(This wasn't being done because the gstcpip and gsatalk interfaces pass all
unrecognized options to the tcpip and atalk interfaces respectively.)

Added timeout= option to xwin responder.

Added printed= and canceled= option to write, mail, xwin, audio, and samba
responders.

Changed ppr/ppr_respond.c so that it does setuid(uid) before executing the
responder unless the setuid bit is set.  (This fixes the xwin responder when
-e responder is used but it effect on the other responders is unclear.  Some
of them may need to have the setuid bit set.)

Added "#define OPEN_MAX _POSIX_OPEN_MAX to the SunOS 4 section of sysdep.h
at the suggestion of Ethan Gold <etgold@cs.vassar.edu>.

The xwin, mail, and samba responders now all print the title and the number
of pages.

The pprpopup responder now prints the title if there is one.

Added support for long options in switchsets.

Added code to `clean' PATH and IFS in audio responder.

Added auto-detection of MS-Windows placable metafiles.

Added fake_lp program to serve as an lp-like wrapper and added --show-id
option to ppr.

Fixed installprogs/etc.init.d.ppr.sh, the name of the papsrv configuration
file had not been changed here.

Added printer_list.perl to misc.

Renamed INSTALL to INSTALL.txt and README_MISC to README_MISC.txt.

Audio commentator:  Added separate table for status updates.  It is used
before the status and errors tables are consulted.

Added status "off line" to audio commentator.  (I thought I had already put
that in.)

Fixed papsrv/Makefile: it did not indicate that papsrv_authorize.c depends
on papsrv.h.

Changed the format the the ppop lpq "error, retry 2 in 10 seconds" to
"error, 2nd retry in 10 seconds" because Samba would mistake the old format
for a job name.  (This is because it had the basic pattern of two words, one
number, one work, one number, and one word.)  (Thanks to Olivier Tharan
<olive@betty.minet.net> for tracking this one down.)

Changed ppr so that it adjusts the "%%Pages:" comment if there are fewer
"%%Page:" comments than it indicates.  (Steve Hsieh <steveh@eecs.umich.edu>
suggested this fix.)

Increased the maximum size of the proxy string read from a queue file in
ppop.c from 31 to 127 bytes.  (Steve Hsieh thought that a user name plus an
"@" plus a hostname could exceed 31 bytes.  He points out that the LPR/LPD
protocol allows 31 bytes for each.)

Fixed ppad show so that it says "per side" if CHARGE_BY_SIDE is defined.

Added "Charge-To:" line to queue file and added "--charge-to".  Removed "-f
-" feature.  Added "-R" for feature.  Extended "ppr -u false" to apply to
the real name field in the ppuser database as well.

Removed the unused file "include/filter_pcl.h".

Changed the default "For:" name from pw_comment to pw_gecos.  Using pw_comment
seemed to work on most systems but not all.

Changed the responder argument list to add an extra (currently blank) second
message field and to move the responder options field closer to the front.

Removed the global variables "sidecount", "total_printed_sheets", and
"total_printed_sides" from pprdrv.

Added the compute_charge() function to libppr.

Changed the fig filter so that it removes the "%%Title:" line from the fig2dev
output since it wall always say "stdin".

Altered the guts of pprd_respond.c so that the RINFO struct is used to pass
more of the aculated information rather than long lists of function arguments.

Fixed the HTML/SGML detection code.  A previous attempt to allow whitespace in
front of the "<html" or "<!doctype" had left it broken.

Added IRIX 6.3 support.

Changed the dvi.sh filter so that it does a chdir() to the ppr invokation
directory before running dvips.  This allows inclusion of EPS files to work.

Fixed the ALI atalk interface so that it does not attempt to use the address
cache if the printer name is "-" which indicates that the interface is being
used to contact a printer which does not have a queue yet.

Renamed interfaces gs->gssimple, parallel->simple.  This is to prepare for a
new interface called "parallel" which will likely appear in version 1.40.

Fixed lprsrv standalone mode so that if accept() fails, the server will simply
report it as debug output and move on rather than killing itself.  (Steve Hsieh
<steveh@eecs.umich.edu>)

Added DEBUG_INTERFACE_GRITTY to pprdrv and applied to to printer_flush().
(Steve Hsieh <steveh@eecs.umich.edu>)

Added "%%Feature:" --> "%%IncludeFeature:" and "%%ExecuteFile:" to
"%%IncludeDocument:" to ppr_old2new.c.


1.30, 12 March 1997--4 April 1997

Reworded ppr warnings about missing %%EndProlog to clearly indicate
that one is being inserted.

Beefed up checks in ppr/ppr_main.c:write_queue_file() to include tests for
variables which contain only whitespace and would therefor mess up the
ppr_sscanf() based parsing of the queue file.

Added rule to lprsrv to convert a job name (N) of " " to "standard input".
(Steve Hsieh <steveh@eecs.umich.edu>)

Changed samba commentator so that it will accept the NETBIOSNAME-IPADDRESS
form of address.

Fixed papsrv so that it invokes ppr with the new "-R for" switch.

Renamed the "HP DeskJet 870C Ghostscript" PPD file to "HP DeskJet 550C
Ghostscript" and changed the resolution from 600dpi to 300dpi.

Changed *FileSystem to True in Ghostscript PPD files.

Replaced misc/pprpopup.tcl with a new version.

Fixed ppr/ppr_main.c:main() so that it sets the FILE pointers comments,
page_comments, and text to NULL after it closes them so that file_cleanup()
will not try to close them again and thereby cause a core dump.

Changed some messages in Configure related to the various ports and to the
selection of AppleTalk support.

Added IDLE_HACK_TIMEOUT to interfaces/atalk_ali.c for Steve Hsieh.

In fixup.sh, put back in some commented out code which renamed an old media
database file and moved some echo commands inside the conditional blocks in
the LANMAN/X section.

Cleaned up the installprogs/Makefile.

Added support for the lp spooling system's postplot filter to
setup_filters.sh.

Fixed setup_filters so that it automatically detects if troff is a link to
GNU troff.

Corrected some type conversion mismatches in lprsrv debug messages by
casting gid_t, uid_t, and pid_t types to long int.

Increased MAX_VMOPTIONS in global_defines.h from 10 to 15.


1.31b1, 7 April 1997--20 August 1997

* Changed lprsrv.c so that the file type "l" (leave control characters) no
longer selects the dotmatrix emulator.  (Steve Hseih says that Windows NT
will sometimes use this type instead of "f".)

* In interfaces/lpr.c and interfaces/tcpip.c changed -1 to INADDR_NONE and
removed cast of inet_addr() return value to int.

* Renamed daemon() to ppr_daemon() to avoid clash with daemon() in BSD and
glibc 2.

* Added the function torf_setBOOL() and the type BOOL.

* Changed the definition of struct Group in pprd.h so that the booleans
which were of type char are now of type BOOL.  Also changed the type of the
member list from short int to int.

* Moved the "normal" system dependent values from global_defines.h to
sysdep.h.  Removed BOOL from sysdep.h.  Converted all NO_ things in sysdep.h
to HAVE_ things.  Generally reworked the whole system.

* Changed the tcpip interface so that it assumes the feedback argument is TRUE
if it is absent.  This is part of the perparation for the GUI.  I hope that
TRUE is the right default.

* Removed commented out code from interfaces/client.c and ppr/ppr_infile.c.

* Made SHORT_INT a typedef rather than a define and changed the members of
pprd's in memory queue array from short int to SHORT_INT.

* Changed the lpr interface so that it will change spaces in the user name
string to "_".

* Added code to Configure to generate appropriate gcc options based on the
results of "gcc --version" and "uname -m".

* Fixed "ppad bins ppd" and added multiple argument support to "ppad bins
add" and "ppad bins delete".  (Patch from Steve Hsieh.)

* Increased MAX_BINNAMES in pprd.c from 10 to 50.  This is only a temporary
fix.

* In pprdrv.c, move the interface killing code into exit_with_commentary() so
that fatal() will kill the interface and not stall for 60 seconds in
commentator_wait() if the interface has already been launched.

* In pprdrv.c: start_interface(): changed setting of O_NODELAY to O_NONBLOCK.
Changed some messages to include errno.

* Fixed Configure so that the CFLAGS for the native IRIX compiler
include "-I /usr/local/include" and "-L /usr/local/lib".

* Rearanged functions in libppr/myalloc.c so that they call fatal() in a way
which looks ok to compilers which don't know that fatal() doesn't return.

* Fixed a few static variable declarations which were implicitly of type int,
making explicitly of type int.

* Rewrote the upgrading section in INSTALL.txt and added instructions for
switching IRIX to System V release 4 pipes.

* A little cleanup of ppr/ppr_rcache.c.

* Corrected lprsrv.c, it was using "-y" rather than "-o" to set the width
for ppr.

* Added a new source file ppr/ppr_simplify.c.

* Renamed some functions and moved them to different files:

Old Name		New Name
------------------------------------
clean_getline()		getline_simplify_cache()
_clean_getline()	getline_simplify()
read_comments()		read_header_comments()

* Added the functions getline_simplify_cache_hidenest() and
getline_simplify_cache_hidenest_hideps() which will be used in a future
version to simplify the caching and nested structure handling.

* Added "grep -v '^%%Title:'" to all of the shell script picture format
filters because pnmtops inserts a title line with a title of "noname.ps"
when it reads from stdin.

* Changed wording of responder message from "Your print job has been
rejected because of a fatal PPR error" to "Your print job has been rejected
by PPR because of a fatal error" so as not to suggest that there error is
necessarily in PPR.  This error message may be the result of both internal
errors in PPR and invokation errors such as asking it to print a file which
does not exist.

* Fixed ppr/ppr_main.c: write_queue_file() so that it will ommit the
"Title:" line from the queue file if the title string is empty.  This is
necessary becuase Samba will invoke ppr with "-C ''".

* Changed assert_ok_value() in ppr_main.c.  It now distinguishes between
emptyok and blankok.  It also, for convienence, takes two strings for the
name of the thing being tested.  They are concatenated.

* Added calls to assert_ok_value() to the switch parsing code for --for,
--title, and --draft-notice (along with there one letter equivelents).

* Fixed ppr/ppr_respond.c:respond() so that it does chdir(HOMEDIR) before
trying to stat() the responder.  It was doing the chdir() in the child.
This meant that "-e responder" wouldn't cause command line syntax errors to
be reported thru the responder since the stat() would fail.

* Moved the init code install code out of fixup.sh and into a new script
called install_init_code.sh.

* Added $HOMEDIR/install/install to the list of outdated files removed by
fixup.sh and removed the rm command for it from installprogs/Makefile.

* Fixed myalloc.c to include errno.h and string.h.

* Fixed ppr_rcache.c to include errno.h.

* Fixed tcpip.c to bracket SA_RESTART reference with #ifdef.

* Removed USE_SOCKET_FIFO from sysdep.h since it was never implemented.

* Added HAVE_MKFIFO and lame fallback code in pprd.c.

* Changed the Cygnus-Win32 section in sysdep.h.

* Changed ppr/ppr_dscdoc.c to accept "%%PageOrder: Ascending" and
"%%PageOrder: Descending" with a warning.  (Steve Hsieh)

* Added "volatile" to variables set by signal handlers in pprdrv, atalk
interface.  I don't know if this is the right thing to do, but that is how I
understand the meaning of "volatile".

* Added HP-UX support (Tim Leamy <ccctim@mailbox.ucdavis.edu>)

* Added SHAREDIR so that PPD files, pre-loaded cache, and speach files can
be shared among architectures.

* Fixed findNECHO and findEECHO in installscript and findNECHO in Configure
so that they don't skip "echo" because [ -x echo ] is false.

* Moved DEFAULT_PAGESIZE, DEFAULT_PAGE_PSU_WIDTH, DEFAULT_PAGE_PSU_HEIGHT
and friends to global_defines.h and changed filter_lp, filter_fortran, and
filter_dotmatrix to use these values.

* Added pagesize=, mediacolor=, mediatype=, mediaweight=, and duplex= to
filter_dotmatrix.

* Removed "samba_mail" clause from libppr/reswidth.c.

* Added the skeleton of AT&T UWIN support.

* Moved parts of the lpr interface into a new liblpr.a.

* Added PPR_GS_HACK_ADDRESS support to tcpip interface for consistency with
the atalk interface.

* Renamed ppd/ghostscript/ghostscript.master to ghostscript_master.

* Merged gssimple.sh, gsatalk.sh, and gstcpip.sh into a single file
gs_master.sh from which each of the origional files may be generated using
cpp and sed.

* Added 255 to the error codes which gs_master.sh interprets as a PostScript
error.  This may not have been necessary or even a good idea since 1.30b7
added support for Ghostscript error messages in the form "Unrecoverable
error:".

* Fixed icmpn() which was comparing one character less than what it was told
to.  (Patch submitted by morio@sozio.geist-soz.uni-karlsruhe.de.)

* Fixed responders/time_elapsed.c which was appending an extra space to
elapsed times of less than 2 days.

* Added the sysdep.h define FAKE_SIGIO which enables code to use SIGALRM
polling and a few additional polling calls in close_interface() and
reapchild() as a substitute for a working SIGIO or SIGPOLL.

* Changed ppr_infile.c: exec_filter() so that it takes an additional
argument, the filter argument list type.

* Fixed ppr_infile.c: nofilter() so that it uses the new log file name
format.  (It had ommitted the destination node and home node.)

* Changed ppr_infile.c to eliminate buffer_count and prohibition on PJL and
David's dot headers that stretched beyond the first input buffer.

* Changed ppr_infile.c: stubborn_rewind() so that it will use unique names
for its temporary files as a step toward accomodating systems which can't
unlink() open files.

* Added code to ppr_req.c to convert old style punch options to new style.
(See RBIIp 704.)

* Added code to issue warnings for %%DocumentPaper and %%Paper comments.

* Added warnings code for two argument %%Pages, %%ExecuteFile, and %%Feature
in DSC >= 3.0.

* Fixed ppr_sscanf() so that %d will not read 0 if there are no digits.

* Corrected handling of "%!PS-Adobe-" specified by DSC 1.0.  It is now
changed to "%!".

* Fixed spurious peeve warning that "0 characters follow EOF mark".

* Changed the response message which said "because it does not conform
sufficently to the DSC" to "because it does not have DSC page division
information".

* Renamed getline() in ppr to in_getline().

* Reworded some warnings in ppr_old2new.c, ppr_dscdoc.c, and ppr_req.c for
consistency.

* Added the functions handle_atend(), trap_noarg(), and trap_atend() to
ppr_dscdoc.c.  Also made header_trailer() static since it is not called from
other modules.  Fixed the trailer argument in the call in read_trailer().
(This fixed a _lot_ of bugs discovered during the development of the
regression test for this module.)

* Eliminated old_to_new_header_trailer() and old_to_new_pagelevel() and
replaced them with code in ppr_dscdoc.c.  This allowed correct
implementation of the parsing rule in item 5 on page 631 of the Red Book.

* Added global variable tokens_count to tokenize().

* Changed ppr_old2new.c so that %%EndProcSet, %%EndFile, and %%EndFont are
not upgraded to %%EndResource if the %%Begin comment didn't have an
argument.

* pprdrv: Corrected the hack from printers which hangup after a PostScript
error.  The correction was to add code like that in main() to reapchild().
(Patch from Labie Vincent.)

* renamed ppr --show-id to --show-jobid and added --show-long-jobid.

* Cleaned up interfaces/alert.c a little.

* Moved is_ppr_dest() from lprsrv.c to liblpr and renamed it to
printdest_claim_ppr().

* Moved the lp/lpr path definitions from lprsrv.h
to sysdep.h and liblpr.h and added new ones LP_LIST_PRINTERS,
LP_LIST_CLASSES, and LPR_PRINTCAP.  Also made STANARD_ and SIDELINED_
versions of the lpr and lp paths and added SIDELINED_LP and SIDELINED_LPR to
the user settable options section in global_defines.h.

* Added PPR_DSC_PREFIX to global_defines.h.

* Added "%TCHCTSpooler: PPR-1.31" to header comments emmited by pprdrv.

* Added environement variable PPR_VERSION to pprd, ppr, and papsrv and added
calls to a new library function prune_env().

* Renamed SHORT_PATH to SAFE_PATH to better reflect its purpose.

* Changed the responder invokation so that the reason is no longer enclosed
in ().

* Changed the xwin and samba responders to to say "Probable cause:
<reason>".  Also added spacing between the parts of the message in the xwin
responder in an attempt to improve readability.

* Added --foreground switch to pprd so that is can be run from init.
(Suggestion of Michael Deutschmann <ldeutch@mail.netshop.net>.)

* Changed the wording of a ppop cancel <destname> message from "There were
no jobs to cancel." to "You had not jobs to cancel.".  This is intended to
make it more obvious that with version 1.30 ppop cancel no longer attempts
to delete all jobs but mearly deletes all jobs owned by the user who calls
it.

* Added catching of Ghostscript exit code 139 which seems to indicate a core
dump.

* Altered the line spacing in the xwin and samba responders.

* Fixed ppad delete and ppad group delete so that they now run ppop purge
rather than ppop cancel before deleting the destination.

* Rewrote fake_lp, made the libuprint.a, write fake_lpr.

* Added conditional defined for INADDR_NONE after include of netinet/in.h in
interfaces/tcpip.c and libuprint/lpr_connect.c.

* Changed PPR_PATH and PPOP_PATH in global defines to give the full path
rather than the path relative to HOMEDIR.

* Changed sysdep.h.  Now more systems define a signal() macro including SGI
and HP-UX.  The macro for SunOS 4.x no sets the SA_INTERUPT flag.

* Added Dingbats -> DingbatsMedium to fontsub.conf.

* Fixed some ommisions of SHAREDIR in installprogs/makedirs.sh.  Also fixed
procsets/Makefile and dotmatrix/Makefile so that they put the procedure sets
in SHAREDIR rather than HOMEDIR.

* In ppr/ppr_main.c:  Changed -R ignoreduplex to -R ignore-duplex, -R
ignorefor to -R ignore-for, -R ignorecopies to -R ignore-copies,
--ignore-dsc-title to -R ignore-title and added -R title.  Fixed
lprsrv/lprsrv.c to use -R ignore-title in stead of --ignore-dsc-title.

* Changed ppr --default-media to --default-medium.

* Changed libppr/daemon.c so that it uses sysconf(_SC_OPEN_MAX) rather than
OPEN_MAX, removed OPEN_MAX from include/sysdep.h.

* Changed libppr/daemon(): ppr_daemon() so it no longer does chdir(HOMEDIR),
changed pprd/pprd.c, papsrv/papsrv.c, and lprsrv/lprsrv.c accordingly.


1.31b2, 21 August 1997--12 September 1997

* Fixed procsets/Makefile, dotmatix/Makefile, ppd/ghostscript/Makefile,
encodings/Makefile, fonts/Makefile
substituting $(SHAREDIR) for $(HOMEDIR) in paths to procedure sets and PPD
files.

* Changed installprogs/fixup.sh, adding an outdated() function which is used
to delete outdated files.  It only prints the name of the file and tries to
deleted it if it exists.

* Renamed lprsrv.c:getline() to lprsrv_getline() to avoid GNU libc clash.

* Moved definition of _GNU_SOURCE out of the Linux section of sysdep.h and
into the top of global_defines.h.

* Changed serveral instances of the word "media" in warning() calls in
ppr/ppr_media.c to "medium".

* Removed the rm -f ../ppr-src-*.tar.gz from the top level Makefile.

* Created print_pap_status() function to deal with DeskJet 850C.  Also
created is_pap_PrinterError().  Both are in libppr.

* Renamed libppr function unsafe_ps_name() to is_unsafe_ps_name().

* Modified lprsrv so that it uses the new functions printdest_claim_lp() and
printdest_claim_lpr() in libuprint.  This means that it can now pass jobs to
both lpr and lp simultaineously if the compile time options have been set to
include the code for both.  It also means that lprsrv does not blindly pass
jobs for unknown destinatins off to the "system print spooler".

* Added periods to the end of certain fatal() calls in pprd.c.

* Changed pprdrv_capable.c to state what the required langauge level and the
printer's language level are when the printer's level is not adequate.

* Fixes for OSF/1 3.2 port:  Added interupted system call retry to fgets()
call main() which reads from the FIFO, restored linking of pprdrv against
libsys5.a in order to get a pipe() which supports SIGIO, removed references
to $(OSFLIBS) from Makefiles for papsrv, pprd, and ppr2samba.

* Fixed pprd_ppopint.c so that ppop move moves the -infile.  (Bug reported
by Steve Hsieh.)

* In pprdrv/pprdrv.c, renamed copy_page() to copy_a_page().

* Fixed a problem with jobs which had the pages in reverse order in the
input file when the number of pages was not an even multiple of pagefactor.
When copy_pages() in pprdrv.c ran off the end of the list of page
descriptions the fact wasn't being detected as it was for jobs which had
their pages in ascending order.  (Bug reported by Steve Hsieh.)

* Restored the removal of unrecognized "(atend)" comments.  (The corrected
(atend) processing in 1.31b1 accidently led to their being copied into the
-comments file.)


1.31, 15 September 1997--6 October 1997.

* Changed the names of some functions in pprdrv/pprdrv_progress.c removing
bould underscores and changing pprdrv_state_update_write() to
pprdrv_state_update_addline().

* Changed lprsrv so that it returns an error code of 2 if a data file
transfer fails due to a want of disk space.  Also fixed it so that it will
return a code of 2 if the receive data file command detects a want of disk
space.  (Patch from Steve Hsieh.)

* Moved the MAX_* stuff out of lprsrv.c and into uprint.h and renamed it to
LPR_MAX_*.

* Fixed but in lprsrv, missing else in job dispatch code which could cause
the job to be submitted to both ppr and lpr if both claimed the job.
(Bug report from Steve Hsieh.)

* Added code to fixup.sh to remove fake_* programs from PPR's bin directory.
(These programs were renamed to uprint_* in 1.31b2.)

* Copied lprsrv.c to nlprsrv.c and renamed lprsrv.c to olprsrv.c, did the
same for lprsrv.h.  Changed lprsrv Makefile so that it installs
$(HOMEDIR)/lib/lprsrv as a link to olprsrv.

* Changed fixup.sh to make everything in ~ppr/bin executable by world
(chmod 755) before setting individual permissions.  (Steve Hsieh had trouble
because of his umask setting.)

* Finished libuprint, fake_lp, fake_lpr, fake_lpq, and fake_lprm.  Combined
SIDELINED_LP and SIDELINED_LPR into NATIVE_SPOOLERS_SIDELINED.  Changes to
libuprint necessitated changes to the lpr interface will cause slight
differences in the formatting of its error messages.

* Added the define LPR_EXTENSIONS_OSF to the DEC OSF section of sysdep.h.
This is for future use by libuprint.

* Added the uprint_* programs to those which get made setuid root by
fixup.sh.

* Defered warnings about DSC comments which overflow ppr's continuation
buffer until such time as those comments are continued.

* Added peeve level warning for DSC comments which don't have a space after
the colon.

* Fixed the System V lp class and printer detection paths in sysdep.h for
SGI and HP-UX.  Took a guess for System V Release 4.0 for WGS.  There is no
longer a default setting for these variables.

* Modified printdest_claim_lp() so that it will only accept as a printer a
subdirectory (for Solaris 2.x) or a non-zero-length file.  This is so we can
create zero length files in /var/spool/lp/interface on SGI systems without
uprint thinking lp has a printer.  (This is for the SGI program glp and
friends.)

* Moved NATIVE_SPOOLERS_SIDELINED from global_defines.h to
Configure which may put it in CFLAGS in include/global.mk.

* Added HOMEDIR/editps to directories created.

* Made indexttf setuid ppr and put a test a the top of main() which makes it
abort if the effective uid is 0.  Cleaned it up a little too, making it
include truetype.h.  Made it setuid ppr and setgid ppop.

* Changed ppr/ppr_dscdoc.c:feature_spy() so that it interprets a feature
"*Media None" as an empty media type string just as it already did for
"*MediaType Plain".  (This is for the HP 5Si PPD file.)

* Made ppr complain if its EUID is the same as it UID and the UID does not
correspond to USER_PPR or if the EUID is 0.

* Made the "Spooler is not running message" apply only if errno is ENOENT or
ENXIO (which indicates an unattached FIFO).

* Made all C source files in libppr include global_defines and changed the
return type of padded_cmp() from int to BOOL.

* Added libppr/strerror.c:safe_strerror() as workaround for Linux
strerror() bug.

* Added /etc/ppr/editps.conf (so that -H editps works) and
ppr -G infile:editps.

* Removed GROUP_PPOP, GROUP_PPAD, GROUP_PPRPROX from fixup.sh,
include/global_defines.h, and installprogs/installscript.sh.  Made fixup set
most PPR files to GROUP_PPR.  Made lprsrv demote self to GROUP_PPR when
started as root in standalone mode.

* Added LICENSE.txt.

* Added libppr/acl.c:user_acl_allows() and made ppr, ppop, and ppad user it.

* Created an editps filter for Windows NT 4.0 output.

* Adjusted the wording of a few warnings in ppr/ppr_res.c.  (Changed
"inclusion cue" to "%%%%Include", change "not declared" to "never declared"
and a few other things like that.

* Changed libuprint/uprint_run.c:uprint_run() so that if the command runs
to completion it returns the command's exit code rather than 0 as it
formerly did.

* Fixed problems with the exit codes of uprint_lp, uprint_lpr, uprint_lpq,
and uprint_lprm so that they return the exit code of the program they call.
Previously they tended to return 1 no matter what happened.

* Changed printdest_claim_lp() so that it accepts a file in the printer's
directory if it is a directory (for Solaris 2.x), if it executable (sane
interface program), or if it does not begin with "#UPRINT".


1.32a1, 7 October 1997--16 October 1997.

* UPRINT: Added OSF options support to uprint_lpr, the RFC 1179 dispatcher, added
LPR_EXTENSIONS_OSF support to the lpr dispatcher.

* UPRINT: Added file type specification and OSF options translation to the ppr
dispatcher.

* UPRINT: Added many missing options to the lp dispatcher.

* UPRINT: removed security problems due to failure to relinquish root access.

* Removed comments from smb.conf.sample which refered to "pc.myorg.org",
something that applied to an old version of the samba responder.

* Fixed installscript.sh which was substituting "" as the value for SHAREDIR.
(I touched all *.sh, *.perl, and *.pl files so that they will be re-installed
using the new installscript.sh.)

* Fixed ppr_infile.c so that -H editps will still work if other hacks are used.
(The problem was that == was used in the test in stead of &.)

* Changed ppr --show-jobid so it says "(1 file)" just as System V lp does.

* Changed uprint_print_rfc1179() to show the number of files too, also changed
job id number it displays to "0" to conform with Solaris 2.6 lp.

* Removed ioctl() prototype from OSF/1 section of sysdep.h.

* Updated lw_errors.conf and lw_status.conf.

* Changed the DVI filter (misc_filters/dvi.sh), making it add the DVIPS
basedir to the PATH so that it can find MakeTeXPK.

* Removed explicit path setting from misc_filters/pr.sh

* Added BIND_ACCESS_BUG to sysdep.h for Solaris 2.x, added code in
libuprint/lpr_connect.c to work around this bug.

* Added --markup.

* Added -T enriched.

* Added -T mime type recognition.  (Most -T types don't have MIME names
entered in the table yet.

* Added strip to the things installbin does.  This should allow me to remove most
instances of strip from the Makefiles (to ease debugging).


1.32a2, 17 October 1997--6 November 1997.

* Added uprint-remote.conf and moved all current uprint.conf functions to
uprint-remote.conf.

* Combined lw_errors.conf and lw_status.conf into one file, lw_messages.conf.  The string
"PrinterError:" now appears in many of the messages.  Whether "PrinterError:" appears in the
regularized string now determines whether the message is reported to the commentator as
an error or simply a status.  Also, the code value passed to commenators has changed slightly.
Previously, either COM_PRINTER_STATUS, COM_PRINTER_ERROR, or COM_PRINTER_STATUS_UPDATES was set.
Now if COM_PRINTER_STATUS_UPDATES is set then either COM_PRINTER_STATUS or COM_PRINTER_ERROR is
set too.  Appropriate changes made in commentators/audio.perl.

* Added ppr --commentary with support in queue file.

* Added ppr reading of "%%DocumentData:" with support in queue file and
restoration in pprdrv.

* Some code cleanup in ppad.

* Replaced the AppleDict proceedure set with an appearently newer one
off of Shakti.

* Added BACKUPS= to include/global.mk generated by Configure.

* Fixed baud rate setting code in interfaces/serial.c.

* Major re-write of interfaces/serial.c to eliminate the child process.  The
new version uses select().

* Modified pprdrv/pprdrv_feedback.c to remove control-D's since the new serial
interface copies them to its stdout.

* Reworked pprdrv/pprdrv_feedback.c to defer handling of partial lines
more correctly.

* Removed various useless calls to setsid() from pprd.  (It called it after
forking to invoke pprdrv and sendmail.)

* Removed calls to setsid() from pprdrv.  It now calls setpgid(0,0) near the
top of main() and sends SIGHUP to the group in commentator_wait() if they don't
finish within 60 seconds.  The call to setsid() in the interface child has been
replaced with setpgid(0, 0) so that the kill of the interfaces process
group will continue to work.

* Removed calls to setsid() from papsrv child launch.

* Dropt the "wait=" option from the serial interface.  Dropt the "online=cd"
option.  Added an "online=dsr/cts" option.  Added a "detect_hangups=" option.
Added a "hangup_on_close=" option.  Added "rtscts=" option.

* Added parallel interface.

* Added gsserial and gsparallel interfaces.

* Fixed AT&T port so it compiles again.  It probably didn't work in 1.30 and 1.31.


1.32a3, 14 November 1997--21 November 1997.

* Fixed ppad charge rounding error.  (Reported by Klaus vom Scheidt
<vscheidt@sun10rz2.rz.uni-leipzig.de>.)

* Changed gs interfaces to sleep for 2 seconds and then exit with EXIT_PRNERR
if Ghostscript exits with code 141.  (The 2 second sleep is done in the hope
of catching a signal.

* Changed commentator timeout code so that it does not start a new section in
the printer alerts log (i.e., it uses FALSE as the second parameter for alert().

* Reworked do_daemon() a little, adding umask() call and moving some of
the code out of #ifdef HAVE_FORK.

* Corrected to value of UNIX_644.  (It had been 660.)

* Added umask setting to ppr, ppad, ppuser, ppr2samba, and indexttf.

* audio commentator: Moved "off line" from the status to errors.

* Added "PrinterError: off line" to lw_messages.conf.

* Fixed syntax error in samba commentator.

* Changed the permissions of state_update (the file thru which pprd
indicates spooler status changes to GUI interfaces) from 755 to 644.

* pprdrv: Finished TBCP support.  printer_putc, printer_puts, and
printer_write are no macros which refer to function pointers.

* pprdrv: added printer disqualification on the basis of code useage.

* ppad: fixed ppad codes command.  It was storing the name string, not
the code number.

* Changed the order to the printer interface program arguments.  (The first
three, the printer name, the printer address, and the interface options
remain the same.)

* atalk_cap.c: removed appearently unnecessary resetting of sigalrm_caught.

* Added PCL magic number from Steve Hsieh.

* ppr: Removed a bug in getline_simplify() which made if fail to call
tokenize() on lines such as "%%ADO_ImageableArea: -31 -31 581 977".  The
result of this bug was that in LaserWriter 8.x output, the %%DocumentMedia:
line was being parsed twice.

* ppr: Improved the messages about imperfect medium matches.


1.32a4, 24 November 1997--20 January 1998.

* Wrote code to read uprint.conf and removed the NORMAL_LPR_PATH and friends
  from sysdep.h and uprint.h, also removed NATIVE_SPOOLERS_SIDELINED from
  Configure.

* Made changes to olprsrv.c to use uprint.conf.

* Minor changes to get PPR closer to working under UWIN 1.35.

* Changed misc/samba.conf.sample to mention "chmod 1777" and added
  "printing = bsd" with note that it goes in the [global] section
  if Samba is older than version 1.9.18.

* Major work on lprsrv to convert it to use libuprint routines.

* Renamed libuprint/uprint.conf to uprint.conf.sample and
  libuprint/uprint-remote.conf to uprint-remote.conf.sample

* Added lprsrv.conf access control to the new lprsrv.

* Changed printlog format to use a four digit year.

* Added PPD file for "HP LaserJet 4000 Series".

* Replaced misc/modes-3.1.mf with modes-3.3.mf.

* ppad_filt.c: change mfmodes.conf matching so that resolutions stated
  in the PPD file in forms like "600x600dpi" will be converted to the
  form "600dpi" before an attempt is made to match them against mfmodes.conf.
  (This change was inspired by the PPD file "HP LaserJet 4000 Series".

* Eliminated the all wildcard rule from mfmodes.conf.  Consequently,
  when no match is found the mfmode= item will be ommited from the default
  filter options and the DVI filter will let dvips choose the mode.

* Changed a ppad debug message so that it will state the resolution it is
  looking for in mfmodes.conf.

* In pprdrv_ppd.c: expanded the PostScript code which is used to bracked
  duplex code inserted by the -F switch.  Formerly it saved and restored
  the current transform matrix.  Now it also saves and restores the current
  point.


1.32a5, 22 January 1998--26 February 1998.

* Renamed interfaces/feedback_test.ps feedback_test1.ps.  Moved
  tests/misc_old/int_test.ps and int_test2.ps to interfaces and renamed
  them feedback_test2.ps and feedback_test3.ps.

* libppr: added padded_icmp()

* ppr_media.c:  Changed pass 2 media matching so that the comparision
  of media types is case insensitive.

* libppr: Added support for /etd/ppr/acl/???.allow files to user_acl_allows()

* Hooked up -A switch in the new lprsrv.  (I added a global variable
  uprint_arrest_interest_interval in libuprint.)

* Split lprsrv.conf "become user" and "proxy user" into "ppr" and "other"
  versions.  Changed "user format" to "ppr user format" and "proxy class"
  to "ppr proxy class".

* Added program lprsrv-test.

* Added /etc/ppr/acl to installprogs/makedirs.sh.

* Added internationalized messages option to Configure.  If turned on it will
  put lines in global.mk to add -DINTERNATIONAL to CFLAGS and define INTLLIBS.

* Started to add gettext() initialization code to programs.

* Added po source directory with extract.sh and README.txt.

* Added internationalization startup code to uprint programs, to pprd, and
  to ppr.

* Removed USE_SHORT_STRINGS from sysdep.h and ppr_main.c.

* Moved input filters to $HOMEDIR/filters

* Changed ppr to set umask to PPR_JOBS_UMASK which is defined as 007 rather
  than a hard coded value of 0077.

* Renamed directory indexttf to ttfutils and created empty directory libttf.

* Moved GUI (called "printdesk") into printdesk directory.

* Renamed the temporary program dotmatrix/prop to dotmatrix/prop_genmetrics.

* global_defines.h: added TBCP2BIN_PATH and AFMDIR.

* created installprogs/ppr_make_depend.perl and started a conversion to a
  more complex but less verbose Makefile structure.  Also started to convert
  the install clauses to copy the programs and files into place regardless
  of relative dates.  (This seems to be the accepted procedure.)

* Added ppr option -e no-hexdump as replacement for -e dishexdump. (Though
  the old one still works.)

* Renamed the uprint programs from uprint_* to uprint-*.

* Removed the scripts uprint/install_uprint.sh and uprint/uninstall_uprint.sh.
  Added them to the "Removing Obsolete Files" section of installprogs/fixup.sh.

* Internationalized filter_lp.

* Added libppr/cs2enc.c:charset_to_encoding() and changed filter_lp to use it.
  This is a step toward Russian character set support.

* Re-arranged the libpprdb directory.  It now has no children.  The different
  backend modules are distinguised by the part of the file name before a "_".

* Moved PostScript very incomplete document generation library "typeset"
  into distribution.

* Added --no-edit option to installprogs/installscript.sh.

* Reorganized the code in pprd/pprd.c:main().  I split much of it out
  into static functions to make it easier to see the order of startup
  operations.

* Changed the gs* interfaces and the interfaces that they call so that rather
  than pass the PID of the shell script thru the undocumented interface
  option "patron=" it is passed thru the environement variable
  PPR_GS_INTERFACE_PID.  This was necessary because in many of the interfaces
  it was inconvienent or impossible to parse the interface options before the
  first condition that could result in a fatal error.

* Changed the code in Configure, and installprogs/installscript.sh
  to put the test of echo in a subshell since otherwise SunOS 5.6
  /bin/sh will not redirect output until it has found the command in
  the path.

* Changed ppd/dopatches.sh so that it will detect if it will try to
  determine if patch is Larry Wall's and if not use temporary files
  to avoid feeding patch file names with spaces in them.  The patch
  that comes with SunOS 5.x has a bug which makes it choke on file
  names with spaces in them.

* Changed the sample uprint.conf so that the the sidelined locations of the
  system spooler programs is still /usr/bin but they have "real-" prefixed
  to their names.

* Internationalized tcpip interface.

* Changed the name of the "status_update_interval=" option of the atalk
  interface to "idle_status_interval=" but retained recognition of the
  old name for compatibility.

* Added the "idle_status_interval=" option to the tcpip interface.

* Modified pprdrv_feedback.c to recognized TBCP coming from the printer and
  decode it.  It will swallow the ^AM that announces TBCP.

* Broke pprd.c up into pprd.c, pprd_mainsup.c, pprd_load.c, and pprd_queue.c.
  This is part of a project to better organize things and to reduce the
  paged-in size of the daemon by putting initialization code all together.

* Added a libppr function set_ppr_env() to set HOME, PATH, IFS, and PPR_VERSION.
  This code is now called by ppr, pprd, papsrv, and lprsrv.

* ppr: Moved seteuid()/setegid() code into two functions called become_user()
  and unbecome_user().  Bracketed getcwd() with calls to these functions.
  Renamed uid and gid to user_uid and user_gid.

* Added PPR responder options support to uprint-lp, uprint-lpr, libuprint, and
  lprsrv.

* Changed ppop lpq output format so that there are no spaces in the file name
  field when the messages "arrested" and "held" are added.  This should make
  Samba happier.

* Moved atalkmapd.perl from "responders" to "misc".  Reworked the
  responders/Makefile and added notes to responders/atalk.perl to indicate
  that it has never worked very well.  Moved responders/atalk.conf to
  misc/atalk.conf.sample.

* Changed responders/pprpopup.perl so that if there is an "@" in the address
  it will take the part before the @ and use it as the parameter for a "SETUSER"
  command.  This is so it can send to multi-user systems.

* Created misc/pprpopupd.perl, a message-receiver daemon for multi-user systems.

* Changed responders/pprpopup.perl so that it does not print the message that
  begins "Your job's log file follows" unless there is a log file.

* Fixed a problem with lprsrv/lprsrv_print.c:dispatch_files_run().  The child
  process would demote it self before opening the log file.

* Changed uprint-remote.conf parsing so that
  the section name is the default remote printer name.

* Changed libuprint/uprint_print_rfc1179.c so that OSF extensions are also
  used if "ppr extensions" is true.

* Combined xppr.sh and xpprstat.sh into xfm-ppr.sh.  Added the old programs
  to the list of obsolete files in fixup.sh.

* Corrected pprd_respond.c which was using "-1" rather than "?" for the
  responder number of pages parameter when the number was unknown.

* Re-wrote readqfile.c to prepare it for less rigid queue files which may
  come as a result of remote PPR printing.  This included the adding of
  a "EndMisc" line to the queue file format.

* Added %u to ppr_sscanf().

* Prepended "option_" to a number of variable names in ppr.

* Removed the -p (--portion) switch from ppr.

* Renamed lw_messages.conf to lw-messages.conf.  Moved lw-messages.conf,
  fontsub.conf, editps.conf, and mfmodes.conf into $(SHAREDIR)/globalconf.

* Fixed lprsrv so that if the L line does not appear it sets nobanner true
  rather than setting banner true if it does.  The result is that PPR will
  not print banner pages unless banners is set to "yes" with ppad.

* Renamed lw_message.conf to lw-messages.conf.  Moved lw-messages.conf,
  fontsub.conf, mfmodes.conf, and editps.conf into GLOBALCONF.  Split
  lw-messages into a CONFDIR and a SHAREDIR/globalconf portion.  Both
  are read and the changes are made to the CONFDIR portion.

* ppr/ppr_main.c:write_queue_file(): cut back down to one argument.
  The code in ppr/ppr_split.c must modify the structure before it passes
  it to write_queue_file().

* Added RESP_CANCELED_NOPAGES and EXIT_NOTPOSSIBLE
  and ppr_selpgs.c:select_pages() for the new page selection feature.

* Changed myfree() so that it detects attempts to free NULL pointers.

* Fixed an error in ppr_sscanf().  If an integer pattern such as "%d" failed
  to match, it would ignore the pattern and continue with the next one.  Worse
  yet, it would use the argument for the skipt pattern for the next pattern.
  In order to fix this I changed "if(!isdigit(*string)) break;" to
  "if(!isdigit(*string)) goto break_break;".

* Began internationalization of ppop.

* Fixed ppop.c:parse_job_name() so that it does not interpret input of
  "-" as a zero length destination name.  It now considers such input
  to be an error.  It also now prints a message when confronted with
  trailing garbage rather than just returning -1.

* Made logical_eof a static in ppr/ppr_infile.c and added the function
  in_eof() to provide read-only access.

* Changed ppr_infile.c so that in_getline() does not make "%%EOF" lines when
  it sees HP UEL or control-D.  This will change the behavior of the -Z switch.

* Changed ppr_main.c:main() and functions such as read_pages() and
  read_trailer() to absolutely ensure that the "-text" file ends
  with "%%Trailer".  It is also now guaranteed that the "-pages" file
  ends with "%%Trailer" and "Offset: xxx".

* Ran regression tests "test-ppr".  Found one problem due to a change in
  header_trailer().  A "strncmp(line," had been changed to "strcmp(tokens[0],"
  which wasn't the right thing.   The other difference, in part 1 of test
  300-badeps is probably due to the change in the paragraph before this.  The
  new results seem more correct.

* Fixed gramatical errors in the printer alert messages in pprd/pprd_alerts.c.


1.32b1, 26--27 February 1998.

* Added "/usr/local/cap60/lib" to the list of directories searched for the
  CAP 6.0 library.

* Corrected pprd so it creates /var/spool/ppr/queue when it starts up.
  I wonder when this bug appeared.

* Made libppr/pprpopop.pl:make_connexion() parse the address with a regular
  expression to avoid insecure dependency warnings.

* Simplified the buffer flushing code in pprdrv_buf.c: If write() sets
  errno to EPIPE then it sleeps for 10 seconds and then calls fatal().
  Hopfully, the interface will exit during that period.

* Fixed pprdrv/pprdrv.c:start_interface() so that it will block SIGCHLD just
  before fork() and then unblock it in the parent.  (The child code already
  clears the signal mask.)  The idea is to guarantee that the parent can
  record the child process id in the variable "sigint" before reapchild()
  is called.  On Solaris 2.6, if the interface exited due to an error
  in the interface options and the jobbreak method was signal or signal/pjl,
  then pprdrv would block forever waiting to receive SIGUSR1 from the
  interface.  Of course, since intpid was not set, reapchild() mistook
  the interface termination for the termination of a commentator.

* Added a check to pprd so that it will not let the user "ppr" start the
  spooler unless the gid is also "ppr".  This is important because it
  cannot set all of the group ids to the proper value if it is not root.
  Consequently, some commentators would fail due to Perl taint checks
  which got turned on because Perl was running setgid.

* Finished uprint-newconf and moved it from the uprint subdirectory to the
  libuprint subdirectory.

* Added BROKEN_PERMISSIONS for Steve Hsieh.  This is an experimental
  workaround for a bug in the NFS he is using.


1.32b2, 2 March 1998--20 March 1998

* Fixed dependency errors in libuprint/Makefile and uprint/Makefile.

* Added extra DODEBUG(()) calls to interfaces/atalk_ali.c as suggested
  by Steve Hsieh.

* Fixed lprsrv -A and -s switches which were messed up due to bad parsing
  tables in the new lprsrv.

* Made ppr/ppr_main.c:main(): call infile_file_cleanup() before calling exit()
  if open_fifo() fails.

* Added file type "hpgl2" for HP-GL/2.

* Added "BarBar" mode and -H hppassthru.  This includes a new queue file
  line called "BarBarLang:".

* Changed ppr/ppr_infile.c:in_eof() to return TRUE only _after_ the first call
  to in_getline() _after_ the one which returned the last line.

* Cleaned up ppr/tbcp2bin.c a little.

* Added "PJLHint:" to queue file and PJL member to struct QFileEntry.

* Split the interface launching code and printer setup code out of pprdrv/pprdrv.c
  and put it in pprdrv/pprdrv_interface.c.  Changed the external interface to
  the job managment routines.  Formerly the functions were:
  start_interface(), printer_setup(), printer_reset(), jobbreak(),
  and close_interface().  Now they are job_start(), job_end() and job_nomore().

* Added a 10th parameter to interfaces which tells the BarBar language.

* Changed -H transparent so that it prints banner and trailer pages.  I hope
  I have not destroyed its usefullness (if it ever had any).

* Changed parallel interface program so that if open() of the port returns
  EBUSY it will retry retry 29 times at 2 second intervals.  Tests on
  Linux-2.0.25 showed this to be necessary.  If the timeout expires it will
  exit with EXIT_ENGAGED.  If it is being run from gsparallel, it will
  send gsparallel SIGINT.

* Changed fig filter so that it invokes fig2dev with the -P switch and
  consequently no longer needs to do as much massaging of the PostScript
  output.

* Changed "media" to "medium" in a responder message.  Also changed it in
  the audio responder.  This will require the rerecording of a sound file,
  but for now I have simply renamed it.

* Changed the gs* interfaces so they will ommit Ghostscript from the pipeline
  if the 10th parameter (barbarlang) is blank.

* Changed the tcpip, parallel, and serial interfaces so that they will use
  resonable defaults if they are invoked with as few as 2 parameters.

* Fixed error in uprint.conf.sample.  Error was "lpr = /usr/bin/lp".

* Renamed /var/spool/ppr/lpr_nextid to lpr_previd and changed the start of
  the sequence numbers from 0 to 1.  The new name better reflects its purpose.
  I will leave the PPR nextid file for when I fix that whole mechanism.

* lprsrv: corrected problem which occured when nobody uid was -1.

* Uprint and lprsrv: cleaned up handling of no files specified and "-" as
  stdin.

* In numberous modules, moved inclusion of global_defines.h to a point
  after the inclusion of the system includes.  On Cygnus Win32 this caused
  a problem because sysdep.h generally defines a macro signal() which gave
  trouble when signal.h was subsequently included.  Note that system
  includes whose conditional inclusion is dependent on values defined in
  global_defines.h (or sysdep.h which it includes) must still come after
  the inclusion of global_defines.h.

* Fixed uprint-lpr -K switch so it accepts the addional argument forms
  accepted by OSF lpr and translates them to the forms that OSF lpr
  puts in the queue file K line.  Invalid -K switch values are now
  rejected.

* Changed ppr default from --markup=format to --markup=fallback-lp.

* Fixed ppop lpq so that it displays the correct total number of pages in the
  printer status line.

* Fixed many of the filters in misc_filters.  They were broken because they
  were calling other filters which had been moved from $HOMEDIR/lib to
  $HOMEDIR/filters.

* Added -o title= to pr filter and modified libuprint to generated it for
  the pr title (T in lpr queue file).

* Changed the "file" commentator time format to use a 4 digit year.

* Added the --passthru switch and made many changes to support non-PostScript
  printer languages.

* Added "#define ANSWER int" to global_defines.h.

* Added interface option "control_d_handshake=" to tcpip.  The default is
  false if the jobreak method is PJL.

* Beefed up pprd/pprd_mainsup.c:adjust_ids() so that it actually looks up the
  correct ID numbers for user "ppr" and group "ppr" and makes sure the euid
  and egid are correct.


1.32b3, 23 March 1998--3 April 1998

* Added confirmation messages to Configure script for A4 vs. US Letter and
  GNU gettext().

* Added include "before_system.h" and changed sysdep.h to use PASS1 and PASS2.

* Fixed gs* series interfaces and some filter shell scripts to work with
  /bin/sh again.  They used ${10} which appearently only works in Bash.

* Changed the sed filter used with cpp on gs_master.sh to remote lines
  begining with "#".

* Changed ppr so that if the -u switch setting is to use the /etc/passwd
  gecos field as the user name but the gecos field is empty, it will
  use the user name.  (Thanks to Robert G. Smith <rob@bip.anatomy.upenn.edu>
  for helping to track this one down.)

* ppr/ppr_infile.c: added macro FABS() to replace fabs() thus obviating
  the necessity to link with libm.

* Changed libuprint/uprint_uid.c:uprint_re_uid_setup() to add an pointer
  argument for returning the "safe" uid.  This is to fix standalone
  mode in lprsrv.

* Fixed libuprint/claim_lpr.c:claim_lpr() so that it is non-empty if
  USE_LP is defined rather than if LP_PATH is defined.  The macro
  LP_PATH was removed some time ago.  The result of this bug was that
  libuprint would never hand jobs off to lpr.

* Changed libuprint/uprint.c:uprint_set_jobname() to reject zero length
  job names.  I did this because a queue file received by lprsrv might
  have such a thing and letting it thru would get ppr upset when it
  discovered that its --lpqfilename switch had an empty argument.

* In include/global_structs, changed "struct PAGESIZE" to "struct PS_PAGESIZE"
  because PAGESIZE is a macro defined in some file included by stropts.h
  in Solaris 2.5.1.

* Changed pprdrv/pprdrv_interface.c:printer_setup() so that PJL commands from
  a barbar job are inserted before those provided by PPR.  This provides extra
  protection against the overriding of the things PPR wants to set such
  as printer display message.  (Suggested by Steve Hsieh
  <steveh@eecs.umich.edu>.)

* Changed fixup.sh so it will create /etc/ppr/acl if necessary and so it will
  show the names of the missing ACL files it is creating.

* Added WIN32_TESTING to include/sysdep.h.

* Improved ppr -G infile:autotype and -G infile:filter debugging messages.

* Fixed ppr --markup option.

* Fixed feedback_pjl_wait() to be compatible with the control_d_handshake=no
  option of the tcpip interface.  The problem was that with short files the
  PJL start of job messages wasn't coming before transmission was finished.

* Fixed misc_filters/dvi.sh so it explicitly export PATH.  This doesn't seem
  to be necessary in Bash but it is in /bin/sh from Digital Unix 4.0.

* Changed misc_filters/tex.perl to work around problem due to that fact that
  recent versions of Perl 5.x define values returned from readdir() as
  tainted.

* Changed the open() flags used on the FIFO in ppr, ppop, and ppad from
  (O_WRONLY | O_NDELAY) to the Posix form (O_WRONLY | O_NONBLOCK).  Also
  added alternate flags (O_WRONLY | O_APPEND) to be used when HAVE_MKFIFO
  is not defined.

* Added BROKEN_SETUID_BIT define for Cygnus Win32.  This causes ppr and
  pprd to ommit some startup tests.

* Added fname_sprintf() to libppr.  This is a special sprintf() like function
  which only understands %d, %ld and %s and (most importantly) will not write
  more than MAX_PATH characters to the target string.  Also, if
  COLON_FILENAME_BUG is defined, it will change ':' to '!'.  This is for
  Cygnus Win32 which does strange things if colons appear in filenames.

* Changed many sprintf() calls in ppr, ppop, and pprd to use fname_sprintf().

* Added "b" flag to fopen() calls for MEDIAFILE in ppr, pprdrv, and ppad.

* Added a call to alert() in start_interface(), after the execl() so that
  there will be a message in the printer alert log if execl() fails.  It also
  exits with code EXIT_PRNERR rather than 242.

* Fixed libuprint/lpr_connect.c:uprint_lpr_make_connection() to it applies
  htons() to the result of atoi() when reading a port number.  (Bug fix from
  Richard Harwood <R.M.Harwood@dcs.hull.ac.uk>.)

* Changed the magic number for the PPR header read by ppr from ".!" to ".ppr".
  This should only effect the PRNAUTH.EXE program for MS-DOS which I don't
  believe is currently installed anywhere.

* Added ".type" to PPR header.  This sets the input file type as the -T switch
  and "@PJL ENTER LANGUAGE =" do.

* Broke out part of installprogs/installscript.sh into installprogs/scriptfix.sh.
  Added SCRIPTFIX= to global.mk generated by Configure.

* Moved fixed_cc_osf from misc to installprogs.


1.32, 6 April 1998--30 April 1998

* Added code to .ppr header parser to issue a warning of a line is unrecognized.

* Moved sgi_glp_hack.perl from uprint/ to misc/.

* Made some changes to PJL setup and cleanup code in pprdrv_interface.c.
  Particularly, it now uses RESET and USTATUSOFF.

* Changed sysdep.h to fix AT&T Unix port to define S_ISLNK() if it is not
  defined already.

* Put rule to build pprdrv_ppd_parse.c from pprdrv_ppd_parse.l back into
  pprdrv/Makefile.  It had been accidently deleted when the .depend stuff
  was put in.

* Added MV=mv to the things defined in global.mk.

* Moved the Sed command in interfaces/Makefile out into a separate file,
  sedcmd.sh.  I did this because some versions of make object to the
  '#' in the Sed command, mistaking it for a comment start and truncating
  the command.

* Changed the include mechanism pprdrv/pprdrv_ppd_parse.l so it works
  correctly, at least with flex.  According to "lex and yacc", you can't
  just change yyin and expect it to start reading from another file.
  There is buffering to contend with.

* Did the same for papsrv PPD parsing.

* Added tests/test-pprdrv with test for correct PPD inclusion.  This test
  seems advisable because many versions of Lex exist.

* Fixed lprsrv so it will again produce an inteligible error message when it
  is run as non-root.  It was claiming an "internal error".

* ppr/ppr_infile.c: In ".ppr" headers, changed ".type:" to ".file-type:"
  and changed ".transparent" to ".hack: transparent".

* Moved ppr --file-type and --copies to the list of finalalized long options.

* Fixed lprsrv/lprsrv_client_info.c:get_client_info() so that after it does
  the reverse lookup it does a forward lookup to see if it will get the
  origional IP address.

* Fixed rule in Configure which determines when -fno-strength-reduce is used
  as a GCC option on Intel systems.  The rule was that it should not be used
  if the GCC version is 2.7.2.1 or 2.8 or greater.  The rule is not that
  it should not be used if the version is 2.7.2.1 or greater.  The effect
  of this change is that -fno-strength-reduce is ommited for GCC 2.7.2.3.

* Changed the global.mk section which configure emmits for SGI so that when
  the native compiler is selected is refers to it as /usr/bin/cc to avoid
  links to GCC.  It also now uses /usr/bin/cc -E because /lib/cpp has a
  bug in its handling of #if #elif #else #endif.

* Commented out the "failed to include before_system.h" warning in
  global_defines.h.  This is not only because it will scare people but
  because the SGI compiler doesn't understand #warning and stops.

* Corrected testing for failure of getcwd() in ppr/ppr_main.c:main().
  Corrected declaration of myname in include/ppr.h.  The SGI C compiler
  found both of these errors.

* Moved sgi_glp_hack.perl from uprint/ to misc/.  Interestingly, it was
  already listed in misc/README_MISC.txt.  Added it to install section
  of misc/Makefile.  Installation is conditional on uname -s returning
  the string "IRIX".

* Added -r to uprint-lpstat so it says "schedualer is running".  This is so
  you can kill lpsched if you have no System V LP queues.

* Added special case for Xerox Docutech 135 to misc/ppd2win95drv.perl.
  The special case is only effective if xrdt1355.dll is in the win95drv
  directory.


1.40a1, 1 May 1998--3 August 1998

* Changed the global.mk definition of MAILX for SGI from "mailx" to
  "/usr/sbin/mailx".  This need was not recognized previously because
  /usr/sbin is in the standard SGI PATH.

* Changed  installprogs/installscript.sh so that it no longer edits the script.
  Also, changed the makefiles so that they use installprogs/scriptfixup.sh
  during the make phase to create localy customized versions of scripts.  This
  makes the install phase go much faster, reducing the time the system is in
  an unusable state during an upgrade.

* Modified the FIFO command dispatcher in pprd/pprd.c, breaking out the
  ppop commands into a separate dispatcher in pprd/pprd_ppopint.c.  Changed
  the format of these commands so the PID of ppop comes before the command
  letter rather than after.  This should make it easier to support
  alternative reply methods and additional parameters such as message language
  for internationalization.  It will also eliminate the transmission of
  a meaningless PID thru rpprd.

* Changed the ppop reply file format so the reply code is returned first on
  a line of its own.  A special code (EXIT_OK_DATA) was added to eliminate
  the need to set an execute bit on the reply file to indicate that there
  is non-message data to be read such as data for ppop list.

* Changed the wording of some of the messages in pprd/pprd_ppopint.c to
  improve clarity and consistency.  This means some adjustments will have
  to be made to internationalization files if anyone sends me any.

* Fixed Configure so that it puts SIGUSR1= and SIGUSR2= in global.mk for
  OSF/Digital Unix.  These values are taken from /usr/include/sys/signal.h
  for Digital Unix 4.0 and verified by consulting an archived
  /usr/include/sys/signal.h from 3.2.  This should fix some of the gs*
  interfaces.  (1.32p1)

* Modified the parallel interface so it opens the port with O_WRONLY rather
  than O_RDWR if feedback is false.

* Fixed a problem in pprd/pprd_load.c:initialize_queue().  Due to a problem
  with the COLON_FILENAME_BUG code it would not reload jobs already in the
  queue.  (1.32p1)

* Added BACKUPS= to include/global.mk.unconfigured so that "make clean" will
  work correctly on an unconfigured source tree.

* Added a new input type called "text" and changed MIME type "text/plain"
  from "lp" to "text".  The idea is that "lp" will always be the line
  printer emulator but "text" may be something else such as a2ps.

* Added WILDCARD_NODEID as a constant value that assign_nodeid() returns
  for "*".

* Fixed ppop and pprd so that if the home node isn't specified it is assumed
  to be a wildcard.  Previously they erroneously assumed the node to be
  the node on which ppop was executed.  Added WILDCARD_NODEID, WILDCARD_DESTID,
  WILDCARD_JOBID, and WILDCARD_SUBID to global_defines.h.

* Added rpprd to the things automatically built and installed by the top
  level Makefile.

* Added signal_interupting() and signal_restarting() to libppr.  Both set
  up a reliable signal handler.  The first one is like signal() in BSD.
  These will be used to replace all calls to signal() and most calls to
  sigaction().  While PPR currently defines a signal() macro in sysdep.h,
  its use can be confusing because the real signal() differs in behavior
  from system to system.

* Removed signal() definitions from sysdep.h and replaced them with
  a single signal() macro in global_defines.h which equates signal()
  with signal_interupting().

* Removed all SIGIO/SIGPOLL code from pprdrv and replaced it with
  select() code.

* Removed SIGIO/SIGPOLL defines from sysdep.h.  Removed last vestige of
  OSFLIBS= from Configure/global.mk.  Removed SOCKETPAIR_SIGIO from sysdep.h.

* Started internationalization of pprdrv strings.

* Fixed lprsrv so that when the queue file contains an M line it calls
  uprint_set_notify_email() in addition to uprint_set_lpr_mailto().
  (Thanks to Richard Harwood for the bug report.)  (1.32p1)

* Added sysdep.h define HAVE_H_ERRNO.

* Changed ppr_infile.c:exec_filter_argv() so that if the suid and sgid bits
  are not set on the filter then the effective user and group ids respectively
  are set back to the user's.  Since the saved id's are unaffected, this is
  probably only a moderate security improvement.

* Changed setup_filters.sh to set setgid bits on DVI, TeX, and Texinfo filters.
  Modified DVI filter so it chmods the DVIPS configuration files it generates
  to 664.  With the change above, access permissions when printing DVI files
  should be much closer to correct.

* Moved the test interface from interfaces/regtest.sh to tests/test_interface.sh.
  It is no longer installed in the interfaces directory.  The copy in the
  interfaces directory has been added to the list of obsolete files which
  installprogs/fixup.sh deletes.

* Fixed bugs in responders/samba.sh which caused it to ignore the os= option.

* Added PPD file "PPR Generic Level 2".

* Added web/addprnwiz.cgi.perl.

* Changed ppad_conf.c:conf_close() so that it doesn't unlink before rename.
  This prevents pprd from exiting if 2 ppad commands come in rapid sucession.
  It would exit if it tried to open the config file while the second ppad
  command was moving the new file into place.

* Changed pprdrv_feedback.c code so it will throw away HP UEL.

* Changed pprdrv_feedback.c code so that feedback_pjl_wait() will reset
  the writemon alarm every time the printer reports that a page has
  been dropt into the output bin.

* Changed pprdrv.c:error() so it is not signal safe and it does not write
  to the printer's alerts log.

* Re-wrote regularize_lw_message() to use stdio since it need no longer be
  signal safe.

* Changed pprdrv.c:debug() and pprdrv.c:fatal() so they use snprintf()
  and vsnprintf().

* Changed filter_lp so it does not emmit a "%%Media:" line unless the
  mediatype=, mediaweight=, or mediacolor= option are used.  This is
  so that the ppr -D switch works more often when users expect it to.

* Fitted out filter_lp with appropriate calls to new library functions
  to use charsets.conf and fonts.conf to select the fonts and encodings.
  This makes it possible to add support for new character sets without
  recompiling.

* Changed "charset=standard" to "charset=adobestandard".

* Changed pprdrv/pprdrv_res.c:uncompress_pfb() so it converts '\r' to '\n' in
  ASCII segments.

* Added idle_status_interval option to serial interface.

* Added KOI8Encoding MacEncoding, ISOLatin2Encoding, ISOLatin3Encoding,
  ISOLatin4Encoding, ISOLatin5Encoding, CP1250Encoding.  Reference for
  character placement was a2ps 4.10.2.

* Added CourierISOC font family to support KOI8Encoding.

* Fixed pprdrv to recognized "StandardEncoding", "SymbolEncoding",
  and "ISOLatin1Encoding" rather than the incorrect "Standard",
  "Symbol", and "ISOLatin1" as the names of built-in-to-printers
  encoding vectors.  See RBII page 639.

* Fixed find_ttfont() so that it works again.  A Makefile change had
  broken it.  Also moved it from pprdrv/pprdrv_tt.c to pprdrv_ttfind.c.

* Changed pprdrv/pprdrv_buf.c:printer_puts_escaped() so it replaces
  high bit characters with "?" as it already did with non-printables.

* Fixed pprdrv TrueType generation code so it outputs the copyright
  and trademark notices in the font file using printer_puts_escaped.

* Fixed error in pprdrv/pprdrv_commentary.c which cause the time stamp of the
  internal "file" commentator to be garbled.

* Added /etc/printers.conf support to the Solaris port so that it will
  work with the new LP system introduced in Solaris 2.6.

* Fixed bugs in N-Up which caused problems with MS-Windows output.  Replaced
  Trincoll-PPR-dmm-nup-3-4 with Trincoll-PPR-dmm-nup-3-5.  Removed two zero
  parameters at begining of invokation arguments (in pprdrv/pprdrv_nup.c)
  since they should not be present when the third is not 0.

* Updated papsrv/Makefile to new style.

* Updated UWIN support for UWIN 1.51 (but it still doesn't work).

* Changed Configure A4 and internationalization code to use case rather than
  grep and nested ifs.

* Changed scriptfix so it sets the mode of the output file to 555 to discourage
  accidental editing.

* Internationalized ppad.

* Changed ppad/ppad.c/am_operator() to am_administrator() and reversed the
  return value so it returns TRUE if access was allowed.

* Made ppop and ppuser set PPR_UMASK just to be on the safe side.

* Added ACL support to ppuser and internationalized it.

* Removed separate filter_fortran and merged its function into filter_lp.

* Changed filter_lp so that when doing test on its invokation name it tests
  only the basename.

* Added version 1.9 of Rich Salz's wildmat() as libppr/wildmat.c and
  libppr/wildmat.3.

* Internationalized ppr2samba.

* Fixed a bug in pprdrv/pprdrv_ppd.c which would cause a feature with an
  empty code snippet to get the code snippet from the previous feature.

* Added procset file AdobePS_Win_Driver_L2-4.2-0 to static cache.  This was
  necessary because the Adobe PostScript driver version 4.23 for MS-Windows 95
  sends different versions of this file with different lists of enclosed
  procedure sets.  Added code to installprogs/fixup.sh to remove old
  dynamically cached copies.

* Changed some installprogs/fixup.sh messages to end announcements of
  operations being commenced with "..." and to print "Done." at the end
  of operations.

* Added SMBCLIENT to things filled in by installprogs/scriptfixup.sh.

* Changed install location of samba_submitter and xerox_ticket_submitter from
  $HOMEDIR/bin to $HOMEDIR/lib.

* Added client operating system (Samba %a) to arguments for samba_submitter
  and xerox_ticket_submitter.  The new argument was added in the middle.

* Changed pprdrv/pprdrv.c:copy_header() to copy all of the "-comments" file
  at the begining instead of coping just the "%!" line and then doing the
  rest near the end.

* Updates to misc/README_MISC.txt.


1.40a2, 13 August 1998--11 September 1998

* Began internationalization of papsrv.

* Re-wrote papsrv.conf parsing code to allow INI syntax

* Corrected bug which made "PPDfile:" line useless

* Added papsrv.conf setting "query font cache".

* Fixed xwin responder to work with xterm again

* Corrected long-standing bug in global_defines.h.  XWINBINDIR was set to
  /usr/X11/bin instead of /usr/bin/X11.  This means it would be wrong if
  you didn't accept all of the default paths.

* Made the default idle_status_interval option for the tcpip interface
  30 (seconds) if feedback is true.  It is still 0 (disabled) if feedback
  is false.

* Changed the default width for the pr interface from 132 to 80.  I cannot
  imagine how it got to be 132.

* Made ppad interface clear "Codes:" when it clears "Feedback:" and
  "Jobbreak:".

* Moved include/interfaces.h to libppr/interfaces.c and added functions
  to retrieve the information.

* Added struct PPD_PROTOCOLS to global_defines.h and added PPD file
  "*Protocols:" parsing to pprdrv and ppad.

* Added native compiler support for HP-UX.

* Changed Configure and sysdep.h so sysdep.h determines which section it will
  use based upon a symbol defined in CFLAGS.

* Changed the automatic binary detect rule in ppr_infile.c to not trigger if
  there are no NULLs.  This is so international text will not trigger the
  rule.

* Added PORTING.txt.

* Experimentally increased PJL_DISPLAY_LEN in pprdrv.h from 16 to 40.

* Changed "HP LaserJet 4M Plus DSC" to use PageSize code from
  "HP LaserJet 4 Plus".  Incremented version number from 1.51 to 1.60.

* Removed the non-functional paremeter "eof_timeout=" from the tcpip interface.

* Commented out control-D handshaking code in serial, parallel, and tcpip
  interfaces.

* Added control-D handshaking code to pprdrv.  This seemed a good idea since
  it reduces the complexity of the interfaces and PJL handshaking was
  already in pprdrv.

* Added 10 retries at 2 second intervals to tcpip interface for use when
  connnect() reports "connection refused".

* Removed misc/wwwppop.perl and misc/www.conf.

* Added share win95drv to smb.conf.sample.  Also added "queuepause command ="
  and "queueresume command =" for Samba 1.9.18p10.

* Added printman/README.txt.

* Added editps/Adobe_NT_5.0

* Turned -H editps on by default.

* Fixed ppr/ppr_editps.c:editps_identify() so that creator string extracting
  works with CRLF terminated files.  Also added "creator glob =".  This is
  the first use of wildmat().  Also changed wildmat() to have const arguments.

* Modified ppr/ppr_outfile.c:open_output() to open -comments, -text, and -pages
  in binary mode so as not to mangle any binary tokens.  Modified
  ppr/ppr_split.c and pprdrv/pprdrv.c:main() to do the same.
  (This is only important for Win32 ports.)

* Modified ppr_infile.c:in_getline() to ignore binary tokens inside strings
  and to realize that "%" does not start a comment if it is inside a string
  or <~ ~> and so it should not turn off binary token recognition for the
  rest of the line.

* Added French internationalization files fr-PPR.po and fr-PPRD.po.  These
  files were contributed by Olivier Tharan <olive@imaginet.fr>.

* Removed BROKEN_PERMISSIONS hack from ppr/ppr_infile.c.

* Added support for Solaris extensions to the LPR/LPD protocol.

* Changed the meaning of "ppr extensions = " in uprint-remote.conf
  so that it does not implicitly include OSF and Solaris extensions.

* Added fatal() to dotmatrix/main.c so I could eliminate last direct
  use of strdup() which it seems is not defined in POSIX.

* Fixed libppr/signal1.c and libppr/signal2.c to include sys/signal.h
  before global_defines.h so that sys/signal.h won't see our signal()
  macro.

* Added Steve Hsieh's code to ppr/ppr_main.c:mark_feature_for_insertion()
  to accept Adobe pslpr format.

* Added "system type =" to uprint_remote.conf syntax.

* Changed pprdrv/pprdrv_res.c:begin_resource() so that it calls dgetline()
  instead of dgetline_read().  (This is recursive.)  This enables more correct
  handling of nested resources.  Added tests/test-consistency and
  tests/test-consistency/100-unclosed to make sure this fix worked.
  This fix was inspired by an unclosed resource in the Adobe Driver 5.0
  for MS-Windows NT.  The unclosed resource in page one, combined with
  a closed resource which followed it resulted in only page one being
  printed.  This was because the unclosed resource prevents ppr from
  seeing the "%%Page:" comments for the subsequent pages but pprdrv
  was stopping its copy of the resource (which should have continued
  until the end of the file) when it saw the comment "%%Page: 2 2".
  This same problem inspired the creation of editps/Adobe_NT_5.0 and
  the making of -H editps the default.
  In pprdrv/pprdrv.c dgetline_read() and dgetline_parse() are now static.

* Changed the correct responses from some regression tests to reflect the
  fact that -comments code is now placed at the top of the comments section
  rather than at the end.

* Added libppr/signal_sh.c to create signal.sh.  Removed signal number
  handling code from Configure and installprogs/scriptfixup.sh.  Changed
  the Ghostscript interfaces to use lib/signal.sh.  This change should
  make porting easier.

* Fixed bug in pprdrv_lw_messages.c which caused it to call error() with
  a spurious message about raw message entries in lw-messages.conf.
  (It was printing the message when a matched failed, not when the closing
  quote was missing as it should have.)

* Attempted to bring installprogs/make_bindist.sh up to date but did not
  test it.

* Added the ability to change the sh and perl #! lines to scriptfixup.sh.

* Changed all shell and Perl scripts I could find to use "#! /" instead
  of "#!/" since it is more technically correct.

* In papsrv.conf parsing, change the default for pprparms from "" to "-I".

* Fixed ppad so that is preserves the modes of printer and group configuration
  files when editing them.  This is important because user execute means
  stopped and other execute means protected.

* Added KOI8-R as an alternative to KOI8 as I am not sure which is correct.

* ppr/ppr_media.c: Fixed errors in media matching warnings.

* libppr/dimens.c: Added "mm", "millimeters", and "millimetres" to the
  recognized units.  This meant that A4 from ppad/media.sh was never entered!

* Fixed duplicate fclose() in "ppad media show" which caused core dumps.

* Made ppr/ppr_media.c accept width and height within 1 PSU as an exact match
  since though Adobe says that these statistics in the "%%Media:" comment
  are of type real, in practice they round these off.

* Added ppr -G media:matching.

* Changed weight for "a4" in ppad/media.sh from 80 to 75 so that it will match
  a default of "letter" when overridden by "%%BeginFeature: *PageSize A4".

* Added "ppd/hp/HP LaserJet 8000 Series".

* Made various fixes to suppress gcc -Wwrite-strings warnings (not finished)
  and so that everything can be compiled with g++.

* Fixed inacuracies in help messages for ppad media commands.


1.40a3, 14 September 1998--18 September 1998

* Turned off -H editps which was made on by default in 1.40a2.  I have mixed
  fealings about turning this off, but it requires Perl.

* Fixed location of jump target in ppr_main.c:main() so that a zero length
  file does not cause a core dump by causing a call to fclose(FIFO) when
  it hasn't been opened.

* Added MATLAB editps script.

* Added support for all hacks in .ppr header .hack: lines.

* Added .ppr header .feature: lines.

* Increased MAX_VMOPTIONS (in global_defines.h) from 15 to 25.

* Corrected bug in po/make_pox.sh which prevented it from correctly
  producing .pox files when there was no .po file.

* Changed libuprint/uprint_strerror.c:uprint_strerror() so it returns already
  internationalized messages.  Removed gettext() calls from uprint/uprint-lp.c
  and uprint/uprint-lpr.c which were there to internationalize
  uprint_strerror() return values.

* Changed misc/ppd2win95drv.perl to make /var/spool/ppr/win95drv and to skip
  PPD files ending in "~".

* Corrected missing case in installprogs/install_init_progs.sh for systems
  without System V style init scripts.

* Removed LEX_LIB=-lfl from Linux section in Configure.  It is my hope to
  use pre-generated Flex code in future.  Also changed pprdrv/Makefile so
  that clean doesn't remove pprdrv_ppd_parse.c, only veryclean does that.

* Shortened start state names in pprdrv_ppd_parse.l so it will work with
  old Lex's.  This is dispite the fact that I hope to have everyone use
  Flex generated C code.  Also increased %p from 3200 to 3500.

* Sundry fixes and improvements to misc/xerox_ticket_submitter.perl.

* Split installprogs into tools4make and tools4fixup.  Some programs were
  moved to misc.

* Moved script stuff out of libppr and into libscript.

* Moved various .h files out of includes and into the individual directories.
  This is to avoid giving the false impression that they are used by more
  than one program.

* Moved interfaces/interface.sh to libscript.

* Changed lprsrv so it doesn't limit the reverse-looked-up hostname for
  authorization to LPR_MAX_H.  It is now limited to MAX_HOSTNAME which is
  defined in lprsrv.h as 128.

* Fixed libuprint/uprint_argv_ppr.c so that it puts the -I switch right
  after -d <destname>.  This allows lpr options to override switchset
  options.  (Thanks to Klaus Reimann <klausr@ITAP.Physik.Uni-Stuttgart.De>
  for pointing out this error.)

* Renamed install_init_code.sh to inst_init.sh and etc.init.d.ppr.sh
  to init_ppr.sh to get around problems with makes that can't handle
  implicit rules for files with names longer than 14 characters.

* Restored some explicit make rules for files with names longer than
  14 characters.

* Added libppr/stresc.c:compile_string_escapes() and changed editps
  matching to use it.

* Eliminated editps syntax "creator left" and "creator right".  Changed
  "creator full" to "creator".

* Arranged for tools4make/makedirs to be built from makedirs.sh so that
  the shell invokation on line one will be edited if necessary.  The
  PPR directories are also written into it at that time rather than
  being retrieved from include/global.mk later.

* Fixed pprdrv_ppd.c:insert_features() so that if it sets strip_binselects
  it doesn't do it until it is finished calling insert_feature().  That way
  its own insertions don't get stripped out.

* In ppr, changed code so that .feature: and -F switch don't call
  mark_feature_for_insertion() directly but rather they call
  parse_feature_option().  This new function also sets read_duplex_enforce
  to FALSE if the feature is a "*Duplex" feature.  This allows -F switches
  to override -R duplex: options.  (These problems were diagnosed by
  Klaus Reimann.)

* Replaced French translation files with the latest from
  Olivier Tharan <olive@imaginet.fr>.


1.40a4, 5 October 1998--12 November 1998

* Reviewed exit code in atalk_ali.c, atalk_cap.c, serial.c, parallel,c, and
  tcpip.c, making them all call identical do_exit() fuctions and making sure
  it is always called.  The atalk interfaces exited with EXIT_ENGAGED
  without sending SIGINT to the parent.

* Changed ULTRIX shell test in Configure to one suggested by Stephen Dowdy
  <dowdy@cs.colorado.edu>.  The he supplied hasn't actually been tested
  on Ultrix though.

* In ppr/ppr_infile.c, renamed get_input_file() to infile_open and
  close_infile() to infile_close() and force_in_type() to infile_force_type().

* Started to break up ppr/ppr.h into separate files, one for each module.
  That way, a module which calls functions in another module can include the
  header file for that module.

* Changed ppr/ppr_infile.c:no_filter() so that it uses an empty input file if
  -H transparent has been used.  This allowes us to use transparent mode to print
  files which the printer understands but for which we have no filter.  Previously
  it was necessary to declare the file type in question to be one of the passthru
  types or to say "-e hexdump".

* Removed the ppr --passthru option and replaced it with a "PassThru:" line in
  the printer or group configuration file.

* Fixed passthru operation so that it is skipped in
  ppr/ppr_infile.c:infile_open() if the -H transparent option is used since
  there is no point in generating a -barbar file that will never be used.

* Fixed a problem in ppop/ppop.c:job_permission_check() which cause the
  wildcard source node nama generated by parse_job_name() to result in
  all users being allowed to delete any job.  (Thanks to Klaus
  Reimann for tracking this down.)

* Changed libppr/jobid.c:local_jobid() and remote_jobid() so that they
  ommit the home node if it is "*".  Previously they only ommited it if
  it was the node they were running on.

* Removed the prelimanary options --dest and --destination from ppr and
  replaced them with --queue (still preliminary).

* Changed ppr command line parsing so that it is done in two passes.  The
  first pass only finds the desination name.  This makes the next change
  possible.

* Changed switchset handling so that it is always inserted at the begining
  of the line.  The -I switch is now obsolete and does nothing.

* Changed papsrv_conf.c so that the default "ppr parms =" is now once again
  blank rather than "-I".

* Removed -I from misc/smb.conf.sample.

* Removed -I from uprint/uprint_argv_ppr.c.

* Incorporated a patch from Klaus vom Scheidt
  <vscheidt@sun10rz2.rz.uni-leipzig.de> which allows ppuser commands to be
  log to a file if the log file already exists.

* Corrected the "ppuser charge" command so that it posts a charge rather
  than a withdrawal.  Also change the return type of the charge commands
  from int to enum USERDB_RESULT and the transaction type argument to
  db_transaction() from int to enum TRANSACTION.

* Some message cleanup in ppop.

* Fixed ppop so that "ppop log" prints usage instead of causing a core dump.

* Put setegid() before seteuid() in ppr/ppr_main.c:unbecome_user().  This is
  to please ULTRIX.

* More ULTRIX fixes.

* Renamed directories: "dotmatrix" -> "filter_dotmatrix",
  "misc_filters" -> "filters_misc", and "typeset" -> "filters_typeset"
  to make them sort together in the directory listing.

* Fixed ppr/ppr_editps.c:editps_identify() so it doesn't core dump when testing
  for a creator line value if there was no "%%Creator:" line.

* Switched default for ppr -K from false to true.  This is so that users can
  use customized PPD files.  This also helps the MS Windows 95 PostScript
  driver which manges feature names in its comments.  If someone has a group
  of incompatible printer, he can set "-K false" in the switchset.

* Changed uprint-remote.conf parsing in libuprint/claim_remote.c so that
  the queue names in [] can contain shell wildcards.

* Changed capitalization of "ppad show" and "ppad group show" output from
  "Default filter options:" to "Default Filter Options:".

* Changed the uprint-remote.conf line "system type =" to "remote system type =".

* Added the program misc/pprwatch.c.  This program is installed in lib.  It
  does a "tail" on /var/spool/ppr/state_update and
  /var/spool/ppr/state_update_pprdrv.  This program was introduced so it could
  be a server for a client-server version of printdesk and so that the
  state_update communications mechanism can be changed in the future.  Also,
  my simplifying the communications mechanism, it may encourage more people
  to exploit the state_update mechanism to build GUI front ends for PPR.

* Changed "state_update" and "state_update_pprdrv" files so that they no
  longer get "REWIND" lines.  Changed state_update so it gets "other execute"
  set when it is full.

* Fixed printdesk so it works with pprwatch.

* Changed the spool path in misc/smb.conf.sample from /var/samba/printspool to
  /var/spool/ppr/sambaspool.  Combined smb.conf.sample and smb.conf.sample2
  into "smb-protos.conf.sample".  Added install/smb.conf.sample and
  install/smb.conf.sample2 to the list of obsolete files.  Added
  smb-protos.conf to the list of sample files.

* Turned /etc/ppr/printcap generation in ppr2samba off.  Added
  /etc/ppr/printcap to the list of obsolete file deleted by fixup.sh.

* Added explanatory information to the top of the smb-include.conf file
  generated by ppr2samba.

* Moved all of the Samba stuff from misc/ to samba/.

* Revamped libttf so it never calls fatal and doesn't use any part of libppr.

* Added the libttf demonstration program ttf2ps.

* Moved rpprd directory to remote/rpprd.

* Moved documentation into the source distribution.  Added the directories
  $(SHAREDIR)/man and $(SHAREDIR)/htmldocs.


1.40a5, 13 November 1998--18 February 1999

* Moved some pprd functions into pprd/pprd_destid.c, moved libppr/nodeid.c
  into pprd/pprd_nodeid.c.

* The code in pprdrv/pprdrv_ppd.c:begin_feature() would ignore the ppr -K true
  switch in the case of "*Duplex" features.  I do not remember a good reason for
  this, so I have removed this exception.  This change simplifies the operation
  of the ppr -K switch.

* Also, changed pprdrv/pprdrv_ppd.c:begin_feature() so that if is retains
  old code it inserts 2 lines of comments explaining why it has done so.  I don't
  think we care much about bloating the PostScript file since this is probably
  a disfunctional case anyway.  Did same for case where it strips out code
  that can't be replaced from the PPD file.  Added regression test for this.

* Added the "RSA Data Security, Inc. MD5 Message-Digest Algorithm".  I got
  the source files md5.h and md5.c out of the Siag/Siod distribution.

* Isolated procedure sets and PPD files on which other parties have copyright
  in the directory "vendors".

* Replaced my patched "HP LaserJet IIISi Postscript" PPD file with a new one
  from Adobe.

* Replaced my patched "QMS-PS 410" PPD file with a briefer one called
  "QMS-PS 410 DSC" which includes the unpatched Adobe supplied version.

* Modified samba/ppd2win95drv.perl so that it has a --verbose option.  It now
  produces output only on errors unless the --verbose option is used in which
  case it produces more output than it did before.  It also now looks for
  "*Include:" directives in PPD files and does the include since MS-Windows
  drivers probably ignore "*Include:".

* Added misc/pprclean.perl, a script which removes temporary files which
  PPR accidently leaves around.

* Changed the troff filter which uses Groff to use Grog rather than just
  arbitrarily choosing the -man macros and a few preprocessors.  Added
  filters_misc/rewind_stdin.c which is installed in $(HOMEDIR)/lib.  This
  is used by the new troff filter.

* Added tools4fixup/rm_old_man.sh and added a call to it in tools4fixup/
  fixup.sh.

* Added [default destinations] section to uprint.conf.

* Changed pprdrv/pprdrv_buf.c:printer_printf() so that %o prints 3 digits
  rather than the minimum required.  (This is because \xxx is used to
  represent characters in PostScript strings.

* Changed pprdrv/pprdrv_buf.c:printer_puts_escaped() so that it prints
  non-ASCII-printable characters using \xxx rather than printing a
  question mark.

* Modified pprdrv/pprdrv_flag.c so that the encoding for the banner page
  is ISO Latin 1.

* Fixed the lpr interface so it will exit with an alert if feedback is true.

* Expanded the error message for the above in the dummy and simple interfaces.

* Removed the disused control-d handshaking code from the serial, parallel,
  and tcpip interfaces.

* Corrected bugs in ppr's parsing of the command line.  Previously there was
  a special routine to find the -d switch but it had bugs.  It has been
  replaced with a separate ppr_getopt() loop, this one with a much smaller
  doopt() routine.  They are now called doopt_pass1() and doopt_pass2().

* Added "vendors/ppd_adobe/Ricoh Aficio 401 PS v2015".

* Renamed libppr/foptions.c:filter_option_error() to filter_options_error().

* Renamed the files which contain libppr functions for interfaces to names begining
  with "lib_", moved them to libpprint, and moved their prototypes to
  include/libpprint.h.  Also moved many functions out of the interfaces
  and into libpprint.

* Added libppr/throw.c:libppr_throw() and include/libppr_exception.h.  All
  libppr code which used fatal() as an exception callback has been changed
  to use this new function.

* Began to internationalization of interfaces/atalk_ali.c and parallel.c.

* Changed "ppad show" feedback setting display to "yes" or "no" rather than
  "True" or "False" and made other minor changes to "ppad show" output
  capitialization.  Made many changes to "ppad -M show" output as part of
  the work on the new WWW interface.

* Changed "ppad codes myprn unknown" to "ppad codes myprn ignore" in order
  to make its purpose clearer.

* Did much work on the WWW controls and made them part of what is installed.

* Moved HTML docs installation locate from $HOMEDIR/htmldocs to
  $(SHAREDIR)/www/docs.

* Fixed bug in "ppop cancel" involving the handling of multiple cancel
  specs.

* Fixed "ppop qquery" so that when the "creator" field is asked for it is
  displayed rather than the "routing" field which was being displayed
  by accident.

* Changed the name of ppr resource caching temp files from just the process
  id to ".temp$PID".

* Enhanced misc/pprclean.perl.

* Removed the directory filters_typeset/enriched since it didn't contain
  anything useful.

* Added locale.h to the internationalization headers for those modules which
  call setlocale().  This is necessary for Solaris 2.6.

* Commented out debugging messages in printdesk.  It is basically usable
  now though there is a bug which sometimes causes it to lock up.  It works
  with Tk400.202 and Tk800.012 but Tk800.000 (I think) has a bug which
  prevents the popup menu (in the window which shows an icon for each
  queue) from working.

* Changed "ppop progress" so it doesn't print a percent sign after the percent
  sent and so it has a human readable mode.  It also now prints all zeros
  for jobs with now "Progress:" line.

* Made sundry changes to printdesk/PPRcontrol.pm so that it could be used
  by www/prn_control.cgi.perl.  This included the adding of a get_progress()
  method which was the reason for the change to "ppop progress" described
  above.

* The WWW management tools are now partially usable.  These include an add
  printer wizard, a queue display tool, and a printer control tool.  A printer
  properties editor is also begun.  These tools use new Perl libraries for CGI
  data handling, wizards, and tabbed dialog boxes.

* Moved the C++ typesetter library and its demo.cc into from
  filters_typeset/lib and filters_typeset/demo to filters_typeset/lib_c++.
  I am considering reimplementing it in Perl.  I origionally rejected Perl
  becuase only Perl 4 was available at the time and structures were very
  difficult to build.  Perl 5 refererences remove that objection.  A sucessful
  Perl prototype might later lead to a second generation implementation in
  C++ or Java.

* Renamed ppad/ppad_conf.c:confwrite() to conf_printf() and added
  conf_vprintf().  Removed conf_set_name_strval() and replaced it with
  conf_set_name() which does all of the access checks, file opens, file
  close, and accepts printf style values.

* Converted the "ppad comment", "ppad switchset", "ppad passthru",
  "ppad outputorder", "ppad charge", "ppad flags", "ppad deffiltopts",
  "ppad group comment", "ppad group switchset", and "ppad group deffiltopts"
  commands to use conf_set_name().

* Fixed another possible rounding problem in money handling in "ppad charge".

* Added "ppad charge" to the ppad help output.

* Added the "ppad pagelimit" command and added the page limit to the
  "ppad show" output.

* Added LP_LPSTAT_BROKEN to sysdep.h for HX-UX 10.x which has a very old
  lpstat which can't handle "lpstat -o myprn".

* Added --nocreate option to ppr2samba and removed the -v option leaving
  --version and removed the -? option leaving only --help.

* Added the printdesk directory to the build and install of the top level
  Makefile because its library is required by things in the www directory.
  I also renamed printdesk/nbp_lookup.c to nbp_lookup_ali.c.

* Changed the method of creating the temporary file in ppr/ppr_infile.c:
  stubborn_rewind().  It now opens the temporary file read-write and
  rewinds it after writing it.  Previosly it re-opened it read-only.
  This change allows us to unlink its name imediately.  This is good because
  if we run out of disk space we don't make the problem worse.

* Modified libppr/options.c and foptions.c so that it uses a struct in stead
  of global variables.  Also made it skip leading blanks in options strings.

* Changed interfaces/gs_master.sh so that it doesn't put a leading blank
  on the options passed to the backend interface.

* Adjusted all C language interfaces, filter_lp, filter_dotmatrix to use
  the new option parsing code.  Converted lpr interface to use it.

* Added code to samba/ppd2win95drv.perl so that as well as processing the
  PPD files that come with PPR it will process any other PPD files the user is
  employing.  It does this by scanning the "PPDFile:" lines in the files in
  $CONFDIR/printers.


1.40a6, 18 February 1999--22 July 1999

* Moved the fonts and AFM files distributed with PPR from
  $(SHAREDIR)/cache/font and $(SHAREDIR)/AFM to $(SHAREDIR)/fonts.

* Fixed samba/ppd2win95drv.perl so that the base directory for relative
  includes is the directory in which the including script resides
  (Patch from Steve Hsieh).

* Updated libuprint/uprint-remote.conf.sample.

* Removed misc/rqlaser.sh.

* Added www/images/pprlogo.jpg.

* Added start_msg and stop_msg options to the PPR script for System V init.
  These options are for HP-UX 10.20.

* Added filters_misc/html_htmldoc.sh.  This, when properly setup up by
  setup_filters, will use HTMLDOC (http://www.easysw.com/~mike/htmldoc/)
  to convert HTML to PostScript.  This is a preliminary version of the script,
  it doesn't support any options yet.

* Removed the "remote" subdirectory which contained "rpprd".

* Fixed the editps/Windows_NT_4.0 script so that it removes the comments
  which would pass off font fragments as real fonts.

* Added Solaris 2.6 thru 7 as a separate option in Configure.  This was
  prompted by the fact that 2.6 and later has snprintf().  It will probably
  also someday become important because 2.6 and later has a new printing system
  similiar to UPRINT.

* Fixed ppad comment and ppad passthru so they no longer mistakenly try to
  edit a group.

* Renamed ttfutils to fontutils in anticipation of the change.

* Cleaned up www/show_queues.cgi.perl to use border=0 in images rather than
  set the link colours to the background colour and separately set the colour
  of each queue name to something else.

* Fixed papsrv/papsrv_ppd_parse.l so it will ignore trailing spaces and tabs
  on lines such as "*TTRasterizer:".

* Started to write www/ppr-httpd.perl, a very basic web server designed to be
  launched from inetd.  It will be used for the WWW interface to PPR and
  to dispense documentation.

* Renamed pprclean to ppr-clean, pprsync to ppr-sync.

* Did a sprintf() removal sweep of interfaces/lpr.c.

* Added the X_() macro for `extra' strings which could be translated but
  probably aren't worth it.  This will be used for messages which indicate
  internal errors or raw system call failure information.  Using X_() rather
  than just leaving the quoted string alone indicates that a descision has
  been made to not include that string in the list of strings to be translated
  even though it could be included.  The preferred solution in the case of
  system call failures is to provide messages for common error codes which
  explain how that error code applies to the system call that failed in the
  context of the current operation.  If anyone disagrees with this assessement
  he can extract and translate the X_() strings and define X_() to be the
  same as _().

* Changed libuprint/lpr_connect.c:uprint_lpr_response() so that it once again
  prints messages (using uprint_error_callback()) when it fails.  Adjusted
  libuprint/uprint_print_rfc1179.c and interfaces/lpr.c to distinguish
  between uprint_lpr_response() return codes indicating its own failure and
  those indicating unfavourable responses from the server.  Also, added
  a 30 second timeout to uprint_lpr_response().

* Changed definition of CP= in the global.mk generated for all platforms to
  include the -p switch to preserve file modification times (amoung other
  things).  This is to reduce the number of files in the www area which get
  their dates changed every time a "make install" is run.

* Added informational lines for Linux /sbin/chkconfig to
  tools4fixup/init_ppr.sh.

* Fixed misc/xfm-ppr.sh to handle the printing of files with spaces in their
  names.

* Added specific error messages to lprsrv so it says that it should be run
  from Inetd if stdin is not a socket and it says that there already is
  a server on the specified port if bind fails (in standalone mode).

* Fixed the uprint-* programs to specifically say that they should be
  setuid root rather than simply saying that setuid(0) has failed.

* Changed the lpr interface to send the control file first.  This may allow
  stupid printers to print a banner page.  Also, RFC 1179 seems to imply that
  this is the prefered order.  There really should be an option to reverse
  the order.

* Removed the commented out definition of LPRSRV_USE_LPR_STYLE_JOB_NAME
  from include/global_defines.h since this is a feature of olprsrv
  which will soon be dropt.  Also moved KEEP_OLD_CODE from global_defines.h
  to pprdrv/pprdrv.h since pprdrv is the only program effected by it.

* Added $CONFDIR/lw-messages.conf.sample and $CONFDIR/ttfonts.db to the
  list of obsolete files removed in tools4fixup/fixup.sh.

* Fixed the pprdrv code for lw-messages.conf to properly create the empty
  section.  (This was appearently broken when lw-messages.conf was split
  into a distribution and a local version.)

* Renamed xfm-ppr to ppr-xfm, xpprgrant to ppr-xgrant, pprwatch to tail_status,
  papsrv_kill to papsrv-kill.  (The idea is that nothing in bin will have an
  underscore in its name and that minor programs will have names that begin
  with the major program or package name and a dash.)

* Added libppr/ini_section.c and include/libppr_ini.h to handle the reading
  of the ppr.conf file.  Also added misc/ppr_conf_query.c for use from
  shell scripts.

* Removed A4/US Letter compile time option and replaced it with new ppr.conf
  code.  It was used in filter_lp, filter_dotmatrix, pprdrv (for flag pages),
  and ppr (for documents without a "%%DocumentMedia:" comment).

* Added PPREXIT_CONFIG to include/ppr_exits.h.  This exit code is used
  to indicate a problem with the ppr.conf file.

* Changed ppr/ppr_media.c:write_media_lines() so that if there is no
  "%%DocumentMedia:" comment and it has guessed the required media
  based on the default medium and various comments such as
  "%%PageSize:" but the resulting medium is not found in the media
  database, it writes a "Media: UNRECOGNIZED NULL" line.  (Formerly
  it would write a line which said "Media: letter NULL" or
  "Media: a4 NULL".

* Fixed some bugs in "ppad switchset" and "ppad group switchset" which
  where introduced in 1.40a5.  This bugs interfered with the clearing
  of a switchset.

* Removed Makefile code to install samba/xerox_ticket_submitter.perl
  and removed code in ppd2win95drv which provided support for installing
  the Xerox job ticketing driver.  Also removed the Xerox prototype
  share from samba/ppr-protos.conf.sample.

* Revamped filters_misc/hexdump.c to read the medium size from ppr.conf
  and to understand the filter option "maxpages=".

* Renamed the queue file line "BarBarLang:" to "PassThruPDL:".

* Added a queue file line "Filters:" which describes the filter chain which
  was applied or would have to be applied to convert the input file to
  PostScript.  In the mode invoked by "ppr -H transparent", this value
  is passed to the printer interface program as the 10th (barbar) parameter.

* Moved everything in $SHAREDIR/globalconf into $SHAREDIR/lib.

* Began internationalization of filter_dotmatrix.  (Found and changed some
  pre-release 1994 copyright notices too!)

* Began internationalization of filter_hexdump.

* Code cleanup of include/global_defines.h, include/global_structs.h,
  include/pprd.h, and pprdrv/pprdrv.h.  The general trend was to move
  stuff into more private include files.  I intend to eventually
  move a lot of the contents of global_defines.h and global_structs.h
  into libppr_*.h files.

* Renamed the "client" interface to "clispool".  Moved its include file into
  the C source code.  I intend to create a Berkeley Sockets version of this
  interface, if only for nastalgia.

* Removed the IBM Courier fonts from the Ghostscript PPD files.  Also bumped
  the PPD file version number from 1.30 to 1.40.

* Integrated smb interface contributed by Klaus Reimann
  <klausr@ITAP.Physik.Uni-Stuttgart.De>.  Added code for working with
  gssmb.

* Added building of gslpr and gssmb interfaces.  Changed gs* interfaces
  to read ppr.conf [ghostscript] gs=.

* Removed SMBCLIENT= re-writing from Configure and from
  tools4make/scriptfixup.sh since the setting is being moved to ppr.conf.
  Switched responders/samba.sh and commentators/samba.sh over to this
  new system.

* Fixed "ppad switchset" and "ppad group switchset" so that it is possible
  to clear switchsets.

* Moved verious shell script helper programs and files into libscript.  These
  are: misc/ppr_conf_query.c, interfaces/alert.c, responders/time_elapsed.c,
  responders/respond.sh (dynamically built), and responders/respond.ph
  (also dynamically built).

* Added tools4fixup/make_conf to generate ppr.conf.sample.

* Added tools4fixup/inst_cron to create a crontab entry.

* Changes in ppr/ppr_main.c:main():  Environment search order is not LOGNAME,
  USER rather than USER, LOGNAME since LOGNAME seems to be the standard one
  while USER seems to be an xterm thing.  Also, if PPRDEST is not defined,
  PRINTER is again checked.  This is consistent with System V lp behavior
  and allows the use of one environement variable to set the default
  destination for uprint-lp, uprint-lpr, and ppr.

* Made the flag page date format a settable parameter (flag date format =)
  in ppr.conf.  The default now uses %y rather than %Y (for no particular
  reason).

* Added pprdrv/pprdrv_flag.c:pslinef() and with it did some
  internationalization of the flag pages.

* Added pprdrv/ppdrv_buf.c:printer_putc_escaped() by moving the inner code
  of printer_puts_escaped() and replacing it with a call to the new function.

* Fixed alert message in gs* interfaces so that if device= and uniprint=
  are both absent it mentions uniprint= as a possibility.

* Moved filters_misc/rewind_stdin.c to libscript.

* Renamed filters_misc/hexdump.c to filter_hexdump.c.

* Added filters_misc/png.sh which uses the pngtopnm program which is part
  of Libgr (RedHat libgr-progs-2.0.13-12.rpm to be specific).

* Converted the money() function in libppr to read ppr.conf.  Its default
  format is now 1.25, -1.25.  (The former fixed format was $1.25, ($1.25).

* Changed "ppuser show" to use money().  Unless the default money() format
  is used, this change changes the "ppuser show" output.

* Fixed a bug in uprint-lp which caused it to reject the -s option.

* Updated libppr/interfaces.c to include new printer interface programs.

* Changed the font name in the IBM Courier .AFM files in fonts/ to match
  the names in the fonts themselves.  (The IBM Courier fonts are those from
  the X distribution, only the font name has been changed from "Courier"
  to "IBMCourier" to distinguish it from the one distributed by Adobe
  which has a much smaller character set.)

* Moved the font and encoding stuff out of include/global_structs.h and into
  include/libppr_font.h.

* Added ESC x 3 to the dotmatrix filter.  It is a Genicom code for turning
  on high speed printing mode.

* Added the already documented 12th and 13th fields to the printlog format.
  The page count field only works if PJL is available and enabled.  It is
  not used to compute the charge (which is now logged in the 13th field).

* Reversed 12th and 13th printlog fields.

* Moved the call in pprdrv.c:main() to patchfile() to just after the
  flag page printing and before the test for transparent or passthru
  mode.  This means that persistent patches will be loaded before
  transparent or passthru jobs but those loaded by jobpatchfile() will not be.

* Added pagecount querying and 14th and 15th fields to printlog.  This required
  many fixed the to querying code and other interface code.

* Changed the way the ppop commands compute the percentage of a file sent
  to use floating point.  This should reduce the chance of negative
  percentages and other anomolies, due to int overflow, being shown on
  large jobs.  Also changed job_status() to print "bug%" if the total bytes
  is 0.  (Why this should ever be so is unknown, but there are reports of
  core dumps on floating point exceptions.  Does integer divide through
  floating point exceptions?)

* Added a HP UEL escape before the code that turns off unsolicitied status
  reports in pprdrv after the printer has reported that job processing
  is finished.  The problem was that if the interface inserted a control-T
  while pprdrv was waiting, it would knock an HP 4Si into PostScript mode.

* Fixed some memory leaks in papsrv_query.c by having it call
  noalloc_find_cached_resource() rather than find_cached_resource().

* Changed the name of the global_defines.h macro PRE_CACHEDIR to RESLIBDIR.  Also
  renamed pprdrv/ppdrv_ppd.c:find_font() to ppd_font_present() and changed to return
  value from 0 found, -1 not found to TRUE if found, FALSE if not.  Added
  FONT_TYPE_TTF to global_defines.h as a value that find_cached_resource() can
  set mode to.  Simpified pprdrv/pprdrv_capable.c code by having it let
  find_cached_resource find the .TTF fonts (and now any font in the font index)
  and having it examine the mode to determine if it should ask for the TrueType
  rasterizer and do other things like that.  Changed to FONT_ stuff so that the
  values aren't mode_t anymore.  Rather there is a separate set of FONT_MODE_
  defines which are used to represent the FONT_ defines in the file system.

* Moved libppr/vsnprintf.c into snprintf.c.

* Fixed some parameter error checking in the lpr interface and changed a lot
  of exit() calls to int_exit() calls.

* Eliminated all uses of sprintf() and vsprintf() from libppr.

* Removed the note that the SunOS 4.1.3 port is untested.  (Thanks to
  Matthew Keller <kellermg@potsdam.edu> for his test report.)

* Removed references to the defunct rpprd FIFO from ppr and ppop.

* Moved to call to feedback_setup() to an earlier part of start_interface()
  because if the interface didn't like its arguments, reapchild() could
  be called and run feedback_drain() before feedback_setup() was called.

* Fixed some bugs in tools4fixup/fixup.sh, updated the license statement,
  and moved the check for user root until after that requirement is stated.

* Fixed the pr filter so that if no "width=" or "length=" option is passed
  to it, then no -w or -l option is passed to pr.  Previously it was
  passed a default value of -w80 and -l66.  This was resulting in the
  truncation of long lines.  Appearently the Linux pr(1) man page is
  incorrect when it says that the default for -w is 72.  In actual fact it
  seems to be much longer, maybe even infinite.  Also fixed filter_pr to use
  $TEMPDIR.

* Changed to temporary file names used by the pr, dvi, tex, and texinfo
  filters to ppr_pr_$$, ppr_dvi_$$, and ppr_texinfo_$$.

* Added the pr filter to those handled by setup_filters.sh.  Previously it
  was an exception in that it was installed by "make install".

* Created ppr_strsep().  It is intended to work like BSD strsep().

* Changed ppr_getline() to delete all trailing spaces from the line.  Also
  modified it so that if the passed in buffer is a NULL pointer if
  allocates one of the size indicated by the passed in buffer size parameter.
  I see that there is no note in this file which says when ppr_getline()
  was added.  I believe it was added at the same time as libppr/ini_section.c.

* Simplified ppad/ppad_filt.c:get_mfmode() by changing it to use ppr_strsep().
  Also changed it to use ppr_getline().

* Removed the compiled in table from libppr/cs2enc.c:charset_to_encoding().

* Added $SHAREDIR/lib/pagesize.conf as a configuration file read by
  libppr/pagesize.c:pagesize() when it doesn't find the page size in its
  compiled in table.  The compiled in table may be eliminated later.

* Moved editps.conf to /editps/.  I don't know if that was best, but it
  makes it easier for someone to realize what he has to modify to use
  a new filter.

* Changed ppr/ppr_outfile.c:get_next_id() so that it skips an ID number
  if there is already a queue file for a job with that number with the
  same queue name, destination node name, and home node name.  This
  may not guard against collisions with jobs created with the ppr -Y
  switch, it will not prevent problems if someone tries to manipulate jobs
  by ID number alone, and it will not work well when remote printing
  is implemented, and it will not protect against the possibility of
  the ID numbers wrapping around during the time that a copy of ppr
  is preparing a job (unlikely to be a problem), but it is a lot better
  than what was (both jobs would be destroyed).

* Eliminated libppr/size_list.c:page_sizes[] and the structure it used.

* Changed libppr/pagesize.c:pagesize() to read pagesizes.conf.

* Modified libppr/wildmat.c:wildmat() so that it will allow backslash
  octal constructs, hexadecimal, and normal ANSI string things like \r\n\t.

* Added a search path argument to libppr/findres.c:find_cached_resource().

* Added code to ppr/ppr_main.c:main() so that it repeatedly calls getcwd()
  with larger buffers until it works.  It then trims the buffer down to the
  correct size.

* Added ppr --cache-priority and --cache-store.

* Changed "N_Up:" line in queue file to "N-Up:", changed "Draft-Notice:"
  to "DraftNotice:" (and changed "Draft" to "DraftNotice" in struct
  QFileEntry).

* Broke the queue file "Attr:" line up into several lines, but left
  the old one for now and did not change the code which reads the queue
  file to read the new style lines because they aren't complete yet.

* Added ppr --cache-store, --cache-priority, --strip-cache, --strip-fontindex,
  and --strip-printer options.  The default are "none", "low", "false",
  "false", and "true".

* Added code to papsrv to run ppr with --cache-store=all, --cache-priority=high
  to maintain proper papsrv operation with LaserWriter 8.x despite the changed
  default behavior.

* Merged features of pprdrv_res.c:add_resource_font() into add_resource().

* Fixed a bug in pprdrv/pprdrv.c:copy_prolog() which could result in the script
  section being copied by copy_trailer().

* Improved pprdrv/pprdrv_res.c:begin_resource() to strip out resources forced
  into the prolog or document setup section and those fingered by
  --strip-printer=true.

* Fixed libppr/getopt.c:ppr_getopt() so it puts back equal signs which it
  replaces with NULLs during the parsing.  This is important because
  ppr runs thru its arguments twice.  This problem had broken options
  such as "ppr --queue=dummy".

* Implemented pserrors.conf in pprdrv/pprdrv_reason.c.  The old compiled in
  checks are still there.  If the pserrors.conf rules don't find anything,
  then the old function is called.  If it finds something, this is logged as
  an error.

* Cleaned up ppr/ppr_old2new.c:old_to_new() (renamed to old_DSC_to_new()
  so that overflows are more clearly prevented.  Also added a few more
  warnings and regularized and internationalized others.

* Changed pprdrv/pprdrv_capable.c so it uses its own line buffer and
  ppr_strsep() rather than use the PostScript line buffer and the PostScript
  DSC lexer tokenize().  This was done to make things easier to understand by
  eliminating a silly tie-in.  In order to fix the resulting caos it was
  necessary to create ppr_strsep_quoted().

* Re-wrote much of pprdrv so that it doesn't do anything in signal handlers
  but set a few flags.  This will no double create its own crop of bugs,
  but it actually made much of the interface code simpler, particularly
  the query code, and it allowed me to re-write pprdrv_fault_debug.c
  to use STDIO again with the exception of the two new functions
  signal_debug() and signal_fatal().

* Changed a message which pprd adds to a printer's alerts file from
  "Printer placed in fault mode." to "Printer placed in fault mode,
  no auto-retry." because the old message didn't make the distinction
  obvious.  Also marked this message and "Printer placed in
  auto-retry mode." for internationalization.  As key message they
  should be internationalized even if not all of the interfaces
  can be yet.

* Beafed up and reorganized the programs in the /test/ directory.  Started
  a new group called "test-interface" to test the new changes to the
  interface running code in pprdrv.

* Replaced -i with --routing in ppr --help output (but -i still works).
  Added ppr -R routing and -R ignore-routing.

* Changed -C to --title in ppr --help (though -C still works fine).

* Added a "ppr2samba-vserver:" parameter to allow `virtual servers'.  This
  is a user requested feature.

* Removed the old fake printcap code from ppr2samba.

* Fixed a bug in "ppad pageslimit" which made it inoperative.

* Got a basic ppr-indexfonts working.

* Changed commentator/xwin.sh to put quote marks around and a comma and
  space between raw1 and raw2 in the displayed message.

* Changed the 2nd raw paramater of "stalled" commentator message from minutes to
  seconds and milliseconds.

* In pprdrv, moved the call to printer_bufinit() from main() to start_interface().

* Simplified pprdrv/pprdrv_commentary.c now that it doesn't have to worry about
  being called from a signal handler.

* Changed the default idle_status_interval for the tcpip interface when
  feedback is true from 30 seconds to 40 seconds.  This is still well
  within the default 90 second timeout of an HP JetDirect card.  This was
  changed so that the idle messages wouldn't come on top of the stalled
  messages all the time.

* Added Canon PPD files "Canon iR330-400 PS Print Server Ver 1.0" and
  "Canon iR330-400 PS Ver 1.0".  The first supplied by Canon for
  the Adobe PostScript driver for Microsoft Windows 95/98, the second
  is supplied for use with LaserWriter 8.5.  They differ a little, mainly
  is whether certain page sizes are described as "Transverse".

* Added filters_misc/pdf_xpdf.sh to use xpdf's pdftops.


1.40a7, 26 July 1999--10 August 1999

* Fixed pprd_respond.c to read "N-Up:" rather than "N_Up:".  This problem
  had broken the money charge stated in the responder message.

* Added an error() function to filter_dotmatrix.  This wasn't noticed
  earlier because appearently GNU C has an error() function.

* Fixed a problem in feedback_wait_pjl(): It wasn't calling writemon_start()
  again after calling writemon_unstalled() when a page dropt into the
  output tray.

* Installed some ULTRIX fixes from Klaus Reimann.

* Installed snprintf(), vsnprintf() declaration fixes from Klaus Reimann.

* Changed pprdrv/pprdrv_interface.c:start_interface() to set the umask to
  077 (or more precisely, to PPR_INTERFACE_UMASK which is defined in
  include/global_defines.h).

* Added code to ppop/ppop.c:main() to unblock all signals.  There was
  a report of a problem in the WWW interface with ppop being run with
  SIGUSR1 blocked.

* Fixed lprsrv standalone mode to disable the SIGCHLD handler in its
  forked off children since it was preventing libuprint from wait()ing.

* Fixed the cancel and list queue functions in lprsrv so that if the
  libuprint function which does the work fails and returns with
  uprint_errno set to UPE_UNDEST a special error message is printed stating
  that the queue does not exist.  This is necessary because the libuprint
  functions don't call uprint_error_callback in this case (though maybe
  they should, I can't decide).

* Added a "remote_too" parameter to uprint_print(), uprint_lprm(), and
  uprint_lpq() in libuprint.a so that forwarding of requests to remote
  systems can be disabled.  Used this new feature to disable forwarding
  in lprsrv.  This was done because it has security and accidental loopback
  implications which have yet to be explored.  Also, forwarding through
  uprint-remote.conf entries never worked for printing, only for
  queue listing and job deletion!  It probably was never intended to
  work at all since the changes which made lpq and lprm work were all
  in libuprint, not in lprsrv.

* Renamed the include/sysdep.h macros USE_LP and USE_LPR to HAVE_LP and
  HAVE_LPR respectively in order to better reflect their meaning.

* Changed libuprint/claim_lp.c so that if HAVE_LP is defined, LP_LIST_CLASSES
  and LP_LIST_PRINTERS had better be.

* Fixed tools4fixup/fixup.sh invokation of ppr-indexfonts by adding "-c"
  to the su command line.

* Eliminated the "firstline" argument to uprint_error_callback().

* Removed the SIGPIPE handler in the tcpip and lpr interfaces and instead
  set the SIGPIPE handler to SIG_IGN.

* Changed sprintf() to snprintf() in libuprint/uprint_print_rfc1179.c.

* Cleaned up pprdrv/pprdrv.c:pprdrv_read_printer_conf() by changing code
  to use the current ppr_sscanf() (some of the code was written before
  ppr_sscanf() reached its present state.  Also added fclose() on the
  printer configuration file!

* Added libppr/cloexec.c which contains set_cloexec() which provides
  a simple way to set the FD_CLOEXEC flag on a file descriptor.  The code
  for it was moved out of pprd's FIFO opening code.

* Changed pprdrv so its calls set_cloexec() on the queue file and all of the
  component files.

* Cleaned up the pprdrv incapable logging code a little.  It now calls fatal()
  if it can't open the log for writing and it has a cleaner test to see
  when it should print messages about trying and refusing to try.

* Added a parameter to uprint_lpr_response() to specify the timeout.

* Rewrote uprint_print_rfc1179() to send the control file first.  (Actually
  the control and data file operations are now broken out into two functions.
  It is easy to change the order in the source code.)

* Added chunked mode to the lpr interface.

* Removed the timeout which the lpr interface uses when waiting for the
  reply zero byte after sending a zero byte at the end of a data file.  This
  change was necessary because HP JetDirect cards don't reply right away.

* Changed the default idle status interval of the tcpip interface from
  40 to 15 seconds.  This should allow faster reporting of things like
  out-of-paper.  I intend to weed out some of these messages before
  generating commentary messages about them.

* Removed the directory filters_typeset/lib_c++/ because it was too incomplete
  to be useful and I am porting it to Perl before continueing the project.

* Modified the names of encodings which don't have official Adobe name to
  begin with "PPR-".  Also removed "Encoding" from the end and changed the
  definition code to install them with "/Encoding defineresource" if
  "defineresource" (a level 2 operator) is available.  Also changed the
  procset TrinColl-PPR-ReEncode to take the encoding as a name rather than
  an array and look it up with "/Encoding findresource" if "findresource"
  (another level 2 operator) is available, otherwise to use "load".  Also
  changed encodings/ISOLatin1Encoding so it does not load itself if "where"
  can find a previous definitition of it.  Also changed the encodings/Makefile
  so that when installing the encodings it applies procsets/squeeze to remove
  syntactically unnecessary spaces.

* Edited ppd/ghostscript/ghostscript_master to include the URW fonts explicitly
  and updated the font version numbers to conform to those of the fonts.

* Removed the non-FULLY_SERIALIZED code from pprd.

* Fixed a core dump bug in a printer_printf() in the N-Up code.

* Fixed the definition of EDITPSCONF in global_defines.h to point to its new
  location.

* Rewrote ppr/ppr_editps.c:editps_idenfity(): removed "creator=" and renamed
  "creatorglob=" to "creator=", improved code quality, removed line length
  limit, added "interpreter=".

* Changed for -H editps to on.

* Moved the code to create a DVIPS configuration file into filters_misc/
  make_dvips_conf.c, removed the setgid bit from the dvi, tex, and texinfo
  filters, removed the code in ppr_infile.c which allows setuid and setgid
  execution of filters.

* Added editps/dvipsk_5.58f to deal with problems in "dvipsk 5.58f" output.

* Added lines in editps.conf to check for the Perl and Sed interpreters before
  deciding to use the filter.

* Changed all programs which use temporary files to begin their names with
  "ppr-" plus the program name plus "-" plus the process id.  The exception is
  Uprint which uses "uprint-" plus the process id.  This should make the work
  of ppr-clean easier.

* Fixed a nasty bug in the new pprdrv feedback code.  It turns out that the
  timeout passed to feedback_wait() is relative to the call to writemon_start()
  (sort of).  This means that in jobbreak_signal() it is necessary to
  increment the timeout value for each call.

* Added 2nd parameter to feedback_wait() which can be used to instruct it to
  return imediately if it is interupted by a signal.

* Changed pprdrv/pprdrv_feedback.c:feedback_reader() to convert bytes with
  the value zero to question marks since some of the code can't deal with them
  because it sees them as string terminators.  For example, strcspn(line, "\n")
  can't be used to find the end of a line with zero bytes in it.

* Fixed a bug in pprd/pprd_respond.c which caused the responders to report
  only the first word of the job and submitter's name.

* Changed the pprdrv commentary system a good deal.  The definitions of the
  categories beyond the first 4 have changed.  Now all messages will be in
  one category from amoung the first 4 even if they are also in one of the
  other categories.  All categories must be in the mask on the "Commentator:"
  line in order for the commentary to be sent.  Repeated printer status
  messages are now filtered out if the message has been announced within the
  last 5 minutes.

* Added "chunk_size=" and "exaggerated_size=" to the lpr interface.  These will
  not appear in the documentation until it is know if they are useful.

* Modified ppr/ppr_nest.c:outermost_start() and outermost_end() to improve
  the warnings and gab messages.

* Changed ppr/ppr_infile.c:in_ungetc() to clear logical_eof.

* Substanially re-wrote ppr_simplify.c:copy_data() to make it try hard to deal
  with defective "%%BeginData:" comments with binary data.

* Changed the default for ppr --strip-printer to false because there are
  probably a lot of programs which send modified fonts.

* Changed certain negated character classes in papsrv/papsrv_ppd_parse.l and
  pprdrv/pprdrv_ppd_parse.l to include "\n".  (The *TTRasterizer: parsing in
  the papsrv parser was sucking up newlines and stuff beyond them.

* Fixed ppr --cache-priority parsing, "high" wasn't working.

* Removed all instances of sprintf() from papsrv.

* Renamed --cache-store=unique to --cache-store=unavailable and
  --cache-store=all to --cache-store=uncached.

* Fixed --strip-cache=true so it works even while the resource is being
  stored in the cache.

* Fixed libppr/ini_section.c:ini_query().

* Added missing code in pprdrv/pprdrv_flag.c for reading default page size
  from /etc/ppr/ppr.conf and fixed sundry typos in banner page code.

* Added "stopped" protection arround the "%%IncludeFeature: *PageSize"
  in filter_lp/filter_lp.c.

* Added some more flag date formats to tools4fixup/make_conf.sh.

* Added editps/LaserWriter_8_8.4 to re-write LaserWriter 8.4 output.  For some
  reason it is generating things like "%RBIBeginTrueTypeFont: Accept68K Geneva"
  "%RBIEndTrueTypeFont" instead of the "%%BeginFont: Geneva" "%%EndFont".
  Since PPR goes to considerable trouble to handle LaserWriter 8.x TrueType
  fonts correctly, this change was not welcome.  Perhaps other spoolers didn't
  deal with it well.  The filter also deals with a duplicate font include
  request problem.

* Changed top level "make dist" to go to the "po" directory and run
  "./extract.sh".  This ensure that the .pot files are up-to-date.

* Removed misc/ppdconv.perl and replaced it with misc/ppd2macosdrv.perl.
  The new program is installed in BINDIR.

* Added a "*Product:" line to "ppd/other/QMS-PS 410 DSC" so it can have a
  unique name on a Macintosh computer.

* File reorganization:

  From					To
  ========================================================================
  /var/spool/ppr/nextid			/var/spool/ppr/run/lastid_ppr
  /var/spool/ppr/lpr_previd		/var/spool/ppr/run/lastid_uprint_lpr
  /var/spool/ppr/pprd.pid		/var/spool/ppr/run/pprd.pid
  /var/spool/ppr/papsrv.pid		/var/spool/ppr/run/papsrv.pid
  /var/spool/ppr/lprsrv.pid		/var/spool/ppr/run/lprsrv.pid
  /var/spool/ppr/olprsrv.pid		/var/spool/ppr/run/olprsrv.pid
  /var/spool/ppr/alerts/		/var/spool/ppr/printers/alerts/
  /var/spool/ppr/alerts/*.status	/var/spool/ppr/printers/status/
  /var/spool/ppr/addr_cache/		/var/spool/ppr/printers/addr_cache/
  /var/spool/ppr/win95drv		/var/spool/ppr/drivers/win95
  \\*\win95drv				\\*\pprwin95
  /var/spool/ppr/state_update		/var/spool/ppr/run/state_update
  /var/spool/ppr/state_update_pprdrv	/var/spool/ppr/run/state_update_pprdrv

* Added a test for the existence of TEMPDIR to tool4make/makedirs.sh.

* Added another lookup stage to printdesk/nbp_lookup_ali.c and changed the
  timing somewhat.

* Removed printdesk/printer2.xbm (which was never used for anything) and
  removed it from the list of things installed in the Makefile and added
  it to the obsolete files removed in fixup.

* Fixed a problem with misc/ppr-sync.sh copying the papsrv_default_zone.conf
  file.

* Fixed www/show_printlog.cgi.perl so it can parse the new printlog file
  format.

* Fixed ppad so that when it deletes a printer it also deletes its address
  cache file.

* Changed the exit codes in pprdrv for failed queries from EXIT_PRNERR_NORETRY
  to EXIT_PRNERR because some interfaces won't stop trying before the 120
  second timeout expires.

* Fixed bugs in tools4fixup/inst_cron.sh which made the crontab file useless.

* Added sorting or interface names and descriptions of new interfaces to
  www/prn_addwiz.cgi.perl.

* Started work on save function in www/prn_properties.cgi.perl.

* Cleaned up fixup.sh some.  It should now correctly change the file ownership
  within a PPR directory even if the directory name is a symbolic link.  It
  also now does SHAREDIR.

* Modified ppr2samba to review the smb-include.conf file and print a warning
  if it doesn't have [pprproto] and [pprwin95] sections.


1.40a8, 11 August 1999--15 December 1999

* Modified pprdrv/pprdrv.c:copy_data() so that if a "Bytes" section runs
  off the end of the file, it won't copy -1 cast to char to the printer
  for the missing bytes.  (This is to match the copy_data() changes in
  ppr/ppr_simplify.c.)

* Fixed ppr-httpd so it sends a "Content-Type:" header on CGI responses.

* Added tools4make/paths.c which will later be used to get global_defines.h
  path definitions into makefiles and possibly into shell and Perl scripts
  as well.

* Added libuprint/lpr_failover.c and changed the remote lpr, lpq, and lprm code
  to use its uprint_lpr_make_connection_with_failover().  The effect of this
  change is that command or space separated lists hostnames may be given
  "remotehost=" lines in uprint-remote.conf.

* Did some more internationalization of the libuprint messages.

* Changed tools4fixup/inst_cron.sh to use a temporary file because System V
  cron won't accept "-" and RedHat Linux cron won't accept stdin without it.

* Fixed lprsrv so that if a queue can't be found, it responds to the ^B command
  with a byte of 1.  (Previously it responded with a byte of 0 but threw away
  the job and closed the connection after logging the error.)

* Changed libppr_int/int_con_tcpip.c:int_connect_tcpip() and the tcpip
  interface so that by default, if connect() reports ECONREFUSED, it exits
  with EXIT_ENGAGED rather than calling alert() and exiting with EXIT_PRNERR.
  Also dropt the number of retries in this case from 10 to 5.

* Removed the "write_size=" option from the tcpip interface since it didn't do
  anything and doesn't seem useful.

* Added the "refused=engaged", "refused=error", and "refused_retries="
  options to the tcpip interface.

* Changed libppr_int/int_con_tcpip.c:int_connect_tcpip() so that it creates
  a new socket using socket() before each connect() attempt.  This is
  because Linux won't let us re-use the socket on which the connect()
  call failed.

* Fixed the lpr interface so that it runs most of the time under its real
  user id rather than running as root all of the time.  This allows the
  printer alerts files to have the correct ownership.  Also fixed ppop
  to report on the permissions problem rather than claiming there was
  no alert log.  Also fixed the code in libuprint/lpr_connect.c so it
  doesn't call uprint_error_callback() while root.

* Fixed bug in libuprint/uprint-newconf.c which caused it to fail after
  applying a system patch replaced its links with new versions of the real
  programs.

* Moved the PPR Xauthority file from "$HOMEDIR/.Xauthority" to
  "$RUNDIR/Xauthority" so that it will work with $HOMEDIR on a read-only
  partition.  The changes were in misc/ppr-xgrant.c, libppr/prune_env.c,
  and misc/pprpopupd.perl.

* Added vendors/ppd_hp "HP C LaserJet 4500-PS" and "HP LaserJet 4050 Series".
  The first one has an incorrect "*FormatVersion:" line.  I removed a trailing
  space from the ModelName of the second.

* Furthur modified "ppad -M show" output to conform to the needs of the
  WWW interface.

* Many enhancements to the WWW interface, including the show_queues,
  prn_addwiz, and prn_properties scripts.

* Removed PPD file "Canon iR330-400 PS Ver 1.0".

* Fixed misc/ppd2macos.perl to encode / as :2F for Netatalk and CAP.

* Added "temp_first=" option to the lpr interface.

* Fixed a bug in tools4fixup/fixup.sh which caused it to fail to create
  compatibility links when removing old versions of programs whose names have
  changed.

* Added latest French translation files from Olivier Tharan.

* Changed ppr --responder-options= so that it adds to the existing options.
  This implies that responders are required to ignore options that they don't
  recognize.

* Fixed bugs in ppad/ppad_filt.c which caused core dumps when adding a group
  member with a resolution which differed from that of the existing members.

* Moved the code in ppad_filt.c which converts "600x600dpi" to "600dpi" from
  get_mfmode() to deffiltopts_add_ppd() so that PPD files which state the
  resolution in these two ways won't be considered to have conflicting
  resolutions.

* Fixed interface/tcpip.c so it forces idle_status_interval= to zero if
  barbarlang is non-empty.  This is because control-T's may cause problems
  if the job isn't PostScript.

* Changed the format which ppad uses to print switchsets.  Formerly it put
  single quotes arround an option argument only if it contained one or more
  spaces.  It now also uses quotes if it contains one or more equals signs.
  Hopefully this change will make it easier to identify the option and its
  argument when the option is long.

* Fixed a bug in responders/write.sh, namely that $response_code_number
  was undefined.

* Added queue alias support code to ppr.

* Changed "PassThru Types:" to "PassThru types:" in the "ppad show" and
  "ppad group show" output.

* Added queue alias support to ppop.

* Did furthur internationalization work on ppop.

* Fixed the "ppop qquery" "longsubtime" field so it doesn't end with a
  newline.

* Added the commands "ppad location", "ppad department", and "ppad contact".
  Also added code the "ppad show" to display this information.  If these
  new fields are not set, then the lines fromt them will be missing from
  the output.  However, the "ppad -M show" command will show them with
  empty values.

* Added "HP LaserJet 2100 Series" and "HP LaserJet 5000 Series" to
  vendors/ppd_hp/.

* Changed the line length limit in libppr/ppr_gcmd.c:ppr_get_command() from
  80 to 256.

* Changed tools4make/Makefile to install paths.sh and paths.pl in $HOMEDIR/lib.
  Added more information to the paths.* files, made some changes to /printdesk/
  to use paths.pl.

* Changed the "ppad charge" command so that it always writes a "Charge:" line
  with 2 values.  Also changed it so that an zero length "duplex sheet charge"
  is interpreted as "none" (for the benefit of www/prn_properties.cgi.perl).
  Also improved syntax checking for bad currency values.

* Changed the "ppad -M group show" output format some more to suit the WWW
  interface which is currently in development.

* Added code to pprdrv/pprdrv_writemon.c to allow writes during monitored
  waits for printer messages.  This was intended to allow the printer LCD
  message to be changed with PJL commands while waiting for the job to
  finish.  Unfortunately, the HP 4000 I have tested it on doesn't do the
  updates until after the job is finished!

* Changed the idle_status_interval default of the tcpip interface from 15
  if feedback is true, 0 otherwise, to 15 if feedback is true and jobbreak
  is control-d, 0 if otherwise.

* Changed the idle_status_interval default of the serial interface from 0
  to 15 if feedback is true and jobbreak is control-d, 0 otherwise.

* Added the idle_status_interval option to the parallel interface and gave it
  the same default as tcpip and serial.

* Changed the jobbreak "pjl" and "signal/pjl" code to send "@PJL" commands
  to the printer at regular intervals while waiting for the job to
  finish in order to keep reseting the communications timeout.

* In pprdrv/pprdrv_interface.c, added code to turn on PJL unsolicited status
  messages (using the command "@PJL USTATUS DEVICE = ON") and added the
  function pprdrv/pprdrv_feedback.c:handle_ustatus_device() which is called
  whenever one of the resulting messages in received.  Currently, it just
  reformats the message and uses write_printer_status() to make it available
  to the "ppop status" command.  Commentator support will be added later.
  Code should also be added to translate PJL status code into a human readable
  form.  The current code is only intended to allow us to see how the PJL
  status system works.

* Added code to tools4fixup/setup_filters.sh to install the PNG filter.  This
  was somehow omited from 1.40a6.

* Moved verious documenation files, including this one, into /docs/misc/ and
  left links to them at the top level.

* Removed the link README_MISC.txt and moved misc/README_MISC.txt to
  docs/misc/README_MISC.txt, leaving a link to it at its old location.

* Added the "reset_before=" and "reset_on_cancel=" options to the parallel
  interface (with defaults of TRUE and FALSE respectively) and a Linux module
  with platform-specific parallel port code and a generic module (which does
  nothing).  Also added a hook to platform specific code (supplied for Linux)
  which tests to see if the printer is ready before starting and prints a
  LaserJet-style "%%[ ... ]%%" message and exits with EXIT_PRNERR if it is not.

  Hopefully, someone else will supply modules for Solaris, SGI, and the like.
  There will be more parameters in the future which the various modules can be
  expanded to support.

  The "reset_before=" option does not perform its reset until the printer is
  found to be on-line, not out of paper, and not in a fault state.  This was
  necessary, but doing a reset on an HP Deskjet 500 caused to it go on-line
  even if it was off-line!

* Added "reset_on_cancel=" to the parallel interface and support for Linux.

* Added a backslash before a @ in a string to port misc/atalkmapd.perl from
  Perl 4 to Perl 5.

* Added LD= and LDFLAGS= to the include/global.mk created by Configure.  Also
  changed some of the makefiles to use it rather than CC= and CFLAGS=.

* Added FreeBSD 3.1r port from Alan F. Lundin <aflundi@sandia.gov>.

* Added file type "mgc" for Mentor Graphics Metafile, also from Alan F. Lundin.

* Added additional PCL detection rule from Alan F. Lundin.

* Changed the printer configuration file reading in pprdrv to use ppr_getline()
  so as to remove any configuration file line length limit at that point
  at least.

* Changed the "ppop ldest" command so it doesn't use a fixed length buffer
  to read the comment.

* Changed the "ppad interface" command so that it now simply deletes "Address:"
  lines which come before the "Interface:" line rather than putting the
  "Interface:" line there.  It also now correctly deletes "Codes:" lines
  which come after the interface if the interface has changed.

* Changed ppad/ppad_conf.c:confread() so that it can read lines of any length.

* Removed printer/group configuration file line length limit from papsrv.

* Removed the printer/group configuration file line length limit from
  ppr2samba.

* Added the %A format to ppr_sscanf().  This format will return the rest of
  the line but with trailing white space removed unless the string is quoted,
  in which case it will return the contents of the quotes.

* Heavily re-wrote the printer configuration file parsing in pprdrv.c.

* Rewrote the printer and group configuration parsing in ppad to conform to
  the changes in the pprdrv parsing.

* Fixed the bug in libuprint/uprint_lprm.c which prevented uprint-lprm from
  canceling multiple jobs on a PPR queue.

* Changed "ppad show" output so that "PassThru:" and "PagesLimit:" aren't
  shown if they aren't set.  (The are shown in the "ppad -M show" output.)

* Changed the order of the "ppad show" output to group things slightly more
  logically.

* Changed the "ppad group add" command so that it can add many at once.

* Added the "ppad group set" to change the whole member list.

* Changed the "ppad group remove" command so that it can remove more than
  one printer at a time.  (The code is not efficent since it re-writes
  the configuration file once for each printer.)

* Added libppr/trim.c which implements trim_whitespace_right().  Nothing uses
  it yet.

* Changed the ppr hack default (defined in include/global_defines.h) back to
  none.  It was set to turn on the editps hack by default, but there are still
  too many problems with it.

* Fixed bug in pprdrv's handling of "%%BeginResource:" lines with only one
  parameter.  It now just copies the resource rather than core dumping or
  calling fatal().

* Finished "ppr --commentary" code and added the ppr switches --commentator,
  --commentator-address, and --commentator-options as well as the environment
  variables PPR_COMMENTARY, PPR_COMMENTATOR, PPR_COMMENTATOR_ADDRESS, and
  PPR_COMMENTATOR_OPTIONS.  Also added to the "ppop details" and "ppop qquery"
  commands code to print these values.

* Added a "severity" parameter to pprdrv's commentary() function.  Also made it
  one of the parameters to the commentator.

* Changed the lw-messages.conf format and pprdrv/pprdrv_lw_messages.c to allow
  a severity number between 1 and 10 at the begining of a section name.

* Removed the severity data from the audio commentator since the above changes
  made it redundant.

* Heavily re-organized the code for the audio responder and commentator.  The
  routines which generate the play lists have been moved into files in
  libscript/ so that then can be used in CGI scripts which generate sound
  files which clients can pull down from web servers.  Also deleted
  a sound file which said that the remote spooler daemon is down since the
  remote spooler daemon has been eliminated from the PPR peer-to-peer plans.

* Moved misc/tail_status.c to libscript/ and moved the guts of it into
  libppr/tail_status.c so that it can be called from www/commentary-httpd.

* Added lib/pprwatch to the list of obsolete files removed by
  tools4fixup/fixup.sh.

* Slightly modified some of the pprdrv commentary() messages in pprdrv/
  pprdrv_writemon.c so that they all begin with a verb such as "has been"
  "was not", etc.  Previously they were incosistent.  Also modified libscript/
  speach_commentary.pl to parse the modified messages.

* Changed pprdrv/pprdrv_feedback.c:write_printer_status() by changing the
  name to ppop_new_status() and make it no longer call progress_new_message().
  (The caller must now call both.)  Also, renamed pprdrv/pprdrv_progress.c:
  progress_new_message() to progress_new_status().  Also changed the message
  which progress_new_status() writes from "MESSAGE" to "STATUS" and changed
  printdesk/PPRstateupdate.pm.

* Changed the names of some pprdrv writemon operation names:
  "PJL" -> "WAIT_PJL", "CONTROL-D" -> "WAIT_CONTROL-D",
  "SIGNAL" -> "WAIT_SIGNAL".  This should make their purpose clearer to people
  reading the commentator output.

* Changed interfaces/gs_master.sh so that the signal handlers set with "trap"
  do nothing but set a variable.  Calling "exit" didn't seem to be working, at
  least not on Linux 2.2.5 or Solaris 2.6.

* Fixed filter_lp so that the memset() calls the clear the line buffer also
  clear the extra spaces reserved for a tab at the end of the line and the
  space for the terminating null on the longest possible line.  This bug
  caused bad PostScript to be generated on Solaris 2.6 Sparc if a line got
  wrapped.

* Changed libscript/speach_commentary.pl to increase the frequency with which
  silly sounds are played when they are turned on.  This included fixing a bug
  which was preventing them from being played on job errors.

* Fixed libscript/speach.pl:speach_time_interval() so that it can say time
  intervals longer than 99 days 23 hours 59 minutes correctly.

* Fixed pprdrv/pprdrv_lw_messages.c:regularize_lw_message() so that if the
  message to be regularized matches the section heading, the section heading
  is returned.  (This bug meant that irregular messages get a cooked version
  but those already in cannonical form did not!)

* Made changes because Bash 1.14.7 (at least on Linux 2.2.5) has trouble
  trapping SIGINT with the "trap" command:

  Added SIGTTIN and SIGTTOU to the signals in libscript/signal_sh.c.

  Switched the gs* interfaces (interfaces/gs_master.sh) to trap SIGTTIN instead
  of SIGINT for receiving notification that the subsidiary interface is exiting
  with value EXIT_ENGAGED.

  Changed libppr_int/int_exit.c:int_exit() to send SIGTTIN instead of SIGINT.

  Did some general code refinement for the gs* interfaces.

* Fixed pprdrv/pprdrv_commentary.c:commentary() so that the code to suppress
  exit messages after an "off line" message works.  It was broken because
  it was looking for a _status_ of "off line" rather than an _error_ of
  "off line".

* Added more "Please press RETURN to continue." messages to tools4fixup/
  fixup.sh in order to make it more likely that fixup errors will be noticed.

* Cleaned up libscript/Makefile.

* Added libscript/getpwnam and getgrnam so that the fixup script can determine
  the id numbers of the ppr user and group event if they aren't stored in
  /etc/passwd and /etc/group.

* Replaced the fake snprintf() and vsnprintf() implementation in libppr/
  snprintf.c with one take from Samba/rsync.  The notice at the top of the
  file says it may be used for any purpose as long as that notice is not
  removed.  Thus, it is not under the GPL and is not incompatible with
  PPR's BSD style license.

* Change NEEDS_STRSIGNAL, NEEDS_SNPRINTF, and NEEDS_VSNPRINTF to
  HAVE_STRSIGNAL, HAVE_SNPRINTF, and HAVE_VSNPRINTF in anticipation of an
  eventual move to autoconf.

* Changed "ppop status" so that it says "halting (printing xxx-nnn)" rather
  than "printing xxx-nnn (halting)".  Also removed the \n from the ends of
  the tranlatable status strings (sorry guys).  Also changed some of the
  machine mode messages and added a 3rd field which presents the status extra
  message ("off line" for example) as a 3rd field.

* Modified printdesk/PPRcontrol.pm:get_pstatus() so that it returns the printer
  name as the 1st list member, the job name (if any) as the 3rd parameter and
  the last printer status message as a 6th list member.

  Made get_pstatus() return a list of array references so that it can report on
  the status of more than one printer at a time (such as a group or "all").

  Removed get_pmessage() since it is now unnecessary.

* Renamed printdesk/PPRcontrol.pm:list_destionations() to list_destinations().
  Also changed it to include all fields returned by "ppop ldest".

* Changed many of the printdesk/PPRcontrol.pm function so that while the
  queue indicated when the object was created remains the default, it can
  now be overriden by specifying a different queue.

* Added "destname" to "ppop qquery".

* Changed pprdrv/pprdrv_feedback.c so that when writing
  "%%[ PrinterError: xxx ]%%" messages to the progress file and for use by
  "ppop status", the "PrinterError:" is left on.

* Changed tools4make/makedirs.sh so that it also does chown and chgrp on the
  new directory to set owner and group to "ppr".

* Added tools4make/make_new_dir.sh.

* Changed "ppad show" output in both human and machine reable forms to always
  show the charge as a charge per duplex sheet and a charge per simplex sheet
  even if the configuration file only contains one value on the "Charge:" line.
  This allows us to simplify code that parse the output, such as that in the
  new WWW interface.

* Fixed printdesk/PPRstateupdate.pm to correctly keep track of whether it has
  started tail_status yet.

* Fixed printdesk/printdesk.perl and printdesk/atchooser.perl so that they
  exit in an approved way for Tk.

* Improved error messages in libuprint/uprint_print_rfc1179.c.

* Improved error messages in lprsrv/lprsrv_print.c.

* Added an extra void* parameter to libppr/tail_status.c:tail_status() so that
  the callback routine can accept a pointer to a structure which can give it
  information about the context in which it was called.

* Moved a big chunk of ppr/ppr_main.c:write_queue_file() into the new function
  libppr/writeqfile.c:write_struct_QFileEntry().

* Added "responder", "responder-address", and "responder-options" columns to
  "ppop qquery".

* Numberous improvements to the www/ programs including but not limited to:

  * Added the www/ppr-commentary-httpd.c program which issues spoken commentary
    messages on printer events.

  * Enhanced www/show_queues.cgi.perl to use a host of xfig generated icons
    to describe printer status.

  * Modified many of the www/ programs to use Cascading Style Sheets.

  * Added the server disk space graphing program df_html.cgi and df_img.cgi
    which use gd-1.7.3, the Perl GD module version 1.23, and the Perl
    module Chart-PGNgraph 1.13 to display pie charge representing disk usage.

  * Added CGI and audio test pages.

  * Got the add group wizard actually working.

  * Fixed bugs in ppr-httpd which made it fail to work with the Amaya browser.

  From now on, enhancements to the WWW interface will be logged in this file.
  During the initial period of rapid development the changes were too numberous
  and extensive to easily describe.


1.40b1, 15 December 1999--26 January 2000

* Added LOGDIR to tool4make/paths.c and changed the name of the Perl output
  file form paths.pl (Perl library) to paths.ph (Perl header).  Added
  paths.pl to the obsolete files in tools4fixup/fixup.sh.

* Bumped the PrintDesk libarary version number from 0.1 to 0.2 in consideration
  of the changes I made in 1.40a8 to accomodate the WWW interface.

* Added TAIL_STATUS_PATH and SAFE_PATH to include/global_defines.h and
  libscript/paths.c.

* Changed the ppr-httpd log file from "/tmp/ppr-httpd.log" to "$LOGDIR/ppr-httpd".

* Added VERSION and SHORT_VERSION to tools4make/paths.c and changed
  SHORT_VERSION to include alpha and beta indicators.  (That is, I changed
  it from "1.40" to "1.40b1".

* Many improvements to www/ppr-httpd.perl:

  * Added explicit recognition of ".txt" files as MIME type text/plain.

  * Added support for request methods in lower or mixed case.

  * Added support for the "Location:" header from a CGI script.

  * Added support for $ENV{PATH_INFO} and $ENV{PATH_TRANSLATED} in CGI scripts.

  * Set the PATH for CGI scripts to SAFE_PATH.

  * Fixed code to send "405 Method Not Allowed" with an "Allow:" header when
    any method other than GET is tried on a file or any method other than
    GET or POST on a CGI script.

  * Added the framework for authentication.  If the request has a valid
    "Authorization:" header, then $ENV{REMOTE_USER} is set, otherwise it is
    not.  If the script returns "Status: 401", a "WWW-Authenticate:" header
    is generated with a challenge.

* Modified www/cgi_data.pl:cgi_read_data() to read $ENV{QUERY_STRING} as well
  as STDIN when the request method is POST.  Also removed the code which
  stript trailing spaces from values.  I had forgotten about this code
  and had considered the behavior to be a browser bug.  This change may break
  some scripts.

* Added tabindex and accesskey support to cgi_wizard.pl and added code to use
  it to prn_addwiz.cgi and grp_addwiz.cgi and cgi_membership.pl.  In the
  "Cancel", "Back", "Next" buttons, the access key is indicated by putting
  an underscore before it.

* Removed the first $me argument from www/cgi_wizard.pl:cgi_wizard() because
  it is better to use $ENV{SCRIPT_NAME}.

* Added www/cgi_auth.pl:demand_authentication().

* Changed cgi_wizard.pl and cgi_tabbed.pl to call demand_authentication()
  if $ENV{REMOTE_USER} doesn't have a non-null, non-empty value.

* Changed Configure to not defined DOTEXE=.exe for UWIN since UWIN seems to
  already have rules to handle this and defining it so makes some of the
  default make rules not apply anymore.

* Moved the call to tools4make/makedirs from the top level Makefile to
  tools4make/Makefile's install: clause in order to remove a chicken-and-
  the-egg problem which was preventing "make install" from creating the
  top level PPR directories even if it had write access because it was
  trying to install paths.sh and paths.ph first.

* Created www/cgi_intl.pl.  For now it just contains dummy functions.  These
  dummy functions allow me to make the internationalization changes to the
  CGI scripts without breaking them.  Once that is done, I will go back
  and put real message translation code into this library.

* Applied i18n changes to www/show_logs.cgi.perl.

* Added code to po/extract.sh to extract messages from *.perl and *.pl in
  the directory www/.  This produces some spurious warnings because xgettext
  doesn't recognized Perl comments, but the output is fine.

* Added a preliminary implementation of RFC 2617 Digest authentication to
  www/ppr-httpd.  It will require some review before it can be considered
  secure.

* Renamed www/logs.html to show_logs.html and added a link to show web
  server activity.

* Fixed the left and right arrows in www/cgi_membership.cgi to be "<-" and "->"
  rather than ">-" and "-<".

* Changed www/show_queues.js to set the hyperlinks after emitting the HTML
  for the popup menus rather than while emmiting it and to put more newlines
  in the HTML.  I had hoped this would fix operation with HotJava but it
  didn't.  However, I thought the code looked better, so I have kept the
  changes.

* Added a 3rd parameter to www/cgi_wizard.pl:do_wizard() to set $debug rather
  than passing it thru a global variable.  Also made it automatically turn
  on table borders if debug mode is enabled.

* Fixed ppr-httpd so that it can parse request lines with methods consisting
  of any sequence of any ASCII characters not excluded by RFC 2068 section
  2.2's definition of a token.  Previously it would only accept upper-case
  ASCII characters.  Also fixed it so it doesn't convert the request method
  to upper case since RFC 2068 section 5.1.1 says method names are case-
  sensitive.

* Replaced the RSA's sample MD5 implementation with the new Ghostscript one.

* Moved parse_job_name() and parse_dest_name() from ppop/ppop.c to libppr/
  jnparse.c.  This work included moving various prototypes, defines, and
  structure definitions from ppop/ppop.h and include/pprd.h to include/
  global_structs.h.

* Added the define USER_PPRWWW to include/global_defines.h and Configure.

* Added --su switch to ppad.  This switch allows the user "pprwww"
  so invoke commands as if any other user.

* Changed ppop's -u or --as-user switch to an --su switch like ppad's.
  Unlike ppad's --su switch, this one may be used by any operator.  The
  ppop code is also more complicated because we have to answer the question
  "do I own this job?" in addition to the much simplier question "do I have
  a special privledge?".

* Began internationalizing www/prn_addwiz.cgi.perl, grp_addwiz.cgi.perl,
  prn_properties.cgi.perl, grp_properties.cgi.perl, and show_jobs.cgi.perl
  and added access control and --su support to all of them.

* Began internationalization of www/show_queues.cgi.perl and
  www/delete_queue.cgi.perl.

* Added cgi_encode() to www/cgi_data.pl.

* Fixed www/cgi_data.pl:cgi_read_data() so it understands characters encoded
  in lower-case hexadecimal.  Formerly it only understood upper-case.  (Amaya
  generates lower-case.)

* Added www/cgi_back.pl and changed many of the www/ programs to use it.  This
  allows the "Back" "Cancel" and "Close" bottons to take the user back to
  an appropriate previous page in browsers which don't support JavaScript.

* Added the very work-in-progress Perl typesetting library to
  filters_typesset/perllib/.

* Fixed tools4make/installbin.sh and installscript.sh so that they will exit
  with a non-zero value if cp fails.

* Changed some Makefiles which did chmod 6711 on the executable to do
  chmod 6755 so that if someone compiles PPR as himself and then tries to
  do "make install" as the user "ppr" it will work.

* Fixed some column alignment problems in the ppr --help output.

* Moved the fonts in fonts/ into vendors/ to clarify their copyright and
  license status.  Also moved the .afm files in filters_typeset/ into
  vendors/ for the same reason.

* Added a description of the copyright and licensing of various 3rd party
  files to LICENSE.txt.

* Added -T to the Perl options of all of of the CGI programs in www/.  This
  will surely have broken many of them.

* Fixed www/test-audio.html by changing the field name "code" to "category".

* Changed the permissions on $VAR_SPOOL_PPR/logs from 755 to 775 to allow
  ppr-httpd to write its log there.

* Changed ppr-httpd to set umask to 002.

* Did more work to internationalize the www/ programs.

* Added a "AddOn" section to the queue file and removed some line-length
  limits in some of the queue file reading code in pprdrv and and ppop.

* Fixed the gentle reloading of www/show_queues.cgi.  The problem was that
  the form elements named "submit" were masking the submit() method.

* Changed the names of the CSS files in www/ to match the names of the Perl
  code files whose output they apply to.

* Changed the interface selection screen of the add printer wizard to use a
  table instead of <multicol> which only works in Netscape.

* Changed www/show_queues.js to not use the Layers constructor but rather
  to use a pre-defined <div>.  The popup menu no longer uses a child browser
  window in Internet Explorer.  Code will have to be added later for the
  standard DOM.

* Added code to interfaces/interface_linux.c to define the status codes if
  /usr/include/linux/lp.h fails to do so.  In linux 2.2.13 these codes are
  incorrectly only defined if __KERNEL__ is defined.

* Did some i18n cleanup.  This included renaming some of the programs in po/
  and adding "daemon lang =" to the [internationalization] section of ppr.conf.
  This is read by the System V Init script (tools4fixup/init_ppr.sh) and used
  to set LANG for pprd, papsrv, etc.

* Added "package main;" to the top of the paths.ph generated by
  tools4make/paths.c because otherwise if "use PrintDesk;" was used then
  the values would be defined in the package "PrintDesk".

* Renamed docs/misc/README_MISC.txt to misc_README.txt and changed the link
  misc/README_MISC.txt to README.txt

* Moved po/README.txt into docs/misc/ and left a link to it in its former
  place.

* Added code to www/cgi_data.pl to detect if REQUEST_METHOD is not defined
  and skip the attempt to retrieve the POST data and query string and to
  set a few CGI variables in order to prevent warnings about undefined values.
  This is so that the CGI programs may be run from the command line during
  testing without printing loads of misleading warnings.

* Fleshed out www/cgi_intl.pl.

* Moved the incomplete script www/gather_stats.perl into misc/ for now.

* Various changes to the incomplete Cygwin port including: changing version
  specific Cygwin element in the SAFE_PATH (defined in sysdep.h) to
  "/bin:/usr/bin" (the installer must make a link), changing
  #ifdef PPR_CYGWIN32 to #ifdef PPR_CYGWIN to conform to global.mk.

* Renamed the function dirnotok() in tools4make/makedirs.sh to dirok() since
  that seems to make more sense.

* Correct the GCC version detection and processor detection in Configure so
  that it can select i586 and i686 and so that it no longer incorrectly turns
  off strength-reduce in GCC versions 2.8 which have two digits after the first
  dot (such as 2.95.1).

* Added EXIT_USER_ABORT to include/util_exits.h.

* Changed the functions in libppr/jnparse.c to call error() rather than
  printing to the global FILE* errors.

* Changed ppop and ppad so that if they are fed an unknown subcommand the
  return EXIT_SYNTAX.  The previous behavior varied.

* Added the "ppop modify" command.

* Fixed an undiscovered bug in the interactive modes of ppop and ppad which
  could cause them to overflow the arrays they used for parsing the command
  line into an argument list.

* Renamed some include/global_structs.h:struct QFileEntry members.

* Removed the constant include/global_defines.h:MAX_QFLINE.  Queue file lines
  can now be of any length that will fit in memory.

* Changed the name of the "ppop qquery" field "proxy" to "proxy-for" and
  "draft" to "draft-notice".

* Greatly improved editps/Windows_NT_4.0.

* Changed some of the warning and gab messages in ppr/ppr_nest.c for clarity.

* Added CUSTOM_HOOK_PROLOG and CUSTOM_HOOK_PAGEZERO to pprdrv.

* Fixed a bug in tests/tools/regression_test_2 which was appearently tripping
  up Bash 2.  ("exec - >$ADDRESS" instead of "exec >$ADDRESS").


1.40b2, 28 January 2000--14 February 2000

* Added information about Digest Authentication to www/README.txt.

* Internationalized "ppuser show" output.

* Changed ppop so that the user "pprwww", like "root" and "ppr" is privledged
  even if it isn't listed in /etc/ppr/acl/ppop.allow.

* Changed libpprdb/dbstrlower.c to user myalloc() rather than mystrdup()
  which looked silly.

* Fixed a problem in the part of Configure which generated the global.mk
  section for DEC OSF/1:  It generated two CC= lines, one of them wrong.

* Temporarily changed ppop/ppop_modify.c to use char* arithmatic since void*
  arithmetic doesn't seem to work with the OSF/1 C compiler.

* Fixed some missing includes in libppr/.

* Made small updates in INSTALL.txt.

* Fixed ppr/ppr_infile.c so that the size of passthru languages is recorded.
  It was being incorrectly recorded zero.

* Fixed CHARSETCONF in global_defines.h to be in SHAREDIR rather than HOMEDIR.

* Fixed su command which runs inst_cron in fixup.

* Fixed Configure problem with USER_PPRWWW.

* Fixed "touch" command portability problem in tools4make/Makefile.

* Added PPD files:  "HP LaserJet 4050 N", "Kyocera 1700+" (with German
  translation strings), "Lexmark Optra Color 1200",
  and "Lexmark Optra S xxx5 Series".  For now we will pretend the problem of
  PPD files in multiple languages doesn't exist.

* Removed samba/xerox_ticket_submitter.perl and salvaged some of the code to
  make misc/custom_hook_docutech.perl.

* Enhanced pprdrv/pprdrv_custom_hook.c:custom_hook_run() so that it obeys
  "%%IncludeFeature:" lines.  Also made it connect stdin to /dev/null
  and stderr to the pprdrv log file.  Also added an error() call after
  the execl() in case it fails.

* Fixed a bug in pprdrv printer config parsing which made "CustomHook:" not
  work.

* Changed pprdrv/pprdrv_commentary.c:commentary_spawn() so it calls error()
  if execl() fails.

* Added to ppop modify the ability to modify Addon lines by prefixing their
  names with "addon:".

* Added to ppop qquery the ability to display Addon lines by prefixing their
  names with "addon:".

* Changed the 3rd argument to a custom hook from the full path and name
  of the queue file to simply the full job name.  The custom hook programs
  should be encouraged to use ppop qquery to get the information they need.

* Modified www/cgi_run.pl:run() so that it breaks long commands into multiple
  lines.

* Fixed include/global_defines.h:lmatchp() macro.  (Klaus Reimann
  <klausr@ITAP.Physik.Uni-Stuttgart.DE> spotted this.  The macro was supposed
  to return a pointer to the text after the matching text with whitespace
  directly after the match skipt.  It was actually skipping non-whitespace
  after the match!)

* Added the proxy_for() method in printdesk/PPRcontrol.pm.

* Changed libppr/acl.c so that the users "ppr", "pprwww", and "root" are
  always considered to be members of all access control lists.  This will
  allow the removal of scattered code which grants them access even if the
  ACL does not.

* Greatly simplified the ppop job ownership tests by removing special
  code described in the previous item and by always doing a getpwbyuid()
  and no longer attempting numberic uid test for uid 0 (root) and the
  effective uid (ppr).

* Simplified ppad in the same way.

* Simplified the ppop --proxy-for code.  An operator can now manipulate jobs
  sent by other proxies.  The documentation was and remains silent on this
  point.

* In response to the CERT advisory CA-2000-02, wrapped data from form POSTing
  and PPR queue listings, etc. in calls to html() in the following www/
  scripts:  show_jobs.cgi.perl, show_queues.cgi.perl, prn_properties.cgi.perl,
  grp_properties.cgi.perl, prn_addwiz.cgi.perl, grp_addwiz.cgi.perl,
  cgi_membership.pl,

* Moved html() from www/cgi_intl.pl to cgi_data.pl, renamed
  www/cgi_data.pl:cgi_encode() to form_urlencoded() and added
  javascript_string() and html_value().

* Put "use 5.005;" at the top of many of the www/ scripts since there seem
  to be problems with 5.003 including inability to parse "foreach my $i ...".

* Fixed www/grp_addwiz.cgi.perl to use "ppad group members" rather than
  "ppad group set" which was a earlier name for the subcommand.

* Fixed ppad/ppad_util.c:print_switchset() so it doesn't leave a trailing space.

* Added www/cgi_run:shell_parse() and changed prn_properties.cgi.perl and
  grp_properties.cgi.perl to use it to parse the switchset into words to
  pass to run().

* Fixed bugs in tool4fixup/fixup.sh which prevented it from making PPR's group
  and from recognizing when it had suceeded.

* Fixed problems in fixup where it failed to do chown or chgrp or both on
  configuration files which it created.

* Added "vendors/ppd_adobe/Tektronix Phaser 220i".

* Added www/test_components.cgi.perl.

* Fixed www/show_queues.js and show_jobs.js to work correctly in IE 5.0 even
  when the window has been scrolled down.

* Added a few notes at the top of samba/smb-protos.conf.

* Added misc/ppdoc.sh.

* Renamed ttf2ps to ppr-ttf2ps and added it to the obsolete files removed
  by fixup.  I did this because there are alredy too many ttf2ps programs out
  there.

* Changed samba/Makefile to copy win95cp.bat into /var/spool/ppr/drivers/win95/.

* Renamed printdesk/atchooser -> ppr-chooser and printdesk -> ppr-panel.

* Fixed www/prn_properties.cgi.perl and grp_properties.cgi.perl to run
  ppr2samba when necessary.

* Renamed pprd/pprd_nag.c:nag() to pprd/pprd_remind.c:ppad_remind().  Also
  fixed a bug in that function which caused a core dump if no printer queues
  had yet been created.  Also added internationalization code to the function.

* Problem:  if pprd was not running, www/show_queues.cgi would die by a
  broken pipe signal.  Solution:  Changed ppop to print "*FATAL\t" rather
  than a (possibly translated) "Fatal: ", changed printdesk/PPRcontrol.pm
  to call croak() in various places if a line is read from ppop which
  begins with "*" but not with "*DONE".  Result:  failure message makes it
  to web browser and script close HTML document properly.

* Added the temporary WWW interface password changing program
  www/ppr-passwd.sh.  It uses the htdigest program from the Apache web server.

* Added NULL as last argument to execl() in pprdrv/pprdrv_custom_hook.c:
  custom_hook_run().

* Fixed tools4fixup/make_conf.sh:findfile_test_basename_path_default() so if
  the program is not found it returns the default as it should.  It was
  returning the search path.

* Changed the job WWW interface job "Details" window in the following ways:
  changed the script name from job_properties.cgi to job_modify.cgi, changed
  the button which brings it up from "Details" to "Modify" (which, incidentaly,
  corresponds with "ppop modify"), added scrollbars, reduced the height from
  700 to 600 pixels.  (The "Ticket" tab is too high for 800x600 displays.  More
  work is required to fix this.)

* Changed the www/show_jobs.cgi.perl default refresh interval from 10 to 60
  seconds.

* Changed uprint.conf format by renaming section [to lp] -> [real lp] and
  [to lpr] -> [real lpr].  The old section names are still recognized.  This
  change anticipates enhancements in a future version of PPR.  These include
  printcap= and osf extensions= in [real lpr], and printers= and classes= in
  [real lp].  (Currently these settings are compiled in.)

* Removed pprdrv/lw-messages.conf.sample which was installed as $CONFDIR/
  lw-messages.conf.sample since it seemed to serve no real purpose.

* Changed libppr/acl.c:user_acl_allows() to explicitly skip comment lines
  rather than simply relying on them not matching user names.

* Changed pprd/pprd_nodeid.c:nodeid_to_name() to call error() and return
  "<bug>" for invalid node ids rather than calling fatal().  There is a bug
  somewhere that is resulting in nodeid_to_name() being called with appearently
  unitialized values for node ids.

* Fixed AppleTalk library selection code in Configure.

* Changed all sprintf() calls in libuprint/.

* Enlarged the buffer space for such things as the responder email address
  in libuprint/.

* Changed libuprint/uprint_lprm.c to send certain messages to stdout when
  a non-root user is denied permission to perform a root-only task
  (specifically, to delete the jobs of a named user).  They were previously
  being posted with uprint_error_callback() which made the behavoir for ppr
  and lp inconsistent with lpr.

* Fixed a bug in uprint-lprm:  It would always perform "lprm -" as if root
  had invoked it!


1.40, 15 February 2000--23 February 2000

* Moved the makefile version setting for Makefile and the docs/ makefiles
  into include/version.mk.

* Changed www/ppr-commentary-httpd.c and commentary_select.cgi.perl so that
  if no printer checkboxes are checked, then all printers are monitored.
  Also prepared the selection screen (but not the actually commentary screen)
  for internationalization and revised some of the text.

* Updated misc/README.txt.

* Restored the carriage returns at the end of the lines in samba/win95cp.bat.
  They had appearently been removed by the editor ted.  In future I will have
  to remember to edit it only with vi or joe.  Also renamed it to WIN95CP.BAT
  and added to old name to the obsolete files list in fixup.

* Fixed www/prn_control.cgi.perl to demand authentication when required.  The
  code had never been added.

* Removed extra newline after status printing from "ppop status" output.

* OSF fixes from Klaus Reimann.

* Added additional message variants to pprdrv/lw-messages.conf, added new
  category "PrinterError: needs attention", added "needs attention" to
  libscript/speach_commentary.pl, did not add a sound file.


1.41a1, 23 February 2000--18 July 2000

* Fixed "forceaufssecurity" in papsrv/papsrv_conf.c.

* Changed www/ppr-httpd.perl to undefine $ENV{ENV}.  I don't know what this
  variable is for, but if it is defined, then Perl won't do an exec(), noting
  that the value is tainted.  This problem showed up when I upgraded to
  Mandrake 7.0.  Perhaps Inetd is defining it.

* Removed a spurious trailing space from the name of
  "vendors/procset_apple/AppleDict md-71-0".

* Merged the disparate changes to tools4make/setup_filters.sh and
  filters_misc/setup_filters.sh into the former.

* Moved misc/ppdoc.sh to docs/ppdoc.sh.

* Added a timeout to the reception of POST data in www/ppr-httpd.perl.  Also
  added a wait() call so that CGI children don't become zombies.

* Fixed pprd/pprd_load.c:initialize_queue() to handle queue names such as
  "myprn-2".  I had previously fixed ppop to handle these.

* Fixed "ppop purge" to handle queue names such as "myprn-2".

* Changed the assertion check in ppr/ppr_outfile.c:get_next_id() to stop
  after 10000 failures rather than 1000 and to say "all job id numbers used"
  instead of "assertion failed".

* Broke tools4fixup/fixup.sh up into numerous scripts all called by the
  new fixup.sh which is simply a wrapper.  The scripts which the old
  fixup.sh called in this manner have been renamed with names starting
  with "fixup_".

* Removed a spurious assertion check from pprdrv/pprdrv.c:copy_setup() which
  was triggered when printing files with unclosed resources in the setup
  section.  Also added a warning to ppr/ppr_main.c:main() to point out
  such files.

* Added progress bar code to www/prn_control.cgi.perl.

* Added a 4th column to the "ppop progress" output to indicate the total
  number of pages.

* Changed two lines in Configure which used NECHO to used EECHO instead since
  /usr/ucb/echo (which supports -n) is an optional package in Solaris 2.6 and
  they were appearently the only place where an echo that simply prints the
  "-n" does more than cosmetic harm.

* Put a 10 minute timeout in the pprpopup responder.

* Changed the description of the "tcpip" interface program in
  www/prn_addwiz.cgi.perl from "UPP (JetDirect Protocol)" to "AppSocket
  (JetDirect Protocol)".

* filter_pcl/PCL.java: Corrected PCL ESC parser to handle combined commands
  correctly.  Previously it got stuck in an endless loop.

* Fixed www/df_img.cgi.perl to use red for used, green for available, and
  yellow for reserved.

* Fixed www/Makefile so it doesn't install the *.fig files from www/q_icons/.

* Moved misc/ppr-xgrant.c, misc/ppr-xfm.sh, and misc/pprpopupd.perl to
  the new directory unixuser/.

* Added unixuser/login_ppr.sh and login_ppr.csh.

* tools4fixup/fixup_links.sh: Added ppr-xgrant to the list of programs which
  get symbolic links in $BINDIR.

* tools4fixup/fixup_links.sh: Added links into /etc/profile.d for RedHat
  Linux systems (and any others that have /etc/profile.d).

* Reworded a few error messages in pprdrv/pprdrv_interface.c.

* pprdrv/pprdrv_interface.c: fixed a problem with exiting commentators and
  custom hooks overwriting the interface exit information in
  static_wait_status, renamed static_wait_status to interface_wait_status.

* samba/smb-protos.conf.sample: changed
  "printer driver location = \\%h\pprwin95" to
  "printer driver location = \\%L\pprwin95".  Before I made this change,
  automatic Win95 driver installation was broken if the NetBIOS and
  DNS host names were not the same.

* Changed samba/smb-protos.conf.sample to smb-protos.conf and arranged for
  it to be installed in $HOMEDIR/lib instead of $CONFDIR.

* www/ppr-httpd.perl: added code to examine Linux's /proc/net/tcp to determine
  the username for the connexion if the connexion is from 127.0.0.1.  This
  allows browsers which don't support Digest authentication to work if they
  are running on the same machine as the PPR web server.  (This was inspired
  by Jeremy Monin's <mailto:jeremy@shadowlands.org> Authlocal
  <http://shadowlands.org/authlocal/>.)  This only works on Linux with /proc
  mounted.

* www/show_jobs.cgi.perl: fixed redirect code (adding www/cgi_redirect.pl)
  so that the [Modify] button works with non-Javascript browsers.

* www/ppr-httpd.perl: fixed so a "Content-Type:" line is not required if a
  CGI script sends a "Location:" header.

* Added tools4fixup/fixup_cron.sh.  It will need more work before it is
  portable.

* www/show_log.cgi.perl, show_printlog.cgi.perl: Added code to emit a
  "Last-Modified:" header with the mtime of the log file and an "Expires:"
  header 60 seconds into the future.

* www/cgi_time.pl: renamed format_time() to cgi_time_format() and added
  cgi_time_parse().

* Added libscript/MD5pp.pm.  This was obtained from
  <http://www.cs.ndsu.nodak.edu/~rousskov/research/cache/sanitar/>
  It appears to be freeware, but I am still attempting to determine the
  exact license terms.

* www/ppr-httpd.perl: added support for "If-Modified-Since:" on GET and POST,
  added "Range:" and "If-Range:" support for GET on files.  Added support for
  MD5pp.pm.

* ppad/ppad.c: renamed privledged() to privileged() and added code to make
  result true if UID == EUID even if the ACL didn't contain the username.
  This fixes "make install" for non-root users.

* www/show_queues_nojs.cgi.perl: Added "Expires:" header with date 1 day in the
  future and "Last-Modified:" header with the script's revision date.

* www/commentary_speach.cgi.perl: Added "Expires:" header with date 1 day in
  the future.

* Added www/.htaccess to help the Apache server create directory listings for
  browsing the PPR source code.

* libppr/myalloc.c: added myrestrdup().

* Added libppr/ppr_sscanf.c:ppr_sscanf_checkpoint() and ppr_sscanf_rollback().

* Fixed pprd/pprd_printer.c:look_for_work().  The test of the start_printer()
  return value was broken which probably resulted in unnecessary calls
  to start_printer() after the printer was started.

* Added remote printing transmission hooks to pprd.  This included rewriting
  the code that load old jobs at pprd startup and the code that processes
  the "j" command from ppr.

  It was also necessary to insert some checks to prevent attempts to print
  locally jobs destined for remote queues.

  Major code cleanup in pprd involving renaming numberous functions, moving
  code to other modules, etc.  The module pprd_ppop.c (formerly
  pprd_ppopint.c) was greatly simplified.

* po/extract_to_pot.sh:  Updated it to extract strings from all directories
  which have internationalized messages.  About a third of PPR.pot was missing
  because directories with internationalized programs were being excluded.

* Incorporated the latest French messages from Olivier Tharan
  <olive@minnet.net>.

* Added tools4make/installdata.sh and installprogs.sh.  Decided to phase out
  installbin.sh and installscript.sh.

* Made a few adjustments in the www interface to deal with Netscape's bug
  wherby it submits the value of the first submit button when the submit()
  method is called on a form.  The solution employed in www/show_job.cgi.perl
  is to use Javascript to change the value of the "Settings" button to
  "Refresh" before calling submit().  For www/prn_control.cgi.perl it was to
  use document.location.reload() instead of document.form[0].submit().

* Added the "ppop destination-comment-address" command and added
  "ppop destination-comment as an alternative to "ppop ldest".

* Replaced printdesk/PPRcontrol.pm:list_destinations() with a new
  list_destinations() and list_destinations_comments() and
  list_destinations_comments_addresses().

* www/show_queues.cgi.perl: added "Many Details" option, added font style
  elements to style sheet, added display of number of jobs in queues with
  jobs, added automatic submit whenever the refresh interval or the
  "View" is changed, added CGI variable "borders=1" to force borders on
  (for testing purposes).

* Fixed a bug in libscript/speach_response.pl which made the messages for
  printer and group incapable not play correctly.

* Added www/responder_speach.cgi.perl and www/test-audio-responder.html and
  renamed test-audio.html to test-audio-commentary.html.

* pprdrv/pprdrv_ppd.c: added give_reason() calls for when a feature section
  runs off the end of the file.

* www/Makefile: broke "make install" up into pieces such as
  "make install-progs" and "make install-images" because "make install" had
  gotten to take too long to run.  (This change helps during development,
  "make install" still does what it always did.)

* Added editps/ADOBEPS4.DRV_Version_4.24 and cooresponding entry in
  editps/editps.conf.

* Added www/job_log.cgi.perl and added "mtime: x" to "ppop -M log" output.

* libuprint/uprint_print.c: added current date and time to the logged
  information.

* pprd/pprd_respond.c: increased the maximum length of the title and For
  strings passed to the responder.

* Added www/rfc/.

* Added RESP_CANCELED_ACL to include/respond.h and ppr/ppr_respond.c.

* Added ACL hooks in ppr and "ppop acls" and "ppop group acls".  There will be
  no separate ACLs for aliases, they will use the ACLs of whatever printer or
  group they point to.  To submit to a group one need only pass the ACLs of
  the group, the ACLs of the member printers are irelevant.

* Changed the "ppop dest" output to change the column heading "Protected" to
  "Charge".

* Changed RESP_CANCELED_NOTAUTH to RESP_CANCELED_NOCHARGEACCT and
  PPREXIT_NOTAUTH to PPREXIT_NOCHARGEACCT and added PPREXIT_ACL and
  RESP_CANCELED_ACL.

* Changed libscript/speach_response.pl to accord with changes above.  This
  requires some new audio files.

* ppop/ppop.c:parse_job_name(): added code to recognized "*" as an explicit
  wildcard queue id.  The creates a way to list the jobs in queues with names
  like "busprn-2".  At the some time, the default job subid was changed to
  wildcard.  I don't know if this was the correct thing to do, but it sounds
  right.

* www/cgi_wizard.pl:do_wizard(): Moved 2nd and 3rd parameters to 2nd parameter
  has keys, renamed internal CGI variables to begin with "wiz_", eliminated
  call to cgi_data_read() (the caller must do it now before calling
  do_wizard().)

* www/cgi_data.pl: added undef_to_empty().

* Added README.txt, updated INSTALL.txt and PORTING.txt.

* Changed tools4fixup/init_ppr.sh to run uprint-newconf.

* Internationalized uprint-newconf.

* fontutils/ppr-fontindex.c: Added recursive searching.  Modified
  tools4fixup/fixup_conf.sh accordingly.

* Renamed tools4make to makeprogs and tools4fixup to fixup.

* Renamed $HOMEDIR/install to $HOMEDIR/fixup to better express its purpose.

* Changed the top level Makefile to use SUBDIRS=.  This makes it much shorter
  and easier to maintain.

* Removed $HOMEDIR/lib/paths.sh since it was never used.

* Moved misc/ppr-clean.perl into init_and_cron/ and added deletion of alert
  logs after 7 days.

* Moved fixup/init_ppr.sh into init_and_cron/.

* Created cron_daily.sh and cron_hourly.sh in init_and_cron/.

* Moved global.mk and global.mk.unconfigured from include/ to makeprogs/.

* Added makeprogs/installcp.sh

* Removed makeprogs/installscript.sh and installbin.sh.  Also removed their
  variables from the global.mk generated by ./Configure.  Also removed
  CP=.

* Moved squeeze.c from procsets/ to makeprogs/ and added --squeeze option to
  installcp.sh.

* Fixed unixuser/ppr-xgrant.c to abort if it is run with XAUTHORITY set to
  point to a file which is not owned by the user who ran ppr-xgrant.  If
  run as a result of a "su -", the xauth run under the user's id would block
  for about 10 seconds before reporting that it had failed to lock
  the Xauthority file.

* www/cgi_wizard.pl, cgi_tabbed.pl: changed "exit 0" to "return" in several
  places.  This allows cleanup after the function returns.  This is not needed
  in PPR but it is needed in other applications of these library routines.

* Fixed install to create $SHAREDIR/locale even if the po files are not
  installed.  Because this was not done, the WWW interface didn't work if
  internationalization was not enabled when running ./Configure.

* Fixed lprsrv/lprsrv_conf.c functions be be case-insensitive when comparing
  host names.


1.41b1, 18 July 2000--15 September 2000

* Fixed bug in makeprogs/installcp.sh (changed "==" to "=" in first if).

* Changed www/cgi_tabbed.pl to put "tab_" in front of all its internal
  CGI variables.

* Fixed libuprint/uprint_conf.c to ignore comments even if they don't start
  in column 1.

* Adjusted a few libuprint and interface/lpr.c error messages for greater
  clarity.

* Fixed fixup/fixup_links.sh so that it will do "exit 1" if "ln -s" fails.

* Fixed the serial and parallel interface programs so that they abort if an
  attempt is made to run them with a codes setting of "Binary".  This is
  better than waiting for trouble to strike.  Of course, there is no
  guarantee that it won't, but at least papsrv won't encourage Macintosh
  clients to use control codes in their data.

* Fixed samba/ppr2samba.c so that it looks for smb-protos.conf in
  $HOMEDIR/lib rather than $CONFDIR.

* Added ATALKFLAGS= to the global.mk generated by Configure.  Made changes
  in interfaces/Makefile and papsrv/Makefile to use it.  When complete, these
  changes will allow PPR to compile against an AppleTalk library which isn't in
  the normal include file search path.

* Fixed interfaces/Makefile and papsrv/Makefile to use $(LD) and $(LDFLAGS).
  This bug was showing up on FreeBSD because FreeBSD doesn't have
  /usr/local/lib in GCC's default library search path.

* Fixed vendors/Makefile so that it installs the fonts.  This must have been
  forgotton during the re-organization.

* libppr/fname_sprintf.c:fname_sprintf(): Enhanced error messages.

* ppr/ppr_editps.c: removed spurious extra argument in printf().

* fixup/fixup_accounts.sh: Added user and group add code.  (Provided by
  Espen H. Koht <ehk20@cus.cam.ac.uk>.)

* Configure: re-wrote AppleTalk library search.  It no longer asks the user
  but simply chooses NATALI/Netatalk in preference to CAP and CAP in
  preference to ALI.

* Added "vendors/ppd_hp/HP DeskJet 2500CM" submitted by Larry Hunter
  <Larry.Hunter@uchsc.edu>.

* filters_misc/editps.conf: Added documentation.

* Made some fixes (mainly adding explicit casts) so that the code can
  once-again be compiled with g++.  This test was done with GCC 2.95.2.
  It is a pity that the binaries are about twice as big when compiled
  as C++.

* filter_lp/filter_lp.c: Fixed the minimum columns enforcement code and
  re-worded and fixed some of the noisy=yet code.

* www/prn_addwiz.cgi.perl: Changed order of questions so that the printer
  queue isn't assigned a name until after the user has browsed for it.  Also
  added code to guess at a suitable name from address.

* www/cgi_wizard.pl: Changed the default alt text generating code to use the
  basename of the image file with the extension removed rather than the
  whole image path and filename.

* Removed copyright screen and yes/no prompt from fixup.  I can't remember why
  it was there.  The operations it performs aren't really dangerous.

* Removed the setgid bit from the texinfo filter.  Supposedly this was done
  a long time ago.

* fixup/fixup_filters.sh: General cleanup, removed prompts to select one of
  several possible filter programs.  Instead it just picks the one which in
  my experience (David Chappell's) produces the best results.  I may be back
  later and add override switches.

* fixup/fixup_inetd.sh: Added code to handle absence of tcpd and System V
  Inetd.

* Moved code and documents under licenses other than the PPR license to the
  nonppr/ directory.  Left symbolic links to these files at their proper
  locations.

* Changed defauld HOMEDIR to /usr/lib/ppr and default SHAREDIR to
  /usr/share/ppr.  This should bring PPR into compliance with the FHS.

* Moved ppad/init_media_db.sh and some of ppad/Makefile into
  fixup/fixup_media.sh.

* Created an RPM spec file.  Components: ppr-1.41b1.spec,
  makeprogs/global.mk.4rpm.

* ppr/ppr_editps.c: disabled the editps level argument for an editps script
  since it confuses sed.  It isn't used, so it will remain disabled until
  a solution is found.

* www/prn_addwiz.cgi: Added a function for code to guess at suitable printer
  comment based upon the interface, printer address, and PPD file name.
  Currently it only contains code for AppleTalk.


1.41b2, 15 September 2000--18 December 2000

* www/cgi_error.pl:error_doc(): added optional charset and content_language
  parameters.

* fixup/fixup_accounts.sh: fixed bug which prevented creation of the account
  pprwww.

* include/global_defines.h: fixed definition of EDITPSCONF to look for it in
  $HOMEDIR rather than in $SHAREDIR.

* Makefile: changed the name of the source archive from ppr-src-x.xx.tar.gz
  to ppr-x.xx.tar.gz.  This was done so that it will conform to the file
  naming conventions suggested for uploads to ibiblio.org (formerly sunsite).

* Changed the "ppop progress" output to include the jobid, for, bytes sent,
  and total bytes.

* www/prn_control.cgi.perl: added total bytes, bytes sent, and user to
  things displayed.

* www/prn_control.cgi.perl, show_jobs.cgi.perl: Added controls= CGI variable
  to turn of the buttons and other controls.  This will be used for a
  strictly informative queue display next to some public lab printers.

* printdesk/PPRcontrol.pm: fixed lots of regular expressions which tested
  ppop output to be anchored to the start of the string.

* fixup/fixup_obsolete.sh: added code to deal with the move of /usr/ppr to
  /usr/lib/ppr and /usr/share/ppr.  The old one is moved to /usr/ppr_old
  and a new /usr/ppr is created with symbolic links to the new locations.
  Also added error checking to halt the script if one of the commands
  fails.

* fixup/fixup_cron.sh: Changed it to overwrite ppr's old crontab.

* pprdrv: fixed some typos and other small errors which was preventing
  .TTF font downloading from working.

* Moved printdesk/PPRcontrol.pm to libscript/PPOP.pm and moved its place in
  the Perl heirarcy from PrintDesk::PPRcontrol to PPR::PPOP.

* Added code in /makeprogs/ to generate PPR.pm which will eventually replace
  paths.ph.

* misc/custom_hook_docutech.perl: Added code to print the special Xerox header.

* fixup/fixup_inetd.sh: Changed so that the new inetd.conf lines are inserted
  commented out.  For now we will leave it up to the system administrator to
  decide if these services should run.

* www/README.txt: brought up-to-date.

* www/ppr-httpd.perl: Fixed timeouts according the example in the perlfunct
  man page's alarm() description.

* Added editps/Qt_2.2.0.

* Added new directory docbrowse/ and added it to the top level makefile.
  This directory contains an early version of a WWW interface for viewing
  the man pages and other documentation installed on a computer.  It
  includes CGI scripts which use rpm to find the documentation files.

* Ran tests in tests/ and accepted a new warning about missing "%%Trailer:"
  comments and another failure due to a change in the location of the
  mfmodes.conf file.

* Fixed "ppop details" which was core dumping if the job's filter chain list
  was empty (which was represented by a null pointer).

* Fixed a bug in pprd/pprd_printer.c:printer_look_for_work() which caused
  pprd to chew up loads of CPU time and keep a printer idle if it got a job
  that could never be printed on a certain printer due to failure to meet
  some requirement.  The problem was that printer_look_for_work() was
  calling pprdrv_start() when it should have been calling printer_start().

* Added FUNCTION4DEBUG() to include/pprd.h and used it to eliminate the
  warnings from pprd.

* Fixed several bugs in the PPR daily and hourly cron jobs.

* Added note to misc/remove_ppr.sh saying that it is not up-to-date and may
  be removed at some future date.

* Added a "%preun" section to the ppr-1.41b2.spec file (for RPM packaging).

* Fixed fixup/fixup_perms.sh to create /etc/ppr/htpasswd if it doesn't
  exist.

* Fixed fixup/fixup_filters.sh to send the progress of the search for
  filter programs to stdout rather than stderr.

* fixup/fixup_accounts.sh: added -M option to useradd command (for Linux).
  This suppresses the copying of skeleton files into the home directory.

* fixup/fixup_conf.sh: removed code to copy ppr.conf.sample to ppr.conf
  since there is already code in fixup/fixup_samples.sh to do this.

* fixed/fixup_conf.sh: fixed it to send its progress output to stdout
  instead of stderr.  This allows the RPM package to throw this output away.

* Added description of each top-level source code directory to README.txt.

* www/ppr-httpd.perl: Added commented-out code for anonymous access.
  Incredibly some users considered the lack of authentication code in the alpha
  version to be a feature!

* ppop/ppop.c:job_permission_check(): changed code to disallow operation if it
  fails to open the queue file.  Also fixed the code which constructed the
  queue file name so that it uses 0 if the subid is the wildcard subid.

* libppr/jobid.c: changed remote_jobid() and local_jobid() to not print the job
  subid unless it is greater than 0.  Previously they printed it if it was not
  0.  That meant that they printed the wildcard subid (-1).

* pprdrv/pprdrv_buf.c: changed WRITE_BUF from 4096 to 32768.

* libppr_int/int_copy.c: changed BUFFER_SIZE from 5120 to 32768.

* pprd/pprd_queue.c:queue_new_job(): fixed an error in testing the return
  code of destid_assign().  Because it wasn't interpreted properly,
  submitting a job to a non-existent queue would cause a crash.

* pprd/pprd_queue.c:queue_unlink_job_2(): changed sprintf() to
  fname_sprintf().

* pprdrv: adding fields for postscript_size and total_bytes_sent to the
  printlog.

* www/show_printlog.cgi.perl: added support for new printlog fields.

* Changed pprdrv and the interfaces to set the file descriptors which are
  written to to non-blocking mode.  I hope this is the right thing to do.
  Somehow I was getting away with not doing it, but this may be because
  the pprdrv buffer size was set to 4096 (which just happens to be the
  Linux pipe size).

* Removed "ppad pageslimit" and replaced it with "ppad limitpages" and
  "ppad limitkilobytes".  Made the changes to pprdrv to support these
  settings.

* commentary/audio.perl: fixed it to recognize the "level=" option (as
  documented) rather than "severity_threshold=" (which wasn't).

* Changed pprd, pprdrv, and ppop to support a status of "stranded".  A
  stranded job can't be printed because there is no suitable printer
  available.  Previously such jobs were "arrested".

* Fixed init_and_cron/cron_hourly.sh.  It contained a syntax error.

* commentators/xwin.sh: removed spurious "\n" from the end of the string
  echoed to xmessage.  Also changed /bin/echo to echo.

* pprd/pprd_ppop.c:ppop_dispatch(): fixed the code that deletes the reply
  file is ppop is no longer there to receive the signal.

* Added libppr/mkstemp.c:mktemp() and changed C code to use it (except
  for pprd/pprd_ppop.c which uses its own code.

* Added libscript/mkstemp.c.

* Added include/cexcept.h (and files in nonppr/).

* Started to split libppr into libppr and libgu (generally useful).  The
  libgu functions will be renamed with names starting with "gu_".

* pprdrv/pprdrv_flag.c: fixed call to pslinef() when printing the user
  name.  It was passing the reversed user name as the only argument.
  Added "%s" as a previous argument.  It was choking on "user names"
  with "%" in them.

* papsrv/papsrv_ppd_parse.l: fixed "*LanguageLevel:" parsing.  This should
  make scanned Acrobat documents print much faster.

* Fixed pprd so that canceling a job that is being seized no longer crashes
  the spooler.

* Fixed bug in pprd which caused it to decrement the node reference counts
  in the queue reload code if a job was held.  This resulted in the spooler
  crashing if the job was ever released and printed (or probably if it was
  canceled).

* Cleaned up the code to handle pprdrv exits.  This should remove some more
  rare bugs.  It was impossible for me to verify that the old code was
  correct.

* Expanded the auxiliary information reported by "ppop status" to allow for
  an arbitrary number of lines.  This required changes to pprd, pprdrv,
  and ppop.  Later changes to the WWW interface will be required to display
  this additional information.

* Added an "Operation:" line as one of the possible lines reported by
  "ppop status".  This line tells what pprdrv is doing.

* Separated the LaserWriter-style status line from the PJL status line so
  that both may be displayed if available.

* Separated the "Job on Printer:" ppop status line from the "Status:" line.
  Also added code to weed out "Job on Printer:" lines which simply reflect the
  job pprdrv is printing.

* Changed "ppop status" to report the retry number and countdown for the
  "otherwise engaged or off-line" state.

* Added pprdrv feedback code to detect "%%[ PPR connecting ]%%" and
  "%%[ PPR connected ]%%" so that interfaces that can take a long time to
  connect can send information about progress to pprdrv for display on the
  "ppop status" "Operation:" line.  Added statements to print these lines to
  the tcpip, atalk, and lpr interfaces.

* Added "ppad userparams" and support in pprdrv for JobTimeout, WaitTimeout,
  ManualfeedTimeout, and DoErrorPage.

* Added code to "ppop status" to convert the auxiliary status information from
  an internal machine-readable format to an internationalizable display format.

* Added "ppad pagetimelimit" and all of the required support in pprdrv
  and "ppop status".

* Removed old implementation or describe_postscript_error() from
  pprdrv/pprdrv_reason.c.

* samba/ppr2samba.c: added "ppr2samba-prototype:" line as a step toward
  phasing out the second argument to the "ppr2samba:" line.

* www/prn_properties.cgi.perl: moved code to print HTML code for labeled entry
  widgets into functions, implemented the "Samba" tab, added pagetimeout
  to the "Other" tab, added "Userparams" and "Limits" tabs.

* Added libscript/readppd.pl.

* www/prn_properties.cgi.perl: Added working "Bins" and "Features" tabs.

* Added ppdopts to the "ppop -M show" output.  Added "ppop bins set".  Changed
  the order of "ppop show" output.

* Added documentation to pprdrv/pserrors.conf.

* Added "ppad grayok" and "ppad bins set".

* Ported the "Samba" tab code from www/prn_properties.cgi.perl to
  grp_properties.cgi.perl and fixed the "ppad group addon" command
  so that it works.


1.41, 21 December 2000--8 January 2001

* libuprint/uprint-newconf.c: Added --remove option (which is used by the
  RPM package).

* Moved puts_tabbed() from ppop/ppop_cmds_listq.c to ppop.c and fixed
  "ppop status" so that it won't print tabs in the fields of the
  auxiliary status output when running in machine readable mode.  This was a
  bug because an HP 5Si was returning a tab in what it claimed was the
  LCD message.  The result was that the PJL status was being truncated in
  the WWW interface.

* www/prn_properties.cgi.perl: fixed foreach to work with Perl 5.005
  (appearently Perl 5.6 allows "foreach my $i qw(x y z)" but Perl 5.005
  doesn't.

* docbrowse/docs_util.pl: fixed errors in calls to error_doc().

* fixup/fixup_inetd.sh: fixed bug which caused it to use "/usr/sbin/tcpd"
  for the path to the TCP Wrappers program even if it was found elsewhere.

* ppr/ppr_main.c:write_queue_file(): added code to unlink() the queue file
  if fclose() fails.

* fixup/fixup_accounts.sh: split useradd clause into one for Linux (with -M)
  and for other systems (without -M).

* www/prn_show_queues.cgi.perl: fixed code to deal with the new multiple
  auxiliary messages.  This included adding two new printer icon variants
  for "printing but off-line" and "printing but error".  (Note that with
  other factors such as "charge" and "rejecting", more than two new icon
  files were created.)

* Moved most of the HTML files for the WWW GUI from $SHAREDIR/www to
  $SHAREDIR/www/gui.

* Moved docbrowse/ into www/.

* Added www/login_cookie.cgi.perl, its HTML files, and code in ppr-httpd.perl
  to accept this kind of authentication.  Added a link to it to
  show_queues.cgi.perl.

* www/q_icons/make_composite_figs.perl: In Linux Mandrake 7.2, ImageMagick's
  montage command (which never did it perfectly) really messes up the icons.
  So, it was replaced with a pipeline using ImageMagick's convert followed
  by pnmflip, pnmcut, and pnmtopng.  This produces the highest quality
  icons so far.

* Fixed "ppad addon" and "ppad group addon" so that setting an addon value
  to an empty string deletes the value.

* Fixed "ppad group show" to display addon values.

* libppr/jobid.c: fixed logic in local_jobid() which decided when to print
  the subid.

* papsrv/papsrv_authorized.c:preauthorize(): fixed code so that it won't
  case an empty paramter to be fed to "ppr -f".  Instead it now uses
  "[blank Macintosh owner]".

* www/cgi_auth.pl: replaced the terse notice "Your web browser should send
  authentication." with a much longer one that suggests ways to work around
  a lack of MD5 Digest authentication.

* Fixed "ppop -M dest" output to turn off translation.

* Integrated latest French translation files from Olivier Tharan.

* Fixed www/prn_addwiz.cgi.perl to search for getzones.

* Fixed code in ppr-1.41.spec remove code which wasn't removing the standard
  ACL files.  (It was supposed to remove them if they were still empty.)

* Removed from fixup/fixup_perms.sh the defective code which created an
  empty $CONFDIR/htpasswd.  It is not needed since ppr-passwd does it
  if necessary.

* Fixed www/prn_addwiz.cgi.perl to once again sort AppleTalk printer names.

* Fixed bug in cgi_data.pl read_cgi_data() which had broken handling of
  multiple values with one name.

* Fixed "ppop lpq" to work again with the extended auxiliary status.

* pprdrv/pserrors.conf: changed "Job timeout expired" to "PostScript timeout
  expired" since "JobTimeout" is an official timeout name in PostScript and
  refers to a specific timeout whereas the error "timeout" means any
  timeout.


1.42, 5 January 2001--30 January 2001

* Added include/ppr_query.h and libppr/query.c.

* fixup/fixup_init.sh: fixed code to look for /etc/rc.d/init.d before
  /etc/init.d so that it would not mistake Mandrake Linux for a generic
  System V release 4.0 system.  The result of this bug was that it was
  setting up PPR to start only at run level 2.

* www/ppr-httpd.perl: added missing test to see if MD5 Digest authentication
  had succeeded before trying Cookie authentication.

* www/show_queues.cgi.perl: removed test which decides whether or not not
  display the "Cookie Login" button.  IE 5.5 no longer puts "DigExt" in its
  User-Agent string.

* www/cgi_run.pl: fixed shell_parse() to handle things like
  "--responder-options='printed=no'" properly.

* www/login_cookie.cgi.perl: removed spurious "defer" attribute from the
  script tag that loaded the MD5 code.  This caused a problem in IE 5.5 since
  the function is executed as soon as the page finishes loading.

* Fixed "ppop modify" so it will use a subid of 0 if none is specified.  (A
  change in a library function caused it to use -1.)

* Added "vendors/ppd_adobe/ColorPASS-Z76 Color Server".

* pprd/pprd_destid.c:destid_printer_bit(): fixed it to return a correct result
  even if the destid is a printer.  Previously it caused a crash.  Also
  improved error checking throughout the whole module.

* www/prn_control.cgi.perl: Suppressed display of page progress bar if
  number of pages is zero.  Failure to do this would result in a
  division by zero error.

* www/prn_control.cgi.perl: Fixed handling of "job: " lines in the
  "ppop status" output.  Now it is only used as the current job name
  if we aren't printing a job.

* pprdrv/pprdrv_custom_hook.c: Fixed to remove line length limit on the lines
  from the custom program.

* added libscript/acl.pl.

* Fixed www/show_queues.cgi.perl and job_modify.cgi.perl so that they will
  run ppop with "-u" rather than "--proxy-for" if the user is in
  /etc/ppr/ppop.allow even if he is not in /etc/passwd.

* Fixed "ppop modify" so it checks permission before modifying a job.  The
  call to the check function was missing.

* www/job_modify.cgi.perl: changed cgi_data_peek() to cgi_data_move()
  for the job title.

* www/show_queues.js: widened the "Delete Queue" window from 450 to 600
  pixels.

* www/delete_queue.cgi.perl: broke the internationalizable messages up into
  separate messages for printers, groups, and aliases.

* libscript/PPOP.pm: added media() and mount().

* Deleted blank line between printers in "ppop -M media" output.

* pprd/pprd_media.c: changed so that bins on which nothing is mounted
  return an empty medium name in "ppop media" output rather than "<invalid>".

* Changed "ppop mount" and pprd so that "" can be mounted to indicate that
  a bin contains no paper.

* Added www/prn_media.cgi.perl and tied it into prn_control.cgi.perl.

* Renamed ppr-commentary-httpd to ppr-push-httpd.

* www/ppr-httpd: added ability to defer to ppr-push-httpd.

* Ceased to install ppr-push-httpd on its own port.

* Ceased to install the popup message receiver because it will soon be replaced
  by a CGI script run from ppr-httpd.

* www/prn_addwiz.cgi.perl: fixed it so that if the tcpip interface is choosen
  and the hostname doesn't contain a dot, the ":9100" (or whatever port number
  will still be excluded from the suggested queue name.

* www/README.txt: made security warnings less scary, removed information about
  Apache and the commentary server.  The commentary server has become the
  push server and is now called directly from the main PPR web server.  The
  Apache instructions don't account for the push server and so are best left
  out for now.

* www/index.html: divided the list of links into "Applications" and
  "Documentation".  Made the printer control panel open its own window.

* www/show_queues.cgi.perl: made the button always say "Close" and added
  an onclick event handler to close it.


1.43, 1 February 2001--28 March 2001

* added libgu/gu_snmp.c.

* Added int_snmp_status() to libppr_int/int_con_tcpip.c.

* libppr/datestamp.c:datestamp(): fixed to return "<date missing>" rather
  than a NULL pointer if it fails.

* Applied some fixes for UWIN (which still doesn't work).

* pprdrv/pprdrv_buf.c: reduced BUGSIZE from 32768 to 8192 since the larger
  value was much bigger than any pipe I know of.

* Fixed responders/xwin.sh, filters_misc/dvi.sh, filters_misc/pdf_xpdf.sh,
  and filters_misc/pr.sh to use PPR's mkstemp.

* Fixed filters_misc/make_dvips_conf.c to get the default page size from
  /etc/ppr/ppr.conf.  Something should probably still be done to make it
  adapt to page-size changes.

* Changed makefiles to make more extensive use of rules, $@ and to use OBJSx=
  as temporary storage for the targets lists.  This tends to shorten and
  simply the makefiles.  Also, added dividers and a standard section order.
  Not all makefiles have yet been updated.

* Copied procsets/Trincoll-dmm-nup-3-5 to Trincoll-dmm-nup-3-6 and changed
  pprdrv/pprdrv_nup.c to use the new one.  Re-wrote much of it so that
  DMM-nup-dict can be read-only.  The state which was formerly stored in
  it is stored in DMM-nup-state.  Also fixed setpapertray, lettertray, letter,
  and so forth to call the original ones if N-Up is not activated.

* misc/ppr-sync.sh: fixed to obey $HOMEDIR and $TEMPDIR and to use our
  mkstemp.

* Added code to ppr-1.43.spec to simply print a message if the killall of
  Inetd failes.  (This is to prevent a scary message from rpm which suggests
  that the install failed.)

* misc/ppr-sync.sh: added code to use ssh and scp instead of rsh and rcp if
  the directory ".ssh" exists in $HOMEDIR.

* Added "status/reason" to "ppop qquery" and changed "copies" so it returns
  an empty field if the number copies is unknown (previously it returned
  "1?").

* Fixed the qquery() method in libscript/PPOP.pm so that it doesn't delete
  empty fields at the end.

* Expaned the buffer size for libppr/ppr_gcmd.c:ppr_get_command() from
  256 to 1024 characters.

* Upped the number of words that ppop can take on a line in interactive mode
  from 16 to 64.

* fixup/fixup_perms.sh: added chmod to make $VAR_SPOOL_PPR/dvips group-
  writable.

* Fixed "ppad ppdopts" so that it will work in interactive mode again.

* Fixed ppad/ppad_utils.c:list_to_string() so that it doesn't garble the
  first item.

* Fixed www/show_queues_nojs.cgi.perl.  It wasn't correctly passing the
  printer or queue name.

* Fixed "ppad options" so that it will join multiple argv[] items to make
  the options list and so it will print a warning if someone clears the
  options by setting them to "none" (an obsolete feature).

* Added tests/test-ppad/.

* Fixed www/show_queues.js to mostly work with Mozilla.

* Changed the WWW interface tabbed widget, list jobs, and job modify and
  their style-sheets to take up less space and look better in IE 5.5 and
  Mozilla 0.7.

* Renamed ppr_strsep() to gu_strsep() and ppr_strsep_quoted() to
  gu_strsep_quoted().

* Fixed ppop and ppad so that they can handle quoted strings in interactive
  mode.


1.44b1, 28 March 2001--7 May 2001

* Added pprdrv/pprdrv_pjl_messages.c and pprdrv/pjl-messages.conf.

* Fixed ppr --commentator-address and --commentator-options.  (They were
  doing --commentator!)

* Moved pprd's queue file name parsing code into libppr/parse_qfname.c
  so that pprdrv can use it too.

* Added code to pprdrv to call parse_qfname.c and to use the result when
  printing the job id on the flag pages.

* Added a 9th argument to commentators.  This ninth argument is a
  "canned message" which they can use instead of constructing their own.

* Cleaned up the xwin commentator and added code to recognize the serverity=
  option (with a default value of 3).

* Reversed the two raw arguments for commentator stall messages.  Now the
  operation name comes first and the time in minutes comes second.

* Removed misc/make_bindist.sh and gather_stats.perl.

* Changed misc/Makefile to install misc/xmessage.tcl as
  $HOMEDIR/lib/xmessage.

* Fixed commentators/xwin.sh and responders/xwin.sh so that they try wish
  (with the above mentioned xmessge script) and rxvt before xterm if xmessage
  isn't found.

* interfaces:gs_master.sh: removed -sFONTPATH option since we no longer
  store fonts in $SHAREDIR/cache/font.

* www/*.css: replaced "font-family: serif" with "font-family: times,serif"
  due to a bug in IE 5.5 prior to SP1.  This bug causes it to display
  rectangles for the characters of the "serif" font.

* www/commentary_select.cgi.perl: removed checkboxes for status and errors
  without updates.  (The concept of updates is being dropt.)

* Removed all references to the concepts of status updates and mundane
  exit codes as separate types of commentary events.

* Changed the WWW commentatary monitor to use a hidden frame or an Active X
  instance of the Windows Media Player to play the messages instead of a
  100x100 pixel window.

* libgu/snprintf.c: commented out code which tried to pull short ints from
  the "..." arguments.  This isn't possible because they get upgraded.

* pprdrv/lw-messages.conf, libscript/speach_commentary.pl: adjusted messages
  for greater consistence and removed support for speaking obscure
  messages from the QMS-PS 800 II.

* Moved the stuff in libppr_int/ into libppr/.  In the process I discovered
  that libppr_int/throw.c wasn't even being compiled.  It is now in
  interfaces/.

* pprdrv/pprdrv_lw_messages.c: removed support for $CONFDIR/lw-messages.conf
  (including appending new messages to it).

* Changed MAILPATH to SENDMAIL_PATH and eliminated MAILX.

* Configure: applied fix from Tim Leamey <tcleamey@ucdavis.edu> for HP-UX
  10.2.

* pprd/ppop: applied patch from Tim Leamey <tcleamey@ucdavis.edu> to add
  "ppop last" to move a job to the tail of the queue.

* www/login_cookie.cgi.perl, docs_*.cgi.perl: added -T to the Perl invocation
  at the top and fixed the problems thus exposed.

* Changed sprintf() to snprintf() or ppr_fnamef() in numberous places.

* Made big changes to the new SNMP printer status system.  The codes are
  now converted to strings in pprdrv and pprdrv now keeps track of how
  long a particular fault has been present and arranges for it to be
  announced every 5 minutes.

* fixup/fixup_inetd.sh: added code to generate an Xinetd configuration file
  instead of editing the Inetd configuration file.

* www/cgi_run.pl:opencmd(),run(): changed them to only clear the path if the
  program name starts with a slash.  This will allow scripts that depend on
  a cleaned PATH to work without breaking old ones.

* Added "snmp_status_interval=" to the tcpip interface.

* ppop/ppop_cmds_other.c: Changed "ppop status" to show the duration of the
  fault condtion if it is longer than 2 minutes and to show how old the news is
  if it is older than 5 minutes.

* pprdrv: revamped pprdrv_pjl_message.c and added code so that PJL codes
  are matched up with SNMP PrinterDetectedErrorState bits so that they can
  serve the explain condition reported by SNMP.

* Added pprdrv/pprdrv_snmp.c.

* Changed lw-messages.conf format and integrated pprdrv_lw_messages.c with
  the SNMP status system in the same was as pprdrv_pjl_message.c.

* Added a field to printlog.  It is the job title if available, if not
  available, the job filename, blank if neither is available.  (Feature
  suggested by Espen H. Koht.)

* responders/write: replaced use of $EECHO with a here document.

* commentators/: added write.sh and mail.sh, added parsing of "severity="
  to all responders that didn't have it.

* commentators/audio.perl, responders/audio.perl: added "-w" to
  "#! /usr/bin/perl".

* Moved the COM_* defines out of include/global_defines.h and into
  include/commentary.h and added code to generate and install
  commentary.sh and commentary.ph to libscript/Makefile.

* libscript/speach_commentary.pl: changed to use commentary.ph.

* pprdrv/pprdrv_writemon.c:online_online(): fixed bug which would cause the
  page clock value to be the current time in seconds since the Unix Epoc
  (instead of 0) if the initial reported state of the printer was off-line.

* libgu/gu_sscanf.c: added %t to read time_t.

* www/test_components.cgi.perl: removed test for the Perl MD5 module since
  the code to use it is commented out and we will eventually use the
  Digest::MD5 module from Perl 5.6.

* www/prn_control.cgi.perl: adjustments for changes in the way "ppop -M status"
  labels the LaserWriter status.  More changes will be needed later to display
  the new status information.

* pprdrv/pprdrv_feedback.c: Added code to bail out if a 50xxx PJL code is
  received.  This seems to be necessary because the HP 5Si sometimes loses
  track of the job after throwing error 50028.

* Added --verbose to ppop to limit the information displayed by
  "ppop status".  Currently it hides the raw status information (from
  LaserWriter messages, PJL, and SNMP).

* ppop/ppop_cmds.qquery.c: Added pagesxcopies to "ppop qquery" and changed the
  string for unknown number of pages, copies, etc. from "???" to "?".

* www/show_jobs.cgi.perl: Made pagesxcopies a default column instead of the
  pages and copies columns.

* www/show_jobs.cgi.perl, qquery_xlate.pl: changed the "Settings" window so
  that it displays long descriptions of the columns.


1.44b2, 8 May 2001--5 June 2001

* Makefile: changed "make realclean" to "make distclean".  Added "make
  veryclean" to remove the generated documentation files as well.

* Added libgu/gu_nonblock.c:gu_nonblock() and changed all code that called
  fcntl() directly.  This included interfaces/atalk_ali.c,atalk_cap.c,
  and libppr/int_copy_job.c.

* Fixed papsrv/papsrv_ali.c to use gu_set_cloexec() rather than calling
  fcntl() (which is was doing in the old fashioned way, setting the flags
  to 1.)

* Added pprdrv/pprdrv_rip.c and hooked it into pprdrv.

* Added display of RIP information to "ppad show".

* pprdrv/pprdrv_interface.c: changed code so that control-d's aren't sent for
  non-PostScript jobs even if the jobbreak method is "control-d".

* Fixed pprd and pprdrv to set the close-on-exec flag on more file
  descriptors.

* libppr/int_copy_job.c: Fixed a problems which caused control-T's to be
  schedualed when there was still data in the transmit buffer.  (An
  assertion check caught this.)

* Added libgu/gu_fscanf.c, an very limited implementation of fscanf() that can
  only understands %d, literals, and whitespace, and changed ppr/ppr_outfile.c
  and ppop/*.c to use it.  (This was done because dietlibc doesn't provide
  an fscanf().)

* pprd/pprd_pprdrv.c:pprdrv_exit(): Cleaned up code, revised messages,
  and added support for 5 new more specific exit codes which are
  equated with EXIT_PRNERR and EXIT_PRNERR_NORETRY.

* pprdrv/pprdrv_ppop_status.c: added code to put an "exit:" line in the
  printer status file to indicate the exit status.

* ppop/ppop_cmds_other.c: added code to display the exit status if it
  indicates a fault.

* Added create= option to the dummy interface.

* libuprint/lpr_connection.c:uprint_lpr_make_connection(): changed error
  code for DNS failure from UPE_TEMPFAIL to UPE_BADSYS.

* Fixed all of the interfaces to use the new more explicit exit codes
  where appropriate.

* makeprogs/gen_paths.c: added "1;" at end of file for --pm and --ph.

* pprdrv/: added code to parse a "*pprRIP:" line in the PPD file.

* ppd/ghostscript/ghostscript_master: added *pprRIP: lines the the sample
  PPD files, but left them commented out.

* fixup/fixup_inetd.sh: added "disabled = yes" to the Xinetd configuration
  for consistency with the configuration generated for Inetd.

* makeprogs/gen_paths.c: added "$SIZEOF_struct_Media=" for --pm.

* www/prn_media.cgi.perl: used $SIZEOF_struct_Media instead of a hard-coded
  value of 76.

* libppr/int_snmp.c:int_snmp_status(): changed it so that it takes an
  already created gu_snmp object rather than creating one of its own.
  Changed libppr/int_con_tcpip.c and interfaces/tcpip.c to match.  This
  not only saves the cost (probably negligible of creating and destroying
  the UDP socket for every query, it also allows interfaces/tcpip.c to
  set the SNMP community string.

* interfaces/tcpip.c: added option "snmp_community=".

* libgu/gu_strsep2.c: added "discard" option (which may be NULL).  It is a
  list if characters which should be discarded on either side of the quoted
  string.  It will generally be NULL or " \t".

* pprdrv/pprdrv_lw_messages.c: Fixed a few bugs which caused parse errors
  and garbled status.

* filter_dotmatric/prop.c: fixed bug which caused core dump with dietlibc.
  The problem was that it would exceed an array bound by one if a PostScript
  character name in the AFM file wasn't used in the CP437 character encoding.
  This is a very old bug.  I wonder why no one found it before.

* libppr/int_acache.c: changed sprintf() to snprintf() and fixed unnoticed
  buffer overflow.

* ppr/, interfaces/, pprdrv/: Eliminated sprintf().  That leaves only the
  libgu/gu_sprintf() test code and lprsrv/olprsrv.c (which is obsolete).

* test/test-ppad/: accepted appearance of "rip" line in "ppad -M show"
  output.

* init_and_cron/ppr-clean.perl: fixed typo in directory name which was
  causing the script to die.

* www/show_queues.js: fixed some problems related to scrolling and Mozilla.

* libuprint/*: Removed use of the "ppr -C" switch in favour of the newer
  form "ppr --title".

* libuprint/uprint_argv_ppr.c: changed to put quotes around the argument
  to "-o title=".  This will need more work to handle embedded quotes.

* ppr/ppr_main.c, ppr_infile.c: fixed to handle quoted filter option values.

* libppr/options.c: fixed to handle quoted option values.

* Removed vendors/ppd_hp/"HP LaserJet 4050 N", and "HP LaserJet 4050 Series"
  since they both have the same ModelName and there have been reports that
  they result in the production of bad PostScript and because the "HP
  LaserJet 4000 Series" PPD file probably works for these printers as well.
  Added code to remove them to fixup/fixup_obsolete.sh but left it commented
  out until more is known.

* Changed the statement of the PPR license to be exactly the same as the
  new BSD license (the one with the advertising restriction removed).  Of
  course, the references to "the regents" have been changed to "copyrigh
  holders".  The previous statement was the same in substances.  I have done
  this to avoid any possible question that PPR is distributed under the
  BSD license.


1.44, 5 June 2001--31 July 2001

* moved misc/modes-3.3.mf to filters_misc/ and improved the documentation at
  the top of filters_misc/mfmodes.conf.

* re-organized nonppr/ a little.

* Added makeprogs/save_symlinks.sh and changed top-level Makefile to use it.

* Converted source tree into a CVS sandbox.

* makeprogs/installdata.sh: added clause to skip things named "CVS".

* Fixed NULL pointer problem in "ppad rip".

* Changed pprdrv/pprdrv_rip.c:rip_start() to use a fixed path of
  HOMEDIR/lib/ppr-gs for Ghostscript if the RIP name is "ppr-gs".  This
  is for a future special Ghostscript distribution for use with PPR.

* Added O_EXCL to the open() calls for the port in the interfaces/parallel.c
  and serial.c as recomended in the CUPS programmer's manual.

* ppop/ppop_cmds_listq.c:ppop_lpq_banner(): changed separator for the new
  printer status messages from "; " to "\n\t".  This is because Samba has
  a 100 byte line length limit in its parsing code.  Who knows what it will
  make of the new messages.

* Uncommented the fixup_obsolete code to remove the "HP LaserJet 4050 N"
  (where that name came from is a mystery), added updated "HP LaserJet 4050
  Series" and "HP LaserJet 4000 Series" PPD file form HP (off of
  Sourceforge).

* Removed TrinColl-PPR-dmm-nup-3-5 and moved TrinColl-PPR-dmm-nup-3-6 back
  into procsets.  Future versions will be under the PPR license rather
  than public domain.

* Fixed Configure so that is won't identify RedHat's "2.96" GCC as an old
  one with the strength-reduce bug just because it only has a two part
  version number.

* Configure: fixed typo that caused the FREEBSD system-dependent section
  of makeprogs/global.mk to be omitted.

* Numberous small fixes for problems in the make rules, failure to create
  destination directories, failure to use the make program specified
  in include/global.mk, etc.  It now compiles on Solaris 8; FreeBSD 4.3R;
  and Debian 2.2 i386, Alpha, Sparc, and PowerPC.  (This testing was done
  on the Sourceforge.net compile farm.)

* ppd/generic/: Replaced the two separately maintained PPR Generic PPD files
  with three built from a common file using the C pre-processor.

* ppr/: added ability to read *N-Up features to turn on PPR's internal
  N-Up support.  The keywords are "*pprN-Up" and "*pprN-UpBorders".

* Renamed ppr_realloc() to gu_realloc().

* pprdrv/pprdrv_rip.c (and other files) fixed a problem in rip_fault_check()
  which caused it to miss error messages from the RIP.  This require the
  addition of a parameter to several functions to tell them whether to
  attempt a flush before closing the RIP or the interface.  Without this
  printer_flush() got called recursively since fault_check() is called
  from printer_flush().

* Changed order of targets in makeprogs/global.mk.unconfigured to put
  "cant" first.  When it is included from the makefile in ppr-gs, just
  catching "all" isn't enough since "all" has many dependencies in the
  Ghostscript build process.

* fixup/fixup_inetd.sh: fixed to to recognize if the service line is already
  in /etc/inetd.conf but commented out.

* Changed samba/smb-protos.conf to use "%U@samba" instead of "%m@samba" for
  the -X argument.

* Fixed ppop/ppop.c:job_permission_check() to return 'OK' if the queue file
  does not exist.  This brings the code back in line with the comments.


1.50a1, 1 August 2001--27 February 2002.

* Replaced makeprogs/global.mk.4rpm with a series of them for different
  arch-vendor-os combinations.

* Makefile, docs/Makefile, docs/*/Makefile: corrected mistaken use of
  MAKEFLAGS.

* Changed installation of login_ppr.sh and login_ppr.csh to copy them
  into /etc/profile.d rather than place links to them there.  The master
  copies are now installed in $HOMEDIR/fixup/ rather than $HOMEDIR/lib/.

* makeprogs/gen_paths.c: Removed "package main;" from top of paths.ph since it
  seems to cause problems with mod_perl CGI emulation and whatever once
  required it is appearently using PPR.pm now.

* Added tcl/.

* Added the job title to the arguments passed to the interface programs.
  Changed the lpr interface program to pass it to the remote system.

* pprd/pprd_ppopint.c: Fixed incorrect message in case where "ppop move" moves
  no files because they are all being printed.

* pprd/pprd_destid.c:destid_local_is_group(): fixed to return the current
  answer for the first group id when the printer table is full.  It was
  returning false for a group with destid 150 when there were 150 printers
  with ids 0--149.  This bug would cause a spooler crash if "ppop start"
  was run on a faulted printer since destid_local_get_member_offset() would
  panic and throw an assertion failure since it though it was being asked
  to find a printer in a printer.

* include/global_defines.h: Increased MAX_PRINTERS to 250.

* pprd/pprd_media.c: Replaced references to MAX_PRINTERS with calls to
  functions in pprd_destid.c.

* www/prn_addwiz.cgi.perl: set to hide gs* interfaces.

* interfaces/: removed gs* interfaces.

* ppd/ghostscript/: uncommented *pprRIP: lines.

* ppad/ppad_printer.c:printer_rip(): fixed so that "ppad rip _printer_" can
  clear the RIP setting rather than triggering a spurious syntax error.

* interface/lpr.c: fixed so that if uprint_lpr_response() returns -1 on the
  command (start job), then it exits with EXIT_PRNERR as before rather
  than EXIT_PRNERR_NORETRY_ACCESS_DENIED.

* vendors/ppd_hp/: added "HP LaserJet 8100 Series" and "HP LaserJet 8150
  Series" from <http://hp.sourceforge.net/>.

* samba/ppr2samba.c: added message identifying the printer when ppd_open()
  fails.

* www/prn_properties.cgi: added [RIP] tab, added information extracted from
  the PPD file to the [PPD] tab.

* Moved nonppr/tcl7.5_hacked into tcl/ and integrated the Makefile with the
  PPR build system.

* include/ppr_exits.h: Added PPREXIT_NOTPOSSIBLE.

* ppr/ppr_conffile.c: Fixed so that aliases don't inherit the switchset,
  passthru or acls of the thing they are an alias for.  I haven't firmly
  decided if they should inherit ACLs or not, but inheriting passthru really
  reduced their usefulness.

* samba/smb-protos.conf: added "min print space = 2048" to [pprproto]
  section.

* ppad/ppad_printer.c:printer_rip(): fixed core dump bug for "ppad rip
  myprn" (to clear the RIP).

* Added code so that "ppr --page-list" and "ppad modify page-list" work.

* Changed "-pages" file format, adding a blank line after the section for
  each page.  This simplifies parsing code in pprdrv.

* tests/: accepted changes caused by the addition of a "rip" field to the
  "ppad -M show" output.

* tests/: fixed tests which used "%!PS-Adobe 3.0" instead of
  "%!PS-Adobe-3.0".

* libuprint/uprint_print.c:logit(): changed to omit argv[0] and to put
  double quotes around empty arguments.  (Previously it only put double
  quotes around arguments with spaces in them.)

* libuprint/uprint_print.c:uprint_print(): changed logging so that
  uprint_errno is printed if the return value from uprint_run() is -1.

* www/ppr-httpd.perl: Added BASH_ENV, IFS, and CDPATH to the environment
  variables undefined.

* www/ppr-httpd.perl: Added --standalone-port option and standalone mode.

* misc/ppr-sync.sh: fixed syntax error.

* Added "vendors/ppd_hp/HP LaserJet 6P".

* www/*: message string internationalization fixes.

* www/job_modify.cgi.perl: fixed proxy-for.

* www/ppop.c: Changed wording of message that appears in case of a proxy-for
  mismatch.  Also changed to suppress hostnames if they are the same or the
  one from the command line is "*".  This will reduce user confusion since
  in such cases, the hostname is not at issue.

* pprdrv/pprdrv_rip.c: Changed to exit with EXIT_JOBERR rather than
  EXIT_PRNERR_NORETRY when the RIP core dumps.  This makes more sense since
  the most likely reason for a RIP to core dump is a job it can't deal with.
  It is probably better for it to skip such a job than to bring the whole
  queue to a grinding halt.

* pprdrv/pprdrv_ppd.c: Fixed code that called fatal() before give_reason()
  (so that give_reason() was never called).

* pprdrv/pprdrv.c: added code to check the PPR version number from the queue
  file and make sure it is high enough before proceding.  If the job was
  created by a version of PPR that is too old, the job is arrested.

* pprdrv/pprdrv_interface.c:interface_exit_screen(): change exit code used
  when the interface program exits with an unknown code from
  EXIT_PRNERR_NORETRY to EXIT_PRNERR.  This seems best since interface programs
  that are shell scripts may return unexpected error codes if the system
  is starved for resources such as file descriptors.

* www/show_printlog.cgi.perl: Improvied the workign of the error message
  which is displayed when it is found that $VAR_SPOOL_PPR/logs/printlog
  doesn't exist.

* fixup/fixup_inetd.sh: changed Xinetd configuration for the lpd port from
  "disabled = no" to "disabled = yes".

* Split part of fixup/fixup_links.sh out into fixup/fixup_login.sh.

* Moved vendors/ --> nonppr_vendors/, nonppr/ --> nonppr_misc/, and tcl/ -->
  nonppr->tcl/.

* Added "Status-and-Flags:" to queue file and stopped using the execute bits
  to save this information.

* Added ppr --save, but not the implementation code.  (This switch will tell
  PPR to keep the job in the queue after it is printed.)

* Removed autoconf/ and moved configure.in into makeprogs/.

* Added pprpopup/ and removed samba/pprpopup.tcl.  The pprpopup/ directory
  contains a very heavily re-written PPR Popup program.  It now contains
  a mini web browser based on the IWidgets Scrolledhtml widget.  This allows
  us to ask the user arbitrary questions.

* Added nonppr_misc/md5/md5pure.tcl.

* www/prn_properties.cgi.perl, grp_properties.cgi.perl: Added
  "Prototype Share:" to the [Samba] tab.

* Changed -r option from net:node to net.node to match the Netatalk
  nbplkup output.

* Changed libscript/pprpopup.pl to look up names in
  $VAR_SPOOL_PPR/pprpopup.db/.

* Added www/pprpopup_register.cgi.perl.  This receives registration requests
  from the new PPR Popup and stores them in $VAR_SPOOL_PPR/pprpopup.db/.

* Added www/job_public.cgi.perl.  This is used, along with PPR Popup, in a
  lab printing environment to allow users to claim their jobs.

* Added docs/pprpopup/.  This will store the help files for PPR Popup.

* Removed unixuser/pprpopupd.perl and added it to fixup/fixup_obsolete.sh
  (but left the latter commented out).

* Added procsets/TrinColl-PPR-dmm-nup-3-7 to replace TrinColl-PPR-dmm-nup-3-6.
  The changes correct bugs discovered by Klaus Reimann.

* Fixed pprd so that fatal() doesn't delete the lock file unless pprd
  created the lock file.  The problem was that if it found a lock file from
  another instance, it called fatal() (to say that there was already an
  instance of pprd running) which removed the lock file!

* Added --stop option to pprd.

* Moved the timeval routines out of pprdrv/pprdrv_writemon.c and into
  libgu/gu_timeval.c.

* Changed pprd so that it no longer uses SIGALRM and no longer does anything
  but set a flag in the SIGCHLD handler.  It now uses select() to dispatch
  events.  This eliminates reentrancy problems which were previously handled
  by avoiding unsafe functions such as malloc() and all of stdio.

* Broke the www/ppr-httpd.perl standalone code out into libscript/tcpserver.pl.

* pprd/pprd_ppop.c:ppop_list(): removed error check from fwrite().
  Previously it was a fatal error.  This meant that pprd would kill itself
  if the temporary file space filled up!

* Updated INSTALL.txt somewhat and added a mention of RPM_BUILD_ROOT.

* pprd/pprd.c: fixed named pipe reader code so that it handles the case
  where read() returns two commands.  Incredibly, this bug has been there
  from the very begining (in 1993).  Perhaps it was temporary code that
  was never replaced with good code.  In any event, it probably explains
  why the web interface was sometimes leaving CGI scripts hung waiting
  for ppop.  (Another factor was that the error message displayed when
  ppop timed out waiting for pprd was missing the line feed at the end.)
  This should also explain the jobs that sometimes appeared in the queue
  directory but not in pprd's queue.  This was a vexing problem because
  restarting pprd would cause old jobs to suddenly appear in the queue.

* Added www/cliconf.cgi.perl which creates a shell script to configure
  a client to send jobs to a PPR queue.

* Copied papsrv/ into ppr-papd/ as a first step in making a papsrv
  replacement which reads the regular queue configuration files
  rather than papsrv.conf.


1.50a2, 27 February 2002--8 November 2002.

* Moved responder message building out of pprd/pprd_respond.c and into
  responders/ppr-respond.c.

* misc/: removed atalk.conf.sample, atalkmapd.perl, fix410.ps,
  printer_query.ps, and ttquery.ps.

* ppr/: removed --commentator, --commentator-address,
  and --commentator-options.  Commentators will be combined with responders
  soon, so this is a move in the right direction.

* ppr/: moved calls to respond() into the new function ppr_abort().
  Changed fatal() to call ppr_abort().  ppr_abort() should now be
  handling all abnormal exits.

* pprdrv/pprdrv_rip.c: changed code to interpret killing of the RIP
  by SIGSEGV as a sign of a bad job.  Previously WCOREDUMP() was used
  to determine if the error was a bad job but this didn't work
  because (at least on Linux) WCOREDUMP() was returning false if
  core would have been dumped but the ulimit prohibited it.  I do not
  know if Linux is right to behave in this way.

* Configure: changed everything but Linux to include -lint if international
  messages is selected.

* Added "ppop question" command to cancel a question attached to a job.
  Added support for this to pprd and www/job_public.cgi.perl.  (These
  questions are a request for user feedback which can be attached to
  a job.  PPR Popup is used to present the questions to the user.)

* pprd/pprd_question.perl: fix to recognize "+OK" as success.

* lprsrv/lprdrv_conf.c: added netgroup support contributed by Gerard Verdier
  <Gerard.Verdier@ensic.inpl-nancy.fr>.

* lprsrv/lprsrv_conf.c: code cleanup

* lprsrv/lprsrv-test.c: added paragraph of explanation before the table.

* Removed limits on length of responder name, address, and options.  (System
  wide edits.)

* Allowed spaces in proxy-for strings.

* pprdrv/pprdrv_capable.c: moved the handling of internal resources to a
  table, replacing hand-written C code implementation.  Added CIDInit to the
  table, assuming that level three printers have it.  This will have to be
  checked in the Adobe technical documents concerning CID keyed fonts.

* makeprogs/save_symlinks.sh: added -f to ln command.

* pprpopup/: renamed icon files, renamed script to convert FIG files to Tcl
  image data, added "make images".

* lprsrv/lprsrv.c: fixed "unrecognized command" code so that the ^A style
  message is used only if the command byte is less than ASCII space.

* www/cgi_tabbed.css: made tabbed folder borders narrower.

* www/images_src/, www/images/: reorganized and added www/images/Makefile
  to generate some of the images automatically from their FIG files.  Added
  FIG pictures for the test page and replaced the hand-drawn exclaim.png
  with exclaim.fig.

* www/docs_info.cgi.perl: added (This script can display system GNU Info
  pages.  It is intended mainly to allow the PPR documentation to link
  to Info pages.)

* www/docs_man.cgi.perl: added support for MANPATH searching

* www/index.html: added boxes to enter names of desired man pages, info
  page, and RPM pages; changed logo to pprlogo2-medium.png.

* docs/index.html: changed logo to pprlogo2-medium.png.

* www/df_html.cgi.perl, df_img.cgi.perl: removed df_img.cgi.perl and changed
  df_html.cgi.perl to make a percentage line graph with stretched
  single-pixel images; added df_img.cgi to fixup/fixup_obsolete.sh.  This
  removes PPR's dependency on the GD graphics library and a bunch of Perl
  modules.

* www/show_queues.cgi.perl: added "Add New Alias"; added menu item "Member
  Printer Control" for the groups menu; corrected stated size of icons
  for "Add Printer", "Add Group", "Show All Queues"; moved "Show All Queues"
  to the front.

* www/show_queues.js: Set href= on popup menu items so that users can
  right-click on them and choose to open them in a new tab.

* pprdrv/pprdrv_rip.c: Added an exception to the rule that Ghostscript
  exiting with error code 1 indicates a command line arguments error.  Now we
  nix that if a PostScript error notification has been received.

* misc/ppr-testpage.c: added options to enable grayscale, RGB, and CMYK
  bars.

* www/prn_testpage.cgi.perl: added choices of images and whether or not to
  have the various bars.

* www/alias_addwiz.cgi.perl, alias_properties.cgi.perl: added

* ppad/ppad_printer.c: ppad_show(): fixed bug which caused it to always
  display the PPD file RIP setting even if the actual RIP setting (the one
  taht pprdrv would use) came from the printer's configuration file.

* libppr/int_copy_job.c: added USE_SHUTDOWN stuff.

* ppad/ppad_alias.c: fixed "ppad alias addon"

* www/cgi_tabbed.pl: put 1mm radius on tabs.

* www/grp_control.cgi.perl: added

* Makefile: added subdir pprpopup/ to those automatically built.

* makeprogs/installdata.sh, makeprogs/installcp.sh, fixup/fixup_samples.sh,
  fixup/fixup_media.sh: added chmod to set the permissions of the target
  files.

* makeprogs/make_install_dirs.sh, fixup/fixup_perms.sh: changed permissions
  of $VAR_SPOOL_PPR/pprpopup.db to 770.

* www/cgi_membership.pl, www/cgi_tabbed.pl, www/prn_media.cgi.perl: improved
  appearance in Mozilla.

* www/cgi_tabbed.pl: added [Help].

* www/prn_properties.html: added.

* fixup/fixup_inetd.sh: removed spurious "disabled = yes" line from the
  generated xinetd config file.  (The correct line "disable = yes"
  was already present.)

* ppd/ghostscript/ghostscript_master: Added "-dBitsPerPixel=24" for
  DeskJet 550C.

* Fixed bug in the new internal resource table code in
  pprdrv/pprdrv_capable.c which made it non-functional.

* Fixed pprd/pprd_ppop.c:ppop_move() so that the pass number is reset when a
  job is moved.

* Changed pprdrv so that "Reason:" lines don't have parentheses around them
  in the queue file and changed ppop to add the parentheses itself before
  printing the message.

* Added www/window_open.cgi.perl.  This script may prove useful for shedding
  browser decorations.

* printdesk/: converted to use PPR.pm instead of paths.ph, fixing bugs
  introduced by changes to paths.ph.

* Added fixup/fixup_atalk.tcl to find getzones, fixed printdesk/Printdesk.pm
  and www/prn_addwiz.cgi.perl the to use the one it finds.

* www/show_jobs.cgi.perl: added support for fixed positioning in Mozilla.
  Added JavaScript onclick= handler to checkboxes which highlights selected
  rows.

* www/cliconf.cgi.perl: fixed typos in generated /etc/printcap fragment.

* pprdrv/pprdrv_buf.c:printer_flush(): moved a call to fault_check() to catch
  the case where SIGTERM doesn't interupt a system call and the interface
  program (such as simple) doesn't send anything which would cause a call to
  fault_check() (before feedback_reader()).  I am wondering if all those calls
  to fault_check() are really necessary if just one just before the select
  is enough.

* interfaces/simple.sh: removed code to send control-d when killed, moved
  opening of the output device to the cat call rather than using exec since
  exec quits the script if it fails.

* pprpopup/pprpopup_loader.tcl: changed Win32 registry key from
  HKEY_LOCAL_MACHINE\Software\PPR\PPR Popup\config
  to
  HKEY_CURRENT_USER\Software\PPR\pprpopup
  so as to conform to the structure used in the Unix version (i.e.
  ~/.ppr/pprpopup).

* pprpopup/pprpopup_loader.tcl, pprpopup_main.tcl: added random_load() and
  random_save() in order to separate the constantly changing random seed from
  the configuration.  The random seed is stored raw (not as Tcl code) in
  ~/.ppr/random, HKEY_CURRENT_USER\Software\PPR\random, resid -8002.

* pprpopup/pprpopup_main.tcl: fixed problem wherin a registration attempt that
  failed imediately would not triggering a retry.

* www/: removed all uses of <spacer> since it is not supported by Mozilla
  or IE (in fact I think it is only supported by Netscape 4.x and earlier).

* www/: changed some instance of the "strict" documentation type specification
  to "transitional" for certain pages that use certian HTML 4.01 features that
  are declared deprecated in the standard because their effect can now be
  achieved with CSS.

* nonppr_vendors/ppd_hp/, MIT licensed files: commented out N-Up and watermark
  stuff, removed *ScalePatterns code since it doesn't work on many versions of
  the MS-Windows PostScript drivers, renamed "HP C LaserJet 4500-PS" to "HP
  Color LaserJet 4500".

* www/cgi_widgets.pl: added <span class="widget"> </span> around widgets.

* Configure: added Darwin (Mac OS X) to the list of OSs from which one
  may choose.  (Whether it works or not is as yet unknown.)

* Fixed fix bug that hid errors in libpprdb/gdbm_dbtrans.c.  (Thanks to
  Jacques Sansdrap.)

* pprdrv/pprdrv.c: fixed messed up decimal point splitting in formatting of
  money in the printlog.  (Again, thanks to Jacques Sansdrap.)

* libgu/gu_pch.c: This is the start of a hash library.

* uprint/uprint-lpstat.c: Improvements for Solaris application support.

* Changed makeprogs/global.mk to Makefile.conf and renamed the models in
  makeprogs/ accordingly.  Did a search-and-replace on all makefiles.

* Renamed makeprogs/gen_paths.c to ppr-config.c, changed Makefile to install
  it, and changed fixup/fixup_links.sh to create a link to it in the public
  bin directory.  This change follows in the footsteps of glib-config,
  cups-config, etc.

* pprdrv/pprdrv_rip.c: removed special treatment for RIP "ppr-gs" (which means
  that it will have to supply things like "-q -dSAFER" and "-sOutputFile="
  itself).  Added option for Ghostscript with specified path.  Added code to
  omit "-sOutputFile="| cat - >&3" for Ghostscript if "-sOutputFile=" was
  already supplied.

* Added pprdrv/ppr-gs.c which is a wrapper around Ghostscript.

* www/prn_properties.cgi.perl: fixed numberous bugs in "RIP" tab which were
  related to the radio button and the "PPD" and "Custom" areas.  This work
  included adding "rip_ppd" and "rip_which" to the "ppad -M show" output.

* Added ppr --features (though it presently only works for printers, not
  for groups).

* Added support for "*cupsFilter:" in PPD files to "ppad show" and to
  pprdrv.

* Added strace hooks to pprd/pprd_pprdrv.c so that pprdrv can be traced from
  the very start.  (Turning this on requires changing an option at the top
  of the file and a recompile.)

* Added ppd/ppr-indexppds.c.

* Renamed "Dot Matrix 24 pin Ghostscript" PPD file to "NEC Pinwriter 7
  Ghostscript".  If Ghostscript is specific in its name for the driver,
  we can be too.

* Changed www/prn_properties.cgi.perl to use the output of ppr-indexppds to
  generate a PPD file list.

* Extended www/cgi_intl.pl:ibutton() to include hover help (using the
  title attribute of a span).

* www/docs_info.cgi.perl: added ability to handle info files without the
  ".info" extension.

* pprdrv/pprdrv_ppd_parse.l: fixed a problem with tabs in feature lines not
  being recognized as whitespace.

* nonppr_misc/misc/snprintf.c: upgraded to more recent version with C99
  semantics, asprintf(), and vasprintf().

* pprdrv/pprdrv_feedback.c, pprdrv_rip.c: changed Ghostscript error message
  parsing code to identify error messages associated with the RIP's
  configuration and distinguish them from PostScript errors caused by errors
  in the job.  For example, this new code will catch the message that
  Ghostscript prints if a driver that is not available is requested.

* pprdrv/pprdrv_rip.c:rip_start(): added missing call to gu_nonblock() to
  put pprdrv's end of the pipe to the RIP into nonblocking mode.

* www/ppr-httpd.perl: added "delete $ENV{PATH}" since Perl 5.8.0 isn't happy
  with any PATH received from the environment.

* libppr/int_copy_job.c: added handling of EAGAIN from read() and write() in
  order to accomodate the nonblocking behavior of OSF1.

* po/: Added rule to Makefile to build .pot, fixed install_mo.sh so that it
  will notice if all of the .pot files are missing (they are not in the CVS
  repository), added move_pox_to_po.sh, updated README.txt.

* www/: Added code to various programs to snap the window size to the size of
  the document.  (This is disabled right now due to browser compatibility
  problems.  The problem is that the computed size is a few pixels off
  which causes the windows to shrink by a few pixels on each refresh.)

* www/show_jobs.cgi.perl: enhanced "?controls=" option to limit the list of
  controls which will be shown.  The control bars are completely removed if
  it is empty.  This is for the Docutech users who are confused by some
  of the controls.

* www/: moved prn_properties.html to prn_properties.en.html, added dummy
  prn_properties.ru.html, changed ppr-httpd to use "KOI8-R" as the charset
  for .ru.html files.

* www/prn_testpage.cgi.perl: added -m and -r options to the ppr command.

* www/pprpopup_register.cgi.perl: added code to create an alias registration
  based on the stuff to the left of the @ and the client IP address.  With
  the above change, this should allow users who are running PPR Popup on
  the same machine as the web browser to receive notification of the fate
  of their test pages.

* init_and_cron/ppr-clean.perl: added code to remove old files from
  $VAR_SPOOL_PPR/pprpopup.db/.

* www/pprpopup_register.cgi.perl: put most of the code in an exception
  handling block which generates a text/plain error response.

* pprpopup/: renamed pprpopup_loader.tcl to ppr-popup, changed Makefile
  to install it in $HOMEDIR/bin instead of $SHAREDIR/ppr/www/client/,
  commented out most of the debugging puts commands.

* pprpopup/pprpopup_main.tcl: changed registration failure alert box to
  include the body of the response thus showing the error messages generated
  by the new pprpopup_register.cgi, commented out most of the debugging
  puts commands.

* pprpopup/ppr-popup: added code to set the session restart command to
  /bin/true.  (This may be intended to prevent duplicate instances when
  session management restarts it and session startup starts one too.)

* libuprint/Makefile, uprint/Makefile: changed CC to LD and CFLAGS to
  LDFLAGS when linking the executables.

* responders/mail.sh: fixed so that EECHO= gets filled in.

* editps/: added Mozilla_1.0 (but left entry in editps.conf commented
  out since it works with Ghostscript but not with real PostScript).

* libppr/: int_con_tcpip.c, int_pe_tcpip.c: moved code back into
  interfaces/tcpip.c.

* interfaces/tcpip.c: added appsocket_status_interval=, added an initial
  status check for SNMP and AppSocket status.

* libppr/int_copy_job.c: added send_eoj_funct.

* interfaces/tcpip.c: added use_shutdown=.

* interfaces/lpr.c: changed "L" in control file to use the username instead
  of "somebody".  Changed "N" to use the job title rather than the queue id.

* ppr/ppr_dscdoc.c: added support for "%%BeginNonPPDFeature: NumCopies X" to
  "-R copies"; marked all warnings for internationalization.

* ppr/ppr_main.c: changed default to "-R copies" and made "-n" imply "-R
  ignore-copies".

* pprdrv/pprdrv_notppd.c: added code for "%%BeginNonPPDFeature: NumCopies
  X", both the insert it and to modify it.

* pprdrv/: added support for in-printer collating for printers that define
  *Collate in their PPD files but left it turned off for now since it is
  unclear how to determine how many pages a printer can collate and
  because pprdrv doesn't yet parse *UIContraint: lines.

* pprdrv/pprdrv_ppd.c: rewrote begin_feature() and include_feature()
  combining their common code for changing and deleting features and
  adding code to support new colating features.

* Configure, various makefiles: made building of programs that require tdb
  optional.

* www/cgi_widgets.pl:help_button(): added $helpdir parameter.

* Configure: changed default for internationalization to "yes".

* libuprint/uprint_conf.c: added warning if [real lp] or [real lpr] doesn't
  define installed= and changed the default to yes.

* pprdrv/pprdrv_rip.c: removed support for ppr.conf [ghostscript] gs=.

* fixup/fixup_conf.sh: removed code to generate [ghostscript] gs=
  in ppr.conf.sample.

* pprdrv/pprdrv_ppd.c: added code to ban slashes in RIP names in PPD files.


1.50b1, 13 November 2002--22 January 2003.

* libuprint/claim_lpr.c: Added code to skip spurious blanks before the list
  of queue names in printcap.

* unixuser/ppr-xgrant.c: changed "ppr" to USER_PPR and improved exec()
  failed messages.

* libuprint/uprint_argv_ppr.c: changed title= to pr-title=.  (In lpr, the -J
  option cooresponds most closely to PPR's --title, so we don't want to use
  --title for the title for pr.)  This ensure that this potentially
  difficult-to-parse option is not passed to any other interface.

* Added Configure_new.  This is a better, more automated configure
  script.

* Deleted makeprogs/Makefile.conf.i[356]86-mandrake-linux.

* ppr.spec: changed to use Configure_new.

* libgu/gu_pcs.c: added gu_pcs_append_byte().

* ppr/ppr_main.c: fixed handling of duplex requirements.

* ppr/ppr_infile.c: added prepended implied filter options.  These
  options are implied by -F *PageSize, -F *Duplex, -R duplex:.  We have
  Till Kamppeter <till.kamppeter@gmx.net> to thank for this suggestion.

* ./Configure, ./Configure_new: fixed to accomondate changed format
  of GCC 3.2's gcc --version output.

* Added regression test test-ppr/401-duplex.

* libuprint/uprint.conf.sample: reordered lines; libuprint/uprint_conf.c:
  added error message for unrecognized sections and added missing code to
  ignore flavor= lines in [real lp].

* ppr/ppr_nest.c: error message improvement for unmatched section begin/end

* ppr/ppr_dscdoc.c: suppressed duplicate messages about lack of atend for
  stuff in trailer.

* filters_misc/: replaced pr.sh with pr.tcl.  This new code correctly
  handles the pr-title= option.

* fixup/fixup_filters.sh: added "#! ppr-tclsh" to things rewritten by sed.

* pprdrv/pprdrv_flag.c:print_flag_page_standard(): fixed pslinef() call
  without format string.

* pprdrv/lw-messages.conf: added "PrinterError: paper tray missing".

* commentators/pprpopup.perl: added

* pprdrv/pprdrv_commentary.c: restored support for "ppr --commentary".

* Fixed "ppad help" description of "ppad rip".

* pprdrv/pprdrv.c:pprdrv_read_printer_conf(): fixed to allow empty option
  list.

* www/ppr-web-control.tcl, window_open.cgi.perl: fleshed out adding opening
  of Mozilla using $HOME/.ppr/ppr-web-control.html so that browser write
  privlege can be granted and we can open without an intermediate window;
  Added support for Konqueror, Links, W3m, and Lynx; renamed to ppr-web.tcl.

* fixup/fixup_links.sh: added ppr-web to the list of things liked to the
  public bin directory.

* www/grp_control.cgi.perl, prn_control.cgi.perl: fixed bugs with sizing
  and with closing of the whole frameset in grp_control.cgi.

* www/show_jobs.cgi.perl, show_jobs.js, show_jobs.css: added "Queue" which
  pops up the menu that show_queues.cgi pops up.  Changed "Settings" to
  "View".

* ppr/ppr_respond.c: switch the seteuid()/setegid() code from setting them
  to the user's to setting them to PPR's.  Set the real IDs too.  This
  fixes the xwin and pprpopup responder when launched by ppr (rather than
  pprd).

* ppop/ppop_cmds_other.c:ppop_dest(): fixed to show only those aliases which
  match what the user specified.

# www/q_icons/make_composit_figs.perl: fixed to make the icons have
  transparent backgrounds.  This feature had been left out of the last
  conversion command but was present at some point in the past.

* www/Makefile: fixed to only install image file from www/images/ and skip
  the .fig and build files.

* www/images/icon-48.xbm: added

* ppop/ppop_cmds_other.c:ppop_status(): changed descriptions in verbose mode
  to "Raw LW Status", "Raw SNMP Status", and "Raw PJL Status" (added the
  word "Raw".  This should prevent confusion by distinguishing them from
  the amalgamated status.

* ppop/ppop_cmds_other.c:ppop_status(): changed code to hide printer
  problems that are unconfirmed for more than 4 hours unless --verbose
  is used.

* po/ru-PPRWWW.po: added a few messages and made minor corrections.

* www/show_queues.cgi.perl: set width of table cells holding things such as
  "Add New Printer" to 150 to encourage them to wrap their labels.

* pprdrv/pprdrv_ppop_status.c, pprdrv/pprdrv_commentary.c,
  ppop/ppop_cmds_other.c: refinements to how unrecognized status messages
  are handled.  They are now displayed by ppop even without --verbose.
  Changed order of lines in status file so that standardized status will
  be at the top.

* www/prn_control.cgi.perl: fixed to display standardized status; eliminated
  turned-off code to use form fields to format the information.

* ppop/ppop_cmds_other.c: changed "ppop status" output: changed "unconfirmed
  for X minutes" to "as of X minutes ago" and suppessed "for X minutes" when
  "as of" is displayed.  These two changes shorting the messages
  considerably while still providing a useful amount of information.  Using
  the --verbose switch gets you everything.

* unixuser/ppr-hexdump.c: added

* pprdrv/ppr-gs.c: changed "cupsfilter=" to "cups=", added "ijs=".

* ppd/ghostscript/: added support for Epson Stylus C62.

* samba/ppr2samba.c: fixed test for driver download share to check for it
  under its current name (which is pprprnt$).

* ppr/ppr_main.c: added severe warning for zero length input file.

* po/joe-ru: added

* pprd/pprd_load.c:load_printer() fixed rounding error in reading of
  "Charge:" lines.

* fontutils/ppr-indexfonts.c: if an attempt to open a font file returns
  errno == ENOENT, say it is a broken symbolic link and skip it.  This is
  a good idea because Mandrake Linux 9.0 still has a broken symbolic link
  to a Fontmap file from an old version of Ghostscript.

* fixup/fixup_inetd.sh: removed spurious "disabled =" line from generated
  xinetd.d/ppr file.

* www/prn_properties.cgi.perl: fixed custom RIP saving.

* fixup/fixup_perms.sh: made ppr-xgrant setgid as well as setuid
  (unixuser/Makefile already did this).

* libppr/int_copy_job.c: added check for EAGAIN on write to stdout since
  stdout is a pipe and if the write size is less than PIPE_BUF but bigger
  than the available space, write() may decline it even though select()
  says the descriptor is ready for writing.  Added check for EAGAIN to
  read from stdin (just to be paranoid).  Added code to set stdin and
  stdout to non-blocking mode.

* www/cgi_tabbed.pl, cgi_wizard.pl, show_jobs.cgi.perl: Added alt="" to spacer
  images.

* README.txt: brought up to date.

* interfaces/parallel.c,parallel_linux.c: added status_interval=.
  Unfortunately its seems that the Linux parallel port driver doesn't
  support non-blocking IO.  Also added code to attempt to detect
  if the printer is powered down by watching the busy line.  Added
  case to interpret EIO as an attempt to read from a unidirectional
  printer.  (EINVAL was already interpreted as an attempt to read from
  a unidirectional port.)  Removed EIO explaination "Hangup or other
  error while trying to opening "X"" as it seemed to make no sense
  for parallel ports.  Renamed int_connect_parallel() to open_parallel().
  Marked open_parallel() error messages for i18n.

* interfaces/serial.c: Marked open_port() messages for i18n.

* interfaces/usblp.c: added.  So far only device node addresses are
  supported.  In other words, there is no prevision for specifying the
  desired device by make or serial number or by USB bus location.

* www/prn_addwiz.cgi.perl, libppr/interfaces.c: added entries for usblp
  interface program.

* ppr-papd/: renamed everything from ppr-papd to papd.  This violates my
  convention, but the old name was really annoying me.

* po/: added PAPD.po.

* www/prn_properties.cgi.perl: fixed papd support.

* init_and_cron/init_ppr.sh: added code to start and stop papd (if it is
  installed).

* fixup/fixup_conf.sh: added code to generate [papd] section.

* nonppr_misc/misc/: moved gu_wildmat.* to nonppr_misc/wildmat/, moved
  snprintf.c to nonppr_misc/snprintf/, deleted modes-3.3.mf, moved
  squeeze.c to nonppr_misc/squeeze/squeeze.c, moved ps_type3.c to
  nonppr_misc/ps_type3/ps_type3.c.

* filters_typeset/pod/: removed it since it was never completed and Pod:XML
  has a program pod2xml which can already convert POD to XML.

* samba/: renamed README_SAMBA.txt to README.txt.

* Makefile: changed dist target to exclude CVS and docbook-*-* (using GNU
  Tar syntax).


1.50, 22 January 2003--14 February 2003.

* fontutils/ppr-indexfonts.c: Fixed the code introduced in 1.50b1 which was
  supposed to skip broken symbolic links.  Added code to deal with
  directories listed in ppr.conf which don't exist.

* Configure, Configure_new, lib*/Makefile, nonppr_tcl/Makefile: added
  explicit call to ranlib (though for most platforms RANLIB=touch).

* www/q_icons/[0-2]*.png, www/images/*.png, *.eps: added to CVS (marked as
  binary).  I did this so we will know if switching conversion tools produces
  different results (as it has in the past, generally better) and because a
  lot of people don't have the tools needed to build them.

* fixup/fixup_conf.sh: fixed messed up [papd] section code.

* fixup/fixup.sh: commented out call to fixup_login as it has caused some
  trouble and will be obsolete in the next version.  Those who want it
  can run it themselves.

* interfaces/tcpip.c: added emergency definition of INADDR_NONE since
  Solaris 2.8 doesn't seem to have it!

* makeprogs/ppr_make_depend.perl: changed to ommit dependencies for
  non-existent include files rather than assume they will be in ../include.
  This change was necessary because snprintf.c conditionally includes
  config.h and I didn't want to change it as it is not my code and I want to
  keep it easy to keep up-to-date with the latest version.  Generating a
  dependency spec. for a non-existent file doesn't do any good anyway.

* www/ppr-httpd.perl: added "Accept-Ranges: bytes" to the response headers
  for GET.  According to <http://www.mozilla.org/projects/netlib/Link_Prefetching_FAQ.html>,
  this will allow Mozilla to cache partially downloaded files which result
  from aborted prefetch operations.

* pprd/pprd_pprdrv.c: added code to post an alert suggesting that
  suggests a dynamic linking problem if pprdrv dies "killed by signal 0".

* libppr/alert.c:alert(): expanded formatting buffer from 256 to 512 bytes.

* pprdrv/pprdrv_log.c: added as a central repository for code that deals
  with the job log.

* pprdrv/pprdrv_capable.c, pprdrv_feedback.c: replace job log handling code
  with calls to functions in pprdrv_log.c.

* pprdrv/pprdrv_reason.c: added code send an information block which states
  that a PostScript error has occured, what printer the job was printing on,
  and the probable reason for the PostScript error.  This block will appear
  just before the PostScript error message in the job log.

* Configure, Configure_new: change the messages before the GDBM and TDB
  questions to more clearly indicate that the copy of TDB in Samba can't
  be used, to provide download URLs for GDBM and TDB, and to remind the
  user that GDBM and TDB are licensed under the GPL.

* libuprint/uprint_rfc1179.c: added (but won't use until the next
  PPR minor release when it will allow us to take the setuid root
  bits off of most of the uprint-* programs).

* ppop/README.txt: added

* ppr/ppr_infile.c: implemented passthru for type postscript.

* www/README.txt: updated

* tests/: fixed widspread use of "-r none" instead of "-m none" in ppr
  command lines.  This problem resulted in a flood of e-mail to whatever
  user ran the regression tests.


1.51, 15 February 2003--24 July 2003.

* www/index.html: fixed broken links to documentation.  I am more than
  a little annoyed that several browsers have been hiding the fact that
  certain browers (including Mozilla and Links) have been hiding the fact
  that these links pointed above the root.  Dillo finally gave the game
  away.  Thanks Dillo!

# www/cgi_run.pl: fixed run() and opencmd() so that they don't use die if
  exec fails.  This was bad because the die was often caught.  The result
  was that _both_ parent and child tried to issue the second half of the
  HTML page.  The copy from the child was received by the parent, HTML
  escaped, and displayed as command output!  Suppressed program path in
  run() output.  Suppressed Perl 5.8.0 warning about tainted arguments
  to exec().

* www/*_addwiz.cgi.perl: changed run("/usr/bin/id") to run("id") since it
  is often /bin/id.

* ppad/ppad.c:priviledged(): commented out install-time exception because
  it turns --su into a noop for user ppr.

* www/docs_man.cgi.perl, docs_utils.pl: added manpage directory.

* libuprint/: reorganized code and renamed many files and a few functions.
  Some of the renaming went thus: lpr->bsd, lp->sysv.  This was done
  in most places where the reference was not to a command but to a spooler.

* uprint/: removed all setuid root and calls to setuid business in
  libuprint.  Made uprint-lpr and uprint-lp setuid ppr so that they can get
  the next lpr jobid.

* unixuser/ppr-xgrant.c: by using setreuid() in stead of setuid() was able
  to set the real uid (necessary because xauth is a stinker and calls
  access()) without being root.  This means that it can now be setuid ppr in
  stead of setuid root.

* fixup/fixup_perms.sh: changed to no longer make uprint-* and ppr-xgrant
  setuid root.  Made code neater by creating another for loop which steps
  through a list of files that all need the same ownership and mode.

* lprsrv/olprsrv.c: fixed to work with libuprint changes and to always
  compile support for all supported spoolers.

* lprsrv/ fixed to work with renamed dest_claim_*() functions from libuprint
  and other changes in libuprint.  Changed to run most of the time with the
  euid and egid set to those of the user ppr (previousy the egid wasn't
  changed and the euid was set to that of the owner of /etc/ppr/uprint.conf).
  When running a command as a user, the gid is now set as well since Inetd,
  when asked to run lprsrv as root may run it under a gid that could allow
  excessive access.

* include/sysdep.h: deleted all references to HAVE_LP, HAVE_LPR,
  LP_PRINTERS_CONF.

* papsrv/papsrv-kill.sh: removed, added to fixup/fixup_obsolete.sh.

* pprd/: removed code to create /var/spool/ppr directories on startup.  It
  wasn't being maintained (because it was forgotten).  It would be better
  combined with fixup_perms.sh or with the Init script.  Interestingly,
  this code was the source of a longstanding problem with the mode of the
  log directory mysteriously changing from 775 to 755.

* pprd/, papsrv/, papd/: Changed all calls to setuid() and setgid() (except
  setuid(0)) to setreuid() and setregid() respectively and made sure that the
  return value is checked except for those setuid(0) calls that just prepare
  the way for the important ones.  Added paranoid checks too.  (Using setuid()
  risks security bugs because it does completely different things depending on
  whether the EUID is 0 or not.  Thus it may not do what you want it to do but
  it will indicate success.)

* ppr/: renamed setuid_uid -> ppr_uid, setgid_gid -> ppr_gid; implified startup
  checks which make sure it is running under the right uid.

* ppr/ppr_infile.c: switch from seteuid()/setegid() to setreuid()/setregid()
  for filter execution so that the saved ppr_uid/ppr_gid is dropt.  Added
  checks to make sure that the calls suceed.  Did a test to make sure this
  works.  Verified that setting the effective ids left the saved ids
  untouched on Linux but that the exec() changed the saved ids.

* ppr/prune_env.c:set_ppr_env(): changed IFS from " \t" to " \t\n" because
  that is what is recomended by "Secure Programming for Linux and Unix
  HOWTO".

* www/: replaced ppr-passwd.sh with ppr-passwd.c.  This new implementation
  doesn't depend on Apache's htpasswd.  Added ppr-passwd to the list of
  programs which are made setuid/setgid ppr/ppr by fixup/fixup_perms.sh.

* ppad/ppad_filter.c: added warning for PPD files which don't specify the
  default resolution.  This is probably better than leaving users to wonder
  why there was no match in mfmodes.conf.  Also added support for
  "*DefaultJCLResolution:" as a way to deal with recent HP PPD files.

* makeprogs/installdata.sh: made mode of installed data files 444 instead of
  644.  This seems right since this is used in install *.sample and
  $HOMEDIR/lib/*.conf and we want the user to understand that they shouldn't
  ordinarily be modified.

* Rearanged things in makeprogs/, fixup/, filters_misc/ and the new
  directories z_install_begin/ and z_install_end/ in order to cut down what
  fixup.sh does and otherwise simply the build process.

* Moved fixup/fixup_filters.sh to filters_misc/indexfilters.sh.

* makeprogs/ppr-config.c: added --tcl, added paths.tcl to Makefile.

* www/README.txt: updated to reflect the addition of ppr-passwd.

* README.txt: added explanation of purpose of z_install_begin/
  and z_install_end/.

* pprdrv/pprdrv_log.c: Fixed banner page printing code which would fail if
  the job didn't have a log.

* pprdrv/pprdrv_userparams.c: Implemented setting of Manualfeedtimeout for
  PostScript level 2 (which interestingly is categorized as a page device
  parameter rathern than a userparam).  Also implemented JobTimeout (which
  _is_ a userparam).

* ppad/ppad.c:main(): clarified message about unknown subcommand so as to
  make clearer to the user what happens when he types "ppad --debug ppd
  dummy 'HP LaserJet 4000 Series" (for example).

* Did same as above for ppop.

* po/ru-*.po: minor fixes and a few more messages

* nonppr_misc/docbook-xml-4.2/: added

* fixup/fixup_media.sh moved to ppad/insert_initial_media.sh; modified
  ppad/ppad_media.c to heed  RPM_BUILD_ROOT when opening media.db if
  UID == EUID.

* Moved init script from init_and_cron/ to z_install_end/.

* Renamed init_and_cron/ to cron/.

* cron/cron_hourly.sh: added recognition of Debian GNU/Linux
  package changes and code to call ppr-index (see below)

* cron/ppr-clean.perl: added --debug and --all-removable.  Moved much code
  from ppr.spec and made it part of the --all-removable action.

* INSTALL.txt: removed information on upgrading from versions prior to 1.4x
  since it is too much trouble to proofread it to see if it has been
  superseeded by later changes.  Besides, I haven't heard of anybody
  running a version older than 1.4x.

* fixup/fixup_obsolete.sh: removed code to clean up from versions prior to
  1.4x.

* Removed fixup/fixup_lmx.sh and misc/custom.ppr as they haven't been tested
  in years and Google search doesn't clearly indicate that LanmanX is still in
  use.

* Moved remainder of fixup/ stuff to z_install_end/.

* Moved libscript/getpwnam.c,getgrnam.c to z_install_begin/, added them to
  fixup_obsolete.sh, added z_install_begin/id.c.  It was necessary to
  re-implement id because old versions aren't as nice as GNU id and don't
  support -u, -g, and -n.

* www/ppr-web.tcl: added -d option for use when specifying the queue, though 
  its use is still optional, i.e., the old syntax still works.

* www/cliconf.cgi.perl: added -d option to ppr-web command in generated KDE
  icons.

* makeprogs/ppr_make_depend.perl: fixed bug: #include "" with comment
  following was ignored!

* Moved include/version.mk to makeprogs/version.mk where it is
  auto-generated and only used by the top-level makefile.  Eliminated other
  uses by by adding SHORT_VERSION to ppr-config --mk output.

* templates/adjust_header: added

* makeprogs/installconf.sh: added

* makeprogs/install*.sh: added code to chown and chgrp installed files.

* printdesk/printdialog.perl: removed (after merging the tiny bit of code that
  it had int printdesk/ppr-panel.perl).

* merged ppr-indexfonts, ppr-indexppds, and fixup_filters.sh into lib/ as
  indexfonts, indexppds, and indexfilters respectively and added
  cron/ppr-index as a wrapper to call them with.  Added --delete option
  to all.

* z_install_begin/install_create_accounts.sh: added code for Linux to make
  $USER_PPR a supplemental member of the group "lp".  This should allow PPR
  to open ports such as /dev/lp0 even if the system default permissions
  haven't been altered.  This means a parallel printer may be set up if
  one has ppad access but no root access.

* makeprogs/installprogs.sh: added code to properly handle attempts to
  install setuid root binaries when not running as root.  (It stops and
  tells the user to do "make install" again as root.)

* Removed atalk responder (responders/atalk).

* Added "followme" meta responder support to responders/ppr-respond.c.

* Added unixuser/ppr-followme.c.

* Added ppr-followme and ppr-popup to z_install_end/install_bin_links.sh.

* Added libgu/gu_run.c.

* pprpopup/pprpopup_main.tcl: added code to use "$USER@localhost" or
  "$LOGNAME@localhost" if PPR_RESPONDER_ADDRESS isn't defined.

* pprd/pprd_main.c: Due to MacOS X wierdness with regard to saved IDs and
  setuid(), added seteuid(0), setgid(), setuid() sequence before the existing
  setreuid() setregid() sequence.

* lprsrv/olprsrv.c,lprsrv_print.c: same ID business, plus added missing
  paranoid attempt to setuid(0) (which is what caught the above problem).

* makeprogs/readlink.c: added and changed installln.sh to use it instead of
  (probably nonexistent) system version.

* z_install_end/install_bin_links.sh: added ppr-panel.

* libppr/readppd.c: added code to remove whitespace from the ends of lines
  and skip blank lines.  Did a quick sweep of programs that use these
  functions, made a few minor adjustments.  Everything looks ok.

* pprpopup/ppr-popup: fixed to not throw error if ~/.ppr/pprpopup doesn't
  exist yet.

* configure: removed

* Configure: renamed to Configure_old

* Configure_new: renamed to Configure, added Zlib detection.

* libppr/readppd.c: added Gzip decompression using Zlib.  My that was easy!
  Gzip decompression is important for compatibility with CUPS and GIMP-Print.

* libscript/readppd.pl: added Gzip uncompression using gunzip.

* ppd/indexppds.c: added code to lower case upper cased manufacturer's names
  when then are more than three letters long.

* www/ppd_select.pl: exclude "PPR" manufacture PPD's since they aren't meant
  for printer queues.

* ppd/generic/generic_master: added explicit warning against trying to use
  the PPR Generic PPD files on the print server.  They are only for clients.

* pprdrv/pprdrv_feedback.c: fixed bugs in Ghostscript command line parsing
  error detection, added detection of "RIP:" as RIP error.

* pprdrv/ppr-gs.c: changed to invoke CUPS and IJS filters with their full
  paths rather than setting the PATH environment variable.

* unixuser/ppr-xfm.sh: minor cleanup

* libgu/ini_section.c, ppd/indexppds.c, fontutils/indexfonts.c: added code
  to copy missing sections from ppr.conf.sample to ppr.conf.

* libppr/destinfo.c: added code to handle aliases and to return the PPD file
  for the first printer in the case of groups.

* added tests/test-pprdrv/300-custom-hook.* and tests/tools/test_custom_hook.

* pprdrv/pprdrv_ppop_status.c: fixed erronious display of PJL CODE2=0 as
  important.

* www/cliconf.cgi.perl: added support for Perl/Tk interface icon.

* libppr/: added inline documentation to unsafe.c, ppr_gcmd.c, stresc.c

* nonppr_misc/pcre/: added and included in libgu build.

* nonppr_misc/c2lib/: added and included in libgu build.

* pprdrv/pprdrv_progress.c: code cleanup.

* pprdrv/pprdrv_commentary.c: added PEXIT message to those written into
  $VAR_SPOOL_PPR/run/state_update_pprdrv.

* printdesk/PPRstateupdate.pm: added suport for PEXIT.  Fixed inline POD
  documentation.

* printdesk/PPRprnstatus.pm: fixed to use PEXIT to clear the progress since
  other means where unreliable, especially those that relied on the timing
  of the arrival of messages from pprd relative to the timing of messages
  from pprdrv.

* printdesk/ppr-panel.perl: added -d for selecting queue; added print dialog
  for printing files named on the ppr-panel command line so that ppr-panel
  can be used as a desktop drag-and-drop printing target; added menu bar to
  queue listing so that the printer status windows can be opened from there;
  made queue listing background white; made backgrounds of changing status
  fields in the printer status windows white as well.

* Converted tab spacing from 8 to 4 in *.c, *.h, *.sh, *.perl, *.pm, *.pl,
  and *.tcl files.  David Chappell:  Maintaining 4 column indenting with 8
  column tabs requires too much keyboard pounding and probably contributes
  to repetitive strain injury.  I explored other options before taking this
  step, including evalutating Cooledit which does half tabs.  However I
  finally decided not to use it because the GUI interace's is too
  standardness.  I will just have to configure our editors to do 4 column
  tabs.  I think I will stick with Joe for character mode and adopt e93 for
  when X-Windows is running.

* nonppr_tcl/tclInt.h: fixed CHAR_TYPE() macro to cast argument to int
  before using it as an array index.  This supresses a GCC warning.  Who
  knows why GCC considers this a possible error.

* nonppr_tcl/: Moved prototypes from tclEnv.c to tcl.h.

* nonppr_misc/squeeze/squeeze.c: declared internal function static so that
  gcc -Wmissing-delarations doesn't produce warnings.

* ppop/ppop_cmds_listq.c: added #warnings about y2k warnings.

* Numberous fixes to the build system and ppr.spec.

* Moved TCP connect code and TCP connect option parsing out of
  interfaces/tcpip.c and into libppr/int_tcp_connect.c so that
  it could be shared with interfaces/pros.c.

* interfaces/pros.c: added

* libppr/interfaces.c,interfaces/tcpip.c: added "socketapi", "appsocket",
  and "jetdirect" as aliases for the tcpip interface.  Some of them have
  different default options.

* libppr/interfaces.c: added pros, socketapi, appsocket, and jetdirect.

* www/prn_addwiz.cgi.perl: added pros, socketapi, appsocket, and jetdirect.

* www/show_queues_nojs.cgi.perl: fixed test page menu item to pass the
  variable "name" in stead of "printer".

* interfaces/usblp.c: changed the exit code for port open failures from
  EXIT_PRNERR_NORETRY_NO_SUCH_ADDRESS to EXIT_PRNERR_NOT_RESPONDING since
  the absence of the USB device file may indicate that the printer is
  turned off.

* pprdrv/pprdrv_feedback.c: added "ERROR:" and removed "Usage: gs " from the
  list of massages that get passed to the printer log as possible RIP error
  messages.

* www/: minor style fixes for buttons.

* ppad/ppad_printer.c: changed human-readable "ppad show" output to better group 
  things by category and to indent second and subsequent lines of logical
  groups.

* nonppr_misc/openbsd/strlcpy.c,strlcat.c,strlcpy.3,
  gu/gu_strlcpy.c,gu_strlcat.c: added strlcpy() and strlcat(), the
  safer fixed-length buffer functions from OpenBSD.  These will be used to 
  replace calls to strcpy(), strcat(), strncpy(), and strncat().

* libppr/interfaces.c, ppad/ppad_group.c: fixed core dump errors when "ppad show"
  and "ppad group show" were used on empty printer and group configuration files.
  
* Changed remaining (char)NULL to '\0'.  This was part of an attempt to
  compile PPR with TCC.  TCC doesn't like some of the c2lib code.
  
* libscript/PPOP.pm: added blind detainting of values passed to --su and 
  --proxy-for.  The problem was that Perl considers the value of REMOTE_USER to be
  user input (which it isn't).  I could have fixed this at the point at which the 
  value is derived from REMOTE_USER, but I don't see any danger to passing tainted
  values to these ppop command line options.  Nor can I imagine any instance in which
  a server would accept unverified data as a user identity.
  
* libgu/gu_strcasecmp.c: corrected gu_strcasecmp() and gu_strncasecmp() to
  return positive and negative values to indicate the direction of the
  mismatch.  This has the effect of correcting the behavior of
  printdesk/nbp_lookup_ali.c when run with the --gui-backend option.

* libuprint/uprint_run_rfc1179.c: added hack to set SIGCHLD handling to
  default and clear all signal masks.  Without this, wait() fails with ECHLD
  when lpr or lp is invoked from Acroread 5.0 for Linux.  The reason is
  unclear.

* ppop/ppop_cmds_other.c: changed "ppop status" to suppress the display of
  the basic SNMP-style status (such as "operational, idle") if the queue
  is idle (since in such a case the current status of the actual printer
  is unknown).

* pprd/pprd_respond.c: changed jobname fed to responder to short format.

* pprdrv/pprdrv_ppop_status.c:handle_ustatus_device(): added code to clear
  SNMP-style fault bits when the code isn't repeated in the next PJL USTATUS
  message.


1.52, 24 July 2003--24 September 2003.

Bug Fixes

* Actually removed include/version.mk which somehow didn't get removed when
  it was taken out of service.

* makeprogs/installln.sh: fixed source existence check to work properly when
  installing relative symbolic links.

* z_install_begin/install_create_accounts.sh: fixed missing quotes around
  account "$COMMENT".

* libgu/ini_section.c, responders/ppr-respond.c, unixuser/ppr-followme.c:
  changed asprintf() to gu_asprintf().  Without this PPR wouldn't compile
  on systems that didn't have asprintf().
  
* nonppr_misc/c2lib/config.h: added include for gu.h and define to map 
  vasprintf() to gu_vasprintf().

* www/ppr-httpd.perl: changed code to close connexion on error.  (The
  alternative is to swallow the entity body.)

* fontutils/indexfonts.c: removed message to stderr when a TTF font doesn't 
  have a PostScript name (stored in one of its tables).  Previously, if one
  didn't run ppr-index with --verbose, one could come away with the
  impression that the bad font had halted the indexing process.

* z_install_begin/, makeprogs/, z_install_end/: fixed sundry build problems
  which broke RPM building.

* libuprint/uprint-newconf.c,uprint_conf.c,uprint_private.h,uprint_conf.h,
  include/uprint.h: added code to ignore speculative sections and lines in
  uprint.conf.sample.  Added notes to uprint.conf.sample which explain that
  the sections and lines don't do anything yet.

* interfaces/smb.sh: added "-z 600000" to the smbclient command line.  This
  changes the timeout used when waiting for the SMB server to respond.  That
  is 600,000 milliseconds (10 minutes).  The default is only 20 seconds
  which may not be enough if the file is very large (say 250Mbytes).  It
  seems that on some server the close operation takes a while on such large
  files.  Should it be a matter of concern that the -z option isn't
  documented?

* libuprint/uprint_run_rfc1179.c: added #include <signal.h>.

* libuprint/Makefile: added $(SOCKLIBS) to build line for uprint_rfc1179.

* z_install_end/Makefile: added explicit build rule for getservbyname so
  that $(SOCKLIBS) could be included.

* z_install_end/ppr.sh, makeprogs/scriptfixup.sh, Configure: removed all use 
  of $NECHO (echo -n) and replaced it with echo "\c" since echo -n isn't 
  supported on Solaris without the UCB package.

* libscript/PPOP.pm: added code to launch ppop with PATH unset.

* Added -R/usr/local/lib to LDFLAGS= for Solaris (both new and old)

* editps/Makefile: fixed Makefile to install Qt_2.2.0.

* z_install_end/install_init_scripts.sh,ppr.sh: changed Linux Initscripts 
  stop number from 40 to 20 to conform guidelines in Initscripts 
  documentation, fixed to convert hard links to symbolic links, init script
  is now considered a config file for RPM building purposes.

* www/show_queues.cgi.perl: commented out the doctype declaration so that
  Internet Explorer 6 will go back into compatibility mode and restore the
  JavaScript variables which indicate how far down the window is scrolled.

* www/prn_control.css,cgi_tabbed.css,show_jobs.css: refined styles to get
  close-to-proper button sizes, alignment, and spacing in both IE and
  Mozilla 1.4.

* cgi_run.pl:shell_parse(): fixed bad parsing due to gready regular
  expression.  Specifically, it couldn't parse this correctly:

	--feature='InputSlot=Upper'
	--responder-options='printed=no'
	--feature="Duplex=DuplexNoTumble"

  The gready code caused the first four single quotes to be interpreted as
  one quoted string with two single quotes in the middle!  The code still
  isn't completely correct, but it does handle plausible switchsets.

* ppr/ppr_main.c,libuprint/uprint-newconf.c: converted some tabs back into
  spaces in the --help output.

* www/ppr-web.tcl: fixed the code which opens the printer control panel in
  Mozilla using a file in $HOME/.ppr/ to avoid the need for a singed script
  so that instead of simply assigning to window.location it uses
  window.open() with a 4th argument of true so that the control panel
  replaces the temporary window in the history lists.  This takes advantage
  of an exception to the self.close() access rules.  The exception says that 
  self.close() only works if the history list is empty.

* libscript/PPOP.pm: fixed so that stderr from PPOP is captured too.

* z_install_end/install_inetd_conf.sh: added code to send HUP to xinetd or
  inetd.

* www/cgi_widgets:help_button(): supressed warning if $helpdir undefined.

* www/cgi_intl.pl: added $debug to control debugging level (and thereby turn
  off a slew of debugging messages).

* www/cliconf.cgi.perl: fixed wrong page jump label on Perl/Tk icon
  generation page.

* filter_dotmatrix/: serious bug magnified page dimensions 1440x leaving
  cursor way off the page.  I guess no one is using this filter.  Also
  fixed bug which prevented similtanious bold and italic from working.
  Fixed so that setting left or right margin forces current position
  inside the new margin.  Fixed so that setting page skip forces current
  position inside top margin.  See below for enhancements.

* ppop/ppop_cmds_other.c:ppop_dest(): fixed incorrect test which prevented
  the aliases from being displayed.

Misc. Added Material

* added nonppr_vendors/ppd_hp/"HP LaserJet 2300 PS".

* libgu/gu_exceptions.c: added.  This is intended to eventually replace
  cexcept.h and libppr_exception().

* editps/Qt_3.1.1

Misc. Removed Material

* nonppr_misc/c2lib/mathvec.[ch]: Removed since we will not be doing 3D
  graphics.

* Configure_old: Removed since we aren't testing it anymore.

* nonppr_vendors/procset_adobe/AdobePS_Win_Driver_L2-4.2-0: removed since,
  if it is still needed, it should be repackaged with Adobe drivers, if it
  is needed at all.  It probably isn't since -S currently defaults to false.

* nonppr_vendors/procset_adobe/Adobe_Win_Driver-2-0: same as above, but this
  one is absurdly old too.

* nonppr_vendors/procset_apple/"AppleDict md-71-0": removed.  This was a bad
  hack.  Most of the drivers involved are probably long dead.

* ppuser/ppuser.c: removed authcode subcommand.

* tests/misc_old: removed several files.

Misc. Enhancements

* makeprogs/installln.sh,installprog.sh: added code to write commands that
  fail because not running as root to ../root.sh (if it exists, otherwise
  the error is still a fatal one).  The current RPM specfile uses this
  feature.

* libppr/query.c: changed to use new exception handing.  (It was OK to make
  this change since the code in query.c isn't used yet.

* www/prn_control.cgi.perl: now prints large byte counts in kilobytes or
  megabytes.

* ppad/ppad_media.c: added code to create media database if it doesn't
  already exist.

* z_install_end/ppr.sh: added support for additional commands as recommended
  by Linux Initscripts documentation.

* z_install_end/install_inetd_conf.sh: for Xinetd, add /etc/xinetd.d  and
  the reference to it in /etc/xinetd.conf if it doesn't already exist.

* makeproge/installconf.sh: change to allow specifying of the owner, group,
  and permissions.  This means that it can now be used to register the PPR
  init script.

* www/prn_properties.cgi.perl,prn_properties.en.html: added new help topics.

* Many new Russian messages, though most remain untranslated and the quality
  of the completed work is probably poor.

* www/cgi_tabbed.pl,cgi_wizard.pl: enabled snap-to-size code after changing
  it to run only on the first time.  This should take care of the
  a-few-pixels-at-a-time creap problems which was why the code was disabled.

* www/show_queus.cgi.perl: added target="_blank" to <a> tags that try to
  open a new window using JavaScript.  This makes the no-JavaScript behavior
  more like the behavior with JavaScript.

* filter_dotmatrix: furthur i18n, omit all-blank graphics except as spacing

* tests/test-filters/300-filter_dotmatrix.run,.ok: added

* filter_dotmatrix/: added support for charsets.conf and fonts.conf.  All
  character sets supported by filter_lp are now supported by
  filter_dotmatrix too.

Internet Printing Protocol Work

* ppr/ppr_main.c: added --print-id-to-fd.  This will be used by the IPP
  server to get the job ID.

* www/ppr-httpd.perl: added --root-xlate.  This allows us to set up a server
  whose root is one CGI script, such as cgi-bin/ipp/.  This is necessary
  because IPP clients designed for CUPS expect to be able to send IPP
  requests to the root.

* ipp/: switched exception handling to new implementation

* ipp/ipp_util.c: got code working

* ipp/ipp.c: added do_print_job() and dummy functions for some other
  operations.  This is sufficient for basic printing.


1.53a1, 24 September 2003--20 February 2004.

* z_install_end/: fixed minor RPM build problems.

* Did global search-and-replace to change setlocale(LC_MESSAGES, "") to 
  setlocale(LC_ALL, "").

* libgu/gu_sscanf.c: added %f, replaced isdigit() with own function that
  returns true only for ASCII digits.  Added note to documentation to the
  effect that it really is our purpose not to support locales since the
  purpose of the function is to read configuration and queue files.

* libppr/readqfile.c: changed sscanf() calls that read floats to gu_sscanf()
  calls.

* docs/*/Makefile: removed PostScript versions of documents from the list of
  things built and installed.  PostScript generated by HTMLDOC was just too
  big when it contained color images.  Unless people report that it is a
  problem for them to print the PDF versions, this will be considered a
  solution.

* Converted SNMP code and tcpip interface to new exception handling, got rid
  of old exception handling.  Also added code to prevent running off the end
  of the packet if the packet contains invalid field length values.

* pprd/pprd_queue.c: converted to new exception handing.

* libppr/gnodename.c: added code to read ppr.conf
	[network]
	nodename=
  first as a way to deal with systems whose nodenames change due to dial-up
  networking.

* Added "ppad ppdq" and "ppad ppd query".  This work included debugging and
  improvements in libppr/query.c and the addition of ppad/ppad_ppd.c.

* www/test_components.cgi.perl: supplied internal PATH since security
  changes in recent Perl releases left many of the tests non-functional 
  due to the lack of a PATH.

* moved include/ppr_query.h to libppr_query.h.

* libppr/int_cmdline.c: added detection of --probe option

* interfaces/tcpip.c,lpr.c: added support for --probe; added 
  "%%[ PPR address lookup ]%%" message so that "ppad ppdq" will extend its 
  timeout.

* interfaces/atalk_ali.c,atalk_cap.c,clispool.c,dummy.sh,pros.c,
  serial.c,simple.sh,smb.sh: added code to detect --probe and say it isn't
  supported.

* interfaces/parallel.c,usblp.c: added --probe support

* pprdrv/pprdrv_feedback.c,pprdrv_ppop_status.c,ppop/ppop_cmds_other.c:
  added support for "%%[ PPR address lookup ]%%".

* interfaces/serial.c,parallel.c: added "%%[ PPR connecting ]%%" and 
  "%%[ PPR connected ]%%".

* filters_misc/jpeg.sh: fixed parsing of colour= option.

* filters_misc/html_htmldoc.sh: added colour=, charset=, and level= options.

* po/ru-PPR.po, ru-PPRWWW.po: added and corrected translations.

* pprdrv/ppr-gs.c: added check to see if there is a usable /dev/fd/3 before
  using cat.  (This is from foomatic-gswrapper.  It also uses the cat trick.
  It looks like ideas are flowing in both directions.)

* libppr/writeqfile.c: changed code that used fprintf() to print a float to 
  code that uses gu_dtostr() in order to get around locale problems.

* pprdrv/pprdrv_ppd_parse.l: removed

* pprdrv/pprdrv_ppd.c: removed support for old lexer.

* libppr/options.c: changed uses of strncpy() and gu_StrCopyMax() to
  gu_strlcpy().

* pprdrv/pprdrv_ppop_status.c: changed uses of gu_StrCopyMax() to
  gu_strlcpy().

* libgu/gu_StrCopyMax.c,gu_StrAppendMax.c: removed since are almost
  identical in fuction to gu_strlcpy() and gu_strlcat().

* libgu/gu_pch.c: removed since never finished, c2lib provides Perl-compatible
  hashes, we can always get this file out of CVS if we want to finish it.

* libppr/enc2font.c,pprdrv/pprdrv_lw_messages.c,pprdrv/pprdrv_pjl_messages.c:
  eliminated use of gu_trim_whitespace_right().

* libgu/gu_trim.c: removed since it has fallen into disuse since gu_getline()
  was added to the library.

* libgu/gu_strsep.c,gu_strsep2.c: fixed handling of last field to conform to
  BSD.  The last field needn't be terminated by a delimiter.
  
* www/prn_properties.cgi.perl,ppd_select.pl,cgi_run.pl: added support for
  PPD file selection by printer probing.

* libscripts/readppd.pl,libppr/readppd.c,ppad/ppad_printer.c,pprdrv/pprdrv.c:
  Added support for finding PPD files by their indexed ModelName.

* libppr/ppr_gcmd.c: changed to remove trailing whitespace.

* Makefile: added uprint and uprint-install build targets.  This is a first 
  step toward a uprint-only distribution.

* libuprint/,uprint/: removed dependencies on libppr.

* www/show_queues*: redid popup menu so that all popup menus are pre-generated 
  HTML at the bottom of the page.  In browsers that support CSS and JavaScript, 
  then are hidden.  Clicking on an icon unhides the cooresponding menu and moves
  it to a position under the cursor.

* www/show_queues*: created an alternative menu bar for advanced browsers such
  as Mozilla, Konqueror, and Opera.

* www/show_queues.en.html,show_queues.ru.html: added placeholder files.

* www/show_jobs*: added a version of the new menu bar previously written for 
  show_queues.cgi.

* www/cgi_user_agent.pl: new module which parses the HTTP_USER_AGENT variable and
  attempts to make inferences about questions such as whether the brower supports
  images or CSS :hover.

* www/shared.css: added as a central file for shared CSS styles, moved material
  from other CSS files.

* www/test-css.html: added as a place to try out style posibilities and as a 
  way of testing browsers.

* ppr/ppr_res.c:rationalize_resources(): fixed two places where ! was used in
  place of ~.  The result was that if a document declared a resource supplied
  when it should have declared it as needed and had an include for it, no
  record for it would be included in the queue file and the job would be 
  arrested when pprdrv got to the %%IncludeResource line.  PageMaker 7.0
  exposed this bug.  Also, rewrote many of the warning messages in this
  function in order to improve their clarity.

* www/prn_control.cgi.perl: added table borders for browsers without CSS.

* www/cgi_back.pl: replaced meta-refresh document with call to cgi_redirect.pl.

* www/cgi_tabbed.pl: moved the 'prop open' image into its own table cell since
  so many browsers don't implement align="left".

* papd/: changed code to use the new queueinfo_*() functions.

* ppr/ppr_conffile.c: fixed parsing so that it takes the last instance of a 
  configuration line as described in the Hacker's Guide.

* ppd/indexppds.c: moved two PPD file related functions to libppr/readppd.c.

* libgu/gu_throw.c: removed this file and modified all programs which defined
  their own libppr_throw() to wrap main().  That is the last of the old
  library exception handling.  We have finally eliminated callback library
  error handling!

* cron/ppr-clean.perl: fixed so works again.  It was appearently broken by the
  partial renaming of some of the file handles.

* libppr/readppd.c: added object-oriented version of the PPD file reading 
  functions.  The old ones should be phased out.

* ppad/: changed "ppad ppd" subcommand group to "ppad ppdlib" since there is a 
  "ppad ppd" command with which the group clashed.

* ppad/: added "ppad ppdlib get".

* libppr/queueinfo.c: fleshed out functions.

* Makefile: added papd/ to the list of directories built.

* z_install_end/ppr.sh: added papd to the list of daemons started.

* Makefile, makeprogs/symlinks_save.sh: changed so that all of the links 
  will be regenerated every time.  Unfortunately, this means that files 
  with which some editor may have replaced the link will be silently
  deleted.

* ppad/ppad_group.c:group_addon(): fixed bug which caused omision of the value 
  for "ppad group addon" to be tagged as too many parameters (this was fixed 
  some time ago for "ppad addon".

* ppad/: moved all ppad_filt.c stuff which ../libppr/queueinfo.c couldn't yet
  do into the latter, adjusted all of the subcommands to queueinfo, deleted
  ppad_filter.c.

* cron/ppr-index.c: added check to make sure that only indexers on the 
  approved list are run.  This is important because ppr-index is setuid 
  and setgid ppr and so could have been used by ordinary users to 
  interfer with the operation of the spooler.

* lprsrv/lprsrv_conf.c: added [/filename] section support.

* lprsrv/lprsrv.conf.sample: improved documentation and added sample
  [/filename] section.

* lprsrv/lprsrv_print.c: changed open() call for logging the output of ppr, lp,
  lpr, etc. so that it is allowed to create the log file.  On Starbase this 
  bug produced a silent failure.  This may indicate another bug.

* lprsrv/lprsrv_print.c: removed clipcopy() and changed all calls to it to call
  gu_strlcpy() in its stead.

* samba/ppr2samba.c: added queue aliases support (by converting to the new
  queueinfo code).

* pprd/pprd_mainsup.c: changed control FIFO permissions from 0600 to 0660 so that
  the IPP CGI can connect.
  
* ipp/: moved ipp_utils.h into ../include/, ipp_utils.c into ../libppr/, and
  ipp_constants.h into ../include/.

* pprd/pprd_ipp.c: added and hooked up to FIFO message handler.

* Changed queue file format to break up Attr line into multiple Attr- lines
  and to add a section for IPP attributes.

* ipp/ipp.c: added ability to pass selected IPP requests through to pprd.

* pprd/pprd_ipp.c: added handlers for queue listing, listing printers, and listing groups.



+++++++++++++++++++++
TODO

* Make a script to convert papsrv.conf to "ppad addon papname" commands.

* Get CVS cleaned up.

* Create Debian package.

* Add support for network browers to Add Printer wizard.

* Make a tiny GtkEmbed Mozilla browser

* Make a tiny browser with the Mozilla ActiveX control

* Finish the IPP server.

* Finish support for automatic driver download in Samba 2.2.x.

* Fix Dillo caching problem when deleting printer in the web interface.  It
  may be necessary to emit an header to say that certain CGI output is not
  cacheable.  It is probably that Dillo is exposing a bug by not having
  a workaround for buggy sites.

* Change responder interface to use name=value pairs on the command line.
  Change commentators to support the new status handling code and merge them
  with responders.

* Implement automatic PPD file download URL.

* Implement PPD file upload and import

* Implement PPD file installable options handling in pprdrv.

* Implement PPR node-to-node printing, queue display, and job canceling.

* Add IPP support to UPRINT so that jobs can be sent to CUPS queues.  This
  should probably be done with libcups which is LGPL.

* Make uprint-cancel and uprint-lpstat actually do something

* Implement -F switch sorting in pprdrv.

* Add code to convert command line option value strings and DSC text fields
  to utf-8.  Add --dsc-charset to ppr.

* Support banner page "news" messages.

