X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=tunnel.c;h=17b512cf4aa5508c2cd65f1edb0659d55c5edcc5;hb=refs%2Fheads%2Fnext;hp=a03ef0b32757085673185bdec436ac88f9a48188;hpb=c333f350d703997b67db67b8a578ea4bc70089fa;p=ovirt-viewer.git diff --git a/tunnel.c b/tunnel.c index a03ef0b..17b512c 100644 --- a/tunnel.c +++ b/tunnel.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -46,18 +47,12 @@ /* constants */ -// port to try to listen on, if we can't, increment until we find one we can -const int PORT_RANGE_START = 5600; - // max length of a vm name const int VM_NAME_MAX_LEN = 250; // max length of vnc data const int VNC_DATA_MAX_LEN = 800000; -// port which to connect to on ovirt server -const int OVIRT_SERVER_PORT = 5900; - /* Private thread functions */ static gpointer tunnel_thread(gpointer data); static gpointer client_server_thread(gpointer data); @@ -137,6 +132,8 @@ stop_tunnel(void) static gpointer tunnel_thread (gpointer _data) { + struct hostent *dns_serv; + //char vm_data[VM_NAME_MAX_LEN]; int local_server_socketfd, ovirt_server_socket, client_socketfd; unsigned int local_server_len, client_len, ovirt_server_len; @@ -145,6 +142,9 @@ tunnel_thread (gpointer _data) struct sockaddr_in ovirt_server_address; struct sockaddr_in client_address; + struct sockaddr_in local_server_address_lookup; + unsigned int local_server_address_lookup_len = sizeof(local_server_address_lookup); + GThread *client_server_gthread = NULL; GThread *server_client_gthread = NULL; @@ -154,9 +154,14 @@ tunnel_thread (gpointer _data) DEBUG ("tunnel thread starting up"); // ovirt server address + dns_serv = gethostbyname(hostname); + if(dns_serv == NULL){ + DEBUG("ovirt server lookup failed"); + return NULL; + } ovirt_server_address.sin_family = PF_INET; - ovirt_server_address.sin_addr.s_addr = inet_addr(hostname); - ovirt_server_address.sin_port = htons(OVIRT_SERVER_PORT); + ovirt_server_address.sin_addr.s_addr = ((struct in_addr*)(dns_serv->h_addr))->s_addr; //inet_addr(hostname); + ovirt_server_address.sin_port = htons(ovirt_server_vnc_port); ovirt_server_len = sizeof(ovirt_server_address); // create local net socket @@ -165,18 +170,21 @@ tunnel_thread (gpointer _data) sockets = g_slist_prepend(sockets, c_socket); // local server address - tunnel_port = PORT_RANGE_START; local_server_address.sin_family = PF_INET; local_server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); - local_server_address.sin_port = htons(tunnel_port); + local_server_address.sin_port = 0; local_server_len = sizeof(local_server_address); // increment ports until one is available - while(bind(local_server_socketfd, (struct sockaddr*)&local_server_address, local_server_len) < 0){ - tunnel_port += 1; - local_server_address.sin_port += htons(tunnel_port); + if(bind(local_server_socketfd, (struct sockaddr*)&local_server_address, local_server_len) < 0){ + DEBUG("tunnel bind failed"); + return NULL; } + getsockname(local_server_socketfd, + (struct sockaddr*) &local_server_address_lookup, + &local_server_address_lookup_len); + tunnel_port = (int)ntohs(local_server_address_lookup.sin_port); DEBUG ("tunnel bound to local port %i", tunnel_port); // increase client buffer size? @@ -201,7 +209,7 @@ tunnel_thread (gpointer _data) ovirt_server_socket = socket(PF_INET, SOCK_STREAM, 0); c_socket = malloc(sizeof(int)); *c_socket = ovirt_server_socket; sockets = g_slist_prepend(sockets, c_socket); - DEBUG ("connecting to ovirt server %s on %i", hostname, OVIRT_SERVER_PORT); + DEBUG ("connecting to ovirt server %s on %i", hostname, ovirt_server_vnc_port); if(connect(ovirt_server_socket, (struct sockaddr*)&ovirt_server_address, ovirt_server_len) < 0){ DEBUG ("could not connect to ovirt server"); break;