Initial host/port on command line

This commit is contained in:
Michael Jumper
2010-09-07 22:48:33 -07:00
parent 32af91c429
commit 9dd15c2cfa
5 changed files with 44 additions and 35 deletions

View File

@@ -53,13 +53,13 @@ void guac_free_png_buffer(png_byte** png_buffer, int h) {
} }
guac_client* guac_get_client(int client_fd, void (*client_init)(guac_client* client)) { guac_client* guac_get_client(int client_fd, void (*client_init)(guac_client* client, const char* hostname, int port), const char* hostname, int port) {
guac_client* client = malloc(sizeof(guac_client)); guac_client* client = malloc(sizeof(guac_client));
client->io = guac_open(client_fd); client->io = guac_open(client_fd);
client_init(client); client_init(client, hostname, port);
return client; return client;

View File

@@ -36,7 +36,7 @@ typedef struct guac_client {
} guac_client; } guac_client;
guac_client* guac_get_client(int client_fd, void (*client_init)(guac_client* client)); guac_client* guac_get_client(int client_fd, void (*client_init)(guac_client* client, const char* hostname, int port), const char* hostname, int port);
void guac_start_client(guac_client* client); void guac_start_client(guac_client* client);
void guac_free_client(guac_client* client); void guac_free_client(guac_client* client);
png_byte** guac_alloc_png_buffer(int w, int h, int bpp); png_byte** guac_alloc_png_buffer(int w, int h, int bpp);

View File

@@ -18,6 +18,7 @@
*/ */
#include <unistd.h> #include <unistd.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
@@ -39,14 +40,25 @@ int main(int argc, char* argv[]) {
int connected_socket_fd; int connected_socket_fd;
pid_t client_pid ; pid_t client_pid ;
int listen_port;
const char* connect_host;
int connect_port;
if (argc < 4) {
fprintf(stderr, "USAGE: %s LISTENPORT CONNECTHOST CONNECTPORT\n", argv[0]);
return 1;
}
listen_port = atoi(argv[1]);
connect_host = argv[2];
connect_port = atoi(argv[3]);
fprintf(stderr, "Guacamole starting...\n");
/* Get binding address */ /* Get binding address */
memset(&server_addr, 0, sizeof(server_addr)); /* Zero struct */ memset(&server_addr, 0, sizeof(server_addr)); /* Zero struct */
server_addr.sin_family = AF_INET; server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(1234); server_addr.sin_port = htons(listen_port);
/* Get socket */ /* Get socket */
socket_fd = socket(AF_INET, SOCK_STREAM, 0); socket_fd = socket(AF_INET, SOCK_STREAM, 0);
@@ -62,11 +74,11 @@ int main(int argc, char* argv[]) {
return 2; return 2;
} }
fprintf(stderr, "[guacamole] listening on port %i, forwarding to %s:%i\n", listen_port, connect_host, connect_port);
/* Daemon loop */ /* Daemon loop */
for (;;) { for (;;) {
fprintf(stderr, "Listening...\n");
/* Listen for connections */ /* Listen for connections */
if (listen(socket_fd, 5) < 0) { if (listen(socket_fd, 5) < 0) {
perror("Error listening on socket"); perror("Error listening on socket");
@@ -82,15 +94,20 @@ int main(int argc, char* argv[]) {
} }
/* Fork client */ /* Fork client */
client_pid = fork(); client_pid = 0; /*fork();*/
if (client_pid < 0) { if (client_pid < 0) {
perror("Could not fork child"); perror("Could not fork child");
return 4;
} }
/* In child ... */ /* In child ... */
else if (client_pid == 0) { else if (client_pid == 0) {
guac_client* client = guac_get_client(connected_socket_fd, vnc_guac_client_init); guac_client* client;
fprintf(stderr, "[guacamole] spawning client\n");
client = guac_get_client(connected_socket_fd, vnc_guac_client_init, connect_host, connect_port);
guac_start_client(client); guac_start_client(client);
guac_free_client(client); guac_free_client(client);
@@ -100,13 +117,10 @@ int main(int argc, char* argv[]) {
return 3; return 3;
} }
fprintf(stderr, "Child exiting.\n"); fprintf(stderr, "[guacamole] client finished\n");
return 0; return 0;
} }
else
fprintf(stderr, "Child forked.\n");
} }
/* Close socket */ /* Close socket */

View File

@@ -30,9 +30,9 @@
char __guac_password[] = "potato"; char __guac_password[] = "potato";
char* __GUAC_VNC_TAG_IO = "GUACIO"; static char* __GUAC_VNC_TAG_IO = "GUACIO";
char* __GUAC_VNC_TAG_PNG_BUFFER = "PNG_BUFFER"; static char* __GUAC_VNC_TAG_PNG_BUFFER = "PNG_BUFFER";
char* __GUAC_VNC_TAG_PNG_BUFFER_ALPHA = "PNG_BUFFER_ALPHA"; static char* __GUAC_VNC_TAG_PNG_BUFFER_ALPHA = "PNG_BUFFER_ALPHA";
typedef struct vnc_guac_client_data { typedef struct vnc_guac_client_data {
@@ -169,8 +169,6 @@ char* guac_vnc_get_password(rfbClient* client) {
char* password = malloc(64); char* password = malloc(64);
strncpy(password, __guac_password, 63); strncpy(password, __guac_password, 63);
fprintf(stderr, "Sending password: %s\n", password);
return password; return password;
} }
@@ -214,8 +212,6 @@ void vnc_guac_client_key_handler(guac_client* client, int keysym, int pressed) {
} }
void vnc_guac_client_free_handler(guac_client* client) { void vnc_guac_client_free_handler(guac_client* client) {
rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client; rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client;
@@ -232,9 +228,10 @@ void vnc_guac_client_free_handler(guac_client* client) {
} }
void vnc_guac_client_init(guac_client* client) { void vnc_guac_client_init(guac_client* client, const char* hostname, int port) {
char* hostname_copy;
char* hostname;
rfbClient* rfb_client; rfbClient* rfb_client;
png_byte** png_buffer; png_byte** png_buffer;
@@ -257,11 +254,11 @@ void vnc_guac_client_init(guac_client* client) {
rfb_client->GetPassword = guac_vnc_get_password; rfb_client->GetPassword = guac_vnc_get_password;
/* Connect */ /* Connect */
hostname = malloc(64); hostname_copy = malloc(1024);
strcpy(hostname, "localhost"); strncpy(hostname_copy, hostname, 1024);
rfb_client->serverHost = hostname; rfb_client->serverHost = hostname_copy;
rfb_client->serverPort = 5902; rfb_client->serverPort = port;
rfbInitClient(rfb_client, NULL, NULL); rfbInitClient(rfb_client, NULL, NULL);
@@ -274,13 +271,6 @@ void vnc_guac_client_init(guac_client* client) {
rfbClientSetClientData(rfb_client, __GUAC_VNC_TAG_PNG_BUFFER, png_buffer); rfbClientSetClientData(rfb_client, __GUAC_VNC_TAG_PNG_BUFFER, png_buffer);
rfbClientSetClientData(rfb_client, __GUAC_VNC_TAG_PNG_BUFFER_ALPHA, png_buffer_alpha); rfbClientSetClientData(rfb_client, __GUAC_VNC_TAG_PNG_BUFFER_ALPHA, png_buffer_alpha);
/* Send name */
guac_send_name(client->io, rfb_client->desktopName);
/* Send size */
guac_send_size(client->io, rfb_client->width, rfb_client->height);
guac_flush(client->io);
/* Set client data */ /* Set client data */
vnc_guac_client_data = malloc(sizeof(vnc_guac_client_data)); vnc_guac_client_data = malloc(sizeof(vnc_guac_client_data));
vnc_guac_client_data->rfb_client = rfb_client; vnc_guac_client_data->rfb_client = rfb_client;
@@ -293,7 +283,12 @@ void vnc_guac_client_init(guac_client* client) {
client->mouse_handler = vnc_guac_client_mouse_handler; client->mouse_handler = vnc_guac_client_mouse_handler;
client->key_handler = vnc_guac_client_key_handler; client->key_handler = vnc_guac_client_key_handler;
fprintf(stderr, "VNC Client loaded.\n"); /* Send name */
guac_send_name(client->io, rfb_client->desktopName);
/* Send size */
guac_send_size(client->io, rfb_client->width, rfb_client->height);
guac_flush(client->io);
} }

View File

@@ -22,7 +22,7 @@
#include "client.h" #include "client.h"
void vnc_guac_client_init(guac_client* client); void vnc_guac_client_init(guac_client* client, const char* hostname, int port);
#endif #endif