[Ovirt-devel] [PATCH] few minor bugfixes

Joey Boggs jboggs at redhat.com
Tue Jun 9 20:25:22 UTC 2009


Mohammed Morsi wrote:
>  - 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?
>   
ACK




More information about the ovirt-devel mailing list