Every package has two version indicators: A dgd-net release number, and a DGD version number. There is a loose correspondence between them, because support for older DGD versions is often dropped in later releases. Contact me if you need a particular release / version combination that is not supported. Release 1: - comm_receive condensed to a single loop - cleaned up buffer allocation - put SO_REUSEADDR back Release 2: - fixed the call to setsockopt - made it compatible with precompilation Release 3: - properly initialized usr->newlines (fixes crashing bug) - fixed bug where commands would only be executed if several were queued. Release 4: - added LINEMODE patches from DGD 1.0.8.3 (+minor fix to SB/SE handling) - fixed send_message() for when the driver object doubles as a port object - reversed order of checking for errors and writability in conn_connected - an error is raised if a connect() fails right away (used to be silent) Release 5: - Added config.c and comp/comp.c patches from DGD 1.0.8.8 - Doc fix: accept() has been connection() since release 0. - Added checks for nusers < maxusers before calling comm_new - Made some error messages clearer - Made sure no writes are done to not yet connected sockets Release 6: - Fixed O_USER check in kfun_send_datagram(). (Operator precedence) - Added SO_ERROR check to select-on-exception check for conn_connected() - It seems some hosts report EAGAIN rather than EINPROGRESS for non-blocking connect() calls. Added check for EAGAIN. - Made conn_write() retry if it receives EINTR. - this_user() is now set during port_object->open(). - Peeked in tinyfugue sources to see how it handles nonblocking connect(). conn_connected() rewritten accordingly. - Flow control: When a message will not fit in the output buffer, allocate the space to hold it and return 1. The driver will call message_done() in the connection object when the entire message has been sent. If the connection object uses send_message() before the previous message was done, the unsent part of the previous message will be discarded. This should be compatible with 1.0.19's handling of flow control. Release 7: - Automatically try to extend the socket output buffer when a write can not send everything or a sendto fails with EMSGSIZE. - Do not send WONT ECHO when a new connection is accepted. Clients must start in that mode anyway. To help users with broken clients, the connection object can toggle echoing off and then on. Also, every telnet client I have seen has some way to specify which side should echo. - Do not send DO LINEMODE when a new connection is accepted. It was sent to help certain BSD telnet clients, which do not normally negotiate LINEMODE when contacting a non-standard port, but (I've heard) cannot function properly without it. The user of such a client can specify the port as a negative number to tell it to always start negotiations. - Because no telnet-specific options are sent when a new connection is accepted, the "telnet" protocol has become useful for tasks like ftp-control and smtp. - *** Any object can do open_port() or connect() on itself. - Moved telnet-negotiation flags to a separate field. - Telnet protocol will now refuse unknown options. Release 8: - Increased input buffers for "tcp" receive_message() and "udp" receive_datagram() to 8192 bytes. - IAC IP and IAC BREAK are now ignored. (Used to echo DEL for IP and FS for BREAK.) - Changed reply to DO TM to WONT TM. WILL TM implies that the WILL TM has been inserted at the correct place in the output stream, which is not true. - Added support for IAC EC (erase character) and IAC EL (erase line) - Set socket option OOBINLINE on telnet/tcp connections to receive out-of-band data inline. - When receiving a Data Mark (IAC DM) or Interrupt (IAC IP), purge the input buffer. This assumes that a Data Mark is always part of a telnet "Synch" sequence. Since DGD effectively treats all telnet input as 'urgent', discarding previous input should be all that is necessary. - conn_accept() checks read-select before trying accept(). - Added ports() efun. Efun users() no longer returns ports. query_ip_number() returns 0 for ports. - Speedup when maxusers is much larger than nusers. - Introduced comm_confirm(), so that message_done() and close() are called during a separate round. - Use 'flush' and 'callbacks' to keep track of whether a scan of all users is necessary in comm_flush() and comm_confirm(), respectively. - Patched up some cases where bad connections were not closed. - Moved call to comm_init() to a better place. - send_message(-1) can be used to ask if the previous message is done. It will return 0 if all output has been written. Otherwise, it will return 1 and the driver will call message_done() when all output has been written. - If receive_message() or receive_datagram() returns 1, and there is no more data available during the next input round, the driver will call process_message() or process_datagram() in the object. - Memory allocation in comm_send() rounds up to nearest 8k boundary, to help the static memory allocator. Release 9: - process_message() and process_datagram() now actually work. Release 10: - Avoided memmove(). - Made "protocol" argument of connect() optional. - Switched arguments of open_port() and made the port number optional. - Bugfix: comm_new() now calls conn_del(conn) if there is an error. [rare] - Started adding telnet flow control. - Fixed infinite loop bug in comm_write(). - Added user->optbuf and introduced comm_telopt. - Added telnet_fill() and made comm_send() and comm_write() use it. - Completed telnet flow control. - Simplification: Added comm_user_call() and made comm_receive() use it. - Instead of errors in kfun connect(), call close() later on. - Checked for destructed user object after receive_message() and friends. - Added comm_add_goahead() and made callers of comm_flush() use it. comm_flush() no longer has a "prompt" parameter. - Bugfix: Calling kfun connect() from port->connection() while number of users is at maximum will no longer crash the driver. - Made comm_confirm() be less eager to push and pop error contexts. This package is now complete. Any further changes will be to fix bugs or to track new DGD versions. Maintenance of package now done by by Erwin Harte. - Work-around for Linux-bug with non-blocking connections. - Fixed possible crasher in call to connection(). - Prevented open_port() or connect() from having any effect if done from within close() call in the kfun destruct_object(). - Added netpackage-specific version of block_input() that also works on port-objects.