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--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 condition 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 be 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 misidentifying 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 to form of some state_update PST messages and 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 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: papsrv_authorize.c did not depend 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 -u to apply to the real name field
in the ppuser database as well.

Removed the spurious 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.

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 which will 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 NBNAME-IPADDR form of
address.

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

Renamed the "HP DeskJet 870C" PPD file to "HP DeskJet 550C" and changed to
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.

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, uid, and pid types to long int.

Increased MAX_VMOPTIONS in global_defines.h from 10 to 15.
