Index: vino/ChangeLog =================================================================== --- vino.orig/ChangeLog 2006-10-20 10:23:19.000000000 +0100 +++ vino.orig/ChangeLog 2006-10-20 10:23:19.000000000 +0100 @@ -0,0 +0,11 @@ +2006-10-20 Mark McLoughlin + + Use inet_ntop() instead of inet_ntoa() + + * vino/server/libvncserver/rfbserver.c: + (rfbSockaddrToHostname): function to use inet_ntop + on ipv4, ipv4-mapped ipv6 and ipv6 addresses. + (rfbNewClient): use it. + + * vino/server/libvncserver/CHANGES: add note. + Index: vino/server/libvncserver/CHANGES =================================================================== --- vino.orig/server/libvncserver/CHANGES 2006-10-20 10:21:57.000000000 +0100 +++ vino.orig/server/libvncserver/CHANGES 2006-10-20 10:21:57.000000000 +0100 @@ -30,6 +30,9 @@ be prompted on whether to allow authenticated clients to connect. A second level of authentication. + + Added IPv6 support: + - Use inet_ntop() instead of inet_ntoa() + + Added rfbSetLocalOnly() - i.e. make the server only accept connections from localhost. Useful for people who use SSH tunnels. Index: vino/server/libvncserver/rfbserver.c =================================================================== --- vino.orig/server/libvncserver/rfbserver.c 2006-10-20 10:21:57.000000000 +0100 +++ vino.orig/server/libvncserver/rfbserver.c 2006-10-20 10:21:57.000000000 +0100 @@ -118,6 +118,51 @@ rfbReleaseClientIterator(rfbClientIterat } +static char * +rfbSockaddrToHostname(struct sockaddr *addr) +{ + char buf_in[INET_ADDRSTRLEN]; + char buf_in6[INET_ADDRSTRLEN]; + void *src; + char *buf; + int buflen; + + /* + * Need to handle 3 cases: + * 1) IPv4 address + * 2) IPv4-mapped IPv6 address + * 3) IPv6 address + */ + + if (addr->sa_family == AF_INET) { + struct sockaddr_in *addr_in; + + addr_in = (struct sockaddr_in *) addr; + + src = &addr_in->sin_addr; + buf = buf_in; + buflen = sizeof (buf_in); + + } else /* if (addr->sa_family == AF_INET6) */ { + struct sockaddr_in6 *addr_in6; + + addr_in6 = (struct sockaddr_in6 *) addr; + + if (IN6_IS_ADDR_V4MAPPED (&addr_in6->sin6_addr)) + src = &(addr_in6->sin6_addr.s6_addr[12]); + else + src = &addr_in6->sin6_addr; + + buf = buf_in6; + buflen = sizeof (buf_in6); + } + + if (inet_ntop(addr->sa_family, src, buf, buflen) == NULL) + return NULL; + + return strdup(buf); +} + /* * rfbNewClientConnection is called from sockets.c when a new connection * comes in. @@ -161,7 +206,10 @@ rfbNewClient(rfbScreenInfoPtr rfbScreen, int one=1; getpeername(sock, (struct sockaddr *)&addr, &addrlen); - cl->host = strdup(inet_ntoa(addr.sin_addr)); + + cl->host = rfbSockaddrToHostname ((struct sockaddr *) &addr); + + rfbLog("Got connection from client %s\n", cl->host); rfbLog(" other clients:\n"); iterator = rfbGetClientIterator(rfbScreen);