Move pipes to terminal scope.
This commit is contained in:
parent
225377f197
commit
5a0b8b2ea7
@ -79,16 +79,6 @@ typedef struct ssh_guac_client_data {
|
|||||||
*/
|
*/
|
||||||
int mouse_mask;
|
int mouse_mask;
|
||||||
|
|
||||||
/**
|
|
||||||
* Pipe which will be used to provide STDOUT to the SSH client.
|
|
||||||
*/
|
|
||||||
int stdout_pipe_fd[2];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pipe which will be used to provide STDIN to the SSH client.
|
|
||||||
*/
|
|
||||||
int stdin_pipe_fd[2];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The cached I-bar cursor.
|
* The cached I-bar cursor.
|
||||||
*/
|
*/
|
||||||
|
@ -75,6 +75,22 @@ struct guac_terminal {
|
|||||||
*/
|
*/
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pipe which should be written to (and read from) to provide output to
|
||||||
|
* this terminal. Another thread should read from this pipe when writing
|
||||||
|
* data to the terminal. It would make sense for the terminal to provide
|
||||||
|
* this thread, but for simplicity, that logic is left to the guac
|
||||||
|
* message handler (to give the message handler something to block with).
|
||||||
|
*/
|
||||||
|
int stdout_pipe_fd[2];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pipe which will be the source of user input. When a terminal code
|
||||||
|
* generates synthesized user input, that data will be written to
|
||||||
|
* this pipe.
|
||||||
|
*/
|
||||||
|
int stdin_pipe_fd[2];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The relative offset of the display. A positive value indicates that
|
* The relative offset of the display. A positive value indicates that
|
||||||
* many rows have been scrolled into view, zero indicates that no
|
* many rows have been scrolled into view, zero indicates that no
|
||||||
|
@ -101,20 +101,6 @@ int guac_client_init(guac_client* client, int argc, char** argv) {
|
|||||||
|
|
||||||
guac_socket_flush(socket);
|
guac_socket_flush(socket);
|
||||||
|
|
||||||
/* Open STDOUT pipe */
|
|
||||||
if (pipe(client_data->stdout_pipe_fd)) {
|
|
||||||
guac_error = GUAC_STATUS_SEE_ERRNO;
|
|
||||||
guac_error_message = "Unable to open pipe for STDOUT";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open STDIN pipe */
|
|
||||||
if (pipe(client_data->stdin_pipe_fd)) {
|
|
||||||
guac_error = GUAC_STATUS_SEE_ERRNO;
|
|
||||||
guac_error_message = "Unable to open pipe for STDIN";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set basic handlers */
|
/* Set basic handlers */
|
||||||
client->handle_messages = ssh_guac_client_handle_messages;
|
client->handle_messages = ssh_guac_client_handle_messages;
|
||||||
client->clipboard_handler = ssh_guac_client_clipboard_handler;
|
client->clipboard_handler = ssh_guac_client_clipboard_handler;
|
||||||
|
@ -61,7 +61,7 @@ int ssh_guac_client_handle_messages(guac_client* client) {
|
|||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
|
|
||||||
int ret_val;
|
int ret_val;
|
||||||
int fd = client_data->stdout_pipe_fd[0];
|
int fd = client_data->term->stdout_pipe_fd[0];
|
||||||
struct timeval timeout;
|
struct timeval timeout;
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
|
|
||||||
@ -158,7 +158,7 @@ int ssh_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) {
|
|||||||
|
|
||||||
int length = strlen(client_data->clipboard_data);
|
int length = strlen(client_data->clipboard_data);
|
||||||
if (length)
|
if (length)
|
||||||
return write(client_data->stdin_pipe_fd[1],
|
return write(term->stdin_pipe_fd[1],
|
||||||
client_data->clipboard_data, length);
|
client_data->clipboard_data, length);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -229,7 +229,7 @@ int ssh_guac_client_key_handler(guac_client* client, int keysym, int pressed) {
|
|||||||
guac_terminal* term = client_data->term;
|
guac_terminal* term = client_data->term;
|
||||||
|
|
||||||
/* Get write end of STDIN pipe */
|
/* Get write end of STDIN pipe */
|
||||||
int fd = client_data->stdin_pipe_fd[1];
|
int fd = term->stdin_pipe_fd[1];
|
||||||
|
|
||||||
/* Hide mouse cursor if not already hidden */
|
/* Hide mouse cursor if not already hidden */
|
||||||
if (client_data->current_cursor != client_data->blank_cursor) {
|
if (client_data->current_cursor != client_data->blank_cursor) {
|
||||||
@ -354,18 +354,9 @@ int ssh_guac_client_free_handler(guac_client* client) {
|
|||||||
|
|
||||||
ssh_guac_client_data* guac_client_data = (ssh_guac_client_data*) client->data;
|
ssh_guac_client_data* guac_client_data = (ssh_guac_client_data*) client->data;
|
||||||
|
|
||||||
/* Close terminal output pipe */
|
|
||||||
close(guac_client_data->stdout_pipe_fd[1]);
|
|
||||||
close(guac_client_data->stdout_pipe_fd[0]);
|
|
||||||
|
|
||||||
/* Close user input pipe */
|
|
||||||
close(guac_client_data->stdin_pipe_fd[1]);
|
|
||||||
close(guac_client_data->stdin_pipe_fd[0]);
|
|
||||||
|
|
||||||
pthread_join(guac_client_data->client_thread, NULL);
|
|
||||||
|
|
||||||
/* Free terminal */
|
/* Free terminal */
|
||||||
guac_terminal_free(guac_client_data->term);
|
guac_terminal_free(guac_client_data->term);
|
||||||
|
pthread_join(guac_client_data->client_thread, NULL);
|
||||||
|
|
||||||
/* Free clipboard data */
|
/* Free clipboard data */
|
||||||
free(guac_client_data->clipboard_data);
|
free(guac_client_data->clipboard_data);
|
||||||
|
@ -81,8 +81,8 @@ static char* prompt(guac_client* client, const char* title, char* str, int size,
|
|||||||
char in_byte;
|
char in_byte;
|
||||||
|
|
||||||
/* Get STDIN and STDOUT */
|
/* Get STDIN and STDOUT */
|
||||||
int stdin_fd = client_data->stdin_pipe_fd[0];
|
int stdin_fd = client_data->term->stdin_pipe_fd[0];
|
||||||
int stdout_fd = client_data->stdout_pipe_fd[1];
|
int stdout_fd = client_data->term->stdout_pipe_fd[1];
|
||||||
|
|
||||||
/* Print title */
|
/* Print title */
|
||||||
__write_all(stdout_fd, title, strlen(title));
|
__write_all(stdout_fd, title, strlen(title));
|
||||||
@ -137,7 +137,7 @@ void* ssh_input_thread(void* data) {
|
|||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
int bytes_read;
|
int bytes_read;
|
||||||
|
|
||||||
int stdin_fd = client_data->stdin_pipe_fd[0];
|
int stdin_fd = client_data->term->stdin_pipe_fd[0];
|
||||||
|
|
||||||
/* Write all data read */
|
/* Write all data read */
|
||||||
while ((bytes_read = read(stdin_fd, buffer, sizeof(buffer))) > 0)
|
while ((bytes_read = read(stdin_fd, buffer, sizeof(buffer))) > 0)
|
||||||
@ -156,7 +156,7 @@ void* ssh_client_thread(void* data) {
|
|||||||
char buffer[8192];
|
char buffer[8192];
|
||||||
int bytes_read = -1234;
|
int bytes_read = -1234;
|
||||||
|
|
||||||
int stdout_fd = client_data->stdout_pipe_fd[1];
|
int stdout_fd = client_data->term->stdout_pipe_fd[1];
|
||||||
|
|
||||||
pthread_t input_thread;
|
pthread_t input_thread;
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include <guacamole/socket.h>
|
#include <guacamole/socket.h>
|
||||||
#include <guacamole/protocol.h>
|
#include <guacamole/protocol.h>
|
||||||
#include <guacamole/client.h>
|
#include <guacamole/client.h>
|
||||||
|
#include <guacamole/error.h>
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
@ -95,6 +96,22 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
|
|
||||||
term->text_selected = false;
|
term->text_selected = false;
|
||||||
|
|
||||||
|
/* Open STDOUT pipe */
|
||||||
|
if (pipe(term->stdout_pipe_fd)) {
|
||||||
|
guac_error = GUAC_STATUS_SEE_ERRNO;
|
||||||
|
guac_error_message = "Unable to open pipe for STDOUT";
|
||||||
|
free(term);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Open STDIN pipe */
|
||||||
|
if (pipe(term->stdin_pipe_fd)) {
|
||||||
|
guac_error = GUAC_STATUS_SEE_ERRNO;
|
||||||
|
guac_error_message = "Unable to open pipe for STDIN";
|
||||||
|
free(term);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Size display */
|
/* Size display */
|
||||||
guac_terminal_display_resize(term->display,
|
guac_terminal_display_resize(term->display,
|
||||||
term->term_width, term->term_height);
|
term->term_width, term->term_height);
|
||||||
@ -108,6 +125,14 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
|
|
||||||
void guac_terminal_free(guac_terminal* term) {
|
void guac_terminal_free(guac_terminal* term) {
|
||||||
|
|
||||||
|
/* Close terminal output pipe */
|
||||||
|
close(term->stdout_pipe_fd[1]);
|
||||||
|
close(term->stdout_pipe_fd[0]);
|
||||||
|
|
||||||
|
/* Close user input pipe */
|
||||||
|
close(term->stdin_pipe_fd[1]);
|
||||||
|
close(term->stdin_pipe_fd[0]);
|
||||||
|
|
||||||
/* Free display */
|
/* Free display */
|
||||||
guac_terminal_display_free(term->display);
|
guac_terminal_display_free(term->display);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user