Fix up cross platform stuff
[cascardo/gnio.git] / gnio / gresolver.c
index c5ff2e7..ee9fd0b 100644 (file)
@@ -174,6 +174,36 @@ winsock_error_message (int number)
 }
 #endif
 
+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
+}
+
 #if !defined(HAVE_GETADDRINFO)
 static GList *
 hostent2list (const struct hostent *he)
@@ -276,10 +306,7 @@ g_resolver_get_host_by_name (GResolver *resolver, const gchar *hostname, GError
     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);
   }
@@ -298,6 +325,8 @@ g_resolver_get_host_by_name (GResolver *resolver, const gchar *hostname, GError
 
     if (!rv)
       list = hostent2list (he);
+    else
+      g_set_error_from_last_error (error);
 
     g_free (buf);
   }
@@ -318,6 +347,8 @@ g_resolver_get_host_by_name (GResolver *resolver, const gchar *hostname, GError
 
     if (he)
       list = hostent2list (&result);
+    else
+      g_set_error_from_last_error (error);
 
     g_free (buf);
   }
@@ -331,6 +362,8 @@ g_resolver_get_host_by_name (GResolver *resolver, const gchar *hostname, GError
 
     if (!rv)
       list = hostent2list (&he);
+    else
+      g_set_error_from_last_error (error);
   }
 #else
   {
@@ -341,7 +374,10 @@ g_resolver_get_host_by_name (GResolver *resolver, const gchar *hostname, GError
 #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);
@@ -352,9 +388,6 @@ g_resolver_get_host_by_name (GResolver *resolver, const gchar *hostname, GError
   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;
 }