void xdmcp_client_send_request (XDMCPClient *client, guint16 display_number, GInetAddress **addresses, const gchar *authentication_name, const guint8 *authentication_data, guint16 authentication_data_length, gchar **authorization_names, const gchar *mfid) { gsize length = 11 + strlen (authentication_name) + authentication_data_length + strlen (mfid); gsize n_addresses = 0; for (GInetAddress **address = addresses; *address; address++) { gssize native_address_length = g_inet_address_get_native_size (*address); length += 4 + native_address_length; n_addresses++; } gsize n_names = 0; for (gchar **name = authorization_names; *name; name++) { length += 2 + strlen (*name); n_names++; } guint8 buffer[MAXIMUM_REQUEST_LENGTH]; gsize offset = 0; write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, XDMCP_VERSION, &offset); write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, XDMCP_Request, &offset); write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, length, &offset); write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, display_number, &offset); write_card8 (buffer, MAXIMUM_REQUEST_LENGTH, n_addresses, &offset); for (GInetAddress **address = addresses; *address; address++) write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, 0, &offset); /* FamilyInternet */ write_card8 (buffer, MAXIMUM_REQUEST_LENGTH, n_addresses, &offset); for (GInetAddress **address = addresses; *address; address++) { gssize native_address_length = g_inet_address_get_native_size (*address); const guint8 *native_address = g_inet_address_to_bytes (*address); write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, native_address_length, &offset); write_string8 (buffer, MAXIMUM_REQUEST_LENGTH, native_address, native_address_length, &offset); } write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, strlen (authentication_name), &offset); write_string (buffer, MAXIMUM_REQUEST_LENGTH, authentication_name, &offset); write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, authentication_data_length, &offset); write_string8 (buffer, MAXIMUM_REQUEST_LENGTH, authentication_data, authentication_data_length, &offset); write_card8 (buffer, MAXIMUM_REQUEST_LENGTH, n_names, &offset); for (gchar **name = authorization_names; *name; name++) { write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, strlen (*name), &offset); write_string (buffer, MAXIMUM_REQUEST_LENGTH, *name, &offset); } write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, strlen (mfid), &offset); write_string (buffer, MAXIMUM_REQUEST_LENGTH, mfid, &offset); xdmcp_write (client, buffer, offset); }
void write_padding (guint8 *buffer, gsize buffer_length, gsize length, gsize *offset) { gsize i; for (i = 0; i < length; i++) write_card8 (buffer, buffer_length, 0, offset); }
static void send_query (XDMCPClient *client, guint16 opcode, gchar **authentication_names) { guint8 buffer[MAXIMUM_REQUEST_LENGTH]; gsize offset = 0; gsize length = 1; gsize n_names = 0; for (gchar **name = authentication_names; authentication_names && *name; name++) { length += 2 + strlen (*name); n_names++; } write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, XDMCP_VERSION, &offset); write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, opcode, &offset); write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, length, &offset); write_card8 (buffer, MAXIMUM_REQUEST_LENGTH, n_names, &offset); for (gchar **name = authentication_names; authentication_names && *name; name++) { write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, strlen (*name), &offset); write_string (buffer, MAXIMUM_REQUEST_LENGTH, *name, &offset); } xdmcp_write (client, buffer, offset); }
void write_card16 (guint8 *buffer, gsize buffer_length, guint8 byte_order, guint16 value, gsize *offset) { if (byte_order == X_BYTE_ORDER_MSB) { write_card8 (buffer, buffer_length, value >> 8, offset); write_card8 (buffer, buffer_length, value & 0xFF, offset); }