[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