few minor bugfixes
[ovirt-viewer.git] / tunnel.c
index a03ef0b..c6d091d 100644 (file)
--- a/tunnel.c
+++ b/tunnel.c
@@ -34,6 +34,7 @@
 #include <sys/socket.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <unistd.h>
@@ -46,9 +47,6 @@
 
 /* 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;
 
@@ -137,6 +135,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 +145,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,8 +157,13 @@ 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_addr.s_addr = ((struct in_addr*)(dns_serv->h_addr))->s_addr; //inet_addr(hostname);
   ovirt_server_address.sin_port = htons(OVIRT_SERVER_PORT);
   ovirt_server_len = sizeof(ovirt_server_address);
 
@@ -165,18 +173,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?