} client_thread_data;
+void __guacd_log_info(guac_client* client, const char* format, va_list args) {
+ vsyslog(LOG_INFO, format, args);
+}
+
+void __guacd_log_error(guac_client* client, const char* format, va_list args) {
+ vsyslog(LOG_ERR, format, args);
+}
+
+void guacd_log_guac_error(const char* message) {
+
+ /* If error message provided, include in log */
+ if (guac_error_message != NULL)
+ syslog(LOG_ERR, "%s: %s: %s",
+ message,
+ guac_error_message,
+ guac_status_string(guac_error));
+
+ /* Otherwise just log with standard status string */
+ else
+ syslog(LOG_ERR, "%s: %s",
+ message,
+ guac_status_string(guac_error));
+
+}
+
void* start_client_thread(void* data) {
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(
if (select == NULL) {
/* Log error */
- syslog(LOG_ERR, "Error reading \"select\": %s",
- guac_status_string(guac_error));
+ guacd_log_guac_error("Error reading \"select\"");
/* Free resources */
guac_socket_close(socket);
if (plugin == NULL) {
/* Log error */
- syslog(LOG_ERR, "Error loading client plugin: %s",
- guac_status_string(guac_error));
+ guacd_log_guac_error("Error loading client plugin");
/* Free resources */
guac_socket_close(socket);
|| guac_socket_flush(socket)) {
/* Log error */
- syslog(LOG_ERR, "Error sending \"args\": %s",
- guac_status_string(guac_error));
+ guacd_log_guac_error("Error sending \"args\"");
if (guac_client_plugin_close(plugin))
- syslog(LOG_ERR, "Error closing client plugin");
+ guacd_log_guac_error("Error closing client plugin");
guac_socket_close(socket);
free(data);
if (connect == NULL) {
/* Log error */
- syslog(LOG_ERR, "Error reading \"connect\": %s",
- guac_status_string(guac_error));
+ guacd_log_guac_error("Error reading \"connect\"");
if (guac_client_plugin_close(plugin))
- syslog(LOG_ERR, "Error closing client plugin");
+ guacd_log_guac_error("Error closing client plugin");
guac_socket_close(socket);
free(data);
/* Load and init client */
client = guac_client_plugin_get_client(plugin, socket,
connect->argc, connect->argv);
- guac_instruction_free(select);
+ guac_instruction_free(connect);
if (client == NULL) {
- syslog(LOG_ERR, "Error instantiating client: %s",
- guac_status_string(guac_error));
+ guacd_log_guac_error("Error instantiating client");
if (guac_client_plugin_close(plugin))
- syslog(LOG_ERR, "Error closing client plugin");
+ guacd_log_guac_error("Error closing client plugin");
guac_socket_close(socket);
free(data);
return NULL;
}
+ /* Set up logging in client */
+ client->log_info_handler = __guacd_log_info;
+ client->log_error_handler = __guacd_log_error;
+
/* 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) {