Implement prompts, do not actually redirect real STDIN/STDOUT.
This commit is contained in:
parent
0057460c44
commit
0f978393a6
@ -75,14 +75,6 @@ struct guac_terminal {
|
|||||||
*/
|
*/
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether input should be echoed when keys are pressed. Normally, the
|
|
||||||
* terminal on the side of the SSH server will handle this automatically,
|
|
||||||
* and this flag will need to be cleared. When SSH is not yet connected,
|
|
||||||
* this flag would need to be set for input to be visible.
|
|
||||||
*/
|
|
||||||
bool echo;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
|
@ -44,46 +44,101 @@
|
|||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Similar to fgets(), reads a single line from STDIN. Unlike fgets(), this
|
* Similar to write, but automatically retries the write operation until
|
||||||
* function does not include the trailing newline character, although the
|
* an error occurs.
|
||||||
* character is removed from the input stream.
|
|
||||||
*
|
|
||||||
* @param title The title of the prompt to display.
|
|
||||||
* @param str The buffer to read the result into.
|
|
||||||
* @param size The number of bytes available in the buffer.
|
|
||||||
* @return str, or NULL if the prompt failed.
|
|
||||||
*/
|
*/
|
||||||
static char* prompt(const char* title, char* str, int size) {
|
static int __write_all(int fd, const char* buffer, int size) {
|
||||||
|
|
||||||
/* Print title */
|
int remaining = size;
|
||||||
printf("%s", title);
|
while (remaining > 0) {
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
/* Read input */
|
/* Attempt to write data */
|
||||||
str = fgets(str, size, stdin);
|
int ret_val = write(fd, buffer, remaining);
|
||||||
|
if (ret_val <= 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* If successful, contine with what data remains (if any) */
|
||||||
|
remaining -= ret_val;
|
||||||
|
buffer += ret_val;
|
||||||
|
|
||||||
/* Remove trailing newline, if any */
|
|
||||||
if (str != NULL) {
|
|
||||||
int length = strlen(str);
|
|
||||||
if (str[length-1] == '\n')
|
|
||||||
str[length-1] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a single line from STDIN.
|
||||||
|
*/
|
||||||
|
static char* prompt(guac_client* client, const char* title, char* str, int size, bool echo) {
|
||||||
|
|
||||||
|
ssh_guac_client_data* client_data = (ssh_guac_client_data*) client->data;
|
||||||
|
|
||||||
|
int pos;
|
||||||
|
char in_byte;
|
||||||
|
|
||||||
|
/* Get STDIN and STDOUT */
|
||||||
|
int stdin_fd = client_data->stdin_pipe_fd[0];
|
||||||
|
int stdout_fd = client_data->stdout_pipe_fd[1];
|
||||||
|
|
||||||
|
/* Print title */
|
||||||
|
__write_all(stdout_fd, title, strlen(title));
|
||||||
|
|
||||||
|
/* Make room for null terminator */
|
||||||
|
size--;
|
||||||
|
|
||||||
|
/* Read bytes until newline */
|
||||||
|
pos = 0;
|
||||||
|
while (pos < size && read(stdin_fd, &in_byte, 1) == 1) {
|
||||||
|
|
||||||
|
/* Backspace */
|
||||||
|
if (in_byte == 0x08) {
|
||||||
|
|
||||||
|
if (pos > 0) {
|
||||||
|
__write_all(stdout_fd, "\b \b", 3);
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Newline (end of input */
|
||||||
|
else if (in_byte == 0x0A) {
|
||||||
|
__write_all(stdout_fd, "\r\n", 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
|
||||||
|
/* Store character, update buffers */
|
||||||
|
str[pos++] = in_byte;
|
||||||
|
|
||||||
|
/* Print character if echoing */
|
||||||
|
if (echo)
|
||||||
|
__write_all(stdout_fd, &in_byte, 1);
|
||||||
|
else
|
||||||
|
__write_all(stdout_fd, "*", 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
str[pos] = 0;
|
||||||
return str;
|
return str;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* ssh_client_thread(void* data) {
|
void* ssh_client_thread(void* data) {
|
||||||
|
|
||||||
|
guac_client* client = (guac_client*) data;
|
||||||
|
|
||||||
char username[1024];
|
char username[1024];
|
||||||
char password[1024];
|
char password[1024];
|
||||||
|
|
||||||
/* Get username */
|
/* Get username */
|
||||||
if (prompt("Login as: ", username, sizeof(username)) == NULL)
|
if (prompt(client, "Login as: ", username, sizeof(username), true) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Get password */
|
/* Get password */
|
||||||
if (prompt("Password: ", password, sizeof(password)) == NULL)
|
if (prompt(client, "Password: ", password, sizeof(password), false) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
guac_client_log_info((guac_client*) data, "got: %s ... %s", username, password);
|
guac_client_log_info((guac_client*) data, "got: %s ... %s", username, password);
|
||||||
|
@ -94,7 +94,6 @@ guac_terminal* guac_terminal_create(guac_client* client,
|
|||||||
term->scroll_end = term->term_height - 1;
|
term->scroll_end = term->term_height - 1;
|
||||||
|
|
||||||
term->text_selected = false;
|
term->text_selected = false;
|
||||||
term->echo = true;
|
|
||||||
|
|
||||||
/* Size display */
|
/* Size display */
|
||||||
guac_terminal_display_resize(term->display,
|
guac_terminal_display_resize(term->display,
|
||||||
|
Loading…
Reference in New Issue
Block a user