#include "client.h"
#include "thread.h"
+/**
+ * Sleep for the given number of milliseconds.
+ *
+ * @param millis The number of milliseconds to sleep.
+ */
void __guacd_sleep(int millis) {
struct timespec sleep_period;
/* Send sync */
if (guac_protocol_send_sync(socket, client->last_sent_timestamp)) {
- guac_client_log_error(client, "Error sending \"sync\" instruction: %s", guac_status_string(guac_error));
+ guac_client_log_error(client,
+ "Error sending \"sync\" instruction: %s",
+ guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
/* Flush */
if (guac_socket_flush(socket)) {
- guac_client_log_error(client, "Error flushing output: %s", guac_status_string(guac_error));
+ guac_client_log_error(client,
+ "Error flushing output: %s",
+ guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
int retval = client->handle_messages(client);
if (retval) {
- guac_client_log_error(client, "Error handling server messages: %s", guac_status_string(guac_error));
+ guac_client_log_error(client,
+ "Error handling server messages: %s",
+ guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
- /* Sleep as necessary */
- __guacd_sleep(GUAC_SERVER_MESSAGE_HANDLE_FREQUENCY);
-
/* Send sync instruction */
client->last_sent_timestamp = guac_protocol_get_timestamp();
if (guac_protocol_send_sync(socket, client->last_sent_timestamp)) {
- guac_client_log_error(client, "Error sending \"sync\" instruction: %s", guac_status_string(guac_error));
+ guac_client_log_error(client,
+ "Error sending \"sync\" instruction: %s",
+ guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
+ /* Flush */
if (guac_socket_flush(socket)) {
- guac_client_log_error(client, "Error flushing output: %s", guac_status_string(guac_error));
+ guac_client_log_error(client,
+ "Error flushing output: %s",
+ guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
}
- /* If sync threshold exceeded, don't spin waiting for resync */
- else
- __guacd_sleep(GUAC_SERVER_MESSAGE_HANDLE_FREQUENCY);
+ /* Sleep before handling more messages */
+ __guacd_sleep(GUAC_SERVER_MESSAGE_HANDLE_FREQUENCY);
}
/* Stop on error */
if (instruction == NULL) {
- guac_client_log_error(client, "Error reading instruction: %s", guac_status_string(guac_error));
+ guac_client_log_error(client,
+ "Error reading instruction: %s",
+ guac_status_string(guac_error));
guac_client_stop(client);
return NULL;
}
/* Call handler, stop on error */
if (guac_client_handle_instruction(client, instruction) < 0) {
- guac_client_log_error(client, "Error in client \"%s\" instruction handler: %s", instruction->opcode, guac_status_string(guac_error));
+ guac_client_log_error(client,
+ "Error in client \"%s\" instruction handler: %s",
+ instruction->opcode, guac_status_string(guac_error));
guac_instruction_free(instruction);
guac_client_stop(client);
return NULL;
guac_thread input_thread, output_thread;
if (guac_thread_create(&output_thread, __guac_client_output_thread, (void*) client)) {
+ guac_client_log_error(client, "Unable to start output thread");
return -1;
}
if (guac_thread_create(&input_thread, __guac_client_input_thread, (void*) client)) {
+ guac_client_log_error(client, "Unable to start input thread");
guac_client_stop(client);
guac_thread_join(output_thread);
return -1;
}
-
guac_client* client;
guac_client_plugin* plugin;
- client_thread_data* thread_data = (client_thread_data*) data;
- guac_socket* socket;
guac_instruction* select;
guac_instruction* connect;
+ /* Get thread data */
+ client_thread_data* thread_data = (client_thread_data*) data;
+
/* Open guac_socket */
- socket = guac_socket_open(thread_data->fd);
+ guac_socket* socket = guac_socket_open(thread_data->fd);
/* Get protocol from select instruction */
select = guac_protocol_expect_instruction(
/* Start client threads */
syslog(LOG_INFO, "Starting client");
- guac_start_client(client);
+ if (guac_start_client(client))
+ syslog(LOG_ERR, "Client finished abnormally");
+ else
+ syslog(LOG_INFO, "Client finished normally");
/* Clean up */
- syslog(LOG_INFO, "Client finished");
guac_client_free(client);
if (guac_client_plugin_close(plugin))
syslog(LOG_ERR, "Error closing client plugin");
#endif
/* Otherwise, this is the daemon */
- syslog(LOG_INFO, "Started, listening on port %i", listen_port);
+ syslog(LOG_INFO, "Listening on port %i", listen_port);
/* Ignore SIGPIPE */
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {