#include <netinet/in.h>
#endif
+#include <arpa/inet.h>
+
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
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