#ifdef G_OS_WIN32
/* This is copied straight from giowin32.c, but its static there... */
-/* Is there another way to get this functionality? */
+/* TODO: is there another way to get this functionality? or maybe make this public? */
static char *
winsock_error_message (int number)
{
}
#endif
+#if !defined(HAVE_GETADDRINFO)
+static void
+g_set_error_from_last_error (GError **error)
+{
+ int code;
+
+#ifdef G_OS_WIN32
+ int err = WSAGetLastError ();
+#else
+ int err = h_errno;
+#endif
+
+ switch (err)
+ {
+ case HOST_NOT_FOUND:
+ code = G_IO_ERROR_RESOLVER_NOT_FOUND;
+ break;
+ case NO_DATA:
+ code = G_IO_ERROR_RESOLVER_NO_DATA;
+ break;
+ default:
+ g_warning ("unknown h_errno code encountered");
+ }
+
+#ifdef G_OS_WIN32
+ g_set_error (error, G_IO_ERROR, code, winsock_error_message (err));
+#else
+ g_set_error (error, G_IO_ERROR, code, hstrerror (err));
+#endif
+}
+#endif
+
#if !defined(HAVE_GETADDRINFO)
static GList *
hostent2list (const struct hostent *he)
struct hostent *he = gethostbyname (hostname);
if (!he)
- {
- if (error)
- *error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED, winsock_error_message (WSAGetLastError ()));
- }
+ g_set_error_from_last_error (error);
else
list = hostent2list (he);
}
if (!rv)
list = hostent2list (he);
+ else
+ g_set_error_from_last_error (error);
g_free (buf);
}
if (he)
list = hostent2list (&result);
+ else
+ g_set_error_from_last_error (error);
g_free (buf);
}
if (!rv)
list = hostent2list (&he);
+ else
+ g_set_error_from_last_error (error);
}
#else
{
#endif
he = gethostbyname (hostname);
- list = hostent2list (he);
+ if (he)
+ list = hostent2list (he);
+ else
+ g_set_error_from_last_error (error);
#ifdef HAVE_GETHOSTBYNAME_R_GLIB_MUTEX
G_UNLOCK (dnslock);
if (list)
list = g_list_reverse (list);
- if (!list && error)
- *error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED, winsock_error_message (WSAGetLastError ()));
-
return list;
}
}
typedef struct {
- GList *list;
+ GList *list;
const gchar *host;
} ResolveListData;