]> git.meshlink.io Git - catta/blob - libavahi-core/address.c
e5f8866822f250606055074c3b3c40467cef2d5b
[catta] / libavahi-core / address.c
1 #include <sys/types.h>
2 #include <sys/socket.h>
3 #include <arpa/inet.h>
4 #include <string.h>
5
6 #include "address.h"
7
8 guint avahi_address_get_size(const AvahiAddress *a) {
9     g_assert(a);
10
11     if (a->family == AF_INET)
12         return 4;
13     else if (a->family == AF_INET6)
14         return 16;
15
16     return 0;
17 }
18
19 gint avahi_address_cmp(const AvahiAddress *a, const AvahiAddress *b) {
20     g_assert(a);
21     g_assert(b);
22     
23     if (a->family != b->family)
24         return -1;
25
26     return memcmp(a->data.data, b->data.data, avahi_address_get_size(a));
27 }
28
29 gchar *avahi_address_snprint(char *s, guint length, const AvahiAddress *a) {
30     g_assert(s);
31     g_assert(length);
32     g_assert(a);
33     return (gchar*) inet_ntop(a->family, a->data.data, s, length);
34 }
35
36 gchar* avahi_reverse_lookup_name_ipv4(const AvahiIPv4Address *a) {
37     guint32 n = ntohl(a->address);
38     g_assert(a);
39
40     return g_strdup_printf("%u.%u.%u.%u.in-addr.arpa", n & 0xFF, (n >> 8) & 0xFF, (n >> 16) & 0xFF, n >> 24);
41 }
42
43 static gchar *reverse_lookup_name_ipv6(const AvahiIPv6Address *a, const gchar *suffix) {
44     
45     return g_strdup_printf("%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%s",
46                            a->address[15] & 0xF,
47                            a->address[15] >> 4,
48                            a->address[14] & 0xF,
49                            a->address[14] >> 4,
50                            a->address[13] & 0xF,
51                            a->address[13] >> 4,
52                            a->address[12] & 0xF,
53                            a->address[12] >> 4,
54                            a->address[11] & 0xF,
55                            a->address[11] >> 4,
56                            a->address[10] & 0xF,
57                            a->address[10] >> 4,
58                            a->address[9] & 0xF,
59                            a->address[9] >> 4,
60                            a->address[8] & 0xF,
61                            a->address[8] >> 4,
62                            a->address[7] & 0xF,
63                            a->address[7] >> 4,
64                            a->address[6] & 0xF,
65                            a->address[6] >> 4,
66                            a->address[5] & 0xF,
67                            a->address[5] >> 4,
68                            a->address[4] & 0xF,
69                            a->address[4] >> 4,
70                            a->address[3] & 0xF,
71                            a->address[3] >> 4,
72                            a->address[2] & 0xF,
73                            a->address[2] >> 4,
74                            a->address[1] & 0xF,
75                            a->address[1] >> 4,
76                            a->address[0] & 0xF,
77                            a->address[0] >> 4,
78                            suffix);
79 }
80
81 gchar *avahi_reverse_lookup_name_ipv6_arpa(const AvahiIPv6Address *a) {
82     return reverse_lookup_name_ipv6(a, "ip6.arpa");
83 }
84
85 gchar *avahi_reverse_lookup_name_ipv6_int(const AvahiIPv6Address *a) {
86     return reverse_lookup_name_ipv6(a, "ip6.int");
87 }
88
89 AvahiAddress *avahi_address_parse(const char *s, guchar family, AvahiAddress *ret_addr) {
90     g_assert(ret_addr);
91     g_assert(s);
92
93     if (inet_pton(family, s, ret_addr->data.data) < 0)
94         return NULL;
95
96     ret_addr->family = family;
97     
98     return ret_addr;
99 }
100
101 AvahiAddress *avahi_address_from_sockaddr(const struct sockaddr* sa, AvahiAddress *ret_addr) {
102     g_assert(sa);
103     g_assert(ret_addr);
104
105     g_assert(sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
106
107     ret_addr->family = sa->sa_family;
108
109     if (sa->sa_family == AF_INET)
110         memcpy(&ret_addr->data.ipv4, &((struct sockaddr_in*) sa)->sin_addr, sizeof(ret_addr->data.ipv4));
111     else
112         memcpy(&ret_addr->data.ipv6, &((struct sockaddr_in6*) sa)->sin6_addr, sizeof(ret_addr->data.ipv6));
113
114     return ret_addr;
115 }
116
117 guint16 avahi_port_from_sockaddr(const struct sockaddr* sa) {
118     g_assert(sa);
119
120     g_assert(sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
121
122     if (sa->sa_family == AF_INET)
123         return ntohs(((struct sockaddr_in*) sa)->sin_port);
124     else
125         return ntohs(((struct sockaddr_in6*) sa)->sin6_port);
126 }