-static gint32
-get_family_hint (MonoError *error)
-{
- MonoDomain *domain = mono_domain_get ();
-
- mono_error_init (error);
-
- if (!domain->inet_family_hint) {
- MonoImage *socket_assembly;
- MonoClass *socket_class;
- MonoClassField *ipv6_field, *ipv4_field;
- gint32 ipv6_enabled = -1, ipv4_enabled = -1;
- MonoVTable *vtable;
-
- socket_assembly = get_socket_assembly ();
- g_assert (socket_assembly);
-
- socket_class = mono_class_load_from_name (socket_assembly, "System.Net.Sockets", "Socket");
-
- ipv4_field = mono_class_get_field_from_name (socket_class, "ipv4_supported");
- g_assert (ipv4_field);
-
- ipv6_field = mono_class_get_field_from_name (socket_class, "ipv6_supported");
- g_assert (ipv6_field);
-
- vtable = mono_class_vtable (mono_domain_get (), socket_class);
- g_assert (vtable);
-
- mono_runtime_class_init_full (vtable, error);
- return_val_if_nok (error, -1);
-
- mono_field_static_get_value_checked (vtable, ipv4_field, &ipv4_enabled, error);
- return_val_if_nok (error, -1);
- mono_field_static_get_value_checked (vtable, ipv6_field, &ipv6_enabled, error);
- return_val_if_nok (error, -1);
-
- mono_domain_lock (domain);
- if (ipv4_enabled == 1 && ipv6_enabled == 1) {
- domain->inet_family_hint = 1;
- } else if (ipv4_enabled == 1) {
- domain->inet_family_hint = 2;
- } else {
- domain->inet_family_hint = 3;
- }
- mono_domain_unlock (domain);
- }
- switch (domain->inet_family_hint) {
- case 1: return PF_UNSPEC;
- case 2: return PF_INET;
- case 3: return PF_INET6;
- default:
- return PF_UNSPEC;
- }
-}
-