Use shared util.c.
[samba.git] / lib / util / util_net.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Samba utility functions
4    Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008
5    Copyright (C) Andrew Tridgell 1992-1998
6    Copyright (C) Jeremy Allison 2001-2002
7    Copyright (C) Simo Sorce 2001
8    Copyright (C) Jim McDonough (jmcd@us.ibm.com)  2003.
9    Copyright (C) James J Myers 2003
10     
11    This program is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3 of the License, or
14    (at your option) any later version.
15    
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20    
21    You should have received a copy of the GNU General Public License
22    along with this program.  If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 #include "includes.h"
26
27 /**
28  Interpret an internet address or name into an IP address in 4 byte form.
29 **/
30 _PUBLIC_ uint32_t interpret_addr(const char *str)
31 {
32         struct hostent *hp;
33         uint32_t res;
34
35         if (str == NULL || *str == 0 ||
36             strcmp(str,"0.0.0.0") == 0) {
37                 return 0;
38         }
39         if (strcmp(str,"255.255.255.255") == 0) {
40                 return 0xFFFFFFFF;
41         }
42         /* recognise 'localhost' as a special name. This fixes problems with
43            some hosts that don't have localhost in /etc/hosts */
44         if (strcasecmp(str,"localhost") == 0) {
45                 str = "127.0.0.1";
46         }
47
48         /* if it's in the form of an IP address then get the lib to interpret it */
49         if (is_ipaddress(str)) {
50                 res = inet_addr(str);
51         } else {
52                 /* otherwise assume it's a network name of some sort and use 
53                         sys_gethostbyname */
54                 if ((hp = sys_gethostbyname(str)) == 0) {
55                         DEBUG(3,("sys_gethostbyname: Unknown host. %s\n",str));
56                         return 0;
57                 }
58
59                 if(hp->h_addr == NULL) {
60                         DEBUG(3,("sys_gethostbyname: host address is invalid for host %s\n",str));
61                         return 0;
62                 }
63                 memcpy((char *)&res,(char *)hp->h_addr, 4);
64         }
65
66         if (res == (uint32_t)-1)
67                 return(0);
68
69         return(res);
70 }
71
72 /**
73  A convenient addition to interpret_addr().
74 **/
75 _PUBLIC_ struct in_addr interpret_addr2(const char *str)
76 {
77         struct in_addr ret;
78         uint32_t a = interpret_addr(str);
79         ret.s_addr = a;
80         return ret;
81 }
82
83 /**
84  Check if an IP is the 0.0.0.0.
85 **/
86
87 _PUBLIC_ bool is_zero_ip(struct in_addr ip)
88 {
89         return ip.s_addr == 0;
90 }
91
92 /**
93  Are two IPs on the same subnet?
94 **/
95
96 _PUBLIC_ bool same_net(struct in_addr ip1, struct in_addr ip2, struct in_addr mask)
97 {
98         uint32_t net1,net2,nmask;
99
100         nmask = ntohl(mask.s_addr);
101         net1  = ntohl(ip1.s_addr);
102         net2  = ntohl(ip2.s_addr);
103             
104         return((net1 & nmask) == (net2 & nmask));
105 }
106
107 /**
108  Return true if a string could be a pure IP address.
109 **/
110
111 _PUBLIC_ bool is_ipaddress(const char *str)
112 {
113         bool pure_address = true;
114         int i;
115
116         if (str == NULL) return false;
117
118         for (i=0; pure_address && str[i]; i++)
119                 if (!(isdigit((int)str[i]) || str[i] == '.'))
120                         pure_address = false;
121
122         /* Check that a pure number is not misinterpreted as an IP */
123         pure_address = pure_address && (strchr(str, '.') != NULL);
124
125         return pure_address;
126 }
127
128