The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
CHANGELOG

v2.10 (2022/??/??)
==================
--Added subPre/Postamble convenience functions to Paranoid::Debug, 
  along with argument summarization
--Changed pdebug output to make it easier to match entrance/exit 
  points in subroutine messages
--Added file import/export functionality to Paranoid::Data::AVLTree
--Added basic internal profiling support to Paranoid::Data::AVLTree
--Modified default PATH for pSecureEnv to include sbin directories
--Added quad/long conversion functions to Paranoid::Data, along with 
  a boolean function to detect native quad support
--Various documentation fixes/enhancements

v2.09 (2021/12/28)
==================
--Added new export options for Paranoid::IO
--Added new flock stack mechanism to support transactional I/O patterns
--Improved open flag filtering on reopens
--pflock now performs and popen in order to make sure an flock is 
  properly applied to reopened file handles in children
--Improved pdebug logging for items geting passed arbitrary content
  (logging bytes in content, rather that spilling complete content into the
  logs)
--Added non-flocking variants of I/O functions
--Added I/O tests w/pflock stack enabled to ensure consistent behaviour
--Added Paranoid::IO::FileMultiplexer class, which allows for multiple 
  data stream I/O within a single file, but using normal discrete file
  I/O semantics
--Fixed Paranoid::Filesystem test to account for NetBSD's noatime
  implementation (utime calls for atime fail entirely)

v2.08 (2020/12/31)
==================
--Updated licensing information to reflect Paranoid trademark impact
--Added IMPORT LISTS section to all modules with exportable functions
Paranoid::Args:
--Added template list for exports
Paranoid::Data::AVLTree:
--Added a tree & node class implementing AVL-balanced tree structures
Paranoid:Debug:
--Added constants list for exports
--Documentation updates
Paranoid::Log:
--Minor internal refactoring
Paranoid::Process:
--Added pcommFork to facilitate forking with bi-directional process
  communication

v2.07 (2019/02/01)
==================
Paranoid::Args:
--Consolidate error messages, removing reports for both short/long argument
  versions, etc
--Correlate AccompaniedBy/ExclusiveOf errors to both long/short versions
--Automatically set Multiple/CanBundle and Template for any templates
  w/CountShort
--Automatically set CanBundle for any options w/a short option and a
  template of '' or '$'.  The latter is done if there is also a long
  name for the option
--Add templates for debug, verbose, help, and version for convenience
Paranoid::Debug:
--Modified pdebug to provide support for plog-passing of messages
--PDPREFIX subroutines are now passed the appropriate caller name during
  invocation
--Added PDEBUG1 - PDEBUG8 for developer convenience
Paranoid::Filesystem:
--Fix pmkdir to treat permissions as explicit, not relative to umask
--Modified ptranslatePerms to allow it to be passed octal numbers (or string
  representations of octal numbers) and have it return those values
  unmodified.  This makes it agnostic to translated or untranslated input.
Paranoid::Glob:
--Prune redundant / in paths
Paranoid::Input:
--Documented NEWLINE_REGEX
Paranoid::IO:
--File locking had some corner cases in which flocks weren't applied.
  Removed that logic entirely, locks are now applied, regardless.
Paranoid::Log:
--Added Stdout mechanism that passes log messages to STDOUT
--Added Stderr mechanism that passes log messages to STDERR
--Added PDebug mechanism that passes log messages to pdebug, and allows
  for pdebug to be used as a message preprocessor for sprintf functionality
--Added plverbosity as a convenience function to support Stdout/Stderr
  messages for non-interactive applications
Paranoid::Process:
--fixed pfork to make sure the children counters were reset for the child,
  so max children limits apply on a per-process basis.  Doing it globally
  was unreliable, especially since children only knew what the parent's
  count was prior to forking.

v2.06 (2018/08/06)
==================
--Typos in documentation (Debian Perl Group)
--Fixed bug in pflock in Paranoid::Process that failed to apply the 
  flock as requested
--Improved pflock testing as used by Paranoid::Log::File
--Updated Paranoid::IO::Line POD to clarify the third option to many
  functions which control line chomping.
--Improved Paranoid::Process to constrain SIGCHLD handling to only those 
  children forked specifically with/pfork().  This keeps evals and
  miscellaneous system calls from skewing the counter.
--Fixed pchown tests for platforms that use negative numbers for uid/gid

v2.05 (2017/03/23)
==================
--pkmdir would fail when given paths that included . or .. subdirs,
  fixed
--improved error message from pkmdir to make it obvious what specific
  portion of the path failed
--fixed a bug in popen where reopening a filehandle that was stored 
  under its absolute name deleted the internal cache record
--fixed sigchld signal preemption so it doesn't miss children exit
  codes

v2.04 (2016/09/19)
==================
--Added signal dispatcher functionality to Paranoid::Process

v2.03 (2016/08/09)
==================
--Bad plan for non-IPv6-enabled systems

v2.02 (2016/08/09)
==================
--Typos in documentation (Debial Perl Group)
--Regex improvement for IPv6 addresses (theodore@grcrun11.gr)

v2.01 (2016/06/23)
==================
--Fixed error in prm where files weren't actually deleted if there was a 
  previous error in $! that set ENOENT
--Fixed error in Paranoid::Filesystem where umask was improperly applied
--Fixed error in popen where mode & perms weren't detainted completely
--Adjusted log file test to account for some timing issues on some platforms
--Expanded documentation for Paranoid::Input (documenting known regexes)

v2.00 (2015/10/12)
==================
--Dropped support for Perl 5.6
--Eliminated most instances of croak/die in favor of expecting developers 
  to check the return value
--Complete rewrite of I/O layers and functions
--Added Paranoid::IO
--Added Paranoid::IO::Line
--Moved slurp, sip, etc., to Paranoid::IO::Line
--Rewrote slurp, sip, etc., to provide non-locking versions of functions
--Rewrote slurp, sip, etc., to leverage tuneable performance options from
  Paranoid::IO
--Rewrote and moved Paranoid::Lockfile to Paranoid::IO::Lockfile
--Rewrote Paranoid::Log, Paranoid::Log::Buffer, and Paranoid::Log::File
--Renamed perror to pderror in Paranoid::Debug to avoid name conflict 
  with POSIX
--Added printf functionality to pdebug
--Added platform-agnostic pchomp to Paranoid::Input
--Added passed regex functionality to detaint
--Updated detaint to make target var (third argument) optional
--Updated detaint to work on arrays and hashes as well
--Improved/expanded module unit tests
--Eliminated use of prototypes except where absolutely needed 
  (which eliminates the need to pass by reference for many functions)
--Eliminated pglob from Paranoid::Filesystem.  Globs should be handled
  exclusively through Paranoid::Glob.
--Modified all Paranoid::Filesystem functions to reorder arguments in 
  actual order of importance, making optional arguments truly optional
--Made all Paranoid::Filesystem functions consistent in declaring 
  a filesystem target:  you can pass either a string or a glob, but if
  specifying disparate targets as a list you must pass it as a 
  Paranoid::Glob.
--Removed Paranoid::BerkeleyDB, Paranoid::Log::Syslog, and 
  Paranoid::Log::Email.  Those are now in their own CPAN distributions.
--Added/improved various regexes in Paranoid::Input
--Improved Paranoid::Network's extractIPs to also extract network 
  addresses
--Added deepCmp to the Paranoid::Data module.

v0.36 (2012/09/24)
==================
--Documentation updates
--Added IPv4/6 sorting functions, supporting string, packed, and 
  integer formats
--Fixed MAXIPV6CIDR constant to 128
--Fixed bare words warnings in Perl 5.6 for IPv6 modules

v0.34 (2012/05/29)
==================
--Added Paranoid::Network::IPv4 & Paranoid::Network::IPv6 to provide 
  general protocol-specific functions
--Added ipv4NetConvert function to convert IPv4 IPs to native integer 
  format, and network ranges to base, broadcast, and netmasks in 
  native integer format
--Added ipv6NetConvert function to convert IPv6 IPs to 32bit integer 
  arrays, and network ranges to base, broadcast, and netmasks in 
  32bit integer arrays
--Added ipv4NetIntersect function to test whether two IPv4 IP/network 
  address ranges intersect
--Added ipv6NetIntersect function to test whether two IPv6 IP/network 
  address ranges intersect
--Reworked Paranoid::Network to make use of IPv4/IPv6 modules for 
  use in ipInNetwork
--Added netIntersect to Paranoid::Network, which is an IPv4/IPv6-
  agnostic wrapper for the related functions in the IPv4/IPv6 modules
--Typo fixed in Paranoid::Network::Socket documentation

v0.33 (2011/12/29)
==================
--Detection of imported symbols in the local namespace wasn't working
  correctly.  Fixed.

v0.32 (2011/12/19)
==================
--Added new wrapper module for simpler, more portable IPv6 support and 
  checking (Paranoid::Network::Socket)
--Modified Paranoid::Network to use Paranoid::Network::Socket, and removed 
  Socket, Socket6, and Paranoid::Module dependencies
--Improved Paranoid::Module to reduce the number of detaints, requires, 
  and evals for high frequency calls
--Improved debug output of Paranoid::Module

v0.31 (2011/12/06)
==================
--Use of cached file handles in Paranoid::Lockfile is now fork-safe
--Use of open databases in Paranoid::BerkeleyDB is now fork-safe
--Added lock/unlock methods to Paranoid::BerkeleyDB objects for 
  multiple operations that need to be atomic
--Socket6 is no longer needed or looked for if on Perl 5.14 or newer

v0.30 (2011/08/17)
==================
--Added file permissions support to BerkekelyDB module
--Moved flocking of lockfile to the BerkelelyDB internals
--plock, etc., now returns exit value of flock routine in Lockfile
--Fixed optional prereqs in generated META.yml file
--Added CREDITS file (with recognition for Slaven Rezic (srezic@cpan.org))

v0.29 (2011/04/15)
==================
--Perl-5.6 compatibility fix:  Socket in 5.6 doesn't export AF/PF_INET6, 
  so using Socket6's exclusively
--Perl-5.8 compatibility fix:  Perl's parser chokes on the use of 'bare
  word' imports (i.e., AF_INET), so calling them as subs.
--Optimizing regexes with code-based interpolations of constants
--Misc code adjustments

v0.28 (2011/04/12)
==================
--Updated ipInNetwork in Paranoid::Network to support IPv6 networks &
  addresses
--Added new function extractIPs to Paranoid::Network which can extract IPv4/
  IPv6 addresses from arbitrary text
--Minor tweaks to some regexes in Paranoid::Input

v0.27 (2010/06/03)
==================
--Added the ability to restrict level of indentation for pdebug messages in
  Paranoid::Debug
--Fixed pchmod so that relative permissions applied to a symlink doesn't use 
  the symlink's permissions to apply, but rather the target
--Rewrote Paranoid::Log's internals
--Added '!' as a supported scope for logging facilities
--Added more severity level aliases

v0.26 (2010/05/08)
==================
--Changed daemonize's behavior:  reopening STD* on /dev/null and chdir'ing
  to /.  Hindsight's 20/20, eh?
--Made backup/restore of SIGCHLD in pcapture dependent upon an actual
  sighandler being installed

v0.25 (2010/05/05)
==================
--Fixed tail's behavior to be consistent with documentation
--Fixed tail/sip to preserve file position and buffers when 
  reopening the file in children
--Fixed tail functionality to handle deleted, truncated, moved, or replaced
  files
--Expanded tail/sip documentation
--Added daemonize function to Paranoid::Process

v0.24 (2010/04/15)
==================

--Added Paranoid::Glob
--Major cleanup to satisfy PerlCritic and PerlTidy
--Fixed pmkdir to allow permissions that include sticky bits, etc.
--Updated filesystem functions to use Paranoid::Glob instead of pglob
--pglob is now just a wrapper around Paranoid::Glob as well
--Removed excessive external locking in Paranoid::BerkeleyDB -- hopefully
  internal CDB locking mechanism is robust enough
--Made user input validation on Paranoid::Filesystem non-fatal (handing in
  undefs as filenames, etc.)
--Removed MAXLINKS in Paranoid::Filesystem


v0.23  (2009/03/17)
===================
--Fixed tests that weren't fully supported on all platforms
--Commented out pchown tests which were failing to due to a bug
  in Perl.  A patch has been submitted to bleadperl to address it.
--Added manual detaint of TERM environment variable in psecureEnv
--Updated documentation to include Paranoid::Data
--Made getKeys in Paranoid::BerkeleyDB use finer grained locking
--Added Paranoid::Data
--Added sip, tail, and closeFile functions
--Fixed bug in preadDir that added undef records while filtering out
  symlinks (bug introduced in v0.21)

v0.21  (2009/03/04)
===================
--Massive reformat with Perl::Tidy
--Massive rewrite to accommodate Perl::Critic
--Converted all tests to use Test::More
--Converted licensing to be same as Perl
--Documentation updates
--Updated to only support Perl 5.6 or better
--Fixed bug in pcapture to return appropriate return values
--Fixed bug in pchmodR/pchownR to return correct RV (false)
  with non-existant targets
--Added Paranoid::Args

v0.20  (2008/04/28)
===================
--Misc. POD updates

Paranoid::Filesystem:
--Fixed bug in the recursion wrapper where there were errors in certain
  modes when called on a hierarchy that included an empty subdirectory
--Fixed bug in pchmod where subtracting perms (i.e., o-w) wouldn't result
  in the correct permissions
--Added automatic argument detainting for most functions
--Replaced the horrible manual kludge of pglob with an intelligent wrapper for
  the shell glob
--ptouch now supports full shell globbing, even for non-existent files.
--ptouchR can now create files, but won't automatically create subdirectories

Paranoid::Input:
--Added automatic filename detainting for slurp
--Updated filename/fileglob regexes (expanded allowed characters)

Paranoid::Log & Paranoid::Module:
--Added automatic detainting of module names

Paranoid::Log::File:
--Added automatic detainting of log filenames

v0.19  (2008/04/28)
===================
--Made the croak statements more internally consistent
--Made releasing the lockfiles and db entries in BerkeleyDB more explicit
--Updated filename regex in Input
--Added study to stringMatch
--Added pcapture function to Process

v0.18  (2008/02/29)
===================
--Fixed mail headers for Email module when there are multiple recipients
--Fixed tests to account for FreeBSD's comments in /etc/passwd, /etc/group

v0.17  (2008/02/28)
===================
--Made more tests conditional to account for more types of
  system configurations
--Made error checking more explicit for e-mail logging, and storing
  those errors in Paranoid::ERROR

v0.16  (2008/02/27)
===================
--Fixed conditional tests
--Added new function to Paranoid::Debug (psetDebug)

v0.15  (2008/02/26)
===================
--Initial public release