Ignore:
Timestamp:
Jul 6, 2011, 8:21:13 PM (14 years ago)
Author:
Herwig Bauernfeind
Message:

Samba 3.5: Update trunk to 3.5.9

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server/source3/lib/util_sock.c

    r593 r599  
    18461846
    18471847/************************************************************
     1848 Is this my ip address ?
     1849************************************************************/
     1850
     1851static bool is_my_ipaddr(const char *ipaddr_str)
     1852{
     1853        struct sockaddr_storage ss;
     1854        struct iface_struct *nics;
     1855        int i, n;
     1856
     1857        if (!interpret_string_addr(&ss, ipaddr_str, AI_NUMERICHOST)) {
     1858                return false;
     1859        }
     1860
     1861        if (ismyaddr((struct sockaddr *)&ss)) {
     1862                return true;
     1863        }
     1864
     1865        if (is_zero_addr((struct sockaddr *)&ss) ||
     1866                is_loopback_addr((struct sockaddr *)&ss)) {
     1867                return false;
     1868        }
     1869
     1870        n = get_interfaces(talloc_tos(), &nics);
     1871        for (i=0; i<n; i++) {
     1872                if (sockaddr_equal((struct sockaddr *)&nics[i].ip, (struct sockaddr *)&ss)) {
     1873                        TALLOC_FREE(nics);
     1874                        return true;
     1875                }
     1876        }
     1877        TALLOC_FREE(nics);
     1878        return false;
     1879}
     1880
     1881/************************************************************
    18481882 Is this my name ?
    18491883************************************************************/
     
    18521886{
    18531887        TALLOC_CTX *ctx = talloc_tos();
    1854         char addr[INET6_ADDRSTRLEN];
    18551888        char *name = NULL;
    18561889        const char *dnsname;
     
    19001933        }
    19011934
    1902         /* Handle possible CNAME records - convert to an IP addr. */
     1935        /* Handle possible CNAME records - convert to an IP addr. list. */
    19031936        if (!is_ipaddress(servername)) {
    1904                 /* Use DNS to resolve the name, but only the first address */
    1905                 struct sockaddr_storage ss;
    1906                 if (interpret_string_addr(&ss, servername, 0)) {
     1937                /* Use DNS to resolve the name, check all addresses. */
     1938                struct addrinfo *p = NULL;
     1939                struct addrinfo *res = NULL;
     1940
     1941                if (!interpret_string_addr_internal(&res,
     1942                                servername,
     1943                                AI_ADDRCONFIG)) {
     1944                        return false;
     1945                }
     1946
     1947                for (p = res; p; p = p->ai_next) {
     1948                        char addr[INET6_ADDRSTRLEN];
     1949                        struct sockaddr_storage ss;
     1950
     1951                        ZERO_STRUCT(ss);
     1952                        memcpy(&ss, p->ai_addr, p->ai_addrlen);
    19071953                        print_sockaddr(addr,
    19081954                                        sizeof(addr),
    19091955                                        &ss);
    1910                         servername = addr;
    1911                 }
     1956                        if (is_my_ipaddr(addr)) {
     1957                                freeaddrinfo(res);
     1958                                return true;
     1959                        }
     1960                }
     1961                freeaddrinfo(res);
    19121962        }
    19131963
    19141964        /* Maybe its an IP address? */
    19151965        if (is_ipaddress(servername)) {
    1916                 struct sockaddr_storage ss;
    1917                 struct iface_struct *nics;
    1918                 int i, n;
    1919 
    1920                 if (!interpret_string_addr(&ss, servername, AI_NUMERICHOST)) {
    1921                         return false;
    1922                 }
    1923 
    1924                 if (ismyaddr((struct sockaddr *)&ss)) {
    1925                         return true;
    1926                 }
    1927 
    1928                 if (is_zero_addr((struct sockaddr *)&ss) ||
    1929                         is_loopback_addr((struct sockaddr *)&ss)) {
    1930                         return false;
    1931                 }
    1932 
    1933                 n = get_interfaces(talloc_tos(), &nics);
    1934                 for (i=0; i<n; i++) {
    1935                         if (sockaddr_equal((struct sockaddr *)&nics[i].ip, (struct sockaddr *)&ss)) {
    1936                                 TALLOC_FREE(nics);
    1937                                 return true;
    1938                         }
    1939                 }
    1940                 TALLOC_FREE(nics);
     1966                return is_my_ipaddr(servername);
    19411967        }
    19421968
Note: See TracChangeset for help on using the changeset viewer.