mirror of
https://github.com/simh/simh.git
synced 2026-01-25 19:56:25 +00:00
Revised the socket library sim_sock(.c & .h) to support both IPv4 and IPv6 leveraging the RFC3493 APIs.
All dependent code has been updated to use the revised interfaces.
This commit is contained in:
@@ -570,56 +570,56 @@ return SCPE_OK;
|
||||
t_stat ipl_attach (UNIT *uptr, char *cptr)
|
||||
{
|
||||
SOCKET newsock;
|
||||
uint32 i, t, ipa, ipp, oldf;
|
||||
char *tptr;
|
||||
uint32 i, t, oldf;
|
||||
char host[CBUFSIZE], port[CBUFSIZE], hostport[2*CBUFSIZE+3];
|
||||
char *tptr = NULL;
|
||||
t_stat r;
|
||||
|
||||
r = get_ipaddr (cptr, &ipa, &ipp);
|
||||
if ((r != SCPE_OK) || (ipp == 0))
|
||||
return SCPE_ARG;
|
||||
oldf = uptr->flags;
|
||||
if (oldf & UNIT_ATT)
|
||||
ipl_detach (uptr);
|
||||
if ((sim_switches & SWMASK ('C')) ||
|
||||
((sim_switches & SIM_SW_REST) && (oldf & UNIT_ACTV))) {
|
||||
if (ipa == 0)
|
||||
ipa = 0x7F000001;
|
||||
newsock = sim_connect_sock (ipa, ipp);
|
||||
r = sim_parse_addr (cptr, host, sizeof(host), "localhost", port, sizeof(port), NULL);
|
||||
if ((r != SCPE_OK) || (port[0] == '\0'))
|
||||
return SCPE_ARG;
|
||||
sprintf(hostport, "%s%s%s%s%s", strchr(host, ':') ? "[" : "", host, strchr(host, ':') ? "]" : "", host[0] ? ":" : "", port);
|
||||
newsock = sim_connect_sock (hostport, NULL, NULL);
|
||||
if (newsock == INVALID_SOCKET)
|
||||
return SCPE_IOERR;
|
||||
printf ("Connecting to IP address %d.%d.%d.%d, port %d\n",
|
||||
(ipa >> 24) & 0xff, (ipa >> 16) & 0xff,
|
||||
(ipa >> 8) & 0xff, ipa & 0xff, ipp);
|
||||
printf ("Connecting to %s\n", hostport);
|
||||
if (sim_log)
|
||||
fprintf (sim_log,
|
||||
"Connecting to IP address %d.%d.%d.%d, port %d\n",
|
||||
(ipa >> 24) & 0xff, (ipa >> 16) & 0xff,
|
||||
(ipa >> 8) & 0xff, ipa & 0xff, ipp);
|
||||
"Connecting to %s\n", hostport);
|
||||
uptr->flags = uptr->flags | UNIT_ACTV;
|
||||
uptr->LSOCKET = 0;
|
||||
uptr->DSOCKET = newsock;
|
||||
}
|
||||
else {
|
||||
if (ipa != 0)
|
||||
r = sim_parse_addr (cptr, host, sizeof(host), NULL, port, sizeof(port), NULL);
|
||||
if (r != SCPE_OK)
|
||||
return SCPE_ARG;
|
||||
newsock = sim_master_sock (ipp);
|
||||
sprintf(hostport, "%s%s%s%s%s", strchr(host, ':') ? "[" : "", host, strchr(host, ':') ? "]" : "", host[0] ? ":" : "", port);
|
||||
newsock = sim_master_sock (hostport, &r);
|
||||
if (r != SCPE_OK)
|
||||
return r;
|
||||
if (newsock == INVALID_SOCKET)
|
||||
return SCPE_IOERR;
|
||||
printf ("Listening on port %d\n", ipp);
|
||||
printf ("Listening on port %s\n", hostport);
|
||||
if (sim_log)
|
||||
fprintf (sim_log, "Listening on port %d\n", ipp);
|
||||
fprintf (sim_log, "Listening on port %s\n", hostport);
|
||||
uptr->flags = uptr->flags & ~UNIT_ACTV;
|
||||
uptr->LSOCKET = newsock;
|
||||
uptr->DSOCKET = 0;
|
||||
}
|
||||
uptr->IBUF = uptr->OBUF = 0;
|
||||
uptr->flags = (uptr->flags | UNIT_ATT) & ~(UNIT_ESTB | UNIT_HOLD);
|
||||
tptr = (char *) malloc (strlen (cptr) + 1); /* get string buf */
|
||||
tptr = (char *) malloc (strlen (hostport) + 1); /* get string buf */
|
||||
if (tptr == NULL) { /* no memory? */
|
||||
ipl_detach (uptr); /* close sockets */
|
||||
return SCPE_MEM;
|
||||
}
|
||||
strcpy (tptr, cptr); /* copy ipaddr:port */
|
||||
strcpy (tptr, hostport); /* copy ipaddr:port */
|
||||
uptr->filename = tptr; /* save */
|
||||
sim_activate (uptr, POLL_FIRST); /* activate first poll "immediately" */
|
||||
if (sim_switches & SWMASK ('W')) { /* wait? */
|
||||
|
||||
Reference in New Issue
Block a user