[Ovirt-devel] [PATCH] few minor bugfixes

Mohammed Morsi mmorsi at redhat.com
Mon Jun 8 20:09:52 UTC 2009


 - perform dns lookup on hostname,
 - randomize local tunnel port
 - bump rpm spec version

 updated to include danpb's feedback regarding getaddrinfo
---
 main.c            |   36 ++++++++++++++++++------------------
 ovirt-viewer.spec |    9 ++++++++-
 tunnel.c          |   29 ++++++++++++++++++++---------
 3 files changed, 46 insertions(+), 28 deletions(-)

diff --git a/main.c b/main.c
index 2962f3f..23af6fa 100644
--- a/main.c
+++ b/main.c
@@ -36,6 +36,8 @@
 #include <netinet/in.h>
 #endif
 
+#include <arpa/inet.h>
+
 #ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
 #endif
@@ -903,37 +905,35 @@ viewer_credential (GtkWidget *vnc, GValueArray *credList)
                 gtk_widget_destroy(GTK_WIDGET(dialog));
 }
 
-#if defined(HAVE_SOCKET) && defined(HAVE_CONNECT) && defined(HAVE_HTONS) && defined(HAVE_GETHOSTBYNAME)
+#if defined(HAVE_SOCKET) && defined(HAVE_CONNECT) && defined(HAVE_HTONS)
 
 static int 
 viewer_open_vnc_socket(const char* vnchost, int vncport)
 {
-  int socketfd;
-  struct hostent *serv;
-  struct sockaddr_in serv_addr;
+  int result, socketfd;
+  char port[10];
+  struct addrinfo* vnc_addr;
 
-  socketfd = socket(PF_INET, SOCK_STREAM, 0);
-  if(socketfd < 0){
-      return -1;
-  }
+  sprintf(port, "%d", vncport);
 
-  serv = gethostbyname(vnchost);
-  if(serv == NULL){
+  result = getaddrinfo(vnchost, port, NULL, &vnc_addr);
+  if(result != 0 || vnc_addr == NULL)
       return -1;
-  }
 
-  serv_addr.sin_family = PF_INET;
-  serv_addr.sin_port = htons(vncport);
-  serv_addr.sin_addr.s_addr = ((struct in_addr *)(serv->h_addr))->s_addr; 
+  // just use first found, ignoring rest
+  socketfd = socket(vnc_addr->ai_family,
+                    vnc_addr->ai_socktype,
+                    vnc_addr->ai_protocol);
 
-  if (connect(socketfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0){
-      return -1;
-  }
+  if(connect(socketfd, vnc_addr->ai_addr, vnc_addr->ai_addrlen) <0)
+      socketfd = -1;
+
+  freeaddrinfo(vnc_addr);
 
   return socketfd;
 }
 
-#endif /* defined(HAVE_SOCKET) && defined(HAVE_CONNECT) && defined(HAVE_HTONS) && defined(HAVE_GETHOSTBYNAME) */
+#endif /* defined(HAVE_SOCKET) && defined(HAVE_CONNECT) && defined(HAVE_HTONS) */
 
 /* Remove all menu items from the Connect menu. */
 static void
diff --git a/ovirt-viewer.spec b/ovirt-viewer.spec
index a320ecd..a4d826e 100644
--- a/ovirt-viewer.spec
+++ b/ovirt-viewer.spec
@@ -2,7 +2,7 @@
 
 Name: ovirt-viewer
 Version: 1.0.0
-Release: 2%{?dist}
+Release: 4%{?dist}
 Summary: ovirt-viewer is a vnc viewer for ovirt managed vms
 
 Group: Applications/System
@@ -61,6 +61,13 @@ rm -rf $RPM_BUILD_ROOT
 %{_bindir}/ovirt-viewer
 
 %changelog
+* Mon Jun  01 2009  <mmorsi at redhat.com> - 1.0.0-4
+- bugfixes, dns lookup and local tunnel port assignment
+
+* Wed May  20 2009  <mmorsi at redhat.com> - 1.0.0-3
+- changes to viewer to connect to ovirt server
+  through vnc proxy
+
 * Thu Apr  30 2009  <mmorsi at redhat.com> - 1.0.0-2
 - ssl support, see check-certificate cmd line flag
 - wire up send key menu
diff --git a/tunnel.c b/tunnel.c
index a03ef0b..c6d091d 100644
--- 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?
-- 
1.6.0.6




More information about the ovirt-devel mailing list