Implemented select message, allowing args definition.
This commit is contained in:
parent
46a9529aa4
commit
455c340318
@ -95,6 +95,15 @@ char* guac_escape_string(const char* str);
|
|||||||
*/
|
*/
|
||||||
char* guac_unescape_string_inplace(char* str);
|
char* guac_unescape_string_inplace(char* str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an args instruction over the given GUACIO connection. Each
|
||||||
|
* argument name will be automatically escaped for transmission.
|
||||||
|
*
|
||||||
|
* @param io The GUACIO connection to use.
|
||||||
|
* @param args The NULL-terminated array of argument names (strings).
|
||||||
|
*/
|
||||||
|
void guac_send_args(GUACIO* io, const char** name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends a name instruction over the given GUACIO connection. The
|
* Sends a name instruction over the given GUACIO connection. The
|
||||||
* name given will be automatically escaped for transmission.
|
* name given will be automatically escaped for transmission.
|
||||||
|
@ -85,27 +85,30 @@ guac_client* guac_get_client(int client_fd) {
|
|||||||
|
|
||||||
char* error;
|
char* error;
|
||||||
|
|
||||||
|
/* Client args description */
|
||||||
|
const char** client_args;
|
||||||
|
|
||||||
/* Client arguments */
|
/* Client arguments */
|
||||||
int argc;
|
int argc;
|
||||||
char** argv;
|
char** argv;
|
||||||
|
|
||||||
/* Connect instruction */
|
/* Instruction */
|
||||||
guac_instruction instruction;
|
guac_instruction instruction;
|
||||||
|
|
||||||
/* Wait for connect instruction */
|
/* Wait for select instruction */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
||||||
int result = guac_read_instruction(io, &instruction);
|
int result = guac_read_instruction(io, &instruction);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
syslog(LOG_ERR, "Error reading instruction while waiting for connect");
|
syslog(LOG_ERR, "Error reading instruction while waiting for select");
|
||||||
guac_close(io);
|
guac_close(io);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Connect instruction read */
|
/* Select instruction read */
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
|
|
||||||
if (strcmp(instruction.opcode, "connect") == 0) {
|
if (strcmp(instruction.opcode, "select") == 0) {
|
||||||
|
|
||||||
/* Get protocol from message */
|
/* Get protocol from message */
|
||||||
char* protocol = instruction.argv[0];
|
char* protocol = instruction.argv[0];
|
||||||
@ -141,6 +144,47 @@ guac_client* guac_get_client(int client_fd) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get usage strig */
|
||||||
|
client_args = (const char**) dlsym(client->client_plugin_handle, "GUAC_CLIENT_ARGS");
|
||||||
|
|
||||||
|
if ((error = dlerror()) != NULL) {
|
||||||
|
syslog(LOG_ERR, "Could not get GUAC_CLIENT_ in plugin: %s\n", error);
|
||||||
|
guac_send_error(io, "Invalid server-side client plugin.");
|
||||||
|
guac_flush(io);
|
||||||
|
guac_close(io);
|
||||||
|
guac_free_instruction_data(&instruction);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send args */
|
||||||
|
guac_send_args(io, client_args);
|
||||||
|
guac_flush(io);
|
||||||
|
|
||||||
|
guac_free_instruction_data(&instruction);
|
||||||
|
break;
|
||||||
|
|
||||||
|
} /* end if select */
|
||||||
|
|
||||||
|
guac_free_instruction_data(&instruction);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for connect instruction */
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
int result = guac_read_instruction(io, &instruction);
|
||||||
|
if (result < 0) {
|
||||||
|
syslog(LOG_ERR, "Error reading instruction while waiting for connect");
|
||||||
|
guac_close(io);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Connect instruction read */
|
||||||
|
if (result > 0) {
|
||||||
|
|
||||||
|
if (strcmp(instruction.opcode, "connect") == 0) {
|
||||||
|
|
||||||
/* Initialize client arguments */
|
/* Initialize client arguments */
|
||||||
argc = instruction.argc;
|
argc = instruction.argc;
|
||||||
argv = instruction.argv;
|
argv = instruction.argv;
|
||||||
|
@ -134,6 +134,27 @@ char* guac_unescape_string_inplace(char* str) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void guac_send_args(GUACIO* io, const char** args) {
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
guac_write_string(io, "args:");
|
||||||
|
|
||||||
|
for (i=0; args[i] != NULL; i++) {
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
guac_write_string(io, ",");
|
||||||
|
|
||||||
|
char* escaped = guac_escape_string(args[i]);
|
||||||
|
guac_write_string(io, escaped);
|
||||||
|
free(escaped);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
guac_write_string(io, ";");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void guac_send_name(GUACIO* io, const char* name) {
|
void guac_send_name(GUACIO* io, const char* name) {
|
||||||
|
|
||||||
char* escaped = guac_escape_string(name);
|
char* escaped = guac_escape_string(name);
|
||||||
|
Loading…
Reference in New Issue
Block a user