#define MANAGE_TIMEOUT 126000
/* Address sort support structure */
-struct AddrSortItem {
+typedef struct
+{
gsize index;
GInetAddress *address;
-};
+} AddrSortItem;
XDMCPServer *
xdmcp_server_new (void)
}
}
-/* 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 */
gsize addresses_length, i;
GArray *addresses;
gssize index = -1;
- struct AddrSortItem addr;
+ AddrSortItem addr;
addresses_length = packet->Request.n_connections;
if (addresses_length == 0)
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);
}
/* 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