Problem with ctdb_sys_have_ip

Harald Klatte klatte at hrz.uni-kassel.de
Fri Aug 28 12:10:01 MDT 2009


On Sat, 29 Aug 2009, ronnie sahlberg wrote:

........
>
> Can you try adding this code  at this point :
> #ifdef HAVE_SOCK_SIN_LEN
> 	          addr->ip.sin_len = sizeof(addr->ip);
> #endif
>
.........

With a little hint from a friend we already solved the problem.

On some systems the addrlen parameter of bind() must be set to
the EXACT length of the source data type.

So the follwing works as it should:

bool ctdb_sys_have_ip(ctdb_sock_addr *_addr)
{
        int s;
        int addrlen;
        int ret;
        ctdb_sock_addr __addr = *_addr;
        ctdb_sock_addr *addr = &__addr;

        switch (addr->sa.sa_family) {
        case AF_INET:
                addr->ip.sin_port = 0;
                addrlen = sizeof(struct sockaddr_in);
                break;
        case AF_INET6:
                addr->ip6.sin6_port = 0;
                addrlen = sizeof(struct sockaddr_in6);
                break;
        }

        s = socket(addr->sa.sa_family, SOCK_STREAM, htons(IPPROTO_TCP));
        if (s == -1) {
                return false;
        }

        ret = bind(s, (struct sockaddr *)addr, addrlen);
        if (ret == -1) {
                DEBUG(DEBUG_DEBUG,(" failed to bind address to socket (%s)\n", strerror(errno) ));
                return false;
        }

        close(s);
        return ret == 0;
}


Please change the original code.


Thanks

Harald


-- 

+----------+  Harald Klatte                       email: klatte at hrz.uni-kassel.de
|Uni-Kassel|  ITS,  Universitaet Kassel                   Tel.: (49) 561/804-2280
+----------+  Moenchebergstr. 11, 34109 Kassel            Fax:  (49) 561/804-2297



More information about the samba-technical mailing list