[Vm-dev] [commit][3485] update resolver local address discovery;
it seem gethostbyaddr has been compromised by OS changes recently.
Eliot Miranda
eliot.miranda at gmail.com
Wed Nov 11 16:03:51 UTC 2015
Hi Tim,
it strikes me that the list of ethernet device names should be override able via an environment variable, SQUEAK_NET_INTERFACES, for example.
_,,,^..^,,,_ (phone)
> On Nov 5, 2015, at 12:53 PM, commits at squeakvm.org wrote:
>
>
> Revision: 3485
> Author: rowledge
> Date: 2015-11-05 12:53:44 -0800 (Thu, 05 Nov 2015)
> Log Message:
> -----------
> update resolver local address discovery; it seem gethostbyaddr has been compromised by OS changes recently. Change to using ifgetaddrs and scanning for eth0 or wlan0 addresses, which looks like a good change on Raspbian at least.
>
> Modified Paths:
> --------------
> branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c
>
> Modified: branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c
> ===================================================================
> --- branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c 2015-11-05 18:16:38 UTC (rev 3484)
> +++ branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c 2015-11-05 20:53:44 UTC (rev 3485)
> @@ -83,6 +83,7 @@
> # include <netinet/tcp.h>
> # include <arpa/inet.h>
> # include <netdb.h>
> +#include <ifaddrs.h>
> # include <errno.h>
> # include <unistd.h>
>
> @@ -1504,11 +1505,55 @@
> sqInt sqResolverAddrLookupResultSize(void) { return strlen(lastName); }
> sqInt sqResolverError(void) { return lastError; }
> sqInt sqResolverLocalAddress(void)
> +#if 0
> +/* old code */
> { sqInt localaddr = nameToAddr(localHostName);
> if (!localaddr)
> localaddr = nameToAddr("localhost");
> return localaddr;
> }
> +#else
> +/* experimental new code */
> +{
> + struct ifaddrs *ifaddr, *ifa;
> + int family, s;
> + char host[NI_MAXHOST];
> + sqInt localAddr = 0;
> +
> + if (getifaddrs(&ifaddr) == -1) {
> + interpreterProxy->success(false);
> + return 0;
> + }
> +
> +
> + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
> + {
> + if (ifa->ifa_addr == NULL)
> + continue;
> +
> + s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
> +
> + if(((strcmp(ifa->ifa_name,"eth0")==0)||(strcmp(ifa->ifa_name,"wlan0")==0))&&(ifa->ifa_addr->sa_family==AF_INET))
> + {
> + if (s != 0)
> + {
> + interpreterProxy->success(false);
> + return 0;
> + }
> + FPRINTF((stderr, "\tInterface : <%s>\n",ifa->ifa_name ));
> + FPRINTF((stderr, "\t IP : <%s>\n", inet_ntoa(((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr)));
> + if(localAddr == 0) { /* take the first plausible answer */
> + localAddr = ((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr.s_addr;
> + }
> +
> + }
> + }
> +
> + freeifaddrs(ifaddr);
> + return ntohl(localAddr);
> +
> +}
> +#endif
> sqInt sqResolverNameLookupResult(void) { return lastAddr; }
>
> void sqResolverAddrLookupResult(char *nameForAddress, sqInt nameSize)
>
More information about the Vm-dev
mailing list