Changeset 599 for trunk/server/source3/lib/util_sock.c
- Timestamp:
- Jul 6, 2011, 8:21:13 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server/source3/lib/util_sock.c
r593 r599 1846 1846 1847 1847 /************************************************************ 1848 Is this my ip address ? 1849 ************************************************************/ 1850 1851 static 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 /************************************************************ 1848 1882 Is this my name ? 1849 1883 ************************************************************/ … … 1852 1886 { 1853 1887 TALLOC_CTX *ctx = talloc_tos(); 1854 char addr[INET6_ADDRSTRLEN];1855 1888 char *name = NULL; 1856 1889 const char *dnsname; … … 1900 1933 } 1901 1934 1902 /* Handle possible CNAME records - convert to an IP addr. */1935 /* Handle possible CNAME records - convert to an IP addr. list. */ 1903 1936 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); 1907 1953 print_sockaddr(addr, 1908 1954 sizeof(addr), 1909 1955 &ss); 1910 servername = addr; 1911 } 1956 if (is_my_ipaddr(addr)) { 1957 freeaddrinfo(res); 1958 return true; 1959 } 1960 } 1961 freeaddrinfo(res); 1912 1962 } 1913 1963 1914 1964 /* Maybe its an IP address? */ 1915 1965 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); 1941 1967 } 1942 1968
Note:
See TracChangeset
for help on using the changeset viewer.