diff options
author | Lennart Poettering <lennart@poettering.net> | 2005-10-13 01:26:32 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2005-10-13 01:26:32 +0000 |
commit | 0e203251414d56b3f6b8d4dafde19a1d27b18caf (patch) | |
tree | ff8e355063f6a97c18750d06378132fc63dcfd7a /avahi-compat-howl/address.c | |
parent | 32a03550ac3a6272595866fd40389b8ee3fad9e8 (diff) |
implement address related functions
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@753 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-compat-howl/address.c')
-rw-r--r-- | avahi-compat-howl/address.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/avahi-compat-howl/address.c b/avahi-compat-howl/address.c new file mode 100644 index 0000000..6f26d1a --- /dev/null +++ b/avahi-compat-howl/address.c @@ -0,0 +1,213 @@ +/* $Id$ */ + +/*** + This file is part of avahi. + + avahi is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + avahi is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General + Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with avahi; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <assert.h> +#include <netdb.h> +#include <unistd.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <sys/types.h> + +#include <howl.h> + +#include "warn.h" + +sw_ipv4_address sw_ipv4_address_any(void) { + sw_ipv4_address a; + + AVAHI_WARN_LINKAGE; + + a.m_addr = htonl(INADDR_ANY); + return a; +} + +sw_ipv4_address sw_ipv4_address_loopback(void) { + sw_ipv4_address a; + + AVAHI_WARN_LINKAGE; + + a.m_addr = htonl(INADDR_LOOPBACK); + return a; +} + +sw_result sw_ipv4_address_init(sw_ipv4_address * self) { + assert(self); + + AVAHI_WARN_LINKAGE; + + self->m_addr = htonl(INADDR_ANY); + return SW_OKAY; +} + +sw_result sw_ipv4_address_init_from_saddr( + sw_ipv4_address *self, + sw_saddr addr) { + + assert(self); + + AVAHI_WARN_LINKAGE; + + self->m_addr = addr; + return SW_OKAY; +} + +sw_result sw_ipv4_address_init_from_name( + sw_ipv4_address *self, + sw_const_string name) { + + struct hostent *he; + + assert(self); + assert(name); + + AVAHI_WARN_LINKAGE; + + if (!(he = gethostbyname(name))) + return SW_E_UNKNOWN; + + self->m_addr = *(uint32_t*) he->h_addr; + return SW_OKAY; +} + +sw_result sw_ipv4_address_init_from_address( + sw_ipv4_address *self, + sw_ipv4_address addr) { + + assert(self); + + AVAHI_WARN_LINKAGE; + + self->m_addr = addr.m_addr; + return SW_OKAY; +} + +sw_result sw_ipv4_address_init_from_this_host(sw_ipv4_address *self) { + struct sockaddr_in sa; + int fd; + socklen_t l = sizeof(sa); + + assert(self); + + AVAHI_WARN_LINKAGE; + + /* This is so fucked up ... */ + + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = inet_addr("192.168.1.1"); /* Ouch */ + sa.sin_port = htons(5555); + + if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0 || + connect(fd, (struct sockaddr*) &sa, sizeof(sa)) < 0 || + getsockname(fd, (struct sockaddr*) &sa, &l) < 0) { + if (fd >= 0) + close(fd); + + perror("fuck"); + return SW_E_UNKNOWN; + } + + assert(l == sizeof(sa)); + close(fd); + + self->m_addr = sa.sin_addr.s_addr; + + return SW_OKAY; +} + +sw_result sw_ipv4_address_fina(sw_ipv4_address self) { + + AVAHI_WARN_LINKAGE; + + /* This is ridiculous ... */ + + return SW_OKAY; +} + +sw_bool sw_ipv4_address_is_any(sw_ipv4_address self) { + AVAHI_WARN_LINKAGE; + return self.m_addr == htonl(INADDR_ANY); +} + +sw_saddr sw_ipv4_address_saddr(sw_ipv4_address self) { + AVAHI_WARN_LINKAGE; + return self.m_addr; +} + +sw_string sw_ipv4_address_name( + sw_ipv4_address self, + sw_string name, + sw_uint32 len) { + + assert(name); + assert(len > 0); + + AVAHI_WARN_LINKAGE; + + if (len < INET_ADDRSTRLEN) + return NULL; + + if (!(inet_ntop(AF_INET, &self.m_addr, name, len))) + return NULL; + + return name; +} + +sw_result sw_ipv4_address_decompose( + sw_ipv4_address self, + sw_uint8 * a1, + sw_uint8 * a2, + sw_uint8 * a3, + sw_uint8 * a4) { + + uint32_t a; + + AVAHI_WARN_LINKAGE; + + a = ntohl(self.m_addr); + + assert(a1); + assert(a2); + assert(a3); + assert(a4); + + *a1 = (uint8_t) (a >> 24); + *a2 = (uint8_t) (a >> 16); + *a3 = (uint8_t) (a >> 8); + *a4 = (uint8_t) (a); + + return SW_OKAY; +} + +sw_bool sw_ipv4_address_equals( + sw_ipv4_address self, + sw_ipv4_address addr) { + + AVAHI_WARN_LINKAGE; + + return self.m_addr == addr.m_addr; +} + |