1
0
mirror of https://github.com/simh/simh.git synced 2026-02-01 22:33:25 +00:00

Notes For V3.5-0

The source set has been extensively overhauled.  For correct
viewing, set Visual C++ or Emacs to have tab stops every 4
characters.

1. New Features in 3.4-1

1.1 All Ethernet devices

- Added Windows user-defined adapter names (from Timothe Litt)

1.2 Interdata, SDS, HP, PDP-8, PDP-18b terminal multiplexors

- Added support for SET <unit>n DISCONNECT

1.3 VAX

- Added latent QDSS support
- Revised autoconfigure to handle QDSS

1.4 PDP-11

- Revised autoconfigure to handle more casees

2. Bugs Fixed in 3.4-1

2.1 SCP and libraries

- Trim trailing spaces on all input (for example, attach file names)
- Fixed sim_sock spurious SIGPIPE error in Unix/Linux
- Fixed sim_tape misallocation of TPC map array for 64b simulators

2.2 1401

- Fixed bug, CPU reset was clearing SSB through SSG

2.3 PDP-11

- Fixed bug in VH vector display routine
- Fixed XU runt packet processing (found by Tim Chapman)

2.4 Interdata

- Fixed bug in SHOW PAS CONN/STATS
- Fixed potential integer overflow exception in divide

2.5 SDS

- Fixed bug in SHOW MUX CONN/STATS

2.6 HP

- Fixed bug in SHOW MUX CONN/STATS

2.7 PDP-8

- Fixed bug in SHOW TTIX CONN/STATS
- Fixed bug in SET/SHOW TTOXn LOG

2.8 PDP-18b

- Fixed bug in SHOW TTIX CONN/STATS
- Fixed bug in SET/SHOW TTOXn LOG

2.9 Nova, Eclipse

- Fixed potential integer overflow exception in divide
This commit is contained in:
Bob Supnik
2005-09-09 18:09:00 -07:00
committed by Mark Pizzolato
parent ec60bbf329
commit b7c1eae41f
257 changed files with 107140 additions and 97195 deletions

View File

@@ -19,21 +19,22 @@
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Robert M Supnik shall not
be used in advertising or otherwise to promote the sale, use or other dealings
Except as contained in this notice, the name of Robert M Supnik shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert M Supnik.
14-Apr-05 RMS Added WSAEINPROGRESS test (from Tim Riker)
09-Jan-04 RMS Fixed typing problem in Alpha Unix (found by Tim Chapman)
17-Apr-03 RMS Fixed non-implemented version of sim_close_sock
(found by Mark Pizzolato)
17-Dec-02 RMS Added sim_connect_socket, sim_create_socket
08-Oct-02 RMS Revised for .NET compatibility
22-Aug-02 RMS Changed calling sequence for sim_accept_conn
22-May-02 RMS Added OS2 EMX support from Holger Veit
06-Feb-02 RMS Added VMS support from Robert Alan Byer
16-Sep-01 RMS Added Macintosh support from Peter Schorn
02-Sep-01 RMS Fixed UNIX bugs found by Mirian Lennox and Tom Markson
16-Aug-05 RMS Fixed spurious SIGPIPE signal error in Unix
14-Apr-05 RMS Added WSAEINPROGRESS test (from Tim Riker)
09-Jan-04 RMS Fixed typing problem in Alpha Unix (found by Tim Chapman)
17-Apr-03 RMS Fixed non-implemented version of sim_close_sock
(found by Mark Pizzolato)
17-Dec-02 RMS Added sim_connect_socket, sim_create_socket
08-Oct-02 RMS Revised for .NET compatibility
22-Aug-02 RMS Changed calling sequence for sim_accept_conn
22-May-02 RMS Added OS2 EMX support from Holger Veit
06-Feb-02 RMS Added VMS support from Robert Alan Byer
16-Sep-01 RMS Added Macintosh support from Peter Schorn
02-Sep-01 RMS Fixed UNIX bugs found by Mirian Lennox and Tom Markson
*/
#include "sim_defs.h"
@@ -42,15 +43,15 @@
/* OS dependent routines
sim_master_sock create master socket
sim_accept_conn accept connection
sim_read_sock read from socket
sim_write_sock write from socket
sim_close_sock close socket
sim_setnonblock set socket non-blocking
sim_msg_sock send message to socket
sim_master_sock create master socket
sim_accept_conn accept connection
sim_read_sock read from socket
sim_write_sock write from socket
sim_close_sock close socket
sim_setnonblock set socket non-blocking
sim_msg_sock send message to socket
*/
int32 sim_sock_cnt = 0;
/* First, all the non-implemented versions */
@@ -92,8 +93,8 @@ SOCKET sim_setnonblock (SOCKET sock)
return SOCKET_ERROR;
}
#else /* endif unimpl */
#else /* endif unimpl */
/* UNIX, Win32, Macintosh, VMS, OS2 (Berkeley socket) routines */
SOCKET sim_err_sock (SOCKET s, char *emsg, int32 flg)
@@ -116,18 +117,24 @@ WSADATA wsaData;
wVersionRequested = MAKEWORD (1, 1);
if (sim_sock_cnt == 0) {
err = WSAStartup (wVersionRequested, &wsaData); /* start Winsock */
if (err != 0) {
printf ("Winsock: startup error %d\n", err);
return INVALID_SOCKET; } }
err = WSAStartup (wVersionRequested, &wsaData); /* start Winsock */
if (err != 0) {
printf ("Winsock: startup error %d\n", err);
return INVALID_SOCKET;
}
}
sim_sock_cnt = sim_sock_cnt + 1;
#endif /* endif Win32 */
#endif /* endif Win32 */
#if defined (SIGPIPE)
signal (SIGPIPE, SIG_IGN); /* no pipe signals */
#endif
newsock = socket (AF_INET, SOCK_STREAM, 0); /* create socket */
if (newsock == INVALID_SOCKET) { /* socket error? */
err = WSAGetLastError ();
printf ("Sockets: socket error %d\n", err);
return INVALID_SOCKET; }
newsock = socket (AF_INET, SOCK_STREAM, 0); /* create socket */
if (newsock == INVALID_SOCKET) { /* socket error? */
err = WSAGetLastError ();
printf ("Sockets: socket error %d\n", err);
return INVALID_SOCKET;
}
return newsock;
}
@@ -137,23 +144,23 @@ SOCKET newsock;
struct sockaddr_in name;
int32 sta;
newsock = sim_create_sock (); /* create socket */
if (newsock == INVALID_SOCKET) return newsock; /* socket error? */
newsock = sim_create_sock (); /* create socket */
if (newsock == INVALID_SOCKET) return newsock; /* socket error? */
name.sin_family = AF_INET; /* name socket */
name.sin_port = htons ((unsigned short) port); /* insert port */
name.sin_addr.s_addr = htonl (INADDR_ANY); /* insert addr */
name.sin_family = AF_INET; /* name socket */
name.sin_port = htons ((unsigned short) port); /* insert port */
name.sin_addr.s_addr = htonl (INADDR_ANY); /* insert addr */
sta = bind (newsock, (struct sockaddr *) &name, sizeof (name));
if (sta == SOCKET_ERROR) /* bind error? */
return sim_err_sock (newsock, "bind", 1);
sta = sim_setnonblock (newsock); /* set nonblocking */
if (sta == SOCKET_ERROR) /* fcntl error? */
return sim_err_sock (newsock, "fcntl", 1);
sta = listen (newsock, 1); /* listen on socket */
if (sta == SOCKET_ERROR) /* listen error? */
return sim_err_sock (newsock, "listen", 1);
return newsock; /* got it! */
if (sta == SOCKET_ERROR) /* bind error? */
return sim_err_sock (newsock, "bind", 1);
sta = sim_setnonblock (newsock); /* set nonblocking */
if (sta == SOCKET_ERROR) /* fcntl error? */
return sim_err_sock (newsock, "fcntl", 1);
sta = listen (newsock, 1); /* listen on socket */
if (sta == SOCKET_ERROR) /* listen error? */
return sim_err_sock (newsock, "listen", 1);
return newsock; /* got it! */
}
SOCKET sim_connect_sock (int32 ip, int32 port)
@@ -162,31 +169,31 @@ SOCKET newsock;
struct sockaddr_in name;
int32 sta;
newsock = sim_create_sock (); /* create socket */
if (newsock == INVALID_SOCKET) return newsock; /* socket error? */
newsock = sim_create_sock (); /* create socket */
if (newsock == INVALID_SOCKET) return newsock; /* socket error? */
name.sin_family = AF_INET; /* name socket */
name.sin_port = htons ((unsigned short) port); /* insert port */
name.sin_addr.s_addr = htonl (ip); /* insert addr */
name.sin_family = AF_INET; /* name socket */
name.sin_port = htons ((unsigned short) port); /* insert port */
name.sin_addr.s_addr = htonl (ip); /* insert addr */
sta = sim_setnonblock (newsock); /* set nonblocking */
if (sta == SOCKET_ERROR) /* fcntl error? */
return sim_err_sock (newsock, "fcntl", 1);
sta = sim_setnonblock (newsock); /* set nonblocking */
if (sta == SOCKET_ERROR) /* fcntl error? */
return sim_err_sock (newsock, "fcntl", 1);
sta = connect (newsock, (struct sockaddr *) &name, sizeof (name));
if ((sta == SOCKET_ERROR) &&
(WSAGetLastError () != WSAEWOULDBLOCK) &&
(WSAGetLastError () != WSAEINPROGRESS))
return sim_err_sock (newsock, "connect", 1);
return sim_err_sock (newsock, "connect", 1);
return newsock; /* got it! */
return newsock; /* got it! */
}
SOCKET sim_accept_conn (SOCKET master, uint32 *ipaddr)
{
int32 sta, err;
#if defined (macintosh)
#if defined (macintosh) || defined (__linux) || defined (__APPLE__)
socklen_t size;
#elif defined (_WIN32) || defined (__EMX__) || defined (__APPLE__) ||\
#elif defined (_WIN32) || defined (__EMX__) ||\
(defined (__ALPHA) && defined (__unix__))
int size;
#else
@@ -195,19 +202,20 @@ size_t size;
SOCKET newsock;
struct sockaddr_in clientname;
if (master == 0) return INVALID_SOCKET; /* not attached? */
if (master == 0) return INVALID_SOCKET; /* not attached? */
size = sizeof (clientname);
newsock = accept (master, (struct sockaddr *) &clientname, &size);
if (newsock == INVALID_SOCKET) { /* error? */
err = WSAGetLastError ();
if (err != WSAEWOULDBLOCK)
printf ("Sockets: accept error %d\n", err);
return INVALID_SOCKET; }
if (newsock == INVALID_SOCKET) { /* error? */
err = WSAGetLastError ();
if (err != WSAEWOULDBLOCK)
printf ("Sockets: accept error %d\n", err);
return INVALID_SOCKET;
}
if (ipaddr != NULL) *ipaddr = ntohl (clientname.sin_addr.s_addr);
sta = sim_setnonblock (newsock); /* set nonblocking */
if (sta == SOCKET_ERROR) /* fcntl error? */
return sim_err_sock (newsock, "fcntl", 0);
sta = sim_setnonblock (newsock); /* set nonblocking */
if (sta == SOCKET_ERROR) /* fcntl error? */
return sim_err_sock (newsock, "fcntl", 0);
return newsock;
}
@@ -235,12 +243,13 @@ int32 sim_read_sock (SOCKET sock, char *buf, int32 nbytes)
int32 rbytes, err;
rbytes = recv (sock, buf, nbytes, 0);
if (rbytes == 0) return -1; /* disconnect */
if (rbytes == 0) return -1; /* disconnect */
if (rbytes == SOCKET_ERROR) {
err = WSAGetLastError ();
if (err == WSAEWOULDBLOCK) return 0; /* no data */
printf ("Sockets: read error %d\n", err);
return -1; }
err = WSAGetLastError ();
if (err == WSAEWOULDBLOCK) return 0; /* no data */
printf ("Sockets: read error %d\n", err);
return -1;
}
return rbytes;
}
@@ -254,48 +263,50 @@ void sim_close_sock (SOCKET sock, t_bool master)
#if defined (_WIN32)
closesocket (sock);
if (master) {
sim_sock_cnt = sim_sock_cnt - 1;
if (sim_sock_cnt <= 0) {
WSACleanup ();
sim_sock_cnt = 0; } }
sim_sock_cnt = sim_sock_cnt - 1;
if (sim_sock_cnt <= 0) {
WSACleanup ();
sim_sock_cnt = 0;
}
}
#else
close (sock);
#endif
return;
}
#if defined (_WIN32) /* Windows */
#if defined (_WIN32) /* Windows */
SOCKET sim_setnonblock (SOCKET sock)
{
unsigned long non_block = 1;
return ioctlsocket (sock, FIONBIO, &non_block); /* set nonblocking */
return ioctlsocket (sock, FIONBIO, &non_block); /* set nonblocking */
}
#elif defined (VMS) /* VMS */
#elif defined (VMS) /* VMS */
SOCKET sim_setnonblock (SOCKET sock)
{
int non_block = 1;
return ioctl (sock, FIONBIO, &non_block); /* set nonblocking */
return ioctl (sock, FIONBIO, &non_block); /* set nonblocking */
}
#else /* Mac, Unix, OS/2 */
#else /* Mac, Unix, OS/2 */
int32 sim_setnonblock (SOCKET sock)
{
int32 fl, sta;
fl = fcntl (sock, F_GETFL,0); /* get flags */
fl = fcntl (sock, F_GETFL,0); /* get flags */
if (fl == -1) return SOCKET_ERROR;
sta = fcntl (sock, F_SETFL, fl | O_NONBLOCK); /* set nonblock */
sta = fcntl (sock, F_SETFL, fl | O_NONBLOCK); /* set nonblock */
if (sta == -1) return SOCKET_ERROR;
#if !defined (macintosh) && !defined (__EMX__) /* Unix only */
sta = fcntl (sock, F_SETOWN, getpid()); /* set ownership */
#if !defined (macintosh) && !defined (__EMX__) /* Unix only */
sta = fcntl (sock, F_SETOWN, getpid()); /* set ownership */
if (sta == -1) return SOCKET_ERROR;
#endif
return 0;
}
#endif /* endif !Win32 && !VMS */
#endif /* endif !Win32 && !VMS */
#endif /* end else !implemented */
#endif /* end else !implemented */