From a6d7c5805f6f4996c700af6564ff252d0cf450ea Mon Sep 17 00:00:00 2001 From: Rob Swindell <rob@synchro.net> Date: Sun, 29 May 2022 18:52:12 -0700 Subject: [PATCH] Resolve the socket protocol/address family issues with IPv4 vs. IPv6 When listening, the address family cannot be PF_UNSPEC, so default to PF_INET (IPv4), when not specified. Not sure why we're setting ai_flags to PF_UNSPEC (copied from syncterm) - that's just 0, but otherwise the PF_ and AI_ flags are not compatible. Don't set the ai_flags to anything here since they don't seem to change the behavior. --- src/vdmodem/vdmodem.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/vdmodem/vdmodem.c b/src/vdmodem/vdmodem.c index 903343ac48..36edb74064 100644 --- a/src/vdmodem/vdmodem.c +++ b/src/vdmodem/vdmodem.c @@ -356,13 +356,18 @@ const char* protocol(enum mode mode) return "Raw"; } -int address_family() +int address_family(BOOL for_listen) { switch(cfg.address_family) { case ADDRESS_FAMILY_INET: return PF_INET; case ADDRESS_FAMILY_INET6: return PF_INET6; } - return PF_UNSPEC; + return for_listen ? PF_INET : PF_UNSPEC; +} + +int listen_address_family() +{ + return address_family(true); } int putcom(char* buf, size_t len) @@ -582,14 +587,9 @@ char* dial(struct modem* modem, const char* number) } dprintf("Connecting to port %hu at host '%s' via %s", port, host, protocol(mode)); memset(&hints, 0, sizeof(hints)); - hints.ai_flags=PF_UNSPEC; - hints.ai_family=address_family(); + hints.ai_family = address_family(/* for listen: */false); hints.ai_socktype=SOCK_STREAM; hints.ai_protocol=IPPROTO_TCP; - hints.ai_flags=AI_NUMERICSERV; -#ifdef AI_ADDRCONFIG - hints.ai_flags|=AI_ADDRCONFIG; -#endif dprintf("%s %d calling getaddrinfo", __FILE__, __LINE__); SAFEPRINTF(portnum, "%hu", port); int result = getaddrinfo(host, portnum, &hints, &res); @@ -1073,7 +1073,7 @@ int main(int argc, char** argv) cfg.listen = true; arg++; if(*arg != '\0') { - listening_interface.addr.sa_family = address_family(); + listening_interface.addr.sa_family = listen_address_family(); if(inet_ptoaddr(arg, &listening_interface, sizeof(listening_interface)) == NULL) { fprintf(stderr, "!Error parsing network address: %s", arg); return EXIT_FAILURE; @@ -1123,13 +1123,13 @@ int main(int argc, char** argv) if(sock != INVALID_SOCKET) listening_sock = sock; else { - listening_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP); + listening_sock = socket(listen_address_family(), SOCK_STREAM, IPPROTO_IP); if(listening_sock == INVALID_SOCKET) { fprintf(stderr, "Error %ld creating socket\n", WSAGetLastError()); return EXIT_FAILURE; } } - listening_interface.addr.sa_family = address_family(); + listening_interface.addr.sa_family = listen_address_family(); inet_setaddrport(&listening_interface, cfg.port); result = bind(listening_sock, &listening_interface.addr, xp_sockaddr_len(&listening_interface)); if(result != 0) { -- GitLab