libutil++ v1.9.6 (9/28/18) - http://www.digitalgenesis.com v1.9.6 (9/28/18) - Fixed issue with sn::DNS::sresolve_ip() and DNS::ProtocolAny. - Fixed issue with su::Process::getRSS(). - Added su::Process::getShared(). v1.9.5 (8/1/18) - Fixed an invalid memory access in ss::HTTPRequest::getMIMEType(). - Fixed HTTP server basic authentication. - Added OpenSSL memory release to library. - Added backwards compatability with older LZ4 libraries. - Improved support for older CentOS and Ubuntu based systems. v1.9.4 (6/27/18) - Fixed time conversion signed type. - Fixed sv::Variant double conversion to JSON for NaN and Infinity values. - Added missing su::String::duration prototype. v1.9.3 (7/13/17) - Optimized sv::Variant::AutoType. - Fixed defect in su::MessagePack with decode of int64 values. v1.9.2 (6/23/17) - Optimzied null sv::Variant and sn::IPPrefix. - Added sv::Variant::TypeMsgPack for direct decoding. v1.9.1 (5/27/17) - Added missing su::PathException header. - Fixed defect in su::String::substr_replace() when passed an empty search parameter. - Optimized sv::Variant::operator==() and sv::Variant::operator!=(). v1.9.0 (4/15/17) - Added su::String::rate(). - Fixed defect in sn::DNS::convertARPA(). v1.8.0 (4/9/17) - Minor sv::Variant optimizations. - Fixed uninitialized memory defect in sn::IPAddress. - Added su::Path and su::String::isPrintable(). v1.7.0 (11/26/16) - Added Gzip support to deflate and inflate in su::String. - Added deflate and fixed gzip support in ss::HTTP. - Added authentication related functions to ss::HTTPRequest. v1.6.7 (11/14/16) - Fixed sub-expression issue with regex_search() and regex_search_sub() in su::String. v1.6.6 (10/29/16) - Fixed issue with sn::IPPrefix not properly setting CIDR value when initialized from an IP. - Fixed issue with sv::IPPrefix not properly checking CIDR value. v1.6.5 (8/15/16) - Improved performance sv::Variant's TypeAuto constructor, parse() and unjson() functions. - Variant move constructor and operators will now perform a swap where possible. - Added su::String::base64_encode() and su::String::base64_decode(). v1.6.4 (7/31/16) - Fixed issue with sn::IPAddress not clearing internal cache with applyCIDR is used. - Fixed issue with sn::IPAddress::applyCIDR(0) not modifying IPv4 addresses. - Fixed issue with sv::Variant compare operators not handling const char* as a std::string compare. - Added eq and cmp typedefs to sn::IPAddress sn::IPPrefix. v1.6.3 (6/28/16) - Fixed issue with 64 bit value passed to su::String::itoa() and not properly extending string. - Added sv::Variant::TypeXxx symbols to allow emplace to work. - Fixed issue with -1 encoding in su::MessagePack. v1.6.2 (6/11/16) - Enhanced su::UUID::base64() to support standard and non-standard (URL safe) output formats. - Added su::String::scale() to provide short hand output in thousands, millions, billions, etc. v1.6.1 (6/2/16) - Fixed su::String::duration() output when used with a decimals of 1+. v1.6.0 (5/23/16) - Fixed a crash bug in sv::Variant related to bad MsgPack input. - Added stack trace support to sella::Exception. - Added operator[]() to sc::CedarTrie and additional variations for insert, remove, contains and at. - Remove mantissa output on su::String functions. - Added su::File::itomode(). - Enhanced su::Privilege capability functions. - Added left and right brace parameters to su::String::join. - Added mode arguments to read, readline and write in su::File. - Added su::UUID::base64() for shorter ASCII UUID representation. - Fixed Variant::isNull(). v1.5.0 (2/15/16) - Added support to embedded HTTP server to access specific headers and zlib/gzip compression. - Reorganized embedded HTTP internal functions for correctness and improved content-type handling. - Added parseURI() and buildOutput() helper functions to embedded HTTP server. - Added secure socket support to embedded HTTP server. - Added su::Process::setNice() and su::Process::getNice(). - Added su::Process::setIONice() and su::Process::getIONice(). - Added su::Process::isRunning() and su::Process::getStartTime(). - Added CPU, memory, IO, threads and uptime related functions to su::Process. - Added su::String::deflate() and su::String::deflate() for zlib and lz4 compression. - Added su::Time::clock_realtime_coarse(), su::Time::clock_monotonic_coarse() and su::Time::clock_boottime(). - Removed unused timezone arguments from su::Time::clock_* functions. - Added support for building Debian packages. - The su::Log() TRACE and DTRACE macros no longer generate the formatted string if the traceoption is not set. - Fixed warning in su::Log on Ubuntu. - Added IF and TIME variations to su::Log. - Fixed su::IPAddress::operator>() and su::IPAddress::operator<() mixed family bug. - Fixed sv::Unsigned and sv::Null auto-match regex. - Added additional sv::Variant move semantics. - Added sv::Variant constructor and sv::Variant::cast for sn::IPAddress and sn::IPPrefix. - Added sv::Variant::zero() which sets values to 0 or clears containers. - Added sv::Variant::asVector() and sv::Variant::asMap() functions. - Added direct assignment of sn::IPAddress and sn::IPPrefix into a sv::Variant. - Added unjson(), cjson(), xml() csv() output functions into sv::Variant. - Added msgpack(), unmsgpack(), msgpack_buffer(), unmsgpack_buffer() functions into sv::Variant. - Added sv::Variant::sort() and sv::Variant::unique(). - Fixed sv::Variant::parse() to properly identify UUID, IPAddress and IPPrefix in Vector and Map input. - Fixed sv::Variant::setType() when source was null. - Improved performance of sv::Variable JSON parsing and reduced memory usage for sv::Variant::str(). - Removed an unused prototype for su::String::regex_isearch(). - Fixed sn::DNS::shared_ptr functions and renamed static sn::DNS::resolve() to sn::DNS::sresolve(). - Modified sn::DNS::resolve() to return std::vector, default to AnyProtocol and added PTR record support. - Added sn::DNS::resolve() and sn::DNS::bulkResolve() which leverage internal async calls to improve performance. - Added optional default value output for empty containers and quote support to su::String::join() calls. - Added setIPCLock(), clearIPCLock() and hasIPCLock() to su::Privilege. - Added internal memory scrubbing of sensitive data in su::Crypt before release. - Added su::String::encrypt(), su::String::decrypt() and su::String::random(). - Converted su::ResourceLimit to a static class. - Added su::ResourceLimit::setFileDescriptors() and su::ResourceLimit::getFileDescriptors(). - Added ThreadPoolException to su::ThreadPool constructors. - Fixed sn::Socket::recv() bug length with std::string and std::vector buffers. - Added sn::SecureTCPSocket with TLS 1.0, 1.1, 1.2 and SSLv3 support. - Added regex_search_sub(), str_imatch(), strcmp(), strncmp(), strcasecmp() and strncasecmp() to su::String. - Added support to su::String::regex_search functions for inserting matches into a set. - Added su::Interface::getInterface() to lookup an interface name by IP address. - Added su::File::getDirectory(), su::File::read(), su::File::readline() and su::File::isReadable(). - Added radix_tree template under sella::container. This is a slightly enhanced version of Yuuki Takano's radix_tree. - Added CedarTrie template under sella::container. This is a wrapper around cedar by N. Yoshinaga and M. Kitsuregawa. - Added su::String::itoa() as a higher performance alternative to snprintf. - Removed deprecated su::String::substr_replace2() and substr_ireplace2(). - Removed all deprecated functions from su::Interface. v1.4.0 (11/20/14) - Added basic embedded HTTP server with callback support. - Added su::ThreadPool with scaling worker, scheduling, priority and pause functionality. - Added sn::DNS with sync and async IPv4/IPv6 resolver fuctions. - Added su::File with support for realpath, basename, dirname, exists and type/time checking. - Added su::FileLock for creating file based locks. - Added what() and getCode() to BUILD_EXCEPTION macro for SWIGPERL. - Added getName() to Exception and removed deprecated constructors. - Added RegexException to sella/util/String regular expression functions. - Added set and list support for su::String::join(). - Added char support for su::String::trim(), su::String::rtrim() and su::String::ltrim(). - Added bandwidth, dataRate, dataSize and duration to su::String with decimal support. - Added Time::chronototv() and Time::tmtostr(), Time::sptostr(), etc. functions. - Added std::chrono support for Task::setDelay() and Task::setTimer(). - Added std::chrono support for TaskQueue::push() and TaskQueue::repush(). - Added Process::stackTrace() which produces a GDB like stack trace. - Added Processs::runCommand() which runs a shell command and captures output. - Added sn::IPAddress constructors for in_addr and in6_addr. - Added sn::IPAddress incrementors and decrimentors. - Added sn::IPPrefix getIPAddresses(). - Added sn::Pipe, sn::UnixSocket, sn::SocketPair and sn::SocketTrigger. - Added additional sn::Socket::send and sn::Socket::recv functions. - Added doxygen, snapshot and yum enhancements to build system. - Added sella::server as ss and sella::file as sf to alias.h. - Added size to Variant and enhanced empty. - Added limit parameter to su::String::split(). - Added compressed CSV file and path readers and writers. - Added THROWS() and NO_EXCEPTIONS macros. - Added an updated PREFETCH() macro for added functionality. - Removed debug output in sn::Socket. - Removed all depricated sptr typedefs in favor of shared typedefs. - Removed unnessessary const on Socket remote and local informational functions. - Fixed install path for WRR and TokenBucket algos. - Fixed bug in su::String::join() when passed an empty vector. v1.3.6 (03/12/14) - Improved SWIG PERL compatability by adding ifdef around alias.h. - Fixed FIXME and TODO macros in Log. - Added missing case insensitive functions to String. v1.3.5 (03/09/14) - Added full IPv6 support to Socket classes. - Added json, c_json, xml and c_xml helper functions to Variant. - Changed default log mask to LOG_DEBUG. - Fixed output of null Variants within an Object. - Fixed libutilxx__package() and libutilxx__version. - Fixed logic error in Socket::isUsable(). - Fixed compiler warnings with Log's debug macros with NDEBUG set. - Fixed bug with Process::getPath() not appending a null. v1.3.4 (01/04/14) - Improved SWIG PERL compatability by adding ifdef around Variant's Null constructor. - Log's debug macros with NDEBUG defined now substitute with false. v1.3.3 (12/08/13) - Added boolean functions to check Variant types. - Fixed Variant string output for new types. v1.3.2 (11/26/13) - Fixed crash bug with Exceptions with formatted messages. - Added RETHROW2() and RETHROW2_CODE() macros. - Fixed Variant automatic type detection for strings. v1.3.1 (11/23/13) - Added Interface::getIPAddress(), Interface::getIndex() and Interface::getName(). - Fixed Socket::setSoBindToDevice() implementation. - Added EtherSocket::setPromiscous() and EtherSocket::getInterface(). - UUID within a Variant's Object and Vector is now quoted. - Added a number of Interface::convertMAC() functions. - Added IPAddress, IPPrefix and Pointer to Variant. - Added MixedLogFormat and VerboseLogFormat for Log. v1.3.0 (09/22/13) - Added Variant class with support for JSON as input and output. - Corrected the method used to check for C++11 support. - Added constructors for assigning a UUID with a input string. - Added isRoot(), isRootGroup(), wasRoot() and wasRootGroup() to Privilege. - Added regex_match and regex_search which accept a boost::regex. - Fixed split() and added option to include blank segments. - Added Weighted Round Robin algorithm template class. - Added BUILD_EXCEPTION macro for custom exception building. - Improved header guards to ensure they are unique. - Added IPAddress, IPPrefix and Pointer to Variant v1.2.0 (02/11/13) - Added IPPrefix including operators to check if a prefix or address contains another. - Added clear(), getPort() and getProtocol() to Port. - Added constructor for uint32_t and unsigned char[16] to IPAddress. - Added operators for bitwise AND, OR, XOR and NOT to IPAddress. - Optimized IPv6 comparisons in IPAddress. - Fixed bug related to htonl/ntohl in IPAddress. - Added sub-expression support to regex_match, regex_imatch, regex_search and regex_isearch. - Added support for attaching a numeric code to Exception. - Added macros for RETHROW, THROW_CODE, THROW2_CODE and RETHROW_CODE to Exception. - Added support for passing an Exception to Logging macros (eg: WARNING, ALERT, etc). - Added Process for access to the running process name and PID. v1.1.0 (01/06/13) - Added support for passing vector of traceoptions. - Added macros for SET_TRACE, UNSET_TRACE, CLEAR_TRACE and HAS_TRACE to Log. - Added trim, ltrim and rtrim to String. - Added substr_ireplace, regex_replace, regex_ireplace, regex_match, regex_imatch, regex_search and regex_isearch to String. - Added missing unistd.h include for GCC 4.7. - Added clear() to IPAddress. - Added functions to Interface to get MAC addresses. - Added test program for verifying library calls. This is also useful as an example of how to use the library. v1.0.0 (12/01/12) - Simplified Task callback code and changed Task.data to a vector. - Crypt functions and dependencies may now be disabled by passing SKIP_CRYPT=1 to configure or skip_crypt to rpmbuild. - Improved efficiency of TRACE and LOG calls and also added return values to allow for chaining. - Added HERE and MARK macros to Log. - Changed default LogFormat to SimpleLogFormat. - Allow syslog message length to be adjusted from default of 1022. v0.3.0 (04/21/12) - Not released - Added TODO() and FIXME() macros to Log. - Added shared_ptr() and empty() function to Task UUID, IPAddressPort, IPAddress and Port. - Added UDPSocket and RawSocket classes and simplified constructors for all socket classes. - Added push() and repush() with a timeval argument to TaskQueue. - Added move semantics to IPAddressPort, IPAddress, Port, UUID and Task. - Added Privilege class which provides ability to modify user/group and Linux capabilities. - Added optional data pointer into Task. - Added substr_replace to String. - Added str() and c_str() to Exception. - Restricted syslog message length to 1022 to avoid overflow. - Added PidFile which provides an interface to handle a pid file. v0.2.0 (03/25/12) - SocketMux now uses shared_ptr to pass Sockets. - SocketMux now cleanly supports pthread_cancel by toggling PTHREAD_CANCEL_ENABLE and PTHREAD_CANCEL_ENABLE at the internal select(). - SocketMux now includes new rselect(), wselect(), eselect() and rwselect() functions to reduce overhead on simplier workloads. - SocketMux now includes epoll() function, which performs better with high counts of sockets vs select(). - SocketMux performance improvements were implemented. - Sockets now track if they are in a SocketMux, which is queried with the Socket::hasMux() function. - Updated Socket to use IPAddressPort, IPAddress and Port classes to return local and remote addresses. - Implemented IPAddressPort, IPAddress and Port constructors accepting sockaddr and sockaddr_storage. - Added on-demand cached getString(), c_str() and getHash() functions to IPAddressPort, IPAddress and Port. - Added UUID class. - Included add() function for CommandLine which accepts a long value with bounds checking. - Improved hash functions for IPAddressPort, IPAddress and Port. v0.1.0 (01/21/12) - Initial release - Implemented IP Address (v4/v6), Socket, Command Line, Compression, Encryption, Logging, String, Time, Interface and Task classes. # vim: noet ts=2 sw=2