undo change in mini.c
[mono-project.git] / mono / utils / networking-fallback.c
blob1b31ae503c695deb7e3729b6428b10572c0b58c4
1 /**
2 * \file
3 * Fallback networking code that rely on old BSD apis or whatever else is available.
5 * Author:
6 * Rodrigo Kumpera (kumpera@gmail.com)
8 * (C) 2015 Xamarin
9 */
11 #include <mono/utils/networking.h>
12 #include <glib.h>
13 #include <mono/utils/mono-compiler.h>
15 #ifdef HAVE_NETDB_H
16 #include <netdb.h>
17 #endif
19 #if !defined (HAVE_GETADDRINFO)
21 #if defined (HAVE_GETHOSTBYNAME) || defined (HAVE_GETHOSTBYNAME2)
23 static void
24 add_hostent (MonoAddressInfo *info, int flags, struct hostent *h)
26 MonoAddressEntry *cur, *prev = info->entries;
27 int idx = 0;
29 if (!h)
30 return;
32 if (!info->aliases)
33 info->aliases = g_strdupv (h->h_aliases);
35 while (h->h_addr_list [idx]) {
36 cur = g_new0 (MonoAddressEntry, 1);
37 if (prev)
38 prev->next = cur;
39 else
40 info->entries = cur;
42 if (flags & MONO_HINT_CANONICAL_NAME && h->h_name)
43 cur->canonical_name = g_strdup (h->h_name);
45 cur->family = h->h_addrtype;
46 cur->socktype = SOCK_STREAM;
47 cur->protocol = 0; /* Zero means the default stream protocol */
48 cur->address_len = h->h_length;
49 memcpy (&cur->address, h->h_addr_list [idx], h->h_length);
51 prev = cur;
52 ++idx;
56 int
57 mono_get_address_info (const char *hostname, int port, int flags, MonoAddressInfo **result)
59 MonoAddressInfo *addr_info;
60 addr_info = g_new0 (MonoAddressInfo, 1);
62 #ifdef HAVE_GETHOSTBYNAME2
63 if (flags & MONO_HINT_IPV6 || flags & MONO_HINT_UNSPECIFIED)
64 add_hostent (addr_info, flags, gethostbyname2 (hostname, AF_INET6));
65 if (flags & MONO_HINT_IPV4 || flags & MONO_HINT_UNSPECIFIED)
66 add_hostent (addr_info, flags, gethostbyname2 (hostname, AF_INET));
67 #else
68 add_hostent (addr_info, flags, gethostbyname (hostname))
69 #endif
71 if (!addr_info->entries) {
72 *result = NULL;
73 mono_free_address_info (addr_info);
74 return 1;
77 *result = addr_info;
78 return 0;
81 #endif /* defined (HAVE_GETHOSTBYNAME) || defined (HAVE_GETHOSTBYNAME2) */
82 #else /* !defined (HAVE_GETADDRINFO) */
84 MONO_EMPTY_SOURCE_FILE (networking_fallback);
85 #endif /* !defined (HAVE_GETADDRINFO) */