﻿
Corrections:
	On connect() failure and in some other situations Socat tries to get
	detailled information about the error with recvmsg(). Error return of
	this function is now logged as Info instead of Warn.

	Tests of the correction of the "IP_ADD_SOURCE_MEMBERSHIP but not struct
	ip_mreq_source" issue left an #undef in xiosysincludes.h that disabled
	the ip-add-source-membership option.
	Thanks to Benjamin Poirier for sending a patch.

	Fixed a bug in dalan module that caused SIGSEGV in, e.g.,
	SOCKET-LISTEN:1:1:'"/tmp/sock"'
	Test: DALAN_NO_SIGSEGV

	The retry option with some address types (TCP) did not close() the
	sockets after failed attempts, resulting in an FD leak.

	Filan: Corrected some syntax error messages

	Filan: Fixed a bug introduced in 1.7.4.4 that broke displaying
	TCP/UDP on options -s, -S
	Test: FILAN_SHORT_TCP

	Filan: If IP protocol type cannot be retrieved, display at least the
	socket type

	Filan: Fixed diag_set() call in filan_main.c, bug popped up with C23.
	Thanks to Cristian Rodríguez from openSUSE for reporting this issue.

	Querying the vsock Context Identifier (CID) requires an FD from opening
	/dev/vsock.
	Thanks to Volker Simonis for sending a patch.

	Fixed an internal FD leak in the EXEC,SYSTEM addresses.

	The FDs of the socketpair that queues messages from signal handlers
	lacked FD_CLOEXEC and thus leaked into EXEC and SYSTEM child processes.

	Option stderr on addresses EXEC and SYSTEM uses a temporary FD. It
	lacked the FD_CLOEXEC setting and thus leakt into child processes.

Features:
	VSOCK, VSOCK-L support options pf, socktype, prototype (currently
	useless)

Coding:
	New Environment variable SOCAT_TRANSFER_WAIT that Socat sleep before
	starting the data transfer loop. Useful, e.g., to accumulate multiple
	packets in a receiving datagram socket before starting to process them.

Porting:
	Small correction in configure.ac makes Socat C99 able.
	Thanks to Florian Weimer from Red Hat for provinding a patch.

Testing:
	Idea: EXEC,SYSTEM addresses can keep packet boundaries when option
	socktype=<val-of-SOCK_DGRAM>
	Tests: EXECSOCKETPAIRPACKETS SYSTEMSOCKETPAIRPACKETS
	
####################### V 1.7.4.4:

Corrections:
	In error.c msg2() there was a stack overflow on long messages: The
	terminating \0 Byte was written behind the last position.
	Thanks to Martin Liška for sending the address sanitizer report.

	UDP-RECVFROM with fork sometimes terminated when multiple packets
	arrived. This issue was introduced with a bug fix in version 1.7.4.0.
	Reason was not handling EAGAIN on recvmsg().
	Thanks to Jamie McQuillan for reporting this issue.

	Address TCP with options connect-timeout and retry terminated
	immediately when a connection attempt failed on network error or
	connection refused.
	Test: TCP_TIMEOUT_RETRY
	Thanks to Kamil Holubicki for reporting this issue.

	There were a couple of weaknesses and errors when accessing invalid or
	incompatible file system entries with UNIX domain, file, and generic
	addresses.
	For example, UNIX-CONNECT, when using a non matching socktype, failed
	with -1 and did not print an error message, instead of printing an
	error message and exiting with rc=1.
	Thanks to Paul Wise for reporting and analyzing the case of accessing
	a left over socket entry with GOPEN.

	The rawer option failed because it tried to clear CREAD.
	Test: RAWER

	UDP-SEND and UPD-SENDTO with option lowport always bound to port 1
	instead of a free port in range 640..1023
	Test: UDP_LOWPORT

	Fixed bad parser error message on "socat /tmp/x\"x/x -"

	Tightened syntax checks to detect numerical arguments that are missing
	or have trailing garbage.
	Test: INTEGER_GARBAGE

	ctype(3) functions need there arguments to be unsigned char.
	Thanks to Taylor R Campbell for sending a patch.

	Filan library uses Socats diag/error message system and therefore had
	always the signal handler messages socket pair open. This fix avoids
	this socketpair in standalone Filan.

	Corrected printf format for type socklen_t in two places.

Porting:
	OpenSSL, at least 1.1 on Ubuntu, crashed with SIGSEGV under certain
	conditions: client connection to server with certificate with empty
	subject, and pressing ^C after successful connect.
	This crash is now prevented by setting OPENSSL_INIT_NO_ATEXIT.
	Thanks to Martin Dorey for reporting and analyzing this issue, and for
	providing an environment for reproduction.

	Socat failed to compile on platforms that have
	IP_ADD_SOURCE_MEMBERSHIP but not struct ip_mreq_source
	Thanks to Justin Yackoski for sending a patch.

	configure.ac's detection of getprotobynumber_r() variant did not
	recognize if this function does not exist, e.g. on Musl libc.
	Thanks to Alexander Kanavin and Baruch Siach for sending patches.

	Corrected message format when no strftime() is available; improved
	handling of very long host or program names

	Solaris requires that termios options are always applied to the slave
	side of PTY.

	Fixed ancillary messages on Solaris.

	Filan: Solaris has the open file path infos in /proc/<pid>/path/
	Thanks to Andy Fiddaman to directing me to the patch.

	Filan now recognizes and prints Solaris doors and event ports.

	Solaris derivatives no longer need librt for clock_gettime()
	Thanks to Andy Fiddaman to directing me to the patch.

Building:
	Failure during building documentation, e.g. due to missing Yodl
	packages, now does not let the build process fail.
	Feature requested by Seyhun.

Features:
	Filan prints target of symlink when appropriate
	Test: FILANSYMLINK

	VSOCK-LISTEN now generates environment variables SOCAT_PEERADDR,
	SOCAT_PEERPORT, SOCAT_SOCKADDR, SOCAT_SOCKPORT
	New address aliases VSOCK, VSOCK-L

Documentation:
	Fixed typo in doc/socat-tun.html and link in README.
	Thanks to William Suthers for reporting.

	Fixed hard coded path in docu examples.
	Thanks to Jakub Wilk for sending a patch.

	Updated doc/socat-openssltunnel.html: 2048 bits, commonname

Testing:
	Unset SOCAT_MAIN_WAIT on informational Socat calls

	SOCAT=socat used ./socat instead of the version derived by $PATH

	Do not try VSOCK_ECHO test when feature is not compiled in.

	Fixed logging of test 220 TUNINTERFACE

	Musl libc refuses to execve() shell scripts, 2 tests needed to be
	adapted.

	Musl libc has FOPEN_MAX=1000 which made bash dumping core on test
	EXCEED_FOPEN_MAX.

	Added tests for failures of UNIX socket and GOPEN accesses to non
	matching file system entries.
	Tests:
	CONNECT_TO_MISSING CONNECT_TO_DENIED CONNECT_TO_DIRECTORY
	CONNECT_TO_ORPHANED CONNECT_TO_FILE CONNECT_TO_DGRAM
	CONNECT_TO_SEQPACKET SEND_TO_MISSING SEND_TO_DENIED SEND_TO_DIRECTORY
	SEND_TO_ORPHANED SEND_TO_FILE SEND_TO_STREAM SEND_TO_SEQPACKET
	SENDTO_TO_MISSING SENDTO_TO_DENIED SENDTO_TO_DIRECTORY
	SENDTO_TO_ORPHANED SENDTO_TO_FILE SENDTO_TO_STREAM SENDTO_TO_SEQPACKET
	SEQPACKET_TO_MISSING SEQPACKET_TO_DENIED SEQPACKET_TO_DIRECTORY
	SEQPACKET_TO_ORPHANED SEQPACKET_TO_FILE SEQPACKET_TO_STREAM
	SEQPACKET_TO_DGRAM UNIX_TO_MISSING UNIX_TO_DENIED UNIX_TO_DIRECTORY
	UNIX_TO_FILE UNIX_TO_ORPHANED GOPEN_TO_DENIED GOPEN_TO_DIRECTORY
	GOPEN_TO_ORPHANED 

	On RHEL-9 SCTP support requires installation of package
	kernel-modules-extra. test.sh now detects when SCTP is missing in
	kernel and reacts with warnings instead of errors.

	VSOCK loopback still does not seem to work even in kernel 5.13, so just
	issue warning on "No such device".

####################### V 1.7.4.3:

Corrections:
	Socat crashed with SIGSEGV when peer presented a certificate without
	(or empty?) subject.
	Thanks to Martin Dorey for reporting this issue and sending a patch.

	Socat 1.7.4.2 did not compile on OmniOS (and probably other OpenSolaris
	distributions)
	Thanks to Andy Fiddaman for sending a patch.

	Socat since 1.7.4.0 did not compile on Solaris and its derivatives
	because the getprotobynumber_r() function prototype differ from the
	Linux version.
	configure now checks for the variant.
	Thanks to Robert Zybeck for reporting this issue.

	The variable for the no-sni option was not initialized and could thus
	break OpenSSL certificate verification. E.g., test OPENSSL_SNI on some
	platform succeeded with -g but failed with -O compiler option.
	Thanks to valgrind for quickly finding the cause.

Porting:
	Again porting Socat to AIX (7.1) - Fixed configure and compile issues:
	Adapted include requirements for IPv6
	Guarded MSG_DONTWAIT

	Continued porting Socat to AIX-7.1 - Fixed some runtime errors:
	UNIX domain sockets of type SEQPACKET are not available.
	Connecting to UNIX datagram socket fails with EPROTONOSUPPORT (vs.
	EPROTOTYPE on most other OSes).
	Streams: Must not push ldterm when it is already active (hangs).

Building:
	Socats build date and time may now be set externally with environment
	variable SOURCE_DATE_EPOCH.
	Thanks to Viktor Kleinik for sending a patch.

	Building Socat in a sub directory failed.
	Now the following works even for the docu parts:
	mkdir -p myos; cd myos; ../configure && make; cd ..
	Thanks to Jon Ringle for sending a patch.

Testing:
	test.sh: many corrections for AIX's older shell utilities, e.g.sleep(1)
	does not allow fractions of seconds, grep does not understand '\<';
	OpenIndiana/SunOS netstat format;
	many more functional and cosmetic code corrections.

Documentation:
	The socktype option was documented unspecifically as type option.
	Thanks to Jonas Metzger for the hint.

####################### V 1.7.4.2:

Corrections:
	The per address parameters for OpenSSL overlapped in memory with socket
	parameters. Magically this did not seem to cause problems except on
	MacOS Catalina that reported errors like:
	socat[3458] E Select(7, &0x80, NULL, NULL, {140392884396544.000000}):
	Invalid argument
	Test: OPENSSL_PARA_OVERLAP
	Thanks to Ryo Ota for reporting this bug.

	Fixed a few minor coding issues

	A VSOCK warning message was generated with all listening addresses
	instead of only with VSOCK-LISTEN

	When an OPENSSL-CONNECT client presented a certificate with IPv6
	subject alternate name and the OPENSSL-LISTEN server had no commonname
	option, the server crashed with SIGSEGV in xioip6_pton().
	Test: OPENSSL_CLIENT_IP6_CN
	Red Hat bug 1981308
	Thanks to Vlad Slepukhin for reporting this issue and providing a patch

	Corrected a typo in configure.ac that broke option --enable-openssl-base
	Thanks to john1doe for reporting this issue.

	Socat looped endlessly, not responding to SIGTERM, when a service name
	(for port) could not be resolved.
	Test: BAD_SERVICE

	Using options of NAMED group, e.g.chown, with abstract UNIX domain
	sockets, produced errors because the function was applied with a normal
	file system related call, e.g.chown(), using file "" (empty name). Instead of
	chown(), Socat now uses fchown() on the file descriptor. However, such
	a call usually has no real effect.	
	Test: ABSTRACT_USER
	Thanks to Andreas Fink for reporting this issue.

	Option -R did not only dump ("sniff") right-to-left, but also
	left-to-right traffic to the given file.
	Test: SNIFF_RIGHT_TO_LEFT
	Thanks to 1314 gsf for reporting this bug and sending a patch.

	Options -r and -R, when opening a named pipe that has no actual reader,
	failed with "No such device or address". To solve this problem, Socat
	now opens the pipe in rw-Mode.
	Thanks to Cody J.Soultz for sending a patch.

	The call "socat -r - PIPE" traced to file ./- instead of issuing a
	syntax error.

	Print a message when readbytes option causes EOF

	The ip-recverr option had no effect. Corrected and improved its
	handling of ancilliary messages, so it is able to analyze ICMP error
	packets (Linux only?)

	Setgui(), Setuid() calls in xio-progcall.c were useless.

Testing:
	Prevent the TIMESTAMP tests from sporadically failing due do seconds
	overflow

	Fixed in test.sh a few issues reported by shellcheck

Documentation:
	Added missing docu of OpenSSL options min-proto-version,
	max-proto-version.

	Added missing closing parenthesis in socat.yo.
	Thanks to Emanuele Torre for reporting this issue.

	Corrected more typos and added missing bug info to CHANGES, performed
	some non functional corrections.

Porting:
	Corrected building when clock_gettime() not available, with or without
	gettimeofday().

####################### V 1.7.4.1:

Corrections:
	Socat 1.7.4.0 failed to compile especially on 32 bit systems.
	Thanks to Wang Mingyu and others for sending a patch or reporting this
	issue.

	Under certain conditions OpenSSL stream connections, in particular bulk
	data transfer in unidirectional mode, failed during transfer or near
	its with Connection reset by peer on receiver side.
	This happened with Socat versions 1.7.3.3 to 1.7.4.0. Reasons were
	lazy SSL shutdown handling on the sender side in combination with
	SSL_MODE_AUTO_RETRY turned off.
	Fix: After SSH_shutdown but before socket shutdown call SSL_read()
	Test: OPENSSL_STREAM_TO_SERVER
	Fixes Red Hat issue 1870279.

####################### V 1.7.4.0:

Security:
	Buffer size option (-b) is internally doubled for CR-CRLF conversion,
	but not	checked for integer overflow. This could lead to heap based
	buffer overflow, assuming the attacker could provide this parameter.
	Test: BLKSIZE_INT_OVERFL
	Thanks to Lê Hiếu Bùi for reporting this issue and sending an
	example exploit.

Corrections:
	Socats address parser read over end of string when there were unbalanced
	quotes
	Test: UNBALANCED_QUOTE

	Removed unused usleep() call from sycls.c

	Unsetenv() was conditional in sysutils.c but not in xio-openssl.c thus
	building failed on Solaris 9.
	Thanks to Greg Earle for reporting this issue and providing a patch.

	Mitigated race condition of quickly terminating SYSTEM or EXEC child
	processes.

	Option o-direct might require alignment of read/write buffer to, e.g.,
	512 bytes, Socat now takes care of this when allocating the buffer.
	With this fix read() succeeds, however, write() still might fail when
	not writing complete pages.
	Test: O_DIRECT

	There was a race condition in the way Socat UDP-RECVFROM and similar
	addresses with option fork prevents one packet from triggering
	multiple processes. The symptom was that Socat master process seemed to
	hang and did not process further packets. The fix makes use of
	pselect() system call.
	Thanks to Fulvio Scapin for reporting this issue.

	UNIX domain client addresses applied file system entry options (group
	NAMED) to the server socket instead of the client (bind) socket entry.
	Tests: UNIX_SENDTO_UNLINK UNIX_CONNECT_UNLINK
	Thanks to Nico Williams for reporting this major issue.

	Length of single address options was limited to 511 bytes. This value
	is now increased to 2047 bytes.
	Change suggested by Mario Camou.

	Addresses of type RECVFROM with option fork looped with an error
	message in case that the second address failed before consuming the
	packet. The fix makes RECVFROM drop the packet when the second address
	failed before reading it. Use retry or forever option with the second
	address if you want to avoid data loss.
	Fixes Red Hat bug 1907718
	Thanks to Chunmei Xu for reporting this issue and proving the patch.

	Socats DTLS implementation has been reworked and appears to work now
	reasonably over UDP.
	New addresses: OPENSSL-DTLS-SERVER (DTLS-L),
		OPENSSL-DTLS-CLIENT (DTLS)
	Tests: OPENSSL_DTLS_CLIENT OPENSSL_DTLS_SERVER
		OPENSSL_METHOD_DTLS1 OPENSSL_METHOD_DTLS1.2
	Thanks to Brandon Carpenter, Qing Wan, and Pavel Nakonechnyi for
	sending patches.

	filan did not output the socket protocol.
	filan -s assumed each stream socket to be TCP and each datagram socket
	to be UDP. Now it uses SO_PROTOCOL and getprotoent() for correct output.

	Help text showed two parameters for UDP4-RECVFROM address, but only
	<port> is allowed.
	Thanks to John the Scott for reporting this issue.

	Error messages from SSL_read() and SSL_write() sometimes stated
	SSL_connect instead of originating function name.

	Fixed some more non functional minor issues.

Porting:
	In gcc version 10 the default changed from -fcommon to -fno-common.
	Consequently, linking filan and procan failed with error
	"multiple definition of `deny_severity'" and `allow_severity'
	Fixed by removing definitions in filan.c and procan.c
	Debian issue 957823
	Thanks to László Böszörményi and others for reporting this issue.

	Solaris 9 does not provide strndup(); added substitute code.
	Thanks to Greg Earle for providing a patch.

	Added configure option --enable-openssl-base to specify the location of
	a non-OS OpenSSL installation

	There are systems whose kernel understands SCTP but getaddrinfo does
	not. As workaround after EIA_SOCKTYPE on name and service resolution
	fall back to ai_socktype=0; if it fails with EAI_SERVICE, set
	ai_protocol=0 and try again
	Test: SCTP_SERVICENAME

	Per file filesystem options were still named ext2-* and depended on
	<linux/ext2_fs.h>. Now they are called fs-* and depend on <linux/fs.h>.
	These fs-* options are also available on old systems with ext2_fs.h

	New options openssl-min-proto-version (min-version) and
	openssl-max-proto-version (max-version) give access to the related
	OpenSSL set-macros and substitute deprecated version-specific methods.
	Test: OPENSSL_MIN_VERSION

	With OpenSSL use OPENSSL_init_SSL when available, instead of deprecated
	SSL_library_init.

	With OPENSSL_API_COMPAT=0x10000000L the files openssl/dh.h, openssl/bn.h
	must explicitely be included.
	Thanks to Rosen Penev for reporting and sending a patch.

Testing:
	test.sh now produces a list of tests that could not be performed for
	any reason. This helps to analyse these cases.

	OpenSSL s_server appearently started to neglect TCPs half close feature.
	Test OPENSSL_TCP4 has been changed to tolerate this.

	OpenSSL changed its behaviour when connection is rejected. Tests
	OPENSSLCERTSERVER, OPENSSL_CN_CLIENT_SECURITY, and
	OPENSSL_CN_SERVER_SECURITY now tolerate this.

	OpenSSL no longer allows explicit renegotiation with TLSv1.3, thus the
	appropriate tests failed.
	Fix: use TLSv1.2 for renegotiation tests
	Tests: OPENSSLRENEG1 OPENSSLRENEG2

	Ubuntu 20.04 requires 2048 bit certificates with OpenSSL

	Archlinux 2020 has not which command; its ip,ss commands have modified
	version strings

	More testing issues solved:
	* ss to pipe might omit column separator
	* UDP6MULTICAST_UNIDIR fails on newer Linux kernels
	* do not use sort -V
	* renamed testaddrs() to testfeats(), and introduced new testaddrs()

New features:
	GOPEN and UNIX-CLIENT addresses now support sockets of type SEQPACKET.
	Test: GOPENUNIXSEQPACKET
	Feature suggested by vi0oss.

	The generic setsockopt-int and related options are, in case of
	listening/accepting addresses, applied to the connected socket(s). To enable
	setting options on the listening socket, a new option setsockopt-listen
	has been implemented. See the documentation for info on data types.
	Tests: SETSOCKOPT SETSOCKOPT_LISTEN
	Thanks to Steven Danna and Korian Edeline for reporting this issue.

	Filan option -S gives short description like -s but with improved
	format

	Socat OpenSSL client, when server was specified using IP address, did
	not verify connection on certificates SubjectAltName IP entries.
	Tests: OPENSSL_SERVERALTAUTH OPENSSL_SERVERALTIP4AUTH OPENSSL_SERVERALTIP6AUTH
	Fixes Red Hat bug 1805132

	Added options -r and -R for raw dump of transferred data to files.
	Test: OPTION_RAW_DUMP

	Added option ip-transparent (socket option IP_TRANSPARENT)
	Thanks to Wang Shanker for sending a patch.

	OPENSSL-CONNECT now automatically uses the SNI feature, option
	openssl-no-sni turns it off. Option openssl-snihost overrides the value
	of option openssl-commonname or the server name.
	Tests: OPENSSL_SNI OPENSSL_NO_SNI
	Thanks to Travis Burtrum for providing the initial patch

	New option accept-timeout (listen-timeout)
	Test: ACCEPTTIMEOUT
	Proposed by Roland

	New option ip-add-source-membership
	Feature inspired by Brian (b f31415)

	INCOMPATIBLE CHANGE: Address UDP-DATAGRAM now does not check peerport
	of replies, as it did up to version 1.7.3.4. Use option sourceport when
	you need the old behaviour.
	Test: UDP_DATAGRAM_SOURCEPORT
	Feature inspired by Hans Bueckler for SSDP inquiry (for UPnP)

	New option proxy-authorization-file reads PROXY-CONNECT credentials
	from file and makes it possible to hide this data from the process
	table.
	Test: PROXYAUTHFILE
	Thanks to Charles Stephens for sending an initial patch.

	Added AF_VSOCK support with VSOCK-CONNECT and VSOCK-LISTEN addresses.
	Developed by Stefano Garzarella.

Coding:
	Added printf formats for uint16_t etc.

Documentation:
	Address UDP-RECV does not support option fork.
	Thanks to Fulvio Scapin for reporting that mistake in docu.

	TUN address documentation showed TCP for backend which may merge
	consecutive packets which causes data loss.
	Thanks to Tomasz Lakota for reporting this issue.

####################### V 1.7.3.4:

Corrections:
	Header of xiotermios_speed() declared parameter unsigned int instead of
	speed_t, thus compiling failed on MacOS
	Thanks to Joe Strout and others for reporting this bug.
	Thanks to Andrew Childs and others for sending a patch.

	Under certain circumstances, termios options of the first address were
	applied to the second address, resulting in error
	"Inappropriate ioctl for device" 
	This affected version 1.7.3.3 only.
	Test: TERMIOS_PH_ALL
	Thanks to Ivan J. for reporting this issue.

	Socat failed to compile when no poll() system call was found by
	configure.
	Thanks to Jason White for sending a patch.

	Due to use of SSL_CTX_clear_mode() Socat failed to compile on old
	systems with, e.g., OpenSSL-0.9.8. Thanks to Simon Matter and Moritz B.
	for reporting this problem and sending initial patches.

	getaddrinfo() in IP4-SENDTO and IP6-SENDTO addresses failed with
	"ai_socktype not supported" when protocol 6 was addressed.
	The fix removes the possibility to use service names with SCTP.
	Test: IP_SENDTO_6
	Thanks to Sören for sending an initial patch.

	Under certain circumstances, Socat printed the "socket ... is at EOF"
	multiple times.
	Test: MULTIPLE_EOF

	Newer parts of test.sh used substitutions ${x,,*} or ${x^^*} that are
	not implemented in older bash versions.

####################### V 1.7.3.3:

Corrections:
	Makefile.in did not specify dependencies of filan on vsnprintf_r.o
	and snprinterr.o
	Added definition of FILAN_OBJS
	Thanks to Craig Leres, Clayton Shotwell, and Chris Packham for
	providing patches.

	configure option --enable-msglevel did not work with numbers

	The autoconf mechanism for determining SHIFT_OFFSET did not work when
	cross compiling.
	Thanks to Max Freisinger from Gentoo for sending a patch.

	Socat still depended on obsolete gethostbyname() function, thus
	compiling with MUSL libc failed.
	Problem reported by Kennedy33.

	The async signal safe diagnostic system used FDs 3 and 4 internally, so
	use of appropriate fdin or fdout led to failures.
	Test: DIAG_FDIN
	Problem reported by Onur Sentürk.

	The socket based mechanism for passing messages and signal information
	from signal handler to process could reach and kill the wrong process.
	Introduces functions diag_sock_pair(), diag_fork()
	Thanks to Darren Zhao for analysing and reporting this problem.

	Option ipv6-join-group did not work because it was applied in the wrong
	phase
	Test: UDP6MULTICAST_UNIDIR
	Thanks to Angus Gratton for sending a patch.

	Setting ispeed and ospeed failed for some serial devices because the
	two settings were applied with two different get/set cycles, Thanks to
	Alexandre Fenyo for providing an initial patch.
	However, the actual fix is part of a conceptual change of the termios
	module that aims for applying all changes in a single tcsetaddr call.
	Fixes FreeBSD Bug 198441

	Termios options TAB0,TAB1,TAB2,TAB3, and XTABS did not have an effect.
	Thanks to Alan Walters for reporting this bug.

	Substituted cumbersom ISPEED_OFFSET mechanism for cfsetispeed() calls

	With TCP6-LISTEN and the other passive IPv6 addresses the range option
	just failed: due to a bug in the syntax parser and two more bugs in
	the xiocheckrange_ip6() function.
	The syntax has now been changed from "[::1/128]" to "[::1]/128"!
	Thanks Leah Neukirchen for sending an initial fix.

	For name resolution Socat only checked the first character of the host
	name to decide if it is an IPv4 address. This was not RFC conform. This
	fix removes the possibility for use of IPv4 addresses with IPv6, e.g.
	TCP6:127.0.0.1:80
	Debian issue 695885
	Thanks to Nicolas Fournil for reporting this issue.

	Print a useful error message when single character options appear to be
	merged in Socat invocation
        Test: SOCAT_OPT_HINT

	Fixed some docu typos.
	Thanks to Travis Wellman, Thomas <tjps636>, Dan Kenigsberg,
	Julian Zinn, and Simon Matter

Porting:
	OpenSSL functions TLS1_client_method() and similar are 
	deprecated. Socat now uses recommended TLS_client_method(). The old
	functions and dependend option openssl-method can still be
	used when configuring socat with --enable-openssl-method

	Shell scripts in socat distribution are now headed with:
	#! /usr/bin/env bash
	to make them better portable to systems without /bin/bash
	Thanks to Maya Rashish for sending a patch

	RES_AAONLY, RES_PRIMARY are deprecated. You can still enable them with
	configure option --enable-res-deprecated.

	New versions of OpenSSL preset SSL_MODE_AUTO_RETRY which may hang socat.
	Solution: clear SSL_MODE_AUTO_RETRY when it is set.

	Renamed configure.in to configure.ac and set an appropriate symlink for
	older environments.
	Related Gentoo bug 426262: Warning on configure.in
	Thanks to Francesco Turco for reporting that warning.

	Fixed new IPv6 range code for platforms without s6_addr32 component.

Testing:
	test.sh: Show a warning when phase-1 (insecure phase) of a security
	test fails

	OpenSSL tests failed on actual Linux distributions. Measures:
	Increased key lengths from 768 to 1024 bits
	Added test.sh option -C to delete temp certs from prevsious runs
	Provide DH-parameter in certificate in PEM
	OpenSSL s_server option -verify 0 must be omitted
	OpenSSL authentication method aNULL no longer works
	Failure of cipher aNULL is not a failure
	Failure of methods SSL3 and SSL23 is desired

	test.sh depended on ifconfig and netstat utilities which are no longer
	availabie in some distributions. test.sh now checks for and prefers
	ip and ss.
	Thanks to Ruediger Meier for reporting this problem.

	More corrections to test.sh:
	Language settings could still influence test results
	netstat was still required
	Suppress usleep deprecated messag
	Force use of IPv4 with some certificates
	Set timeout for UDPxMAXCHILDREN tests

Git:
	Added missing Config/Makefile.DragonFly-2-8-2,
	Config/config.DragonFly-2-8-2.h
	Removed testcert.conf (to be generated by test.sh)

Cosmetics:
	Simplified handling of missing termios defines.

New features:
	Permit combined -d options as -dd etc.

porting:
	ext2 options are now fs options.
	
####################### V 1.7.3.2:

corrections:
	SIGSEGV and other signals could lead to a 100% CPU loop

	Failing name resolution could lead to SIGSEGV
	Thanks to Max for reporting this issue.

	Include <stddef.h> for ptrdiff_t
	Thanks to Jeroen Roovers for reporting this issue.

	Building with --disable-sycls failed due to missing sslcls.h defines

	Socat hung when configured with --disable-sycls.

	Some minor corrections with includes etc.

	Option so-reuseport did not work. Thanks to Some Raghavendra Prabhu
	for sending a patch.

	Programs invoked with EXEC, nofork, and -u or -U had stdin and stdout
	incorrectly assigned
	Test: EXEC_NOFORK_UNIDIR
	Thanks to David Reiss for reporting this problem.

	Socat exited with status 0 even when a program invoked with SYSTEM or
	EXEC failed.
	Tests: SYSTEM_RC EXEC_RC
	Issue reported by Felix Winkelmann.

	AddressSanitizer reported a few buffer overflows (false positives).
	Nevertheless fixed Socat source.
	Issue reported by Hanno Böck.

	Socat did not use option ipv6-join-group.
	Test: USE_IPV6_JOIN_GROUP
	Thanks to Linus Lüssing for sending a patch.

	UDP-LISTEN did not honor the max-children option.
	Test: UDP4MAXCHILDREN UDP6MAXCHILDREN
	Thanks to Leander Berwers for reporting this issue.

	Options so-rcvtimeo and so-sndtimeo do not work with poll()/select()
	and therefore were useless.
	Thanks to Steve Borenstein for reporting this issue.

	Option dhparam was documented as dhparams. Added the alias name
	dhparams to fix this.
	Thanks to Alexander Neumann for sending a patch.

	Options shut-down and shut-close did not work.
	Thanks to Stefan Schimanski for providing a patch.

	There was a bug in printing readline log message caused by a misleading
	indentation.
	Thanks to Paul Wouters for reporting.

	The internal vsnprintf_r function looped or crashed on size parameter
	with hexadecimal output.

	Ignore exit code of child process when it was killed by master due to
	EOF

	Corrected byte order on read of IPV6_TCLASS value from ancillary
	message

	Fixed type of the bool element in options. This had bug caused failures
	e.g. of ignoreeof on big-endian systems when bool was not based on int.

	On systems with predefined bool type whose size differs from int some
	IPv6 and TCP options (per setsockopt()) failed.

	Length of integral data in ancillary messages varies (TOS: 1 byte,
	TTL: 4 bytes), the old implementation failed for TTL on big-endian
	hosts.

	Fixed an issue in options processing: TUN and DNS flags had failed on
	big-endian systems and the NO- forms had probable never worked.

porting:
	Type conflict between int and sig_atomic_t between declaration and
	definition of diag_immediate_type and diag_immediate_exit broke
	compilation on FreeBSD 10.1 with clang. Thanks to Emanuel Haupt for
	reporting this bug.

	Socat failed to compile on platforms with OpenSSL without
	DTLSv1_client_method or DTLSv1_server_method.
	Thanks to Simon Matter for sending a patch.

	NuttX OS headers do not provide struct ip, thus socat did not compile.
	Made struct ip subject to configure.
	Thanks to SP for reporting this issue.

	Socat failed to compile with OpenSSL version 1.0.2d where
	SSLv3_server_method and SSLv3_client_method are no longer defined.
	Thanks to Mischa ter Smitten for reporting this issue and providing
	a patch.

	configure checked for OpenSSL EC_KEY assuming it is a define but it
	is a type, thus OpenSSL ECDHE ciphers failed even on Linux.
	Thanks to Andrey Arapov for reporting this bug.

	Changes to make socat compile with OpenSSL 1.1. 
	Thanks to Sebastian Andrzej Siewior e.a. from the Debian team for
	providing the base patch.
	Debian Bug#828550

	Make Socat compatible with BoringSSL.
	Thanks to Matt Braithwaite for providing a patch.

	OpenSSL: Use RAND_status to determine PRNG state
	Thanks to Adam Langley for providing a patch

	AIX-7 uses an extended O_ACCMODE that does not fit socat's internal
	requirements. Thanks to Garrick Trowsdale for providing a patch

	LibreSSL support: check for OPENSSL_NO_COMP
	Thanks to Bernard Spil for providing a patch

testing:
	socks4echo.sh and socks4a-echo.sh hung with new bash with read -n

	test.sh: stderr; option -v (verbose); FDOUT_ERROR description

	improved proxy.sh - it now also takes hostnames

	A few corrections in test.sh

	DTLS1 test hangs on some distributions. Test is now only performed
	with OpenSSL 1.0.2 or higher.

	More corrections to test.sh that reveal a mistake with IPV6_TCLASS

docu:
	Corrected source of socat man page to correctly show man references
	like socket(2); removed obseolete entries from See Also

	Docu and some comments mentioned addresses SSL-LISTEN and SSL-CONNECT
	that do not exist (OPENSSL-LISTEN, SSL-L; and OPENNSSL-CONNECT, SSL
	are correct).
	Thanks to Zhigang Wang for reporting this issue.

	Fixed a couple of English spelling and grammar mistakes.
	Thanks to Jakub Wild for sending the patches.

	NOEXPAND() was not resolved 2 times.

	More minor docu corrections

legal:
	Added contributors to copyright notices. Suggested by Matt Braithwaite.

####################### V 1.7.3.1:

security:
	Socat security advisory 8
	A stack overflow in vulnerability was found that can be triggered when
	command line arguments (complete address specifications, host names,
	file names) are longer than 512 bytes.
	Successful exploitation might allow an attacker to execute arbitrary
	code with the privileges of the socat process.
	This vulnerability can only be exploited when an attacker is able to
	inject data into socat's command line.
	A vulnerable scenario would be a CGI script that reads data from clients
	and uses (parts of) this data as hostname for a Socat invocation.
	Test: NESTEDOVFL
	Credits to Takumi Akiyama for finding and reporting this issue.

	Socat security advisory 7
	MSVR-1499
	In the OpenSSL address implementation the hard coded 1024 bit DH p
	parameter was not prime. The effective cryptographic strength of a key
	exchange using these parameters was weaker than the one one could get by
	using a prime p. Moreover, since there is no indication of how these
	parameters were chosen, the existence of a trapdoor that makes possible
	for an eavesdropper to recover the shared secret from a key exchange
	that uses them cannot be ruled out.
	Futhermore, 1024bit is not considered sufficiently secure.
	Fix: generated a new 2048bit prime.
	Thanks to Santiago Zanella-Beguelin and Microsoft Vulnerability
	Research (MSVR) for finding and reporting this issue.

####################### V 1.7.3.0:

security:
	Socat security advisory 6
	CVE-2015-1379: Possible DoS with fork
	Fixed problems with signal handling caused by use of not async signal
	safe functions in signal handlers that could freeze socat, allowing
	denial of service attacks.
	Many changes in signal handling and the diagnostic messages system were
	applied to make the code async signal safe but still provide detailled
	logging from signal handlers:
	Coded function vsnprintf_r() as async signal safe incomplete substitute
	of libc vsnprintf()
	Coded function snprinterr() to replace %m in strings with a system error
	message
	Instead of gettimeofday() use clock_gettime() when available
	Pass Diagnostic messages from signal handler per unix socket to the main
	program flow
	Use sigaction() instead of signal() for better control
	Turn off nested signal handler invocations
	Thanks to Peter Lobsinger for reporting and explaining this issue.

	Red Hat issue 1019975: add TLS host name checks
	OpenSSL client checks if the server certificates names in
	extensions/subjectAltName/DNS or in subject/commonName match the name
	used to connect or the value of the openssl-commonname option.
	Test: OPENSSL_CN_CLIENT_SECURITY

	OpenSSL server checks if the client certificates names in
	extensions/subjectAltNames/DNS or subject/commonName match the value of
	the openssl-commonname option when it is used.
	Test: OPENSSL_CN_SERVER_SECURITY

	Red Hat issue 1019964: socat now uses the system certificate store with
	OPENSSL when neither options cafile nor capath are used

	Red Hat issue 1019972: needs to specify OpenSSL cipher suites
	Default cipherlist is now "HIGH:-NULL:-PSK:-aNULL" instead of empty to
	prevent downgrade attacks

new features:
	OpenSSL addresses set couple of environment variables from values in
	peer certificate, e.g.: 
	SOCAT_OPENSSL_X509_SUBJECT, SOCAT_OPENSSL_X509_ISSUER,
	SOCAT_OPENSSL_X509_COMMONNAME, 
	SOCAT_OPENSSL_X509V3_SUBJECTALTNAME_DNS
	Tests: ENV_OPENSSL_{CLIENT,SERVER}_X509_*

	Added support for methods TLSv1, TLSv1.1, TLSv1.2, and DTLS1
	Tests: OPENSSL_METHOD_*

	Enabled OpenSSL server side use of ECDHE ciphers. Feature suggested
	by Andrey Arapov.

	Added a new option termios-rawer for ptys.
	Thanks to Christian Vogelgsang for pointing me to this requirement

corrections:
	Bind with ABSTRACT commands used non-abstract namespace (Linux).
	Test: ABSTRACT_BIND
	Thanks to Denis Shatov for reporting this bug.

	Fixed return value of nestlex()

	Option ignoreeof on the right address hung.
	Test: IGNOREEOF_REV
	Thanks to Franz Fasching for reporting this bug.

	Address SYSTEM, when terminating, shut down its parent addresses,
	e.g. an SSL connection which the parent assumed to still be active.
	Test: SYSTEM_SHUTDOWN

	Passive (listening or receiving) addresses with empty port field bound
	to a random port instead of terminating with error.
	Test: TCP4_NOPORT

	configure with some combination of disable options produced config
	files that failed to compile due to missing IPPROTO_TCP.
	Thanks to Thierry Fournier for report and patch.

	fixed a few minor bugs with OpenSSL in configure and with messages

	Socat did not work in FIPS mode because 1024 instead of 512 bit DH prime
	is required. Thanks to Zhigang Wang for reporting and sending a patch.

	Christophe Leroy provided a patch that fixes memory leaks reported by
	valgrind

	Help for filan -L was bad, is now corrected to:
	"follow symbolic links instead of showing their properties"

	Address options fdin and fdout were silently ignored when not applicable
	due to -u or -U option. Now these combinations are caught as errors.
	Test: FDOUT_ERROR
	Issue reported by Hendrik.

	Added option termios-cfmakeraw that calls cfmakeraw() and is preferred
	over option raw which is now obsolote. On SysV systems this call is
	simulated by appropriate setting.
	Thanks to Youfu Zhang for reporting issue with option raw.

porting:
	Socat included <sys/poll.h> instead of POSIX <poll.h>
	Thanks to John Spencer for reporting this issue.

	Version 1.7.2.4 changed the check for gcc in configure.ac; this
	broke cross compiling. The particular check gets reverted.
	Thanks to Ross Burton and Danomi Manchego for reporting this issue.

	Debian Bug#764251: Set the build timestamp to a deterministic time:
	support external BUILD_DATE env var to allow to build reproducable
	binaries

	Joachim Fenkes provided an new adapted spec file.

	Type bool and macros Min and Max are defined by socat which led to
	compile errors when they were already provided by build framework.
	Thanks to Liyu Liu for providing a patch.

	David Arnstein contributed a patch for NetBSD 5.1 including stdbool.h
	support and appropriate files in Config/

	Lauri Tirkkonen contributed a patch regarding netinet/if_ether.h
	on Illumos

	Changes for Openindiana: define _XPG4_2, __EXTENSIONS__,
	_POSIX_PTHREAD_SEMANTICS; and minor changes

	Red Hat issue 1182005: socat 1.7.2.4 build failure missing
	linux/errqueue.h
	Socat failed to compile on on PPC due to new requirements for
	including <linux/errqueue.h> and a weakness in the conditional code.
	Thanks to Michel Normand for reporting this issue.

doc:
	In the man page the PTY example was badly formatted. Thanks to
	J.F.Sebastian for sending a patch.

	Added missing CVE ids to security issues in CHANGES

testing:
	Do not distribute testcert.conf with socat source but generate it
	(and new testcert6.conf) during test.sh run.

####################### V 1.7.2.4:

corrections:
	LISTEN based addresses applied some address options, e.g. so-keepalive,
	to the listening file descriptor instead of the connected file
	descriptor
	Thanks to Ulises Alonso for reporting this bug

	make failed after configure with non gcc compiler due to missing
	include. Thanks to Horacio Mijail for reporting this problem

	configure checked for --disable-rawsocket but printed
	--disable-genericsocket in the help text. Thanks to Ben Gardiner for
	reporting and patching this bug

	In xioshutdown() a wrong branch was chosen after RECVFROM type addresses.
	Probably no impact.
	Thanks to David Binderman for reporting this issue.

	procan could not cleanly format ulimit values longer than 16 decimal
	digits. Thanks to Frank Dana for providing a patch that increases field
	width to 24 digits.

	OPENSSL-CONNECT with bind option failed on some systems, eg.FreeBSD, with
	"Invalid argument"
	Thanks to Emile den Tex for reporting this bug.

	Changed some variable definitions to make gcc -O2 aliasing checker happy
	Thanks to Ilya Gordeev for reporting these warnings

	On big endian platforms with type long >32bit the range option applied a
	bad base address. Thanks to hejia hejia for reporting and fixing this bug.

	Red Hat issue 1022070: missing length check in xiolog_ancillary_socket()

	Red Hat issue 1022063: out-of-range shifts on net mask bits

	Red Hat issue 1022062: strcpy misuse in xiosetsockaddrenv_ip4()

	Red Hat issue 1022048: strncpy hardening: corrected suspicious strncpy()
	uses

	Red Hat issue 1021958: fixed a bug with faulty buffer/data length
	calculation in xio-ascii.c:_xiodump()

	Red Hat issue 1021972: fixed a missing NUL termination in return string
	of sysutils.c:sockaddr_info() for the AF_UNIX case

	fixed some typos and minor issues, including:
	Red Hat issue 1021967: formatting error in manual page

	UNIX-LISTEN with fork option did not remove the socket file system entry
	when exiting. Other file system based passive address types had similar
	issues or failed to apply options umask, user e.a.
	Thanks to Lorenzo Monti for pointing me to this issue

porting:
	Red Hat issue 1020203: configure checks fail with some compilers.
	Use case: clang

	Performed changes for Fedora release 19

	Adapted, improved test.sh script

	Red Hat issue 1021429: getgroupent fails with large number of groups;
	use getgrouplist() when available instead of sequence of calls to
	getgrent()

	Red Hat issue 1021948: snprintf API change;
	Implemented xio_snprintf() function as wrapper that tries to emulate C99
	behaviour on old glibc systems, and adapted all affected calls
	appropriately

	Mike Frysinger provided a patch that supports long long for time_t,
	socklen_t and a few other libc types.

	Artem Mygaiev extended Cedril Priscals Android build script with pty code

	The check for fips.h required stddef.h
	Thanks to Matt Hilt for reporting this issue and sending a patch

	Check for linux/errqueue.h failed on some systems due to lack of
	linux/types.h inclusion. Thanks to Michael Vastola for sending a patch.

	autoconf now prefers configure.ac over configure.in
	Thanks to Michael Vastola for sending a patch.

	type of struct cmsghdr.cmsg is system dependend, determine it with
	configure; some more print format corrections

docu:
	libwrap always logs to syslog

	added actual text version of GPLv2

####################### V 1.7.2.3:

security:
	Socat security advisory 5
	CVE-2014-0019: socats PROXY-CONNECT address was vulnerable to a buffer
	overflow with data from command line (see socat-secadv5.txt)
	Credits to Florian Weimer of the Red Hat Product Security Team

####################### V 1.7.2.2:

security:
	Socat security advisory 4
	CVE-2013-3571:
	after refusing a client connection due to bad source address or source
	port socat shutdown() the socket but did not close() it, resulting in
	a file descriptor leak in the listening process, visible with lsof and
	possibly resulting in EMFILE Too many open files. This issue could be
	misused for a denial of service attack.
	Full credits to Catalin Mitrofan for finding and reporting this issue.

####################### V 1.7.2.1:

security:
	Socat security advisory 3
	CVE-2012-0219:
	fixed a possible heap buffer overflow in the readline address. This bug
	could be exploited when all of the following conditions were met:
	1) one of the addresses is READLINE without the noprompt and without the
	prompt options.
	2) the other (almost arbitrary address) reads malicious data (which is
	then transferred by socat to READLINE).
	Workaround: when using the READLINE address apply option prompt or
	noprompt.
	Full credits to Johan Thillemann for finding and reporting this issue.

####################### V 1.7.2.0:

corrections:
	when UNIX-LISTEN was applied to an existing file it failed as expected
	but removed the file. Thanks to Bjoern Bosselmann for reporting this
	problem

	fixed a bug where socat might crash when connecting to a unix domain
	socket using address GOPEN. Thanks to Martin Forssen for bug report and
	patch.

	UDP-LISTEN would alway set SO_REUSEADDR even without fork option and
	when user set it to 0. Thanks to Michal Svoboda for reporting this bug.

	UNIX-CONNECT did not support half-close. Thanks to Greg Hughes who
	pointed me to that bug

	TCP-CONNECT with option nonblock reported successful connect even when
	it was still pending

	address option ioctl-intp failed with "unimplemented type 26". Thanks
	to Jeremy W. Sherman for reporting and fixing that bug

	socat option -x did not print packet direction, timestamp etc; thanks
	to Anthony Sharobaiko for sending a patch

	address PTY does not take any parameters but did not report an error
	when some were given

	Marcus Meissner provided a patch that fixes invalid output and possible
	process crash when socat prints info about an unnamed unix domain
	socket

	Michal Soltys reported the following problem and provided an initial
	patch: when socat was interrupted, e.g. by SIGSTOP, and resumed during
	data transfer only parts of the data might have been written.

	Option o-nonblock in combination with large transfer block sizes
	may result in partial writes and/or EAGAIN errors that were not handled
	properly but resulted in data loss or process termination.

	Fixed a bug that could freeze socat when during assembly of a log
	message a signal was handled that also printed a log message. socat
	development had been aware that localtime() is not thread safe but had
	only expected broken messages, not corrupted stack (glibc 2.11.1,
	Ubuntu 10.4)

	an internal store for child pids was susceptible to pid reuse which
	could lead to sporadic data loss when both fork option and exec address
	were used. Thanks to Tetsuya Sodo for reporting this problem and
	sending a patch

	OpenSSL server failed with "no shared cipher" when using cipher aNULL.
	Fixed by providing temporary DH parameters. Thanks to Philip Rowlands
	for drawing my attention to this issue.

	UDP-LISTEN slept 1s after accepting a connection. This is not required.
	Thanks to Peter Valdemar Morch for reporting this issue

	fixed a bug that could lead to error or socat crash after a client
	connection with option retry had been established

	fixed configure.in bug on net/if.h check that caused IF_NAMESIZE to be
	undefined

	improved dev_t print format definition

porting:
	Cedril Priscal ported socat to Android (using Googles cross compiler).
	The port includes the socat_buildscript_for_android.sh script

	added check for component ipi_spec_dst in struct in_pktinfo so
	compilation does not fail on Cygwin (thanks to Peter Wagemans for
	reporting this problem)

	build failed on RHEL6 due to presence of fips.h; configure now checks
	for fipsld too. Thanks to Andreas Gruenbacher for reporting this
	problem

	check for netinet6/in6.h only when IPv6 is available and enabled

	don't fail to compile when the following defines are missing:
	IPV6_PKTINFO IPV6_RTHDR IPV6_DSTOPTS IPV6_HOPOPTS IPV6_HOPLIMIT
	Thanks to Jerry Jacobs for reporting this problem (Mac OS X Lion 10.7)

	check if define __APPLE_USE_RFC_2292 helps to enable IPV6_* (MacOSX
	Lion 7.1); thanks to Jerry Jacobs to reporting this problem and
	proposing a solution

	fixed compiler warnings on Mac OS X 64bit. Thanks to Guy Harris for
	providing the patch.

	corrections for OpenEmbedded, especially termios SHIFT values and
	ISPEED/OSPEED. Thanks to John Faith for providing the patch

	minor corrections to docu and test.sh resulting from local compilation
	on Openmoko SHR

	fixed sa_family_t compile error on DragonFly. Thanks to Tony Young for
	reporting this issue and sending a patch.

	Ubuntu Oneiric: OpenSSL no longer provides SSLv2 functions; libutil.sh
	is now bsd/libutil.h; compiler warns on vars that is only written to

new features: 
	added option max-children that limits the number of concurrent child
	processes. Thanks to Sam Liddicott for providing the patch.

	Till Maas added support for tun/tap addresses without IP address
 
	added an option openssl-compress that allows to disable the compression
	feature of newer OpenSSL versions. Thanks to Michael Hanselmann for
	providing this contribution (sponsored by Google Inc.)

docu:
	minor corrections in docu (thanks to Paggas)

	client process -> child process

####################### V 1.7.1.3:

security:
	Socat security advisory 2
	CVE-2010-2799:
	fixed a stack overflow vulnerability that occurred when command
	line arguments (whole addresses, host names, file names) were longer
	than 512 bytes.
	Note that this could only be exploited when an attacker was able to
	inject data into socat's command line.
	Full credits to Felix Gröbert, Google Security Team, for finding and
	reporting this issue

####################### V 1.7.1.2:

corrections:
	user-late and group-late, when applied to a pty, affected the system
	device /dev/ptmx instead of the pty (thanks to Matthew Cloke for
	pointing me to this bug)

	socats openssl addresses failed with "nonblocking operation did not
	complete" when the peer performed a renegotiation. Thanks to Benjamin
	Delpy for reporting this bug.

	info message during socks connect showed bad port number on little
	endian systems due to wrong byte order (thanks to Peter M. Galbavy for
	bug report and patch)

	Debian bug 531078: socat execs children with SIGCHLD ignored; corrected
	to default. Thanks to Martin Dorey for reporting this bug.

porting:
	building socat on systems that predefined the CFLAGS environment to
	contain -Wall failed (esp.RedHat). Thanks to Paul Wouters for reporting
	this problem and to Simon Matter for providing the patch

	support for Solaris 8 and Sun Studio support (thanks to Sebastian
	Kayser for providing the patches)

	on some 64bit systems a compiler warning "cast from pointer to integer
	of different size" was issued on some option definitions

	added struct sockaddr_ll to union sockaddr_union to avoid "strict
	aliasing" warnings (problem reported by Paul Wouters)

docu:
	minor corrections in docu

####################### V 1.7.1.1:

corrections:
	corrected the "fixed possible SIGSEGV" fix because SIGSEGV still might
	occur under those conditions. Thanks to Toni Mattila for first
	reporting this problem.

	ftruncate64 cut its argument to 32 bits on systems with 32 bit long type

	socat crashed on systems without setenv() (esp. SunOS up to Solaris 9);
	thanks to Todd Stansell for reporting this bug

	with unidirectional EXEC and SYSTEM a close() operation was performed
	on a random number which could result in hanging e.a.

	fixed a compile problem caused by size_t/socklen_t mismatch on 64bit
	systems

	docu mentioned option so-bindtodev but correct name is so-bindtodevice. 
	Thanks to Jim Zimmerman for reporting.

docu changes:
	added environment variables example to doc/socat-multicast.html

####################### V 1.7.1.0:

new features:
	address options shut-none, shut-down, and shut-close allow to control
	socat's half close behaviour

	with address option shut-null socat sends an empty packet to the peer
	to indicate EOF

	option null-eof changes the behaviour of sockets that receive an empty
	packet to see EOF instead of ignoring it

	introduced option names substuser-early and su-e, currently equivalent
	to option substuser (thanks to Mike Perry for providing the patch)

corrections:
	fixed some typos and improved some comments

####################### V 1.7.0.1:

corrections:
	fixed possible SIGSEGV in listening addresses when a new connection was
	reset by peer before the socket addresses could be retrieved. Thanks to
	Mike Perry for sending a patch.

	fixed a bug, introduced with version 1.7.0.0, that let client
	connections with option connect-timeout fail when the connections
	succeeded. Thanks to Bruno De Fraine for reporting this bug.

	option end-close "did not apply" to addresses PTY, SOCKET-CONNECT,
	and most UNIX-* and ABSTRACT-*

	half close of EXEC and SYSTEM addresses did not work for pipes and
	sometimes socketpair

	help displayed for some option a wrong type

	under some circumstances shutdown was called multiple times for the
	same fd

####################### V 1.7.0.0:

new features:
	new address types SCTP-CONNECT and SCTP-LISTEN implement SCTP stream
	mode for IPv4 and IPv6; new address options sctp-maxseg and
	sctp-nodelay (suggested by David A. Madore; thanks to Jonathan Brannan
	for providing an initial patch)

	new address "INTERFACE" for transparent network interface handling
	(suggested by Stuart Nicholson)

	added generic socket addresses: SOCKET-CONNECT, SOCKET-LISTEN,
	SOCKET-SENDTO, SOCKET-RECVFROM, SOCKET-RECV, SOCKET-DATAGRAM allow
	protocol independent socket handling; all parameters are explicitely
	specified as numbers or hex data

	added address options ioctl-void, ioctl-int, ioctl-intp, ioctl-string,
	ioctl-bin for generic ioctl() calls.

	added address options setsockopt-int, setsockopt-bin, and
	setsockopt-string for generic setsockopt() calls

	option so-type now only affects the socket() and socketpair() calls,
	not the name resolution. so-type and so-prototype can now be applied to
	all socket based addresses.

	new address option "escape" allows to break a socat instance even when
	raw terminal mode prevents ^C etc. (feature suggested by Guido Trotter)

	socat sets environment variables SOCAT_VERSION, SOCAT_PID, SOCAT_PPID
	for use in executed scripts

	socat sets environment variables SOCAT_SOCKADDR, SOCAT_SOCKPORT,
	SOCAT_PEERADDR, SOCAT_PEERPORT in LISTEN type addresses (feature
	suggested by Ed Sawicki)

	socat receives all ancillary messages with each received packet on
	datagram related addresses. The messages are logged in raw form with
	debug level, and broken down with info level. note: each type of
	ancillary message must be enabled by appropriate address options. 

	socat provides the contents of ancillary messages received on RECVFROM
	addresses in appropriate environment variables:
	SOCAT_TIMESTAMP, SOCAT_IP_DSTADDR, SOCAT_IP_IF, SOCAT_IP_LOCADDR,
	SOCAT_IP_OPTIONS, SOCAT_IP_TOS, SOCAT_IP_TTL, SOCAT_IPV6_DSTADDR,
	SOCAT_IPV6_HOPLIMIT, SOCAT_IPV6_TCLASS

	the following address options were added to enable ancillary messages:
	so-timestamp, ip-pktinfo (not BSD), ip-recvdstaddr (BSD), ip-recverr,
	ip-recvif (BSD), ip-recvopts, ip-recvtos, ip-recvttl, ipv6-recvdstopts,
	ipv6-recverr, ipv6-recvhoplimit, ipv6-recvhopopts, ipv6-recvpathmtu,
	ipv6-recvpktinfo, ipv6-recvrthdr, ipv6-recvtclass

	new address options ipv6-tclass and ipv6-unicast-hops set the related
	socket options.

	STREAMS (UNIX System V STREAMS) can be configured with the new address
	options i-pop-all and i-push (thanks to Michal Rysavy for providing a
	patch)

corrections:
	some raw IP and UNIX datagram modes failed on BSD systems

	when UDP-LISTEN continued to listen after packet dropped by, e.g.,
	range option, the old listen socket would not be closed but a new one
	created. open sockets could accumulate.

	there was a bug in ip*-recv with bind option: it did not bind, and
	with the first received packet an error occurred:
	socket_init(): unknown address family 0
	test: RAWIP4RECVBIND

	RECVFROM addresses with FORK option hung after processing the first
	packet. test: UDP4RECVFROM_FORK

	corrected a few mistakes that caused compiler warnings on 64bit hosts
	(thanks to Jonathan Brannan e.a. for providing a patch)

	EXEC and SYSTEM with stderr injected socat messages into the data
	stream. test: EXECSTDERRLOG

	when the EXEC address got a string with consecutive spaces it created
	additional empty arguments (thanks to Olivier Hervieu for reporting
	this bug). test: EXECSPACES

	in ignoreeof polling mode socat also blocked data transfer in the other
	direction during the 1s wait intervalls (thanks to Jorgen Cederlof for
	reporting this bug)

	corrected alphabetical order of options (proxy-auth)

	some minor corrections

	improved test.sh script: more stable timing, corrections for BSD

	replaced the select() calls by poll() to cleanly fix the problems with
	many file descriptors already open

	socat option -lf did not log to file but to stderr

	socat did not compile on Solaris when configured without termios
	feature (thanks to Pavan Gadi for reporting this bug)

porting:
	socat compiles and runs on AIX with gcc (thanks to Andi Mather for his
	help)

	socat compiles and runs on Cygwin (thanks to Jan Just Keijser for his
	help)

	socat compiles and runs on HP-UX with gcc (thanks to Michal Rysavy for
	his help)

	socat compiles and runs on MacOS X (thanks to Camillo Lugaresi for his
	help)

further changes:
	filan -s prefixes output with FD number if more than one FD

	Makefile now supports datarootdir (thanks to Camillo Lugaresi for
	providing the patch)

	cleanup in xio-unix.c

####################### V 1.6.0.1:

new features:
	new make target "gitclean"

	docu source doc/socat.yo released

corrections:
	exec:...,pty did not kill child process under some circumstances; fixed
	by correcting typo in xio-progcall.c (thanks to Ralph Forsythe for
	reporting this problem) 

	service name resolution failed due to byte order mistake
	(thanks to James Sainsbury for reporting this problem)

	socat would hang when invoked with many file descriptors already opened
	fix: replaced FOPEN_MAX with FD_SETSIZE
	thanks to Daniel Lucq for reporting this problem.

	fixed bugs where sub processes would become zombies because the master
	process did not catch SIGCHLD. this affected addresses UDP-LISTEN,
	UDP-CONNECT, TCP-CONNECT, OPENSSL, PROXY, UNIX-CONNECT, UNIX-CLIENT,
	ABSTRACT-CONNECT, ABSTRACT-CLIENT, SOCKSA, SOCKS4A
	(thanks to Fernanda G Weiden for reporting this problem)

	fixed a bug where sub processes would become zombies because the master
	process caught SIGCHLD but did not wait(). this affected addresses
	UDP-RECVFROM, IP-RECVFROM, UNIX-RECVFROM, ABSTRACT-RECVFROM
	(thanks to Evan Borgstrom for reporting this problem)

	corrected option handling with STDIO; usecase: cool-write

	configure --disable-pty  also disabled option waitlock

	fixed small bugs on systems with struct ip_mreq without struct ip_mreqn
	(thanks to Roland Illig for sending a patch)

	corrected name of option intervall to interval (old form still valid
	for us German speaking guys)

	corrected some print statements and variable names

	make uninstall  did not uninstall procan

	fixed lots of weaknesses in test.sh

	corrected some bugs and typos in doc/socat.yo, EXAMPLES, C comments

further changes:
	procan -c prints C defines important for socat

	added test OPENSSLEOF for OpenSSL half close

####################### V 1.6.0.0:

new features:
	new addresses IP-DATAGRAM and UDP-DATAGRAM allow versatile broadcast
	and multicast modes 

	new option ip-add-membership for control of multicast group membership

	new address TUN for generation of Linux TUN/TAP pseudo network
	interfaces (suggested by Mat Caughron); associated options tun-device,
	tun-name, tun-type; iff-up, iff-promisc, iff-noarp, iff-no-pi etc.

	new addresses ABSTRACT-CONNECT, ABSTRACT-LISTEN, ABSTRACT-SENDTO,
	ABSTRACT-RECV, and ABSTRACT-RECVFROM for abstract UNIX domain addresses
	on Linux (requested by Zeeshan Ali); option unix-tightsocklen controls
	socklen parameter on system calls.

	option end-close for control of connection closing allows FD sharing
	by sub processes

	range option supports form address:mask with IPv4

	changed behaviour of OPENSSL-LISTEN to require and verify client
	certificate per default

	options f-setlkw-rd, f-setlkw-wr, f-setlk-rd, f-setlk-wr allow finer
	grained locking on regular files

	uninstall target in Makefile (lack reported by Zeeshan Ali)

corrections:
	fixed bug where only first tcpwrap option was applied; fixed bug where
	tcpwrap IPv6 check always failed (thanks to Rudolf Cejka for reporting
	and fixing this bug) 

	filan (and socat -D) could hang when a socket was involved

	corrected PTYs on HP-UX (and maybe others) using STREAMS (inspired by
	Roberto Mackun)

	correct bind with udp6-listen (thanks to Jan Horak for reporting this
	bug)

	corrected filan.c peekbuff[0] which did not compile with Sun Studio Pro
	(thanks to Leo Zhadanovsky for reporting this problem)

	corrected problem with read data buffered in OpenSSL layer (thanks to
	Jon Nelson for reporting this bug)

	corrected problem with option readbytes when input stream stayed idle
	after so many bytes

	fixed a bug where a datagram receiver with option fork could fork two
	sub processes per packet

further changes:
	moved documentation to new doc/ subdir

	new documents (kind of mini tutorials) are provided in doc/

####################### V 1.5.0.0:

new features:
	new datagram modes for udp, rawip, unix domain sockets

	socat option -T specifies inactivity timeout

	rewrote lexical analysis to allow nested socat calls

	addresses tcp, udp, tcp-l, udp-l, and rawip now support IPv4 and IPv6

	socat options -4, -6 and environment variables SOCAT_DEFAULT_LISTEN_IP,
	SOCAT_PREFERRED_RESOLVE_IP for control of protocol selection

	addresses ssl, ssl-l, socks, proxy now support IPv4 and IPv6

	option protocol-family (pf), esp. for openssl-listen

	range option supports IPv6 - syntax: range=[::1/128]

	option ipv6-v6only (ipv6only)

	new tcp-wrappers options allow-table, deny-table, tcpwrap-etc

	FIPS version of OpenSSL can be integrated - initial patch provided by
	David Acker. See README.FIPS

	support for resolver options res-debug, aaonly, usevc, primary, igntc,
	recurse, defnames, stayopen, dnsrch

	options for file attributes on advanced filesystems (ext2, ext3,
	reiser): secrm, unrm, compr, ext2-sync, immutable, ext2-append, nodump,
	ext2-noatime, journal-data etc.

	option cool-write controls severeness of write failure (EPIPE,
	ECONNRESET)

	option o-noatime

	socat option -lh for hostname in log output

	traffic dumping provides packet headers

	configure.in became part of distribution

	socats unpack directory now has full version, e.g. socat-1.5.0.0/

	corrected docu of option verify

corrections:
	fixed tcpwrappers integration - initial fix provided by Rudolf Cejka

	exec with pipes,stderr produced error

	setuid-early was ignored with many address types

	some minor corrections

####################### V 1.4.3.1:

corrections:
	PROBLEM: UNIX socket listen accepted only one (or a few) connections.
	FIX: do not remove listening UNIX socket in child process

	PROBLEM: SIGSEGV when TCP part of SSL connect failed
	FIX: check ssl pointer before calling SSL_shutdown

	In debug mode, show connect client port even when connect fails

####################### V 1.4.3.0:

new features:
	socat options -L, -W for application level locking

	options "lockfile", "waitlock" for address level locking
	(Stefan Luethje)

	option "readbytes" limits read length (Adam Osuchowski)

	option "retry" for unix-connect, unix-listen, tcp6-listen (Dale Dude)

	pty symlink, unix listen socket, and named pipe are per default removed
	after use; option unlink-close overrides this new behaviour and also
	controls removal of other socat generated files (Stefan Luethje)

corrections:
	option "retry" did not work with tcp-listen

	EPIPE condition could result in a 100% CPU loop

further changes:
	support systems without SHUT_RD etc.
	handle more size_t types
	try to find makedepend options with gcc 3 (richard/OpenMacNews)

####################### V 1.4.2.0:

new features:
	option "connect-timeout" limits wait time for connect operations
	(requested by Giulio Orsero)

	option "dhparam" for explicit Diffie-Hellman parameter file

corrections:
	support for OpenSSL DSA certificates (Miika Komu)

	create install directories before copying files (Miika Komu)

	when exiting on signal, return status 128+signum instead of 1

	on EPIPE and ECONNRESET, only issue a warning (Santiago Garcia
	Mantinan)

	-lu could cause a core dump on long messages

further changes:
	modifications to simplify using socats features in applications

####################### V 1.4.1.0:

new features:
	option "wait-slave" blocks open of pty master side until a client
	connects, "pty-intervall" controls polling

	option -h as synonym to -? for help (contributed by Christian
	Lademann)

	filan prints formatted time stamps and rdev (disable with -r)

	redirect filan's output, so stdout is not affected (contributed by
	Luigi Iotti) 

	filan option -L to follow symbolic links

	filan shows termios control characters

corrections:
	proxy address no longer performs unsolicited retries

	filan -f no longer needs read permission to analyze a file (but still
	needs access permission to directory, of course)

porting:
	Option dsusp
	FreeBSD options noopt, nopush, md5sig
	OpenBSD options sack-disable, signature-enable
	HP-UX, Solaris options abort-threshold, conn-abort-threshold
	HP-UX options b900, b3600, b7200
	Tru64/OSF1 options keepinit, paws, sackena, tsoptena

further corrections:
	address pty now uses ptmx as default if openpty is also available

####################### V 1.4.0.3:

security:
	Socat security advisory 1
	CVE-2004-1484:
	fix to a syslog() based format string vulnerability that can lead to
	remote code execution. See advisory socat-adv-1.txt

####################### V 1.4.0.2:

corrections:
	exec'd write-only addresses get a chance to flush before being killed

	error handler: print notice on error-exit

	filan printed wrong file type information

####################### V 1.4.0.1:

corrections:
	socks4a constructed invalid header. Problem found, reported, and fixed
	by Thomas Themel, by Peter Palfrader, and by rik

	with nofork, don't forget to apply some process related options
	(chroot, setsid, setpgid, ...)

####################### V 1.4.0.0:

new features:
	simple openssl server (ssl-l), experimental openssl trust

	new options "cafile", "capath", "key", "cert", "egd", and "pseudo" for
	openssl

	new options "retry", "forever", and "intervall"

	option "fork" for address TCP improves `gender changer´

	options "sigint", "sigquit", and "sighup" control passing of signals to
	sub process (thanks to David Shea who contributed to this issue)

	readline takes respect to the prompt issued by the peer address

	options "prompt" and "noprompt" allow to override readline's new
	default behaviour

	readline supports invisible password with option "noecho"

	socat option -lp allows to set hostname in log output

	socat option -lu turns on microsecond resolution in log output


corrections:
	before reading available data, check if writing on other channel is
	possible

	tcp6, udp6: support hostname specification (not only IP address), and
	map IP4 names to IP6 addresses

	openssl client checks server certificate per default

	support unidirectional communication with exec/system subprocess

	try to restore original terminal settings when terminating

	test.sh uses tmp dir /tmp/$USER/$$ instead of /tmp/$$ 

	socks4 failed on platforms where long does not have 32 bits
	(thanks to Peter Palfrader and Thomas Seyrat)

	hstrerror substitute wrote wrong messages (HP-UX, Solaris)

	proxy error message was truncated when answer contained multiple spaces


porting:
	compiles with AIX xlc, HP-UX cc, Tru64 cc (but might not link)

####################### V 1.3.2.2:

corrections:
	PROXY CONNECT failed when the status reply from the proxy server
	contained more than one consecutive spaces. Problem reported by
	Alexandre Bezroutchko

	do not SIGSEGV when proxy address fails to resolve server name

	udp-listen failed on systems where AF_INET != SOCK_DGRAM (e.g. SunOS).
	Problem reported by Christoph Schittel

	test.sh only tests available features

	added missing IP and TCP options in filan analyzer

	do not apply stdio address options to both directions when in 
	unidirectional mode

	on systems lacking /dev/*random and egd, provide (weak) entropy from
	libc random()


porting:
	changes for HP-UX (VREPRINT, h_NETDB_INTERNAL)

	compiles on True64, FreeBSD (again), NetBSD, OpenBSD

	support for  long long  as  st_ino type (Cygwin 1.5)

	compile on systems where pty can not be featured

####################### V 1.3.2.1:

corrections:
	"final" solution for the ENOCHLD problem

	corrected "make strip"

	default gcc debug/opt is "-O" again

	check for /proc at runtime, even if configure found it

	src.rpm accidently supported SuSE instead of RedHat

####################### V 1.3.2.0:

new features:
	option "nofork" connects an exec'd script or program directly
	to the file descriptors of the other address, circumventing the socat
	transfer engine

	support for files >2GB, using ftruncate64(), lseek64(), stat64()

	filan has new "simple" output style (filan -s)


porting:
	options "binary" and "text" for controlling line termination on Cygwin
	file system access (hint from Yang Wu-Zhou)

	fix by Yang Wu-Zhou for the Cygwin "No Children" problem

	improved support for OSR: _SVID3; no IS_SOCK, no F_GETOWN (thanks to
	John DuBois)

	minor corrections to avoid warnings with gcc 3


further corrections and minor improvements:
	configure script is generated with autoconf 2.57 (no longer 2.52)

	configure passes CFLAGS to Makefile

	option -??? for complete list of address options and their short forms

	program name in syslog messages is derived from argv[0]

	SIGHUP now prints notice instead of error

	EIO during read of pty now gives Notice instead of Error, and
	triggers EOF

	use of hstrerror() for printing resolver error messages

	setgrent() got required endgrent()

####################### V 1.3.1.0:

new features:
	integration of Wietse Venema's tcpwrapper library (libwrap)

	with "proxy" address, option "resolve" controls if hostname or IP
	address is sent in request

	option "lowport" establishes limited authorization for TCP and UDP
	connections 

	improvement of .spec file for RPM creation (thanks to Gerd v. Egidy)
	An accompanying change in the numbering scheme results in an 
	incompatibility with earlier socat RPMs!


solved problems and bugs:
	PROBLEM: socat daemon terminated when the address of a connecting
	client did not match range option value instead of continue listening
	SOLVED: in this case, print warning instead of error to keep daemon
	active 

	PROBLEM: tcp-listen with fork sometimes left excessive number of zombie
	processes
	SOLVED: dont assume that each exiting child process generates SIGCHLD

	when converting CRNL to CR, socat converted to NL


further corrections:
	configure script now disables features that depend on missing files
	making it more robust in "unsupported" environments

	server.pem permissions corrected to 600

	"make install" now does not strip; use "make strip; make install"
	if you like strip (suggested by Peter Bray)

####################### V 1.3.0.1:

solved problems and bugs:
	PROBLEM: OPENSSL did not apply tcp, ip, and socket options
	SOLVED: OPENSSL now correctly handles the options list

	PROBLEM: CRNL to NL and CRNL to CR conversions failed when CRNL crossed
	block boundary
	SOLVED: these conversions now simply strip all CR's or NL's from input
	stream 


porting:
	SunOS ptys now work on x86, too (thanks to Peter Bray)

	configure looks for freeware libs in /pkgs/lib/ (thanks to Peter Bray)


further corrections:
	added WITH_PROXY value to -V output

	added compile dependencies of WITH_PTY and WITH_PROXY

	-?? did not print option group of proxy options

	corrected syntax for bind option in docu

	corrected an issue with stdio in unidirectional mode

	options socksport and proxyport support service names

	ftp.sh script supports proxy address

	man page no longer installed with execute permissions (thanks to Peter
	Bray) 

	fixed a malloc call bug that could cause SIGSEGV or false "out of
	memory" errors on EXEC and SYSTEM, depending on program name length and
	libc.

####################### V 1.3.0.0:

new features:
	proxy connect with optional proxy authentication

	combined hex and text dump mode, credits to Gregory Margo

	address pty applies options user, group, and perm to device


solved problems and bugs:
	PROBLEM: option reuseport was not applied (BSD, AIX)
	SOLVED:	option reuseport now in phase PASTSOCKET instead of PREBIND,
		credits to Jean-Baptiste Marchand

	PROBLEM: ignoreeof with stdio was ignored
	SOLVED: ignoreeof now works correctly with address stdio

	PROBLEM: ftp.sh did not use user supplied password
	SOLVED: ftp.sh now correctly passes password from command line

	PROBLEM: server.pem had expired
	SOLVED: new server.pem valid for ten years

	PROBLEM: socks notice printed wrong port on some platforms
	SOLVED: socks now uses correct byte-order for port number in notice


further corrections:
	option name o_trunc corrected to o-trunc

	combined use of -u and -U is now detected and prevented

	made message system a little more robust against format string attacks


####################### V 1.2.0.0:

new features:
	address pty for putting socat behind a new pseudo terminal that may
	fake a serial line, modem etc.

	experimental openssl integration
	(it does not provide any trust between the peers because is does not
	 check certificates!)

	options flock-ex, flock-ex-nb, flock-sh, flock-sh-nb to control all
	locking mechanism provided by flock()

	options setsid and setpgid now available with all address types

	option ctty (controlling terminal) now available for all TERMIOS
	addresses 

	option truncate (a hybrid of open(.., O_TRUNC) and ftruncate()) is
	replaced by options o-trunc and ftruncate=offset

	option sourceport now available with TCP and UDP listen addresses to
	restrict incoming client connections

	unidirectional mode right-to-left (-U)


solved problems and bugs:
	PROBLEM: addresses without required parameters but an option containing
		a '/' were incorrectly interpreted as implicit GOPEN address
	SOLVED: if an address does not have ':' separator but contains '/',
		check if the slash is before the first ',' before assuming
		implicit GOPEN.


porting:
	ptys under SunOS work now due to use of stream options


further corrections:
	with -d -d -d -d -D, don't print debug info during file analysis


####################### V 1.1.0.1:

new features:
	.spec file for RPM generation


solved problems and bugs:
	PROBLEM: GOPEN on socket did not apply option unlink-late
	SOLUTION: GOPEN for socket now applies group NAMED, phase PASTOPEN
		options 

	PROBLEM: with unidirectional mode, an unnecessary close timeout was
		applied
	SOLUTION: in unidirectional mode, terminate without wait time

	PROBLEM: using GOPEN on a unix domain socket failed for datagram
		sockets
	SOLUTION: when connect() fails with EPROTOTYPE, use a datagram socket


further corrections:

	open() flag options had names starting with "o_", now corrected to "o-"

	in docu, *-listen addresses were called *_listen

	address unix now called unix-connect because it does not handle unix
	datagram sockets

	in test.sh, apply global command line options with all tests


####################### V 1.1.0.0:

new features:
	regular man page and html doc - thanks to kromJx for prototype

	new address type "readline", utilizing GNU readline and history libs

	address option "history-file" for readline

	new option "dash" to "exec" address that allows to start login shells

	syslog facility can be set per command line option

	new address option "tcp-quickack", found in Linux 2.4

	option -g prevents option group checking

	filan and procan can print usage

	procan prints rlimit infos


solved problems and bugs:
	PROBLEM: raw IP socket SIGSEGV'ed when it had been shut down.
	SOLVED: set eof flag of channel on shutdown.

	PROBLEM: if channel 2 uses a single non-socket FD in bidirectional mode
		and has data available while channel 1 reaches EOF, the data is
		lost. 
	SOLVED: during one loop run, first handle all data transfers and
		_afterwards_ handle EOF. 

	PROBLEM: despite to option NONBLOCK, the connect() call blocked
	SOLVED: option NONBLOCK is now applied in phase FD instead of LATE

	PROBLEM: UNLINK options issued error when file did not exist,
		terminating socat
	SOLVED: failure of unlink() is only warning if errno==ENOENT

	PROBLEM: TCP6-LISTEN required numeric port specification
	SOLVED: now uses common TCP service resolver

	PROBLEM: with PIPE, wrong FDs were shown for data transfer loop
	SOLVED: retrieval of FDs now pays respect to PIPE pecularities

	PROBLEM: using address EXEC against an address with IGNOREEOF, socat
		never terminated
	SOLVED: corrected EOF handling of sigchld


porting:
	MacOS and old AIX versions now have pty

	flock() now available on Linux (configure check was wrong)

	named pipe were generated using mknod(), which requires root under BSD
	now they are generated using mkfifo


further corrections:
	lots of address options that were "forgotten" at runtime are now
	available 

	option BINDTODEVICE now also called SO-BINDTODEVICE, IF

	"make install" now installs binaries with ownership 0:0


####################### V 1.0.4.2:

solved problems and bugs:
	PROBLEM: EOF of one stream caused close of other stream, giving it no
	chance to go down regularly
	SOLVED: EOF of one stream now causes shutdown of write part of other
	stream

	PROBLEM: sending mail via socks address to qmail showed that crlf
	option does not work
	SOLVED: socks address applies PH_LATE options

	PROBLEM: in debug mode, no info about socat and platform was issued
	SOLVED: print socat version and uname output in debug mode

	PROBLEM: invoking socat with -t and no following parameters caused
	SIGSEGV
	SOLVED: -t and -b now check next argv entry

	PROBLEM: when opening of logfile (-lf) failed, no error was reported
	and no further messages were printed
	SOLVED: check result of fopen and print error message if it failed

new features:
	address type UDP-LISTEN now supports option fork: it internally applies
	socket option SO_REUSEADDR so a new UDP socket can bind to port after
	`accepting´ a connection (child processes might live forever though)
	(suggestion from Damjan Lango)


####################### V 1.0.4.1:

solved problems and bugs:
	PROB: assert in libc caused an endless recursion
	SOLVED: no longer catch SIGABRT

	PROB: socat printed wrong verbose prefix for "right to left" packets
	SOLVED: new parameter for xiotransfer() passes correct prefix

new features:
	in debug mode, socat prints its command line arguments
	in verbose mode, escape special characters and replace unprintables
		with '.'. Patch from Adrian Thurston.


####################### V 1.0.4.0:

solved problems and bugs:
	Debug output for lstat and fstat said "stat"

further corrections:
	FreeBSD now includes libutil.h

new features:
	option setsid with exec/pty
	option setpgid with exec/pty
	option ctty with exec/pty
	TCP V6 connect test
	gettimeofday in sycls.c (no use yet)

porting:
	before Gethostbyname, invoke inet_aton for MacOSX


####################### V 1.0.3.0:

solved problems and bugs:

	PROB: test 9 of test.sh (echo via file) failed on some platforms,
	socat exited without error message
	SOLVED: _xioopen_named_early(): preset statbuf.st_mode with 0

	PROB: test 17 hung forever
	REASON: child death before select loop did not result in EOF
	SOLVED: check of existence of children before starting select loop

	PROB: test 17 failed
	REASON: child dead triggered EOF before last data was read
	SOLVED: after child death, read last data before setting EOF

	PROB: filan showed that exec processes incorrectly had fd3 open
	REASON: inherited open fd3 from main process
	SOLVED: set CLOEXEC flag on pty fd in main process

	PROB: help printed "undef" instead of group "FORK"
	SOLVED: added "FORK" to group name array

	PROB: fatal messages did not include severity classifier
	SOLVED: added "F" to severity classifier array 

	PROB: IP6 addresses where printed incorrectly
	SOLVED: removed type casts to unsigned short *

further corrections:
	socat catches illegal -l modes
	corrected error message on setsockopt(linger)
	option tabdly is of type uint
	correction for UDP over IP6
	more cpp conditionals, esp. for IP6 situations
	better handling of group NAMED options with listening UNIX sockets
	applyopts2 now includes last given phase
	corrected option group handling for most address types
	introduce dropping of unappliable options (dropopts, dropopts2)
	gopen now accepts socket and unix-socket options
	exec and system now accept all socket and termios options
	child process for exec and system addresses with option pty
	improved descriptions and options for EXAMPLES
	printf format for file mode changed to "0%03o" with length spec.
	added va_end() in branch of msg()
	changed phase of lock options from PASTOPEN to FD
	support up to four early dying processes

structural changes:
	xiosysincludes now includes sysincludes.h for non xio files

new features:
	option umask
	CHANGES file
	TYPE_DOUBLE, u_double
	OFUNC_OFFSET
	added getsid(), setsid(), send() to sycls
	procan prints sid (session id)
	mail.sh gets -f (from) option
	new EXAMPLEs for file creation
	gatherinfo.sh now tells about failures
	test.sh can check for much more address/option combinations

porting:
	ispeed, ospeed for termios on FreeBSD
	getpgid() conditional for MacOS 10
	added ranlib in Makefile.in for MacOS 10
	disable pty option if no pty mechanism is available (MacOS 10)
	now compiles and runs on MacOS 10 (still some tests fail)
	setgroups() conditional for cygwin
	sighandler_t defined conditionally
	use gcc option -D_GNU_SOURCE
