diff -r -C 3 socat-1.0.4.1/CHANGES socat-1.0.4.2/CHANGES
*** socat-1.0.4.1/CHANGES	Wed Mar  6 11:37:58 2002
--- socat-1.0.4.2/CHANGES	Sun Mar 31 21:56:49 2002
***************
*** 1,4 ****
--- 1,33 ----
  
+ ####################### 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)
+ 
+ 
  ####################### V 1.0.4.1:
  
  solved problems and bugs:
Only in socat-1.0.4.1/Config: Makefile.AIX-4-1-5
Only in socat-1.0.4.1/Config: config.AIX-4-1-5.h
diff -r -C 3 socat-1.0.4.1/Makefile.in socat-1.0.4.2/Makefile.in
*** socat-1.0.4.1/Makefile.in	Wed Mar  6 10:53:56 2002
--- socat-1.0.4.2/Makefile.in	Sun Mar 31 21:58:09 2002
***************
*** 1,5 ****
! # $Id: Makefile.in,v 1.48 2001/12/29 10:14:28 gerhard Exp $
! # Copyright Gerhard Rieger 2001
  # Published under the GNU General Public License V.2, see file COPYING
  
  SHELL = /bin/sh
--- 1,5 ----
! # $Id: Makefile.in,v 1.50 2002/03/31 17:54:28 gerhard Exp $
! # Copyright Gerhard Rieger 2001, 2002
  # Published under the GNU General Public License V.2, see file COPYING
  
  SHELL = /bin/sh
***************
*** 62,67 ****
--- 62,68 ----
  
  all: socat procan filan
  
+ 
  depend: $(CFILES) $(HFILES)
  	makedepend @SYSDEFS@ $(CFILES)
  
***************
*** 86,91 ****
--- 87,98 ----
  	$(INSTALL) -m 755 -o root -g bin procan $(DESTDIR)$(BINDEST)
  	$(INSTALL) -m 755 -o root -g bin filan $(DESTDIR)$(BINDEST)
  
+ # make a GNU-zipped tar ball of the source files
+ dist: socat.tar.gz
+ 
+ socat.tar.gz: socat.tar
+ 	gzip -9 <socat.tar >socat.tar.gz
+ 
  VERSION = `sed 's/"//g' VERSION`
  TARDIR = socat-1.0
  socat.tar: configure Makefile.in config.h.in install-sh VERSION $(CFILES) $(HFILES) $(DOCFILES) $(SHFILES) $(OSFILES) test.sh gatherinfo.sh
***************
*** 94,105 ****
  	tar cvf socat.tar $(TARDIR)
  	rm -f $(TARDIR)/COPYING		# write protected
  	rm -r $(TARDIR)
- 
- socat.tar.gz: socat.tar
- 	gzip -9 <socat.tar >socat.tar.gz
- 
- # make a GNU-zipped tar ball of the source files
- dist: socat.tar.gz
  
  clean:
  	rm -f *.o socat procan filan socat.tar socat.tar.gz socat.out libxio.a
--- 101,106 ----
diff -r -C 3 socat-1.0.4.1/VERSION socat-1.0.4.2/VERSION
*** socat-1.0.4.1/VERSION	Wed Mar  6 09:38:02 2002
--- socat-1.0.4.2/VERSION	Fri Mar 29 22:38:41 2002
***************
*** 1 ****
! "1.0.4.1"
--- 1 ----
! "1.0.4.2"
diff -r -C 3 socat-1.0.4.1/config.h.in socat-1.0.4.2/config.h.in
*** socat-1.0.4.1/config.h.in	Mon Feb 11 10:41:36 2002
--- socat-1.0.4.2/config.h.in	Sun Mar 31 19:54:28 2002
***************
*** 1,5 ****
! /* $Id: config.h.in,v 1.23 2002/02/11 09:41:36 gerhard Exp $ */
! /* Copyright Gerhard Rieger 2001 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  #ifndef __config_h_included
--- 1,5 ----
! /* $Id: config.h.in,v 1.24 2002/03/31 17:54:28 gerhard Exp $ */
! /* Copyright Gerhard Rieger 2001, 2002 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  #ifndef __config_h_included
diff -r -C 3 socat-1.0.4.1/error.c socat-1.0.4.2/error.c
*** socat-1.0.4.1/error.c	Fri Dec 28 09:13:05 2001
--- socat-1.0.4.2/error.c	Sun Mar 31 20:27:34 2002
***************
*** 1,5 ****
! static const char _rcsid_[]="$Id: error.c,v 1.11 2001/12/28 08:13:05 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* the logging subsystem */
--- 1,5 ----
! static const char _rcsid_[]="$Id: error.c,v 1.13 2002/03/31 18:27:34 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001, 2002 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* the logging subsystem */
***************
*** 54,61 ****
     case 'y': diagopts.syslog = true;
        openlog("socat", LOG_PID, diagopts.logfacility);
        diagopts.logstderr = false; break;
!    case 'f': diagopts.logfile = fopen(arg, "a");
!       diagopts.logstderr = false; break;
     case 's': diagopts.logstderr = true; break;	/* logging to stderr is default */
     case 'p': diagopts.progname = arg; break;
     case 'd': --diagopts.msglevel; break;
--- 54,65 ----
     case 'y': diagopts.syslog = true;
        openlog("socat", LOG_PID, diagopts.logfacility);
        diagopts.logstderr = false; break;
!    case 'f': if ((diagopts.logfile = fopen(arg, "a")) == NULL) {
! 	  Error2("cannot open log file \"%s\": %s", arg, strerror(errno));
! 	  break;
!       } else {
! 	 diagopts.logstderr = false; break;
!       }
     case 's': diagopts.logstderr = true; break;	/* logging to stderr is default */
     case 'p': diagopts.progname = arg; break;
     case 'd': --diagopts.msglevel; break;
diff -r -C 3 socat-1.0.4.1/mail.sh socat-1.0.4.2/mail.sh
*** socat-1.0.4.1/mail.sh	Wed Nov 28 11:24:14 2001
--- socat-1.0.4.2/mail.sh	Sun Mar 31 20:27:34 2002
***************
*** 1,14 ****
  #! /bin/sh
! # $Id: mail.sh,v 1.5 2001/11/28 10:24:14 hermi Exp $
! # Copyright Gerhard Rieger 2001
  # Published under the GNU General Public License V.2, see file COPYING
  
  #set -vx
  
  # This is an example for a shell script that can be fed to socat with exec.
  # Its clue is that it does not use stdin/stdout for communication with socat,
! # so you may feed the mail message via stdin to the script.
! # It supports multiline answers from server, but not much more yet.
  
  # Usage:  cat message.txt |socat [-v] exec:"mail.sh target@domain.com",fdin=3,fdout=4 tcp:mail.relay.org:25,crlf
  
--- 1,15 ----
  #! /bin/sh
! # $Id: mail.sh,v 1.7 2002/03/31 18:27:34 gerhard Exp $
! # Copyright Gerhard Rieger 2001, 2002
  # Published under the GNU General Public License V.2, see file COPYING
  
  #set -vx
  
  # This is an example for a shell script that can be fed to socat with exec.
  # Its clue is that it does not use stdin/stdout for communication with socat,
! # so you may feed the mail message via stdin to the script. The message should
! # contain appropriate mail headers.
! # This script supports multiline answers from server, but not much more yet.
  
  # Usage:  cat message.txt |socat [-v] exec:"mail.sh target@domain.com",fdin=3,fdout=4 tcp:mail.relay.org:25,crlf
  
diff -r -C 3 socat-1.0.4.1/socat.c socat-1.0.4.2/socat.c
*** socat-1.0.4.1/socat.c	Wed Mar  6 10:48:34 2002
--- socat-1.0.4.2/socat.c	Sat Mar 30 21:12:23 2002
***************
*** 1,5 ****
! static const char _rcsid_[]="$Id: socat.c,v 1.55 2002/03/06 09:48:34 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* this is the main source, including command line option parsing, general
--- 1,5 ----
! static const char _rcsid_[]="$Id: socat.c,v 1.58 2002/03/30 20:12:23 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001, 2002 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* this is the main source, including command line option parsing, general
***************
*** 46,51 ****
--- 46,56 ----
  void lftocrlf(char **in, ssize_t *len, size_t bufsiz);
  void crlftolf(char **in, ssize_t *len, size_t bufsiz);
  
+ static const char socatversion[] =
+ #include "./VERSION"
+       ;
+ static const char timestamp[] = __DATE__" "__TIME__;
+ 
  
  int main(int argc, const char *argv[]) {
     const char **arg1, *a;
***************
*** 53,58 ****
--- 58,64 ----
     double rto;
     /*0 int signum;*/
     int i, argc0, result;
+    struct utsname ubuf;
  
     diag_set('p', strchr(argv[0], '/') ? strrchr(argv[0], '/')+1 : argv[0]);
     xiosetopt('p', "!!");
***************
*** 98,104 ****
  	    a = *arg1+2;
  	 } else {
  	    ++arg1, --argc;
! 	    a = *arg1;
  	 }
  	 socat_opts.bufsiz = strtoul(a, (char **)&a, 0);
  	 break;
--- 104,113 ----
  	    a = *arg1+2;
  	 } else {
  	    ++arg1, --argc;
! 	    if ((a = *arg1) == NULL) {
! 	       Error("option -b requires an argument");
! 	       socat_usage(stderr); Exit(1);
! 	    }
  	 }
  	 socat_opts.bufsiz = strtoul(a, (char **)&a, 0);
  	 break;
***************
*** 112,118 ****
  	    a = *arg1+2;
  	 } else {
  	    ++arg1, --argc;
! 	    a = *arg1;
  	 }
  	 rto = strtod(a, (char **)&a);
  	 socat_opts.closwait.tv_sec = rto;
--- 121,130 ----
  	    a = *arg1+2;
  	 } else {
  	    ++arg1, --argc;
! 	    if ((a = *arg1) == NULL) {
! 	       Error("option -t requires an argument");
! 	       socat_usage(stderr); Exit(1);
! 	    }
  	 }
  	 rto = strtod(a, (char **)&a);
  	 socat_opts.closwait.tv_sec = rto;
***************
*** 146,151 ****
--- 158,167 ----
     }
  
     Info(copyright);
+    Debug2("socat version %s on %s", socatversion, timestamp);
+    uname(&ubuf);	/* ! here we circumvent internal tracing (Uname) */
+    Debug4("running on %s version %s, release %s, machine %s\n",
+ 	   ubuf.sysname, ubuf.version, ubuf.release, ubuf.machine);
  
  #if WITH_MSGLEVEL <= E_DEBUG
     for (i = 0; i < argc0; ++i) {
***************
*** 177,185 ****
     fputs("Usage:\n", fd);
     fputs("socat [options] <bi-address> <bi-address>\n", fd);
     fputs("   options:\n", fd);
!    fputs("      -V     version and feature information only\n", fd);
  #if WITH_HELP
!    fputs("      -?     global options and address types\n", fd);
     fputs("      -??    like -?, plus a list of all available address options\n", fd);
  #endif /* WITH_HELP */
     fputs("      -d     increase verbosity (use up to 4 times; 2 are recommended)\n", fd);
--- 193,201 ----
     fputs("Usage:\n", fd);
     fputs("socat [options] <bi-address> <bi-address>\n", fd);
     fputs("   options:\n", fd);
!    fputs("      -V     print version and feature information to stdout, and exit\n", fd);
  #if WITH_HELP
!    fputs("      -?     print a help text describing command line options and addresses\n", fd);
     fputs("      -??    like -?, plus a list of all available address options\n", fd);
  #endif /* WITH_HELP */
     fputs("      -d     increase verbosity (use up to 4 times; 2 are recommended)\n", fd);
***************
*** 200,218 ****
  
  
  void socat_version(FILE *fd) {
!    static char timestamp[] = __DATE__" "__TIME__;
! #if 1
!    const char version[] =
! #include "./VERSION"
!       ;
! #endif
!    struct utsname buf;
  
     fputs(copyright, fd); fputc('\n', fd);
!    fprintf(fd, "socat version %s on %s\n", version, timestamp);
!    Uname(&buf);
     fprintf(fd, "   running on %s version %s, release %s, machine %s\n",
! 	   buf.sysname, buf.version, buf.release, buf.machine);
     fputs("features:\n", fd);
  #ifdef WITH_STDIO
     fprintf(fd, "  #define WITH_STDIO %d\n", WITH_STDIO);
--- 216,228 ----
  
  
  void socat_version(FILE *fd) {
!    struct utsname ubuf;
  
     fputs(copyright, fd); fputc('\n', fd);
!    fprintf(fd, "socat version %s on %s\n", socatversion, timestamp);
!    Uname(&ubuf);
     fprintf(fd, "   running on %s version %s, release %s, machine %s\n",
! 	   ubuf.sysname, ubuf.version, ubuf.release, ubuf.machine);
     fputs("features:\n", fd);
  #ifdef WITH_STDIO
     fprintf(fd, "  #define WITH_STDIO %d\n", WITH_STDIO);
***************
*** 623,628 ****
--- 633,639 ----
  	       sleepon = 1;
  	    } else {
  	       Notice1("socket 1 (fd %d) is at EOF", XIO_GETRDFD(sock1));
+ 	       xioshutdown(sock2, 1);
  	    }
  	 } else if (bytes > 0) {
  	    wasaction = 1;
***************
*** 641,646 ****
--- 652,658 ----
  	       sleepon = 1;
  	    } else {
  	       Notice1("socket 2 (fd %d) is at EOF", XIO_GETRDFD(sock2));
+ 	       xioshutdown(sock1, 1);
  	    }
  	 } else if (bytes > 0) {
  	    wasaction = 1;
diff -r -C 3 socat-1.0.4.1/xio-socks.c socat-1.0.4.2/xio-socks.c
*** socat-1.0.4.1/xio-socks.c	Thu Dec 27 17:59:02 2001
--- socat-1.0.4.2/xio-socks.c	Sun Mar 31 19:54:28 2002
***************
*** 1,5 ****
! static const char _rcsid_[]="$Id: xio-socks.c,v 1.7 2001/12/27 16:59:02 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* this file contains the source for opening addresses of socks4 type */
--- 1,5 ----
! static const char _rcsid_[]="$Id: xio-socks.c,v 1.9 2002/03/31 17:54:28 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001, 2002 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* this file contains the source for opening addresses of socks4 type */
***************
*** 188,193 ****
--- 188,196 ----
     }
  
     applyopts(fd->stream.fd, opts, PH_ALL);
+ 
+    if ((result = _xio_openlate(&fd->stream, opts)) < 0)
+       return result;
  
     /* send socks header (target addr+port, +auth */
     do {
diff -r -C 3 socat-1.0.4.1/xio-udp.c socat-1.0.4.2/xio-udp.c
*** socat-1.0.4.1/xio-udp.c	Thu Dec 27 18:00:55 2001
--- socat-1.0.4.2/xio-udp.c	Sat Mar 30 20:47:42 2002
***************
*** 1,5 ****
! static const char _rcsid_[]="$Id: xio-udp.c,v 1.8 2001/12/27 17:00:55 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* this file contains the source for handling UDP addresses */
--- 1,5 ----
! static const char _rcsid_[]="$Id: xio-udp.c,v 1.10 2002/03/28 10:49:37 gerhard Exp $";
! /* Copyright Gerhard Rieger 2001, 2002 */
  /* Published under the GNU General Public License V.2, see file COPYING */
  
  /* this file contains the source for handling UDP addresses */
***************
*** 7,12 ****
--- 7,13 ----
  #include "xiosysincludes.h"
  #include "xioopen.h"
  
+ #include "xio-socket.h"
  #include "xio-ip4.h"
  #include "xio-ip6.h"
  #include "xio-ip.h"
***************
*** 95,129 ****
  
     retropt_int(opts, OPT_SO_TYPE, &socktype);
  
-    if ((fd->stream.fd = Socket(af, socktype, ipproto)) < 0) {
-       Error4("socket(%d, %d, %d): %s", af, socktype, ipproto, strerror(errno));
-       return STAT_RETRYLATER;
-    }
-    applyopts(fd->stream.fd, opts, PH_PASTSOCKET);
- 
-    applyopts_cloexec(fd->stream.fd, opts);
- 
-    applyopts(fd->stream.fd, opts, PH_BIND);
-    if (Bind(fd->stream.fd, &us.soa, uslen) < 0) {
-       Error4("bind(%d, {%s}, "F_Zd"): %s", fd->stream.fd,
- 	     sockaddr_info(&us.soa, infobuff, sizeof(infobuff)),
- 	     uslen, strerror(errno));
-       return STAT_RETRYLATER;
-    }
- 
-    /* under some circumstances bind() fills sockaddr with interesting info. */
-    if (Getsockname(fd->stream.fd, &us.soa, &uslen) < 0) {
-       Error4("getsockname(%d, %p, {%d}): %s",
- 	     fd->stream.fd, &us.soa, uslen, strerror(errno));
-    }
- 
-    applyopts(fd->stream.fd, opts, PH_PASTBIND);
- 
     if (retropt_string(opts, OPT_RANGE, &rangename) >= 0) {
        if (af == AF_INET) {
  	 parserange(rangename, af, &netaddr_in, &netmask_in);
        } else {
! 	 Error1("range option not supported with address familiy %d", af);
  	 return STAT_NORETRY;
        }
     }
--- 96,106 ----
  
     retropt_int(opts, OPT_SO_TYPE, &socktype);
  
     if (retropt_string(opts, OPT_RANGE, &rangename) >= 0) {
        if (af == AF_INET) {
  	 parserange(rangename, af, &netaddr_in, &netmask_in);
        } else {
! 	 Error1("range option not supported with address family %d", af);
  	 return STAT_NORETRY;
        }
     }
***************
*** 133,140 ****
--- 110,144 ----
     while (true) {	/* we loop with fork or prohibited packets */
        /* now wait for some packet on this datagram socket, get its sender
  	 address, connect there, and return */
+       int one = 1;
        char infobuff[256];
  
+       if ((fd->stream.fd = Socket(af, socktype, ipproto)) < 0) {
+ 	 Error4("socket(%d, %d, %d): %s", af, socktype, ipproto, strerror(errno));
+ 	 return STAT_RETRYLATER;
+       }
+       applyopts(fd->stream.fd, opts, PH_PASTSOCKET);
+       if (Setsockopt(fd->stream.fd, opt_so_reuseaddr.major,
+ 		     opt_so_reuseaddr.minor, &one, sizeof(one)) < 0) {
+ 	 Warn6("setsockopt(%d, %d, %d, {%d}, %F_Zd): %s",
+ 	       fd->stream.fd, opt_so_reuseaddr.major,
+ 	       opt_so_reuseaddr.minor, &one, sizeof(one), strerror(errno));
+       }
+       applyopts_cloexec(fd->stream.fd, opts);
+       applyopts(fd->stream.fd, opts, PH_BIND);
+       if (Bind(fd->stream.fd, &us.soa, uslen) < 0) {
+ 	 Error4("bind(%d, {%s}, "F_Zd"): %s", fd->stream.fd,
+ 		sockaddr_info(&us.soa, infobuff, sizeof(infobuff)),
+ 		uslen, strerror(errno));
+ 	 return STAT_RETRYLATER;
+       }
+       /* under some circumstances bind() fills sockaddr with interesting info. */
+       if (Getsockname(fd->stream.fd, &us.soa, &uslen) < 0) {
+ 	 Error4("getsockname(%d, %p, {%d}): %s",
+ 		fd->stream.fd, &us.soa, uslen, strerror(errno));
+       }
+       applyopts(fd->stream.fd, opts, PH_PASTBIND);
+ 
        Notice1("listening on UDP %s",
  	      sockaddr_info(&us.soa, infobuff, sizeof(infobuff)));
        FD_ZERO(&in); FD_ZERO(&out); FD_ZERO(&expt);
***************
*** 165,171 ****
  		  sockaddr_info(&them.soa,
  				infobuff, sizeof(infobuff)));
  	    /* forbidden peer address, drop the datagram */
! 	    Recvfrom(fd->stream.fd, buff1, 1, 0, NULL, NULL); 
  	    continue;
  	 }
        }
--- 169,175 ----
  		  sockaddr_info(&them.soa,
  				infobuff, sizeof(infobuff)));
  	    /* forbidden peer address, drop the datagram */
! 	    Recvfrom(fd->stream.fd, buff1, 1, 0, &them.soa, &themlen); 
  	    continue;
  	 }
        }
***************
*** 192,204 ****
  	    break;
  	 }
  	 /* server: continue loop with select */
! #if 0
! 	 if (Close(fd->fd) < 0) {
! 	    Warn2("close(%d): %s", fd->fd, strerror(errno));
  	 }
  #endif
  	 Notice1("forked off child process "F_pid, pid);
  	 Sleep(1);	/*! give child a chance to consume the old packet */
  	 continue;
        }
        break;
--- 196,211 ----
  	    break;
  	 }
  	 /* server: continue loop with select */
! #if 1
! 	 /* when we dont close this we get awkward behaviour on Linux 2.4:
! 	    recvfrom gives 0 bytes with invalid socket address */
! 	 if (Close(fd->stream.fd) < 0) {
! 	    Warn2("close(%d): %s", fd->stream.fd, strerror(errno));
  	 }
  #endif
  	 Notice1("forked off child process "F_pid, pid);
  	 Sleep(1);	/*! give child a chance to consume the old packet */
+ 
  	 continue;
        }
        break;
diff -r -C 3 socat-1.0.4.1/xio.help socat-1.0.4.2/xio.help
*** socat-1.0.4.1/xio.help	Mon Feb 11 19:50:19 2002
--- socat-1.0.4.2/xio.help	Sun Mar 31 21:58:09 2002
***************
*** 1,4 ****
! # $Id: xio.help.template,v 1.50 2002/02/10 20:51:38 gerhard Exp $
  # Copyright Gerhard Rieger 2001, 2002
  
  Operating systems:
--- 1,4 ----
! # $Id: xio.help,v 1.51 2002/03/30 20:16:02 gerhard Exp $
  # Copyright Gerhard Rieger 2001, 2002
  
  Operating systems:
***************
*** 7,18 ****
  not always tested) on the operating systems listed below, unless otherwise
  noted:
  
- Linux/GNU 2.0.33, i386
  Linux/GNU 2.4.10, i386
- AIX 4.1.5 (egc)
  AIX 4.3.3 (gcc 2.8)
  Solaris 5.8, sparc
  FreeBSD 4.4, i386
  
  ===============================================================================
  
--- 7,17 ----
  not always tested) on the operating systems listed below, unless otherwise
  noted:
  
  Linux/GNU 2.4.10, i386
  AIX 4.3.3 (gcc 2.8)
  Solaris 5.8, sparc
  FreeBSD 4.4, i386
+ MacOS X 10, PPC
  
  ===============================================================================
  
***************
*** 295,301 ****
  (without consuming its data), connect() to this address, and leave xioopen().
  Afterwards, our socket only communicates with this peer.
  Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_UDP, RANGE
! Note: fork option can not be implemented for technical reasons!
  
  
  #UDP-dgram:port
--- 294,301 ----
  (without consuming its data), connect() to this address, and leave xioopen().
  Afterwards, our socket only communicates with this peer.
  Option groups: FD, SOCKET, SOCK_IP, IPAPP, IP_UDP, RANGE
! Note: with fork option, child processes might hang forever because UDP cannot
! transport EOF conditions.
  
  
  #UDP-dgram:port
***************
*** 933,939 ****
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX 4.3, FreeBSD, Linux
  
  Sets the O_DIRECT flag of the open() call.
  
--- 933,939 ----
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX, FreeBSD, Linux
  
  Sets the O_DIRECT flag of the open() call.
  
***************
*** 956,962 ****
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX 4.3, Linux, SunOS (UNIX98)
  
  Sets the O_DSYNC flag with the open() call. This lets write() calls wait until
  modification metainfo is physically written to media.
--- 956,962 ----
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX, Linux, SunOS (UNIX98)
  
  Sets the O_DSYNC flag with the open() call. This lets write() calls wait until
  modification metainfo is physically written to media.
***************
*** 979,985 ****
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX 4.3, Linux, SunOS
  
  Sets the O_LARGEFILE flag of the open() flag.
  
--- 979,985 ----
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX, Linux, SunOS
  
  Sets the O_LARGEFILE flag of the open() flag.
  
***************
*** 1050,1056 ****
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX 4.3, Linux, SunOS (UNIX98)
  
  Sets the O_RSYNC flag with the open() call. This lets write() calls wait until
  read metainfo is physically written to media.
--- 1050,1056 ----
  Type: BOOL
  Option group: OPEN
  Phase: OPEN
! Platforms: AIX, Linux, SunOS (UNIX98)
  
  Sets the O_RSYNC flag with the open() call. This lets write() calls wait until
  read metainfo is physically written to media.
***************
*** 1212,1218 ****
  Type: BOOL
  Option group: FORK
  Phase: BIGEN
! Platforms: AIX 4.3, FreeBSD, Linux, SunOS
  
  For communication between the exec() or system() subprocess with socat, use a
  pseudo terminal instead of a socket pair. The executed program gets the slave
--- 1212,1218 ----
  Type: BOOL
  Option group: FORK
  Phase: BIGEN
! Platforms: AIX, FreeBSD, Linux, SunOS
  
  For communication between the exec() or system() subprocess with socat, use a
  pseudo terminal instead of a socket pair. The executed program gets the slave
***************
*** 1239,1245 ****
  Type: BOOL
  Option group: FORK
  Phase: BIGEN
! Platforms: AIX 4.3, Linux, SunOS
  
  Like pty, but only use the /dev/ptmx (/dev/ptc on AIX) mechanism, not any other
  way for pty generation. 
--- 1239,1245 ----
  Type: BOOL
  Option group: FORK
  Phase: BIGEN
! Platforms: AIX, Linux, SunOS
  
  Like pty, but only use the /dev/ptmx (/dev/ptc on AIX) mechanism, not any other
  way for pty generation. 
***************
*** 1570,1576 ****
  Type: INT
  Option group: SOCKET
  Phase: PASTSOCKET
! Platforms: AIX 4.3
  
  Sets the SO_AUDIT socket option.
  
--- 1570,1576 ----
  Type: INT
  Option group: SOCKET
  Phase: PASTSOCKET
! Platforms: AIX
  
  Sets the SO_AUDIT socket option.
  
***************
*** 1643,1649 ****
  Physical type: INT
  Option group: SOCKET
  Phase: PASTSOCKET
! Platforms: AIX 4.3
  
  Sets the SO_KERNACCEPT socket option.
  
--- 1643,1649 ----
  Physical type: INT
  Option group: SOCKET
  Phase: PASTSOCKET
! Platforms: AIX
  
  Sets the SO_KERNACCEPT socket option.
  
***************
*** 1963,1969 ****
  Physical type: INT
  Option group: SOCK_IP
  Phase: PASTSOCKET
! Platforms: AIX 4.3, Linux, SunOS
  Implementation status: No results.
  
  Set the IP_RECVTTL socket option. 
--- 1963,1969 ----
  Physical type: INT
  Option group: SOCK_IP
  Phase: PASTSOCKET
! Platforms: AIX, Linux, SunOS
  Implementation status: No results.
  
  Set the IP_RECVTTL socket option. 
***************
*** 2211,2217 ****
  Physical type: INT
  Option group: IP_TCP
  Phase: PASTSOCKET
! Platforms: AIX 4.3
  
  Applies the TCP_STDURG option with setsockopt. This enables RFC 1122 compliant
  urgent point handling.
--- 2211,2217 ----
  Physical type: INT
  Option group: IP_TCP
  Phase: PASTSOCKET
! Platforms: AIX
  
  Applies the TCP_STDURG option with setsockopt. This enables RFC 1122 compliant
  urgent point handling.
