Switch to VNC-style wait.
This commit is contained in:
parent
acf5abe355
commit
8099a57fc6
@ -105,12 +105,13 @@ int rdp_guac_client_free_handler(guac_client* client) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int rdp_guac_client_handle_messages(guac_client* client) {
|
static int rdp_guac_client_wait_for_messages(guac_client* client, int timeout_usecs) {
|
||||||
|
|
||||||
rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data;
|
rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data;
|
||||||
freerdp* rdp_inst = guac_client_data->rdp_inst;
|
freerdp* rdp_inst = guac_client_data->rdp_inst;
|
||||||
rdpChannels* channels = rdp_inst->context->channels;
|
rdpChannels* channels = rdp_inst->context->channels;
|
||||||
|
|
||||||
|
int result;
|
||||||
int index;
|
int index;
|
||||||
int max_fd, fd;
|
int max_fd, fd;
|
||||||
void* read_fds[32];
|
void* read_fds[32];
|
||||||
@ -118,25 +119,25 @@ int rdp_guac_client_handle_messages(guac_client* client) {
|
|||||||
int read_count = 0;
|
int read_count = 0;
|
||||||
int write_count = 0;
|
int write_count = 0;
|
||||||
fd_set rfds, wfds;
|
fd_set rfds, wfds;
|
||||||
wMessage* event;
|
|
||||||
|
|
||||||
struct timeval timeout = {
|
struct timeval timeout = {
|
||||||
.tv_sec = 0,
|
.tv_sec = 0,
|
||||||
.tv_usec = 250000
|
.tv_usec = timeout_usecs
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Get RDP fds */
|
/* Get RDP fds */
|
||||||
if (!freerdp_get_fds(rdp_inst, read_fds, &read_count, write_fds, &write_count)) {
|
if (!freerdp_get_fds(rdp_inst, read_fds, &read_count, write_fds, &write_count)) {
|
||||||
guac_error = GUAC_STATUS_BAD_STATE;
|
guac_error = GUAC_STATUS_BAD_STATE;
|
||||||
guac_error_message = "Unable to read RDP file descriptors";
|
guac_error_message = "Unable to read RDP file descriptors";
|
||||||
return 1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get channel fds */
|
/* Get channel fds */
|
||||||
if (!freerdp_channels_get_fds(channels, rdp_inst, read_fds, &read_count, write_fds, &write_count)) {
|
if (!freerdp_channels_get_fds(channels, rdp_inst, read_fds, &read_count, write_fds,
|
||||||
|
&write_count)) {
|
||||||
guac_error = GUAC_STATUS_BAD_STATE;
|
guac_error = GUAC_STATUS_BAD_STATE;
|
||||||
guac_error_message = "Unable to read RDP channel file descriptors";
|
guac_error_message = "Unable to read RDP channel file descriptors";
|
||||||
return 1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Construct read fd_set */
|
/* Construct read fd_set */
|
||||||
@ -162,24 +163,42 @@ int rdp_guac_client_handle_messages(guac_client* client) {
|
|||||||
if (max_fd == 0) {
|
if (max_fd == 0) {
|
||||||
guac_error = GUAC_STATUS_BAD_STATE;
|
guac_error = GUAC_STATUS_BAD_STATE;
|
||||||
guac_error_message = "No file descriptors";
|
guac_error_message = "No file descriptors";
|
||||||
return 1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Otherwise, wait for file descriptors given */
|
/* Wait for all RDP file descriptors */
|
||||||
if (select(max_fd + 1, &rfds, &wfds, NULL, &timeout) == -1) {
|
result = select(max_fd + 1, &rfds, &wfds, NULL, &timeout);
|
||||||
/* these are not really errors */
|
if (result < 0) {
|
||||||
if (!((errno == EAGAIN) ||
|
|
||||||
(errno == EWOULDBLOCK) ||
|
/* If error ignorable, pretend timout occurred */
|
||||||
(errno == EINPROGRESS) ||
|
if (errno == EAGAIN
|
||||||
(errno == EINTR))) /* signal occurred */
|
|| errno == EWOULDBLOCK
|
||||||
{
|
|| errno == EINPROGRESS
|
||||||
guac_error = GUAC_STATUS_SEE_ERRNO;
|
|| errno == EINTR)
|
||||||
guac_error_message = "Error waiting for file descriptor";
|
return 0;
|
||||||
return 1;
|
|
||||||
}
|
/* Otherwise, return as error */
|
||||||
|
guac_error = GUAC_STATUS_SEE_ERRNO;
|
||||||
|
guac_error_message = "Error waiting for file descriptor";
|
||||||
|
return -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
/* Return wait result */
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int rdp_guac_client_handle_messages(guac_client* client) {
|
||||||
|
|
||||||
|
rdp_guac_client_data* guac_client_data = (rdp_guac_client_data*) client->data;
|
||||||
|
freerdp* rdp_inst = guac_client_data->rdp_inst;
|
||||||
|
rdpChannels* channels = rdp_inst->context->channels;
|
||||||
|
wMessage* event;
|
||||||
|
|
||||||
|
/* Wait for messages */
|
||||||
|
int wait_result = rdp_guac_client_wait_for_messages(client, 250000);
|
||||||
|
while (wait_result > 0) {
|
||||||
|
|
||||||
pthread_mutex_lock(&(guac_client_data->rdp_lock));
|
pthread_mutex_lock(&(guac_client_data->rdp_lock));
|
||||||
|
|
||||||
@ -228,32 +247,15 @@ int rdp_guac_client_handle_messages(guac_client* client) {
|
|||||||
if (guac_client_data->audio != NULL)
|
if (guac_client_data->audio != NULL)
|
||||||
guac_socket_flush(guac_client_data->audio->stream->socket);
|
guac_socket_flush(guac_client_data->audio->stream->socket);
|
||||||
|
|
||||||
/* Reset timeout to 0 seconds */
|
/* Wait again */
|
||||||
timeout.tv_sec = 0;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
|
|
||||||
/* Construct read fd_set */
|
|
||||||
max_fd = 0;
|
|
||||||
FD_ZERO(&rfds);
|
|
||||||
for (index = 0; index < read_count; index++) {
|
|
||||||
fd = (int)(long) (read_fds[index]);
|
|
||||||
if (fd > max_fd)
|
|
||||||
max_fd = fd;
|
|
||||||
FD_SET(fd, &rfds);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Construct write fd_set */
|
|
||||||
FD_ZERO(&wfds);
|
|
||||||
for (index = 0; index < write_count; index++) {
|
|
||||||
fd = (int)(long) (write_fds[index]);
|
|
||||||
if (fd > max_fd)
|
|
||||||
max_fd = fd;
|
|
||||||
FD_SET(fd, &wfds);
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&(guac_client_data->rdp_lock));
|
pthread_mutex_unlock(&(guac_client_data->rdp_lock));
|
||||||
|
wait_result = rdp_guac_client_wait_for_messages(client, 0);
|
||||||
|
|
||||||
} while (select(max_fd + 1, &rfds, &wfds, NULL, &timeout) > 0);
|
}
|
||||||
|
|
||||||
|
/* If an error occurred, fail */
|
||||||
|
if (wait_result < 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
/* Success */
|
/* Success */
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user