1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 * Authors: Christian Kellner <gicmo@gnome.org>
19 * Samuel Cormier-Iijima <sciyoshi@gmail.com>
28 #include "ginetaddress.h"
30 #include "gioenumtypes.h"
32 #include "gnetworkingprivate.h"
35 /* Ensure Windows XP runtime compatibility, while using
36 * inet_pton() and inet_ntop() if available
38 #include "gwin32networking.h"
41 struct _GInetAddressPrivate
51 * SECTION:ginetaddress
52 * @short_description: An IPv4/IPv6 address
55 * #GInetAddress represents an IPv4 or IPv6 internet address. Use
56 * g_resolver_lookup_by_name() or g_resolver_lookup_by_name_async() to
57 * look up the #GInetAddress for a hostname. Use
58 * g_resolver_lookup_by_address() or
59 * g_resolver_lookup_by_address_async() to look up the hostname for a
62 * To actually connect to a remote host, you will need a
63 * #GInetSocketAddress (which includes a #GInetAddress as well as a
70 * An IPv4 or IPv6 internet address.
73 G_DEFINE_TYPE_WITH_CODE (GInetAddress
, g_inet_address
, G_TYPE_OBJECT
,
74 G_ADD_PRIVATE (GInetAddress
)
75 g_networking_init ();)
88 PROP_IS_MC_LINK_LOCAL
,
89 PROP_IS_MC_NODE_LOCAL
,
91 PROP_IS_MC_SITE_LOCAL
,
95 g_inet_address_set_property (GObject
*object
,
100 GInetAddress
*address
= G_INET_ADDRESS (object
);
105 address
->priv
->family
= g_value_get_enum (value
);
109 memcpy (&address
->priv
->addr
, g_value_get_pointer (value
),
110 address
->priv
->family
== AF_INET
?
111 sizeof (address
->priv
->addr
.ipv4
) :
112 sizeof (address
->priv
->addr
.ipv6
));
116 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
123 g_inet_address_get_property (GObject
*object
,
128 GInetAddress
*address
= G_INET_ADDRESS (object
);
133 g_value_set_enum (value
, address
->priv
->family
);
137 g_value_set_pointer (value
, &address
->priv
->addr
);
141 g_value_set_boolean (value
, g_inet_address_get_is_any (address
));
144 case PROP_IS_LOOPBACK
:
145 g_value_set_boolean (value
, g_inet_address_get_is_loopback (address
));
148 case PROP_IS_LINK_LOCAL
:
149 g_value_set_boolean (value
, g_inet_address_get_is_link_local (address
));
152 case PROP_IS_SITE_LOCAL
:
153 g_value_set_boolean (value
, g_inet_address_get_is_site_local (address
));
156 case PROP_IS_MULTICAST
:
157 g_value_set_boolean (value
, g_inet_address_get_is_multicast (address
));
160 case PROP_IS_MC_GLOBAL
:
161 g_value_set_boolean (value
, g_inet_address_get_is_mc_global (address
));
164 case PROP_IS_MC_LINK_LOCAL
:
165 g_value_set_boolean (value
, g_inet_address_get_is_mc_link_local (address
));
168 case PROP_IS_MC_NODE_LOCAL
:
169 g_value_set_boolean (value
, g_inet_address_get_is_mc_node_local (address
));
172 case PROP_IS_MC_ORG_LOCAL
:
173 g_value_set_boolean (value
, g_inet_address_get_is_mc_org_local (address
));
176 case PROP_IS_MC_SITE_LOCAL
:
177 g_value_set_boolean (value
, g_inet_address_get_is_mc_site_local (address
));
181 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
186 g_inet_address_class_init (GInetAddressClass
*klass
)
188 GObjectClass
*gobject_class
= G_OBJECT_CLASS (klass
);
190 gobject_class
->set_property
= g_inet_address_set_property
;
191 gobject_class
->get_property
= g_inet_address_get_property
;
193 g_object_class_install_property (gobject_class
, PROP_FAMILY
,
194 g_param_spec_enum ("family",
195 P_("Address family"),
196 P_("The address family (IPv4 or IPv6)"),
197 G_TYPE_SOCKET_FAMILY
,
198 G_SOCKET_FAMILY_INVALID
,
200 G_PARAM_CONSTRUCT_ONLY
|
201 G_PARAM_STATIC_STRINGS
));
203 g_object_class_install_property (gobject_class
, PROP_BYTES
,
204 g_param_spec_pointer ("bytes",
206 P_("The raw address data"),
208 G_PARAM_CONSTRUCT_ONLY
|
209 G_PARAM_STATIC_STRINGS
));
212 * GInetAddress:is-any:
214 * Whether this is the "any" address for its family.
215 * See g_inet_address_get_is_any().
219 g_object_class_install_property (gobject_class
, PROP_IS_ANY
,
220 g_param_spec_boolean ("is-any",
222 P_("Whether this is the \"any\" address for its family"),
225 G_PARAM_STATIC_STRINGS
));
228 * GInetAddress:is-link-local:
230 * Whether this is a link-local address.
231 * See g_inet_address_get_is_link_local().
235 g_object_class_install_property (gobject_class
, PROP_IS_LINK_LOCAL
,
236 g_param_spec_boolean ("is-link-local",
238 P_("Whether this is a link-local address"),
241 G_PARAM_STATIC_STRINGS
));
244 * GInetAddress:is-loopback:
246 * Whether this is the loopback address for its family.
247 * See g_inet_address_get_is_loopback().
251 g_object_class_install_property (gobject_class
, PROP_IS_LOOPBACK
,
252 g_param_spec_boolean ("is-loopback",
254 P_("Whether this is the loopback address for its family"),
257 G_PARAM_STATIC_STRINGS
));
260 * GInetAddress:is-site-local:
262 * Whether this is a site-local address.
263 * See g_inet_address_get_is_loopback().
267 g_object_class_install_property (gobject_class
, PROP_IS_SITE_LOCAL
,
268 g_param_spec_boolean ("is-site-local",
270 P_("Whether this is a site-local address"),
273 G_PARAM_STATIC_STRINGS
));
276 * GInetAddress:is-multicast:
278 * Whether this is a multicast address.
279 * See g_inet_address_get_is_multicast().
283 g_object_class_install_property (gobject_class
, PROP_IS_MULTICAST
,
284 g_param_spec_boolean ("is-multicast",
286 P_("Whether this is a multicast address"),
289 G_PARAM_STATIC_STRINGS
));
292 * GInetAddress:is-mc-global:
294 * Whether this is a global multicast address.
295 * See g_inet_address_get_is_mc_global().
299 g_object_class_install_property (gobject_class
, PROP_IS_MC_GLOBAL
,
300 g_param_spec_boolean ("is-mc-global",
301 P_("Is multicast global"),
302 P_("Whether this is a global multicast address"),
305 G_PARAM_STATIC_STRINGS
));
309 * GInetAddress:is-mc-link-local:
311 * Whether this is a link-local multicast address.
312 * See g_inet_address_get_is_mc_link_local().
316 g_object_class_install_property (gobject_class
, PROP_IS_MC_LINK_LOCAL
,
317 g_param_spec_boolean ("is-mc-link-local",
318 P_("Is multicast link-local"),
319 P_("Whether this is a link-local multicast address"),
322 G_PARAM_STATIC_STRINGS
));
325 * GInetAddress:is-mc-node-local:
327 * Whether this is a node-local multicast address.
328 * See g_inet_address_get_is_mc_node_local().
332 g_object_class_install_property (gobject_class
, PROP_IS_MC_NODE_LOCAL
,
333 g_param_spec_boolean ("is-mc-node-local",
334 P_("Is multicast node-local"),
335 P_("Whether this is a node-local multicast address"),
338 G_PARAM_STATIC_STRINGS
));
341 * GInetAddress:is-mc-org-local:
343 * Whether this is an organization-local multicast address.
344 * See g_inet_address_get_is_mc_org_local().
348 g_object_class_install_property (gobject_class
, PROP_IS_MC_ORG_LOCAL
,
349 g_param_spec_boolean ("is-mc-org-local",
350 P_("Is multicast org-local"),
351 P_("Whether this is an organization-local multicast address"),
354 G_PARAM_STATIC_STRINGS
));
357 * GInetAddress:is-mc-site-local:
359 * Whether this is a site-local multicast address.
360 * See g_inet_address_get_is_mc_site_local().
364 g_object_class_install_property (gobject_class
, PROP_IS_MC_SITE_LOCAL
,
365 g_param_spec_boolean ("is-mc-site-local",
366 P_("Is multicast site-local"),
367 P_("Whether this is a site-local multicast address"),
370 G_PARAM_STATIC_STRINGS
));
374 g_inet_address_init (GInetAddress
*address
)
376 address
->priv
= g_inet_address_get_instance_private (address
);
379 /* These are provided so that we can use inet_pton() and inet_ntop() on Windows
380 * if they are available (i.e. Vista and later), and use the existing code path
381 * on Windows XP/Server 2003. We can drop this portion when we drop support for
384 #if defined(G_OS_WIN32) && _WIN32_WINNT < 0x0600
386 inet_pton (gint family
,
387 const gchar
*addr_string
,
390 /* For Vista/Server 2008 and later, there is native inet_pton() in Winsock2 */
391 if (ws2funcs
.pInetPton
!= NULL
)
392 return ws2funcs
.pInetPton (family
, addr_string
, addr
);
395 /* Fallback codepath for XP/Server 2003 */
396 struct sockaddr_storage sa
;
397 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&sa
;
398 struct sockaddr_in6
*sin6
= (struct sockaddr_in6
*)&sa
;
399 gint len
= sizeof (sa
);
401 if (family
!= AF_INET
&& family
!= AF_INET6
)
403 WSASetLastError (WSAEAFNOSUPPORT
);
407 /* WSAStringToAddress() will accept various not-an-IP-address
408 * strings like "127.0.0.1:80", "[1234::5678]:80", "127.1", etc.
410 if (!g_hostname_is_ip_address (addr_string
))
413 if (WSAStringToAddress ((LPTSTR
) addr_string
, family
, NULL
, (LPSOCKADDR
) &sa
, &len
) != 0)
416 if (family
== AF_INET
)
417 *(IN_ADDR
*)addr
= sin
->sin_addr
;
419 *(IN6_ADDR
*)addr
= sin6
->sin6_addr
;
426 inet_ntop (gint family
,
431 /* On Vista/Server 2008 and later, there is native inet_ntop() in Winsock2 */
432 if (ws2funcs
.pInetNtop
!= NULL
)
433 return ws2funcs
.pInetNtop (family
, addr
, addr_str
, size
);
436 /* Fallback codepath for XP/Server 2003 */
437 DWORD buflen
= size
, addrlen
;
438 struct sockaddr_storage sa
;
439 struct sockaddr_in
*sin
= (struct sockaddr_in
*)&sa
;
440 struct sockaddr_in6
*sin6
= (struct sockaddr_in6
*)&sa
;
442 memset (&sa
, 0, sizeof (sa
));
443 sa
.ss_family
= family
;
444 if (sa
.ss_family
== AF_INET
)
446 struct in_addr
*addrv4
= (struct in_addr
*) addr
;
448 addrlen
= sizeof (*sin
);
449 memcpy (&sin
->sin_addr
, addrv4
, sizeof (sin
->sin_addr
));
451 else if (sa
.ss_family
== AF_INET6
)
453 struct in6_addr
*addrv6
= (struct in6_addr
*) addr
;
455 addrlen
= sizeof (*sin6
);
456 memcpy (&sin6
->sin6_addr
, addrv6
, sizeof (sin6
->sin6_addr
));
460 WSASetLastError (WSAEAFNOSUPPORT
);
463 if (WSAAddressToString ((LPSOCKADDR
) &sa
, addrlen
, NULL
, addr_str
, &buflen
) == 0)
472 * g_inet_address_new_from_string:
473 * @string: a string representation of an IP address
475 * Parses @string as an IP address and creates a new #GInetAddress.
477 * Returns: a new #GInetAddress corresponding to @string, or %NULL if
478 * @string could not be parsed.
479 * Free the returned object with g_object_unref().
484 g_inet_address_new_from_string (const gchar
*string
)
486 struct in_addr in_addr
;
487 struct in6_addr in6_addr
;
489 g_return_val_if_fail (string
!= NULL
, NULL
);
491 /* If this GInetAddress is the first networking-related object to be
492 * created, then we won't have called g_networking_init() yet at
495 g_networking_init ();
497 if (inet_pton (AF_INET
, string
, &in_addr
) > 0)
498 return g_inet_address_new_from_bytes ((guint8
*)&in_addr
, AF_INET
);
499 else if (inet_pton (AF_INET6
, string
, &in6_addr
) > 0)
500 return g_inet_address_new_from_bytes ((guint8
*)&in6_addr
, AF_INET6
);
505 #define G_INET_ADDRESS_FAMILY_IS_VALID(family) ((family) == AF_INET || (family) == AF_INET6)
508 * g_inet_address_new_from_bytes:
509 * @bytes: (array) (element-type guint8): raw address data
510 * @family: the address family of @bytes
512 * Creates a new #GInetAddress from the given @family and @bytes.
513 * @bytes should be 4 bytes for %G_SOCKET_FAMILY_IPV4 and 16 bytes for
514 * %G_SOCKET_FAMILY_IPV6.
516 * Returns: a new #GInetAddress corresponding to @family and @bytes.
517 * Free the returned object with g_object_unref().
522 g_inet_address_new_from_bytes (const guint8
*bytes
,
523 GSocketFamily family
)
525 g_return_val_if_fail (G_INET_ADDRESS_FAMILY_IS_VALID (family
), NULL
);
527 return g_object_new (G_TYPE_INET_ADDRESS
,
534 * g_inet_address_new_loopback:
535 * @family: the address family
537 * Creates a #GInetAddress for the loopback address for @family.
539 * Returns: a new #GInetAddress corresponding to the loopback address
541 * Free the returned object with g_object_unref().
546 g_inet_address_new_loopback (GSocketFamily family
)
548 g_return_val_if_fail (G_INET_ADDRESS_FAMILY_IS_VALID (family
), NULL
);
550 if (family
== AF_INET
)
552 guint8 addr
[4] = {127, 0, 0, 1};
554 return g_inet_address_new_from_bytes (addr
, family
);
557 return g_inet_address_new_from_bytes (in6addr_loopback
.s6_addr
, family
);
561 * g_inet_address_new_any:
562 * @family: the address family
564 * Creates a #GInetAddress for the "any" address (unassigned/"don't
565 * care") for @family.
567 * Returns: a new #GInetAddress corresponding to the "any" address
569 * Free the returned object with g_object_unref().
574 g_inet_address_new_any (GSocketFamily family
)
576 g_return_val_if_fail (G_INET_ADDRESS_FAMILY_IS_VALID (family
), NULL
);
578 if (family
== AF_INET
)
580 guint8 addr
[4] = {0, 0, 0, 0};
582 return g_inet_address_new_from_bytes (addr
, family
);
585 return g_inet_address_new_from_bytes (in6addr_any
.s6_addr
, family
);
590 * g_inet_address_to_string:
591 * @address: a #GInetAddress
593 * Converts @address to string form.
595 * Returns: a representation of @address as a string, which should be
601 g_inet_address_to_string (GInetAddress
*address
)
603 gchar buffer
[INET6_ADDRSTRLEN
];
605 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), NULL
);
607 if (address
->priv
->family
== AF_INET
)
608 inet_ntop (AF_INET
, &address
->priv
->addr
.ipv4
, buffer
, sizeof (buffer
));
610 inet_ntop (AF_INET6
, &address
->priv
->addr
.ipv6
, buffer
, sizeof (buffer
));
612 return g_strdup (buffer
);
616 * g_inet_address_to_bytes: (skip)
617 * @address: a #GInetAddress
619 * Gets the raw binary address data from @address.
621 * Returns: a pointer to an internal array of the bytes in @address,
622 * which should not be modified, stored, or freed. The size of this
623 * array can be gotten with g_inet_address_get_native_size().
628 g_inet_address_to_bytes (GInetAddress
*address
)
630 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), NULL
);
632 return (guint8
*)&address
->priv
->addr
;
636 * g_inet_address_get_native_size:
637 * @address: a #GInetAddress
639 * Gets the size of the native raw binary address for @address. This
640 * is the size of the data that you get from g_inet_address_to_bytes().
642 * Returns: the number of bytes used for the native version of @address.
647 g_inet_address_get_native_size (GInetAddress
*address
)
649 if (address
->priv
->family
== AF_INET
)
650 return sizeof (address
->priv
->addr
.ipv4
);
651 return sizeof (address
->priv
->addr
.ipv6
);
655 * g_inet_address_get_family:
656 * @address: a #GInetAddress
658 * Gets @address's family
660 * Returns: @address's family
665 g_inet_address_get_family (GInetAddress
*address
)
667 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
669 return address
->priv
->family
;
673 * g_inet_address_get_is_any:
674 * @address: a #GInetAddress
676 * Tests whether @address is the "any" address for its family.
678 * Returns: %TRUE if @address is the "any" address for its family.
683 g_inet_address_get_is_any (GInetAddress
*address
)
685 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
687 if (address
->priv
->family
== AF_INET
)
689 guint32 addr4
= g_ntohl (address
->priv
->addr
.ipv4
.s_addr
);
691 return addr4
== INADDR_ANY
;
694 return IN6_IS_ADDR_UNSPECIFIED (&address
->priv
->addr
.ipv6
);
698 * g_inet_address_get_is_loopback:
699 * @address: a #GInetAddress
701 * Tests whether @address is the loopback address for its family.
703 * Returns: %TRUE if @address is the loopback address for its family.
708 g_inet_address_get_is_loopback (GInetAddress
*address
)
710 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
712 if (address
->priv
->family
== AF_INET
)
714 guint32 addr4
= g_ntohl (address
->priv
->addr
.ipv4
.s_addr
);
717 return ((addr4
& 0xff000000) == 0x7f000000);
720 return IN6_IS_ADDR_LOOPBACK (&address
->priv
->addr
.ipv6
);
724 * g_inet_address_get_is_link_local:
725 * @address: a #GInetAddress
727 * Tests whether @address is a link-local address (that is, if it
728 * identifies a host on a local network that is not connected to the
731 * Returns: %TRUE if @address is a link-local address.
736 g_inet_address_get_is_link_local (GInetAddress
*address
)
738 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
740 if (address
->priv
->family
== AF_INET
)
742 guint32 addr4
= g_ntohl (address
->priv
->addr
.ipv4
.s_addr
);
745 return ((addr4
& 0xffff0000) == 0xa9fe0000);
748 return IN6_IS_ADDR_LINKLOCAL (&address
->priv
->addr
.ipv6
);
752 * g_inet_address_get_is_site_local:
753 * @address: a #GInetAddress
755 * Tests whether @address is a site-local address such as 10.0.0.1
756 * (that is, the address identifies a host on a local network that can
757 * not be reached directly from the Internet, but which may have
758 * outgoing Internet connectivity via a NAT or firewall).
760 * Returns: %TRUE if @address is a site-local address.
765 g_inet_address_get_is_site_local (GInetAddress
*address
)
767 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
769 if (address
->priv
->family
== AF_INET
)
771 guint32 addr4
= g_ntohl (address
->priv
->addr
.ipv4
.s_addr
);
773 /* 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 */
774 return ((addr4
& 0xff000000) == 0x0a000000 ||
775 (addr4
& 0xfff00000) == 0xac100000 ||
776 (addr4
& 0xffff0000) == 0xc0a80000);
779 return IN6_IS_ADDR_SITELOCAL (&address
->priv
->addr
.ipv6
);
783 * g_inet_address_get_is_multicast:
784 * @address: a #GInetAddress
786 * Tests whether @address is a multicast address.
788 * Returns: %TRUE if @address is a multicast address.
793 g_inet_address_get_is_multicast (GInetAddress
*address
)
795 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
797 if (address
->priv
->family
== AF_INET
)
799 guint32 addr4
= g_ntohl (address
->priv
->addr
.ipv4
.s_addr
);
801 return IN_MULTICAST (addr4
);
804 return IN6_IS_ADDR_MULTICAST (&address
->priv
->addr
.ipv6
);
808 * g_inet_address_get_is_mc_global:
809 * @address: a #GInetAddress
811 * Tests whether @address is a global multicast address.
813 * Returns: %TRUE if @address is a global multicast address.
818 g_inet_address_get_is_mc_global (GInetAddress
*address
)
820 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
822 if (address
->priv
->family
== AF_INET
)
825 return IN6_IS_ADDR_MC_GLOBAL (&address
->priv
->addr
.ipv6
);
829 * g_inet_address_get_is_mc_link_local:
830 * @address: a #GInetAddress
832 * Tests whether @address is a link-local multicast address.
834 * Returns: %TRUE if @address is a link-local multicast address.
839 g_inet_address_get_is_mc_link_local (GInetAddress
*address
)
841 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
843 if (address
->priv
->family
== AF_INET
)
846 return IN6_IS_ADDR_MC_LINKLOCAL (&address
->priv
->addr
.ipv6
);
850 * g_inet_address_get_is_mc_node_local:
851 * @address: a #GInetAddress
853 * Tests whether @address is a node-local multicast address.
855 * Returns: %TRUE if @address is a node-local multicast address.
860 g_inet_address_get_is_mc_node_local (GInetAddress
*address
)
862 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
864 if (address
->priv
->family
== AF_INET
)
867 return IN6_IS_ADDR_MC_NODELOCAL (&address
->priv
->addr
.ipv6
);
871 * g_inet_address_get_is_mc_org_local:
872 * @address: a #GInetAddress
874 * Tests whether @address is an organization-local multicast address.
876 * Returns: %TRUE if @address is an organization-local multicast address.
881 g_inet_address_get_is_mc_org_local (GInetAddress
*address
)
883 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
885 if (address
->priv
->family
== AF_INET
)
888 return IN6_IS_ADDR_MC_ORGLOCAL (&address
->priv
->addr
.ipv6
);
892 * g_inet_address_get_is_mc_site_local:
893 * @address: a #GInetAddress
895 * Tests whether @address is a site-local multicast address.
897 * Returns: %TRUE if @address is a site-local multicast address.
902 g_inet_address_get_is_mc_site_local (GInetAddress
*address
)
904 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
906 if (address
->priv
->family
== AF_INET
)
909 return IN6_IS_ADDR_MC_SITELOCAL (&address
->priv
->addr
.ipv6
);
913 * g_inet_address_equal:
914 * @address: A #GInetAddress.
915 * @other_address: Another #GInetAddress.
917 * Checks if two #GInetAddress instances are equal, e.g. the same address.
919 * Returns: %TRUE if @address and @other_address are equal, %FALSE otherwise.
924 g_inet_address_equal (GInetAddress
*address
,
925 GInetAddress
*other_address
)
927 g_return_val_if_fail (G_IS_INET_ADDRESS (address
), FALSE
);
928 g_return_val_if_fail (G_IS_INET_ADDRESS (other_address
), FALSE
);
930 if (g_inet_address_get_family (address
) != g_inet_address_get_family (other_address
))
933 if (memcmp (g_inet_address_to_bytes (address
),
934 g_inet_address_to_bytes (other_address
),
935 g_inet_address_get_native_size (address
)) != 0)