mirror of
https://github.com/simh/simh.git
synced 2026-04-28 12:47:25 +00:00
ETHER, SOCK: Update latest from master branch
This commit is contained in:
52
sim_ether.c
52
sim_ether.c
@@ -1653,7 +1653,9 @@ static int _eth_get_system_id (char *buf, size_t buf_size)
|
|||||||
#endif
|
#endif
|
||||||
if ((status = RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_QUERY_VALUE|KEY_WOW64_64KEY, ®hnd)) != ERROR_SUCCESS)
|
if ((status = RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_QUERY_VALUE|KEY_WOW64_64KEY, ®hnd)) != ERROR_SUCCESS)
|
||||||
return -1;
|
return -1;
|
||||||
reglen = buf_size;
|
if (buf_size < 37)
|
||||||
|
return -1;
|
||||||
|
reglen = buf_size - 1;
|
||||||
if ((status = RegQueryValueExA (reghnd, "MachineGuid", NULL, ®type, (LPBYTE)buf, ®len)) != ERROR_SUCCESS) {
|
if ((status = RegQueryValueExA (reghnd, "MachineGuid", NULL, ®type, (LPBYTE)buf, ®len)) != ERROR_SUCCESS) {
|
||||||
RegCloseKey (reghnd);
|
RegCloseKey (reghnd);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1672,19 +1674,16 @@ static int _eth_get_system_id (char *buf, size_t buf_size)
|
|||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
memset (buf, 0, buf_size);
|
memset (buf, 0, buf_size);
|
||||||
if ((f = fopen ("/etc/machine-id", "r"))) {
|
if (buf_size < 37)
|
||||||
if (fread (buf, 1, buf_size - 1, f))
|
return -1;
|
||||||
fclose (f);
|
if ((f = fopen ("/etc/machine-id", "r")) == NULL)
|
||||||
else
|
f = popen ("hostname", "r");
|
||||||
fclose (f);
|
if (f) {
|
||||||
}
|
size_t read_size;
|
||||||
else {
|
|
||||||
if ((f = popen ("hostname", "r"))) {
|
read_size = fread (buf, 1, buf_size - 1, f);
|
||||||
if (fread (buf, 1, buf_size - 1, f))
|
buf[read_size] = '\0';
|
||||||
pclose (f);
|
fclose (f);
|
||||||
else
|
|
||||||
pclose (f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
while ((strlen (buf) > 0) && sim_isspace(buf[strlen (buf) - 1]))
|
while ((strlen (buf) > 0) && sim_isspace(buf[strlen (buf) - 1]))
|
||||||
buf[strlen (buf) - 1] = '\0';
|
buf[strlen (buf) - 1] = '\0';
|
||||||
@@ -1959,7 +1958,8 @@ return NULL;
|
|||||||
t_stat eth_set_async (ETH_DEV *dev, int latency)
|
t_stat eth_set_async (ETH_DEV *dev, int latency)
|
||||||
{
|
{
|
||||||
#if !defined(USE_READER_THREAD) || !defined(SIM_ASYNCH_IO)
|
#if !defined(USE_READER_THREAD) || !defined(SIM_ASYNCH_IO)
|
||||||
char *msg = "Eth: can't operate asynchronously, must poll\n";
|
char *msg = "Eth: Can't operate asynchronously, must poll.\n"
|
||||||
|
" *** Build with USE_READER_THREAD defined and link with pthreads for asynchronous operation. ***\n";
|
||||||
return sim_messagef (SCPE_NOFNC, "%s", msg);
|
return sim_messagef (SCPE_NOFNC, "%s", msg);
|
||||||
#else
|
#else
|
||||||
int wakeup_needed;
|
int wakeup_needed;
|
||||||
@@ -2070,13 +2070,14 @@ if (0 == strncmp("tap:", savname, 4)) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*fd_handle = (SOCKET)tun;
|
*fd_handle = (SOCKET)tun;
|
||||||
strcpy(savname, devname);
|
memmove(savname, devname, strlen(devname) + 1);
|
||||||
}
|
}
|
||||||
#if defined (__APPLE__)
|
#if defined (__APPLE__)
|
||||||
if (1) {
|
if (tun >= 0) { /* Good so far? */
|
||||||
struct ifreq ifr;
|
struct ifreq ifr;
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
|
/* Now make sure the interface is up */
|
||||||
memset (&ifr, 0, sizeof(ifr));
|
memset (&ifr, 0, sizeof(ifr));
|
||||||
ifr.ifr_addr.sa_family = AF_INET;
|
ifr.ifr_addr.sa_family = AF_INET;
|
||||||
strlcpy(ifr.ifr_name, savname, sizeof(ifr.ifr_name));
|
strlcpy(ifr.ifr_name, savname, sizeof(ifr.ifr_name));
|
||||||
@@ -2474,13 +2475,20 @@ return SCPE_OK;
|
|||||||
const char *eth_version (void)
|
const char *eth_version (void)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_PCAP_NETWORK)
|
#if defined(HAVE_PCAP_NETWORK)
|
||||||
static char version[256];
|
static char version[300];
|
||||||
|
|
||||||
if (!version[0]) {
|
if (!version[0]) {
|
||||||
if (memcmp(pcap_lib_version(), "Npcap", 5))
|
strlcpy(version, pcap_lib_version(), sizeof(version));
|
||||||
strlcpy(version, pcap_lib_version(), sizeof(version));
|
if (memcmp(pcap_lib_version(), "Npcap", 5) == 0) {
|
||||||
else
|
char maj_min[CBUFSIZE];
|
||||||
snprintf(version, sizeof(version), "Unsupported - %s", pcap_lib_version());
|
char *c = version;
|
||||||
|
|
||||||
|
while (*c && !isdigit (*c))
|
||||||
|
++c;
|
||||||
|
get_glyph (c, maj_min, ',');
|
||||||
|
if (strcmp ("0.9990", maj_min) < 0)
|
||||||
|
snprintf(version, sizeof(version), "Unsupported - %s", pcap_lib_version());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return version;
|
return version;
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -381,7 +381,7 @@ t_stat ethq_destroy(ETH_QUE* que); /* release FIFO queue */
|
|||||||
const char *eth_capabilities(void);
|
const char *eth_capabilities(void);
|
||||||
t_stat sim_ether_test (DEVICE *dptr); /* unit test routine */
|
t_stat sim_ether_test (DEVICE *dptr); /* unit test routine */
|
||||||
|
|
||||||
#if !defined(SIM_TEST_INIT) /* Need stubs for test APIs */
|
#if !defined(SIM_TEST_INIT) /* Need stubs for test APIs */
|
||||||
#define SIM_TEST_INIT
|
#define SIM_TEST_INIT
|
||||||
#define SIM_TEST(xxx)
|
#define SIM_TEST(xxx)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
31
sim_sock.c
31
sim_sock.c
@@ -1,6 +1,6 @@
|
|||||||
/* sim_sock.c: OS-dependent socket routines
|
/* sim_sock.c: OS-dependent socket routines
|
||||||
|
|
||||||
Copyright (c) 2001-2019, Robert M Supnik
|
Copyright (c) 2001-2010, Robert M Supnik
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -23,7 +23,6 @@
|
|||||||
used in advertising or otherwise to promote the sale, use or other dealings
|
used in advertising or otherwise to promote the sale, use or other dealings
|
||||||
in this Software without prior written authorization from Robert M Supnik.
|
in this Software without prior written authorization from Robert M Supnik.
|
||||||
|
|
||||||
22-Nov-19 MP Latest 4.X changes
|
|
||||||
15-Oct-12 MP Added definitions needed to detect possible tcp
|
15-Oct-12 MP Added definitions needed to detect possible tcp
|
||||||
connect failures
|
connect failures
|
||||||
25-Sep-12 MP Reworked for RFC3493 interfaces supporting IPv6 and IPv4
|
25-Sep-12 MP Reworked for RFC3493 interfaces supporting IPv6 and IPv4
|
||||||
@@ -263,6 +262,7 @@ if (service) {
|
|||||||
char *c;
|
char *c;
|
||||||
|
|
||||||
port = strtoul(service, &c, 10);
|
port = strtoul(service, &c, 10);
|
||||||
|
port = htons((unsigned short)port);
|
||||||
if ((port == 0) || (*c != '\0')) {
|
if ((port == 0) || (*c != '\0')) {
|
||||||
switch (hints->ai_socktype)
|
switch (hints->ai_socktype)
|
||||||
{
|
{
|
||||||
@@ -432,6 +432,10 @@ return 0;
|
|||||||
#if !defined(IPV6_V6ONLY) /* Older XP environments may not define IPV6_V6ONLY */
|
#if !defined(IPV6_V6ONLY) /* Older XP environments may not define IPV6_V6ONLY */
|
||||||
#define IPV6_V6ONLY 27 /* Treat wildcard bind as AF_INET6-only. */
|
#define IPV6_V6ONLY 27 /* Treat wildcard bind as AF_INET6-only. */
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(TEST_INFO_STUBS)
|
||||||
|
#undef IPV6_V6ONLY
|
||||||
|
#undef AF_INET6
|
||||||
|
#endif
|
||||||
/* Dynamic DLL load variables */
|
/* Dynamic DLL load variables */
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static HINSTANCE hLib = 0; /* handle to DLL */
|
static HINSTANCE hLib = 0; /* handle to DLL */
|
||||||
@@ -684,7 +688,7 @@ return 0;
|
|||||||
port = pointer to buffer for IP port (may be NULL), 0 = none
|
port = pointer to buffer for IP port (may be NULL), 0 = none
|
||||||
localport
|
localport
|
||||||
= pointer to buffer for local IP port (may be NULL), 0 = none
|
= pointer to buffer for local IP port (may be NULL), 0 = none
|
||||||
result = status (SCPE_OK on complete success or SCPE_ARG if
|
result = status (0 on complete success or -1 if
|
||||||
parsing can't happen due to bad syntax, a value is
|
parsing can't happen due to bad syntax, a value is
|
||||||
out of range, a result can't fit into a result buffer,
|
out of range, a result can't fit into a result buffer,
|
||||||
a service name doesn't exist, or a validation name
|
a service name doesn't exist, or a validation name
|
||||||
@@ -739,6 +743,12 @@ load_ws2 ();
|
|||||||
#if defined (SIGPIPE)
|
#if defined (SIGPIPE)
|
||||||
signal (SIGPIPE, SIG_IGN); /* no pipe signals */
|
signal (SIGPIPE, SIG_IGN); /* no pipe signals */
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(TEST_INFO_STUBS)
|
||||||
|
/* force use of stubs */
|
||||||
|
p_getaddrinfo = (getaddrinfo_func)s_getaddrinfo;
|
||||||
|
p_getnameinfo = (getnameinfo_func)s_getnameinfo;
|
||||||
|
p_freeaddrinfo = (freeaddrinfo_func)s_freeaddrinfo;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void sim_cleanup_sock (void)
|
void sim_cleanup_sock (void)
|
||||||
@@ -918,7 +928,7 @@ if (sta == SOCKET_ERROR) /* bind error? */
|
|||||||
if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) {
|
if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) {
|
||||||
sta = sim_setnonblock (newsock); /* set nonblocking */
|
sta = sim_setnonblock (newsock); /* set nonblocking */
|
||||||
if (sta == SOCKET_ERROR) /* fcntl error? */
|
if (sta == SOCKET_ERROR) /* fcntl error? */
|
||||||
return sim_err_sock (newsock, "fcntl");
|
return sim_err_sock (newsock, "setnonblock");
|
||||||
}
|
}
|
||||||
sta = listen (newsock, 1); /* listen on socket */
|
sta = listen (newsock, 1); /* listen on socket */
|
||||||
if (sta == SOCKET_ERROR) /* listen error? */
|
if (sta == SOCKET_ERROR) /* listen error? */
|
||||||
@@ -990,7 +1000,7 @@ if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) {
|
|||||||
sta = sim_setnonblock (newsock); /* set nonblocking */
|
sta = sim_setnonblock (newsock); /* set nonblocking */
|
||||||
if (sta == SOCKET_ERROR) { /* fcntl error? */
|
if (sta == SOCKET_ERROR) { /* fcntl error? */
|
||||||
p_freeaddrinfo (result);
|
p_freeaddrinfo (result);
|
||||||
return sim_err_sock (newsock, "fcntl");
|
return sim_err_sock (newsock, "setnonblock");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((!(opt_flags & SIM_SOCK_OPT_DATAGRAM)) && (opt_flags & SIM_SOCK_OPT_NODELAY)) {
|
if ((!(opt_flags & SIM_SOCK_OPT_DATAGRAM)) && (opt_flags & SIM_SOCK_OPT_NODELAY)) {
|
||||||
@@ -1064,20 +1074,16 @@ if (newsock == INVALID_SOCKET) { /* error? */
|
|||||||
}
|
}
|
||||||
if (connectaddr != NULL) {
|
if (connectaddr != NULL) {
|
||||||
*connectaddr = (char *)calloc(1, NI_MAXHOST+1);
|
*connectaddr = (char *)calloc(1, NI_MAXHOST+1);
|
||||||
#ifdef AF_INET6
|
|
||||||
p_getnameinfo((struct sockaddr *)&clientname, size, *connectaddr, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
|
p_getnameinfo((struct sockaddr *)&clientname, size, *connectaddr, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
|
||||||
if (0 == memcmp("::ffff:", *connectaddr, 7)) /* is this a IPv4-mapped IPv6 address? */
|
if (0 == memcmp("::ffff:", *connectaddr, 7)) /* is this a IPv4-mapped IPv6 address? */
|
||||||
memmove(*connectaddr, 7+*connectaddr, /* prefer bare IPv4 address */
|
memmove(*connectaddr, 7+*connectaddr, /* prefer bare IPv4 address */
|
||||||
strlen(*connectaddr) - 7 + 1); /* length to include terminating \0 */
|
strlen(*connectaddr) - 7 + 1); /* length to include terminating \0 */
|
||||||
#else
|
|
||||||
strcpy(*connectaddr, inet_ntoa(((struct sockaddr_in *)&connectaddr)->s_addr));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) {
|
if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) {
|
||||||
sta = sim_setnonblock (newsock); /* set nonblocking */
|
sta = sim_setnonblock (newsock); /* set nonblocking */
|
||||||
if (sta == SOCKET_ERROR) /* fcntl error? */
|
if (sta == SOCKET_ERROR) /* fcntl error? */
|
||||||
return sim_err_sock (newsock, "fcntl");
|
return sim_err_sock (newsock, "setnonblock");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((opt_flags & SIM_SOCK_OPT_NODELAY)) {
|
if ((opt_flags & SIM_SOCK_OPT_NODELAY)) {
|
||||||
@@ -1152,7 +1158,6 @@ size_t size = addrsize;
|
|||||||
#endif
|
#endif
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
#ifdef AF_INET6
|
|
||||||
*hostnamebuf = '\0';
|
*hostnamebuf = '\0';
|
||||||
*portnamebuf = '\0';
|
*portnamebuf = '\0';
|
||||||
ret = p_getnameinfo(addr, size, hostnamebuf, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
|
ret = p_getnameinfo(addr, size, hostnamebuf, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
|
||||||
@@ -1161,10 +1166,6 @@ if (0 == memcmp("::ffff:", hostnamebuf, 7)) /* is this a IPv4-mapped IPv6
|
|||||||
strlen(hostnamebuf) + 7 - 1); /* length to include terminating \0 */
|
strlen(hostnamebuf) + 7 - 1); /* length to include terminating \0 */
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = p_getnameinfo(addr, size, NULL, 0, portnamebuf, NI_MAXSERV, NI_NUMERICSERV);
|
ret = p_getnameinfo(addr, size, NULL, 0, portnamebuf, NI_MAXSERV, NI_NUMERICSERV);
|
||||||
#else
|
|
||||||
strcpy(hostnamebuf, inet_ntoa(((struct sockaddr_in *)addr)->s_addr));
|
|
||||||
sprintf(portnamebuf, "%d", (int)ntohs(((struct sockaddr_in *)addr)->s_port)));
|
|
||||||
#endif
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,8 +90,10 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#define WSAEACCES EACCES
|
#define WSAEACCES EACCES
|
||||||
#define WSAEINTR EINTR
|
#define WSAEINTR EINTR
|
||||||
#define INVALID_SOCKET ((SOCKET)-1)
|
#define INVALID_SOCKET ((SOCKET)-1)
|
||||||
#define SOCKET_ERROR -1
|
#if !defined(SOCKET_ERROR)
|
||||||
|
#define SOCKET_ERROR (-1)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (VMS) /* VMS unique */
|
#if defined (VMS) /* VMS unique */
|
||||||
@@ -118,7 +120,7 @@ int sim_parse_addr_ex (const char *cptr, char *host, size_t hostlen, const char
|
|||||||
SOCKET sim_master_sock_ex (const char *hostport, int *parse_status, int opt_flags);
|
SOCKET sim_master_sock_ex (const char *hostport, int *parse_status, int opt_flags);
|
||||||
#define sim_master_sock(hostport, parse_status) sim_master_sock_ex(hostport, parse_status, ((sim_switches & SWMASK ('U')) ? SIM_SOCK_OPT_REUSEADDR : 0))
|
#define sim_master_sock(hostport, parse_status) sim_master_sock_ex(hostport, parse_status, ((sim_switches & SWMASK ('U')) ? SIM_SOCK_OPT_REUSEADDR : 0))
|
||||||
SOCKET sim_connect_sock_ex (const char *sourcehostport, const char *hostport, const char *default_host, const char *default_port, int opt_flags);
|
SOCKET sim_connect_sock_ex (const char *sourcehostport, const char *hostport, const char *default_host, const char *default_port, int opt_flags);
|
||||||
#define sim_connect_sock(hostport, default_host, default_port) sim_connect_sock_ex(NULL, hostport, default_host, default_port, 0)
|
#define sim_connect_sock(hostport, default_host, default_port) sim_connect_sock_ex(NULL, hostport, default_host, default_port, SIM_SOCK_OPT_BLOCKING)
|
||||||
SOCKET sim_accept_conn_ex (SOCKET master, char **connectaddr, int opt_flags);
|
SOCKET sim_accept_conn_ex (SOCKET master, char **connectaddr, int opt_flags);
|
||||||
#define sim_accept_conn(master, connectaddr) sim_accept_conn_ex(master, connectaddr, 0)
|
#define sim_accept_conn(master, connectaddr) sim_accept_conn_ex(master, connectaddr, 0)
|
||||||
int sim_check_conn (SOCKET sock, int rd);
|
int sim_check_conn (SOCKET sock, int rd);
|
||||||
|
|||||||
Reference in New Issue
Block a user