    /===================================================================\
   ||                                                                   ||
   ||          Simple Sockets Library Differences Document              ||
   ||                Charles E. Campbell, Jr., PhD.                     ||
   ||                                                                   ||
   ||                         HISTORY                                   ||
   ||                                                                   ||
    \===================================================================/

Version 7c: *** RELEASED *** Aug 22, 2005
	a. (Marcel Satchel) improved <Sinit.c> for Windows
	b. (Aug 22, 2005) included the "b" option for Sopen()
	   (block until requested server becomes available)
	c. (Marcel Satchel) Sinit.c fixed (yet again!)
Version 6: *** RELEASED *** Mar 24, 2005
	a. (Jul 16, 2004) Neeme Tingas suggested that several int declarations be changed
	   to socklen_t for Gnu CC.  I'm currently using __gnu_linux__
	   to test for using socklen_t instead of int.  He also suggested
	   using one int for sigio_handler in EXAMPLES/sktsig.c.  IMHO, the
	   signal() interface seems to be one where lots of different systems
	   use different calling standards and their compilers are quite vigilant
	   about complaining about other styles.
	b. (Mar 24, 2005) Blocking client opens (Sopen(servername,"b")) has been 
	   implemented.  Clients can now request a block until the requested server
	   registers itself with the PortMaster.

Version 5: *** RELEASED *** May 24, 2004
	a. Now supports cygwin.  Note that some of the EXAMPLES programs will
	   not compile under cygwin because it doesn't support sigcontext (yet):
	   oobsend and sktsig.  Thanks go to Frank Myers for this port!

Version 4: *** RELEASED *** Apr 22, 2004
	a. (thank you, Martin Wood!) prototype and declaration for sprt() changed
	   to char *sprt(const char *).
	b. (thank you, Martin Wood!) Changed __linux to __linux__ in <setproto.h>
	   to keep it consistent with <xtdio.h>
	c. (thank you, Martin Wood!) Changed inclusion of <strings.h> to <string.h>
	   for Linux

Version 3: *** RELEASED *** Apr 02, 2004
	a. Cosmetic changes, extra initialization of pointers to NULL,
	   to skdbg.c and Spm.c
	b. Mac OS-X supported (#ifdef MACOS_X...)  You may need to put in a
		into <sockets.h> to get it to compile properly.  Thanks to
		Paul Bourne for sharing this!

Version 2.11a: *** RELEASED *** March 6, 2001
	a. Steve Richards has ported the Simple Sockets Library to OS/2
	   and has given permission to distribute his changes.
	b. sktdbg's put command enhanced to understand \a is ctrl-a, 
	   \b is ctrl-b, ... \z is ctrl-z.

Version 2.10: *** RELEASED *** Feb 28, 2001
	a. Included Microsoft Developer Studio mods - thanks to David Dowd!
	b. Fixed Speername(), including peername and peeraddr commands in sktdbg
	c. Made ...->skt= NULL;  be   ...->skt= 0; because some compilers
	   were complaining about making an integer from a pointer without a
	   cast.
	d. talkclient.c had an uninitialized pointer that caused core dumps
	   under Linux.  Fixed!
	e. Servers named "$####" will attempt to use port #### (where # is
	   a number from [0-9]).  Note that ports 0-1023 are typically reserved.
	f. Moved "xtdio.h" to after the extern "C" in <sockets.h>
	   (thanks to Ralf Moeller)
	g. Steve Richards has kindly ported the Simple Sockets Library to the
	   AS/400 and has given permission to distribute his changes.

Version 2.09:
    a. Includes two new examples: <talksrvr.c> and <talkclient.c>
    b. Sinit() refused to compile under Unix (its really for BillG's o/ses);
       now fixed.
    c. Spm now releases controlling terminal under Unix by itself (ie. nohup
       is no longer needed) (ie. uses setsid()).
    d. Spm now runs as a "task" under Windoze; ie. if Spm.exe is put into
            c:\Windows\Start Menu\Programs\StartUp
        it will run quietly (no window, no ctrl-c to close).
	e. Speername() and Speeraddr() passed the wrong length to the
	   gethostbyaddr() and getpeername() functions; fixed!
	f. Sopen/Sclose will now accept NULL or "" for a sktname; in such a
	   case, the user *must* specify the port number (ie. "s12345" or
	   "c12345").  In such a case, the PortMaster is bypassed.  Facilitates
	   use with some firewalls.
	g. Dr Jon Christopher found a bug and provided a fix to <Speername.c>


Version 2.08:  *** RELEASED *** March 30, 1998
    1. Sopen_server now sets up sin.sin_port with htons() rather than htonl()
    2. Sopen_server's gethostname call now checked for error (has never happened
       before, but you never know!)
    3. Changes were made to <xtdio.h> and <sockets.h> to support Linux.  Thanks
       go to Gary Johnson (gjohnson@season.com).
    4. ***BIG CHANGE***: Starting with v2.08, the Simple Socket Library's
       PortMaster is now registered with IANA.  However, its former port
       was already assigned by IANA elsewhere, so the PortMaster now has a new
       port number, 1750.  This means that your current SSL-using s/w needs to
       be recompiled as it won't be able to contact the new PortMaster with its
       new port number.

          Web users, check out http://www.iana.org/iana/
          Ftp users, check out ftp://ftp.isi.edu/in-notes/iana/assignments/

    5. Modest changes made to the PortMaster's startup banner and
       stdio/stderr/stdout closing.
    6. freeSocket() now also nulls out the Socket's contents.  This function
       is implicitly called by using Sclose().
    7. Two new functions: Smaskisset(Socket *skt) and Smaskfdisset(int fd).
       These two functions are faster than using Smasktest() after a
       Smaskwait().  A supporting new command, "isset", is in sktdbg,
       and supporting changes were made to <sockets.tex>, the manual.
    8. spmtable issues warnings instead of errors on PortMaster problems,
       thereby allowing it to continue through a list of portmasters.
    9. PortMasters will now include the host of servers "sharing" another machine's
       PortMaster for PM_TABLE requests.  Translated: spmtable will now show what
       machine a server is actually on if not the PortMaster's own host.
   10. ERROR -> XTDIO_ERROR, etc -- too many folks are using ERROR, WARNING, etc,
       and so this fixes that problem.
   11. Srmsrvr now uses PMSHARE if no hostname was specified; this improvement also
       affects the srmsrvr program.
   12. Sopen_client now attempts hostname first; if no success and PM_SHARE is defined,
       try Sopen_client to PM_SHARE's PortMaster.

Version 2.07:
    1. Porting hint #5 was added to <DOC/porting.doc>
    2. The <xtdio.h> file was modified with a comment (concerning #define const)
       supporting porting hint #5 (see <sockets.tex>).
    3. To the signal() calls in <oobsend.c> and <oobrecv.c>, I included (void *)
       casts to the second argument (the name of the function to be called in
       the event of receipt of a signal).
    4. Modified Makefiles so that ${...} -> $(...), because some Suns had
       problems with expanding the ${...} form (wierd!).
    5. Improved <sockets.tex> documentation for VMS -- included notes on how to
       use VMS's DCL to allow for command line arguments.
    6. <cprt.c> now #includes <xtdio.h>, which provides prototyping.
    7. New functions: Speername() returns a string giving the peer's name
                      Speeraddr() returns the internet address of the peer
    8. PortMaster now uses SO_REUSEADDR -- it doesn't seem necessary, as the
       PortMaster is very stable in operation, but I decided to do so for
       Murphy's Law handling.  Any comments on this choice one way or the other
       are welcome!
    9. Sopen has been extended - it now will handle user-specified ports in
       addition to dynamic port binding, for both servers and clients.  Check
       out Sopen()'s "mode" in the manual.

   ---------------------------------------------------------------------   

Version 2.06:
    1. spmtable improved so that it will not hang on non-responding
       PortMaster (and will give messages).
    2. Sopen_clientport had unnecessary copying removed: hostenstruct= *hostentptr;

   ---------------------------------------------------------------------   

Version 2.05:
    1. Sopen/SSLNEEDTOSHAREPM problem fixed: PCs should now be able to
       share other's PortMasters to instantiate servers.
    2. Fixed documentation on the PortMaster; its been using port 1541
       for quite awhile now (it was changed from 1540 due to a problem
       with Suns in Version 2.01).
    3. Added shutdown() before close() to Sclose, Sopen (error handling), and
       Spm.

   ---------------------------------------------------------------------   
    
Version 2.04:
    1. spmchk.c now returns (0 usually, 1 for vms) or 2 -- facilitated
       vms usage
    2. If Sopenv's env_var is NULL or a null string (ie. ""), it will
       use SKTPATH for its socket path environment variable.

   ---------------------------------------------------------------------   

Version 2.03:

    1. sockets.h and Sopen now use the SSLNOSETSOCKOPT to specify which
       tcp/ip implementations do not support the setsockopt() call
       (currently, that's msdos and aix).

    2. OSF support tentatively added

    3. smsrvr.c and smclient.c examples added to the distribution

   ---------------------------------------------------------------------   

Version 2.02:

    1. The sockets.tex had Smaskwait calling syntax wrong:
          wrong     : Smaskwait(Socket *)
       - instead of -
          correct   : Smaskwait()
       The sockets.tex file has been corrected.

    2. The sockets.h file was improved so that Suns which have Standard C
       compilers will use <stdarg.h> instead of <varargs.h>.

    3. Marty Olevitch donated spmchk.c (he placed it into the public domain)
       and is included and documented in this distribution.

    4. Included out-of-band data handling example (both send and receive
       programs).

    5. Sread, Sreadbytes, Swrite, and Speek: now take void *buf instead of
       char * buf.  This change should not affect any prior uses but allows
       SSL programmers to use fewer casts when dealing with these functions.

    6. Smasktest used to change the Smasktime information (to 0sec 0usec).
       Smasktest now saves the current time data, does its thing, and then
       restores the timeout info.

    7. Added cprt() to the library; its like sprt(), but for single characters.

    8. Used cprt() with the read command in sktdbg to make all characters read
       visible (and not depend on a null byte which may not be there).

    9. Thanks to R. Day, SCO and Solaris Unix support has been added (options
       to <sockets.h> and <xtdio.h>).

   10. The RDCOLOR environment variable is now used (instead of COLOR) to
       indicate what directory the <rdcolor.dat> file resides in.  The
       documentation in <sockets.tex> has been changed to reflect this.

   ---------------------------------------------------------------------   

Version 2.01:

    1. Stimeoutwait : now takes three arguments: 
    
        int Stimeoutwait(Socket *skt,long seconds,long useconds)
    
       instead of two (useconds was added in).  This change impacted:
          Sclose Sopen Srmsrvr Stimeoutwait
          Portmaster (Spm) sktdbg
    
    2. Sgets : bug in high data transfer rate fixed.  I've now transferred
       literally thousands of images (from a capacitance-based "camera") with
       no problems.
    
    3. PortMaster (Spm): firewall (security) support
       More resistance to crashing, two ways: first, more Stest()s, and
       second, the Stest function itself (see #9) has improved.
    
    4. Document: more examples, firewall discussion, and blather
    
    5. Sopen: opens with TCP_NODELAY for the machines which support it --
       this setting helps small packets get across the Net faster at the price
       of net efficiency (default behavior: tcp/ip bundles small packets together
       within some time interval).
    
    6. AIX (IBM's risc machine) is now supported via <sockets.h>
    
    7. sktdbg:
    
        a) has an enhanced prompt:
            (   0 bytes) Enter: 
           It now tells you how many bytes were awaiting processing when the prompt
           was issued (ie. it uses Stest()).
    
        b) fwinit command: tells the PortMaster to re-initialize its firewall list.
           Good for whoever owns the firewall list to update it and then to
           tell the PortMaster to re-read it.
    
        c) a "close" bug was stomped on
    
    8. Smaskwait : I'm not sure about the old release (Version 1.0) , so some of
       these functions may be new: Smaskfdset Smaskunfdset Smaskpush Smaskpop
    
    9. Stest Speek: used to have problems with a killed socket.  These functions
       now detect dead sockets (ie. return a -1).

   10. The Sun Sparcstation operating system seems to use port 1540 for its own
       purposes, so the PortMaster's port was changed to be 1541 instead of
       1540.  The new port assignment works on all the other machines in the
       test group (SGI Personal Iris, SGI Extreme, Sun 3, Sun Sparcstation,
       IBM/AIX, DecStation/Ultrix, IBM-PC/MSDOS, DEC/VMS).

   ---------------------------------------------------------------------   

Version 1.0: This was the original (and lacked a version number, sigh...)

   ---------------------------------------------------------------------   
