1 /*** 2 This file is part of avahi. 3 4 avahi is free software; you can redistribute it and/or modify it 5 under the terms of the GNU Lesser General Public License as 6 published by the Free Software Foundation; either version 2.1 of the 7 License, or (at your option) any later version. 8 9 avahi is distributed in the hope that it will be useful, but WITHOUT 10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 11 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 12 Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with avahi; if not, write to the Free Software 16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 17 USA. 18 ***/ 19 20 #ifdef HAVE_CONFIG_H 21 #include <config.h> 22 #endif 23 24 #include <assert.h> 25 #include <netdb.h> 26 #include <unistd.h> 27 #include <sys/socket.h> 28 #include <netinet/in.h> 29 #include <arpa/inet.h> 30 #include <sys/types.h> 31 32 #include <avahi-common/gccmacro.h> 33 34 #include "howl.h" 35 #include "warn.h" 36 37 sw_ipv4_address sw_ipv4_address_any(void) { 38 sw_ipv4_address a; 39 40 AVAHI_WARN_LINKAGE; 41 42 a.m_addr = htonl(INADDR_ANY); 43 return a; 44 } 45 46 sw_ipv4_address sw_ipv4_address_loopback(void) { 47 sw_ipv4_address a; 48 49 AVAHI_WARN_LINKAGE; 50 51 a.m_addr = htonl(INADDR_LOOPBACK); 52 return a; 53 } 54 55 sw_result sw_ipv4_address_init(sw_ipv4_address * self) { 56 assert(self); 57 58 AVAHI_WARN_LINKAGE; 59 60 self->m_addr = htonl(INADDR_ANY); 61 return SW_OKAY; 62 } 63 64 sw_result sw_ipv4_address_init_from_saddr( 65 sw_ipv4_address *self, 66 sw_saddr addr) { 67 68 assert(self); 69 70 AVAHI_WARN_LINKAGE; 71 72 self->m_addr = addr; 73 return SW_OKAY; 74 } 75 76 sw_result sw_ipv4_address_init_from_name( 77 sw_ipv4_address *self, 78 sw_const_string name) { 79 80 struct hostent *he; 81 82 assert(self); 83 assert(name); 84 85 AVAHI_WARN_LINKAGE; 86 87 if (!(he = gethostbyname(name))) 88 return SW_E_UNKNOWN; 89 90 self->m_addr = *(uint32_t*) he->h_addr; 91 return SW_OKAY; 92 } 93 94 sw_result sw_ipv4_address_init_from_address( 95 sw_ipv4_address *self, 96 sw_ipv4_address addr) { 97 98 assert(self); 99 100 AVAHI_WARN_LINKAGE; 101 102 self->m_addr = addr.m_addr; 103 return SW_OKAY; 104 } 105 106 sw_result sw_ipv4_address_init_from_this_host(sw_ipv4_address *self) { 107 struct sockaddr_in sa; 108 int fd; 109 socklen_t l = sizeof(sa); 110 111 assert(self); 112 113 AVAHI_WARN_LINKAGE; 114 115 /* This is so fucked up ... */ 116 117 memset(&sa, 0, sizeof(sa)); 118 sa.sin_family = AF_INET; 119 sa.sin_addr.s_addr = inet_addr("192.168.1.1"); /* Ouch */ 120 sa.sin_port = htons(5555); 121 122 if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0 || 123 connect(fd, (struct sockaddr*) &sa, sizeof(sa)) < 0 || 124 getsockname(fd, (struct sockaddr*) &sa, &l) < 0) { 125 if (fd >= 0) 126 close(fd); 127 128 perror("fuck"); 129 return SW_E_UNKNOWN; 130 } 131 132 assert(l == sizeof(sa)); 133 close(fd); 134 135 self->m_addr = sa.sin_addr.s_addr; 136 137 return SW_OKAY; 138 } 139 140 sw_result sw_ipv4_address_fina(AVAHI_GCC_UNUSED sw_ipv4_address self) { 141 142 AVAHI_WARN_LINKAGE; 143 144 /* This is ridiculous ... */ 145 146 return SW_OKAY; 147 } 148 149 sw_bool sw_ipv4_address_is_any(sw_ipv4_address self) { 150 AVAHI_WARN_LINKAGE; 151 return self.m_addr == htonl(INADDR_ANY); 152 } 153 154 sw_saddr sw_ipv4_address_saddr(sw_ipv4_address self) { 155 AVAHI_WARN_LINKAGE; 156 return self.m_addr; 157 } 158 159 sw_string sw_ipv4_address_name( 160 sw_ipv4_address self, 161 sw_string name, 162 sw_uint32 len) { 163 164 assert(name); 165 assert(len > 0); 166 167 AVAHI_WARN_LINKAGE; 168 169 if (len < INET_ADDRSTRLEN) 170 return NULL; 171 172 if (!(inet_ntop(AF_INET, &self.m_addr, name, len))) 173 return NULL; 174 175 return name; 176 } 177 178 sw_result sw_ipv4_address_decompose( 179 sw_ipv4_address self, 180 sw_uint8 * a1, 181 sw_uint8 * a2, 182 sw_uint8 * a3, 183 sw_uint8 * a4) { 184 185 uint32_t a; 186 187 AVAHI_WARN_LINKAGE; 188 189 a = ntohl(self.m_addr); 190 191 assert(a1); 192 assert(a2); 193 assert(a3); 194 assert(a4); 195 196 *a1 = (uint8_t) (a >> 24); 197 *a2 = (uint8_t) (a >> 16); 198 *a3 = (uint8_t) (a >> 8); 199 *a4 = (uint8_t) (a); 200 201 return SW_OKAY; 202 } 203 204 sw_bool sw_ipv4_address_equals( 205 sw_ipv4_address self, 206 sw_ipv4_address addr) { 207 208 AVAHI_WARN_LINKAGE; 209 210 return self.m_addr == addr.m_addr; 211 } 212 213