]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/xdmcp-server.c
Use a sorting function to choose which XDMCP addresses to connect back on. Improve...
[sojka/lightdm.git] / src / xdmcp-server.c
index 515d0eec51cac001b347cfbcaa9934781bdc5776..bbc11927c804e85d0aa56b207a4f5f988b27938d 100644 (file)
@@ -57,10 +57,11 @@ G_DEFINE_TYPE (XDMCPServer, xdmcp_server, G_TYPE_OBJECT);
 #define MANAGE_TIMEOUT 126000
 
 /* Address sort support structure */
-struct AddrSortItem {
+typedef struct
+{
     gsize index;
     GInetAddress *address;
-};
+} AddrSortItem;
 
 XDMCPServer *
 xdmcp_server_new (void)
@@ -361,43 +362,45 @@ connection_to_address (XDMCPConnection *connection)
     }
 }
 
-/* Compare 2 addresses according to our preferences */
+/* Sort function to order XDMCP addresses by which is best to connect to */
 static gint
 compare_addresses (gconstpointer a, gconstpointer b, gpointer user_data)
 {
-    GInetAddress *addr1 = ((const struct AddrSortItem *) a)->address;
-    GInetAddress *addr2 = ((const struct AddrSortItem *) b)->address;
-    GInetAddress *source_address = (GInetAddress *) user_data;
-    GSocketFamily sf1;
-    GSocketFamily sf2;
-    GSocketFamily ssf;
-    gboolean ll1;
+    const AddrSortItem *item_a = a;
+    const AddrSortItem *item_b = b;
+    GInetAddress *source_address = user_data;
+    GSocketFamily family_a;
+    GSocketFamily family_b;
+    gboolean is_link_local;
 
     /* Prefer non link-local addresses */
-    ll1 = g_inet_address_get_is_link_local (addr1);
-    if (ll1 != g_inet_address_get_is_link_local (addr2))
-        return !ll1? -1: 1;
+    is_link_local = g_inet_address_get_is_link_local (item_a->address);
+    if (is_link_local != g_inet_address_get_is_link_local (item_b->address))
+        return is_link_local ? 1 : -1;
 
     /* Prefer the source address family */
-    sf1 = g_inet_address_get_family (addr1);
-    sf2 = g_inet_address_get_family (addr2);
-    if (sf1 != sf2) {
-        ssf = g_inet_address_get_family (source_address);
-        if (sf1 == ssf)
+    family_a = g_inet_address_get_family (item_a->address);
+    family_b = g_inet_address_get_family (item_b->address);
+    if (family_a != family_b)
+    {
+        GSocketFamily family;
+
+        family = g_inet_address_get_family (source_address);
+        if (family_a == family)
             return -1;
-        if (sf2 == ssf)
+        if (family_b == family)
             return 1;
-        return sf1 < sf2? -1: 1;
+        return family_a < family_b ? -1 : 1;
     }
 
     /* Check equality */
-    if (g_inet_address_equal (addr1, addr2))
+    if (g_inet_address_equal (item_a->address, item_b->address))
         return 0;
 
     /* Prefer the source address */
-    if (g_inet_address_equal (source_address, addr1))
+    if (g_inet_address_equal (source_address, item_a->address))
         return -1;
-    if (g_inet_address_equal (source_address, addr2))
+    if (g_inet_address_equal (source_address, item_b->address))
         return 1;
 
     /* Addresses are not equal, but preferences are: order is undefined */
@@ -410,7 +413,7 @@ choose_connection (XDMCPPacket *packet, GInetAddress *source_address)
     gsize addresses_length, i;
     GArray *addresses;
     gssize index = -1;
-    struct AddrSortItem addr;
+    AddrSortItem addr;
 
     addresses_length = packet->Request.n_connections;
     if (addresses_length == 0)
@@ -420,9 +423,11 @@ choose_connection (XDMCPPacket *packet, GInetAddress *source_address)
     if (!addresses)
         return NULL;
 
-    for (i = 0; i < addresses_length; i++) {
+    for (i = 0; i < addresses_length; i++)
+    {
         addr.address = connection_to_address (&packet->Request.connections[i]);
-        if (addr.address) {
+        if (addr.address)
+        {
             addr.index = i;
             g_array_append_val (addresses, addr);
         }
@@ -433,15 +438,14 @@ choose_connection (XDMCPPacket *packet, GInetAddress *source_address)
 
     /* Use the best address */
     if (addresses->len)
-        index = g_array_index (addresses, struct AddrSortItem, 0).index;
+        index = g_array_index (addresses, AddrSortItem, 0).index;
 
     /* Free the local sort array and items */
     for (i = 0; i < addresses->len; i++)
-        g_object_unref (g_array_index (addresses,
-                                       struct AddrSortItem, i).address);
+        g_object_unref (g_array_index (addresses, AddrSortItem, i).address);
     g_object_unref (addresses);
 
-    return index >= 0? &packet->Request.connections[index]: NULL;
+    return index >= 0 ? &packet->Request.connections[index] : NULL;
 }
 
 static gboolean