diff --git a/guacamole/proxy/Makefile b/guacamole/proxy/Makefile index 83940835a..8a10095fb 100644 --- a/guacamole/proxy/Makefile +++ b/guacamole/proxy/Makefile @@ -1,6 +1,6 @@ CFLAGS=-O2 -pedantic -Wall -Werror -I../libguac/include -LDFLAGS=-L../libguac -lpng -lguac +LDFLAGS=-L../libguac -lpng -lguac -ldl .PHONY: clean diff --git a/guacamole/proxy/daemon.c b/guacamole/proxy/daemon.c index 30106d58e..5787096a2 100644 --- a/guacamole/proxy/daemon.c +++ b/guacamole/proxy/daemon.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "client.h" @@ -103,10 +104,37 @@ int main(int argc, char* argv[]) { else if (client_pid == 0) { guac_client* client; + void* client_plugin_handle; + + union { + void (*client_init)(guac_client* client, const char* hostname, int port); + void* obj; + } alias; + + char* error; + fprintf(stderr, "[guacamole] spawning client\n"); - client = NULL; /*guac_get_client(connected_socket_fd, vnc_guac_client_init, connect_host, connect_port); */ /* STUB! */ + /* Load client plugin */ + client_plugin_handle = dlopen("libguac_client_vnc.so", RTLD_LAZY); + if (!client_plugin_handle) { + fprintf(stderr, "[guacamole] could not open client plugin: %s\n", dlerror()); + return 2; + } + + dlerror(); /* Clear errors */ + + /* Get init function */ + alias.obj = dlsym(client_plugin_handle, "guac_client_init"); + + if ((error = dlerror()) != NULL) { + fprintf(stderr, "[guacamole] could not get guac_client_init in plugin: %s\n", error); + return 2; + } + + /* Load and start client */ + client = guac_get_client(connected_socket_fd, alias.client_init, connect_host, connect_port); guac_start_client(client); guac_free_client(client); @@ -116,6 +144,12 @@ int main(int argc, char* argv[]) { return 3; } + /* Load client plugin */ + if (dlclose(client_plugin_handle)) { + fprintf(stderr, "[guacamole] could not close client plugin: %s\n", dlerror()); + return 2; + } + fprintf(stderr, "[guacamole] client finished\n"); return 0; } diff --git a/guacamole/vnc/Makefile b/guacamole/vnc/Makefile index c7e011277..798f3ec53 100644 --- a/guacamole/vnc/Makefile +++ b/guacamole/vnc/Makefile @@ -1,6 +1,6 @@ CFLAGS=-O2 -fPIC -pedantic -Wall -Werror -I../libguac/include -LDFLAGS=-L../libguac -lpng -lguac +LDFLAGS=-L../libguac -lpng -lguac -lvncclient .PHONY: clean diff --git a/guacamole/vnc/vnc_client.c b/guacamole/vnc/vnc_client.c index cab5cbe6d..a9a52a544 100644 --- a/guacamole/vnc/vnc_client.c +++ b/guacamole/vnc/vnc_client.c @@ -264,7 +264,7 @@ void vnc_guac_client_free_handler(guac_client* client) { } -void vnc_guac_client_init(guac_client* client, const char* hostname, int port) { +void guac_client_init(guac_client* client, const char* hostname, int port) { char* hostname_copy;