in src/protocols/rdp/client.c [145:238]
int guac_client_init(guac_client* client, int argc, char** argv) {
/* Automatically set HOME environment variable if unset (FreeRDP's
* initialization process will fail within freerdp_settings_new() if this
* is unset) */
const char* current_home = getenv("HOME");
if (current_home == NULL) {
/* Warn if the correct home directory cannot be determined */
struct passwd* passwd = getpwuid(getuid());
if (passwd == NULL)
guac_client_log(client, GUAC_LOG_WARNING, "FreeRDP initialization "
"may fail: The \"HOME\" environment variable is unset and "
"its correct value could not be automatically determined: "
"%s", strerror(errno));
/* Warn if the correct home directory could be determined but can't be
* assigned */
else if (setenv("HOME", passwd->pw_dir, 1))
guac_client_log(client, GUAC_LOG_WARNING, "FreeRDP initialization "
"may fail: The \"HOME\" environment variable is unset "
"and its correct value (detected as \"%s\") could not be "
"assigned: %s", passwd->pw_dir, strerror(errno));
/* HOME has been successfully set */
else {
guac_client_log(client, GUAC_LOG_DEBUG, "\"HOME\" "
"environment variable was unset and has been "
"automatically set to \"%s\"", passwd->pw_dir);
current_home = passwd->pw_dir;
}
}
/* Verify that detected home directory is actually writable and actually a
* directory, as FreeRDP initialization will mysteriously fail otherwise */
if (current_home != NULL && !is_writable_directory(current_home)) {
if (errno == EACCES)
guac_client_log(client, GUAC_LOG_WARNING, "FreeRDP initialization "
"may fail: The current user's home directory (\"%s\") is "
"not writable, but FreeRDP generally requires a writable "
"home directory for storage of configuration files and "
"certificates.", current_home);
else if (errno == ENOTDIR)
guac_client_log(client, GUAC_LOG_WARNING, "FreeRDP initialization "
"may fail: The current user's home directory (\"%s\") is "
"not actually a directory, but FreeRDP generally requires "
"a writable home directory for storage of configuration "
"files and certificates.", current_home);
else
guac_client_log(client, GUAC_LOG_WARNING, "FreeRDP initialization "
"may fail: Writability of the current user's home "
"directory (\"%s\") could not be determined: %s",
current_home, strerror(errno));
}
/* Set client args */
client->args = GUAC_RDP_CLIENT_ARGS;
/* Alloc client data */
guac_rdp_client* rdp_client = guac_mem_zalloc(sizeof(guac_rdp_client));
client->data = rdp_client;
/* Init display update module */
rdp_client->disp = guac_rdp_disp_alloc(client);
/* Init multi-touch support module (RDPEI) */
rdp_client->rdpei = guac_rdp_rdpei_alloc(client);
/* Redirect FreeRDP log messages to guac_client_log() */
guac_rdp_redirect_wlog(client);
/* Recursive attribute for locks */
pthread_mutexattr_init(&(rdp_client->attributes));
pthread_mutexattr_settype(&(rdp_client->attributes),
PTHREAD_MUTEX_RECURSIVE);
/* Init required locks */
guac_rwlock_init(&(rdp_client->lock));
pthread_mutex_init(&(rdp_client->message_lock), &(rdp_client->attributes));
/* Set handlers */
client->join_handler = guac_rdp_user_join_handler;
client->join_pending_handler = guac_rdp_join_pending_handler;
client->free_handler = guac_rdp_client_free_handler;
client->leave_handler = guac_rdp_user_leave_handler;
#ifdef ENABLE_COMMON_SSH
guac_common_ssh_init(client);
#endif
return 0;
}