]> source.dussan.org Git - tigervnc.git/commitdiff
[Layout] Added os/net.[ch]. They will include wrappers for missing IPv6
authorAdam Tkac <atkac@redhat.com>
Wed, 10 Dec 2008 16:42:33 +0000 (16:42 +0000)
committerAdam Tkac <atkac@redhat.com>
Wed, 10 Dec 2008 16:42:33 +0000 (16:42 +0000)
         capabilities and should hide common networking related differences
         between OSs

[Port] Implement IPv4-only version of inet_ntop for OSs which doesn't have it

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3369 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/configure.ac
common/network/TcpSocket.cxx
common/os/Makefile.am
common/os/net.c [new file with mode: 0644]
common/os/net.h [new file with mode: 0644]

index c07b7fd9fabbe045ed9247c3979de0dc9d7c583a..ab7829b0fcaf23fa27fc148c65e2ef2009d59550 100644 (file)
@@ -85,11 +85,12 @@ AC_ARG_WITH([included-jpeg],
 AM_CONDITIONAL([INCLUDED_JPEG], [ test "x$INCLUDED_JPEG" = xyes ])
 AC_CONFIG_SUBDIRS([jpeg])
 
-AC_CHECK_FUNCS_ONCE([vsnprintf snprintf strcasecmp strncasecmp getaddrinfo])
+AC_CHECK_FUNCS_ONCE([vsnprintf snprintf strcasecmp strncasecmp])
 
-AC_CHECK_TYPES([socklen_t],
-       [AC_DEFINE([VNC_SOCKLEN_T], [socklen_t], [Use correct size])],
-       [AC_DEFINE([VNC_SOCKLEN_T], [int])])
+# IPv6 related functions
+AC_CHECK_FUNCS_ONCE([inet_ntop getaddrinfo])
+
+AC_CHECK_TYPES([socklen_t])
 
 AC_CHECK_HEADERS([sys/select.h])
 
index 4a37d01c5d2d454cca124d026d5a66524e42110f..7ceff0b002514da6618050ead4fd697f81ba015b 100644 (file)
@@ -24,9 +24,6 @@
 //#include <io.h>
 #include <winsock2.h>
 #define errorNumber WSAGetLastError()
-#ifndef VNC_SOCKLEN_T
-#define VNC_SOCKLEN_T int
-#endif
 #else
 #define errorNumber errno
 #define closesocket close
@@ -45,6 +42,7 @@
 
 #include <stdlib.h>
 #include <network/TcpSocket.h>
+#include <os/net.h>
 #include <rfb/util.h>
 #include <rfb/LogWriter.h>
 
@@ -124,7 +122,7 @@ TcpSocket::TcpSocket(const char *host, int port)
 {
   int sock, err, result, family;
   vnc_sockaddr_t sa;
-  VNC_SOCKLEN_T salen;
+  socklen_t salen;
 #ifdef HAVE_GETADDRINFO
   struct addrinfo *ai, *current, hints;
 #endif
@@ -233,7 +231,7 @@ TcpSocket::~TcpSocket() {
 char* TcpSocket::getMyAddress() {
   struct sockaddr_in  info;
   struct in_addr    addr;
-  VNC_SOCKLEN_T info_size = sizeof(info);
+  socklen_t info_size = sizeof(info);
 
   getsockname(getFd(), (struct sockaddr *)&info, &info_size);
   memcpy(&addr, &info.sin_addr, sizeof(addr));
@@ -263,7 +261,7 @@ char* TcpSocket::getMyEndpoint() {
 char* TcpSocket::getPeerAddress() {
   struct sockaddr_in  info;
   struct in_addr    addr;
-  VNC_SOCKLEN_T info_size = sizeof(info);
+  socklen_t info_size = sizeof(info);
 
   getpeername(getFd(), (struct sockaddr *)&info, &info_size);
   memcpy(&addr, &info.sin_addr, sizeof(addr));
@@ -278,7 +276,7 @@ char* TcpSocket::getPeerAddress() {
 
 int TcpSocket::getPeerPort() {
   struct sockaddr_in  info;
-  VNC_SOCKLEN_T info_size = sizeof(info);
+  socklen_t info_size = sizeof(info);
 
   getpeername(getFd(), (struct sockaddr *)&info, &info_size);
   return ntohs(info.sin_port);
@@ -296,7 +294,7 @@ char* TcpSocket::getPeerEndpoint() {
 
 bool TcpSocket::sameMachine() {
   struct sockaddr_in peeraddr, myaddr;
-  VNC_SOCKLEN_T addrlen = sizeof(struct sockaddr_in);
+  socklen_t addrlen = sizeof(struct sockaddr_in);
 
   getpeername(getFd(), (struct sockaddr *)&peeraddr, &addrlen);
   getsockname(getFd(), (struct sockaddr *)&myaddr, &addrlen);
@@ -324,21 +322,21 @@ bool TcpSocket::enableNagles(int sock, bool enable) {
 bool TcpSocket::isSocket(int sock)
 {
   struct sockaddr_in info;
-  VNC_SOCKLEN_T info_size = sizeof(info);
+  socklen_t info_size = sizeof(info);
   return getsockname(sock, (struct sockaddr *)&info, &info_size) >= 0;
 }
 
 bool TcpSocket::isConnected(int sock)
 {
   struct sockaddr_in info;
-  VNC_SOCKLEN_T info_size = sizeof(info);
+  socklen_t info_size = sizeof(info);
   return getpeername(sock, (struct sockaddr *)&info, &info_size) >= 0;
 }
 
 int TcpSocket::getSockPort(int sock)
 {
   struct sockaddr_in info;
-  VNC_SOCKLEN_T info_size = sizeof(info);
+  socklen_t info_size = sizeof(info);
   if (getsockname(sock, (struct sockaddr *)&info, &info_size) < 0)
     return 0;
   return ntohs(info.sin_port);
index 23e4dfb2ba7c0d17b231db5aff4df340700edc25..3d892609294f6006e62b21fbacd93e8ec7b9bf1f 100644 (file)
@@ -1,5 +1,5 @@
 noinst_LTLIBRARIES = libos.la
 
-HDRS = print.h
+HDRS = net.h print.h
 
-libos_la_SOURCES = $(HDRS) print.c
+libos_la_SOURCES = $(HDRS) print.c net.c
diff --git a/common/os/net.c b/common/os/net.c
new file mode 100644 (file)
index 0000000..50ce868
--- /dev/null
@@ -0,0 +1,52 @@
+/* Copyright (C) 2008 TightVNC Team.  All Rights Reserved.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifdef HAVE_COMMON_CONFIG_H
+#include <common-config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef WIN32
+#include <winsock2.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#include <os/net.h>
+
+
+#ifndef HAVE_INET_NTOP
+const char *tight_inet_ntop(int af, const void *src, char *dst,
+                           socklen_t size) {
+       char *tempstr;
+
+       /* Catch bugs - we should not use IPv6 if we don't have inet_ntop */
+       if (af != AF_INET)
+               abort();
+
+       /* inet_ntoa never fails */
+       tempstr = inet_ntoa(*(struct in_addr *)(src));
+       memcpy(dst, tempstr, strlen(tempstr) + 1);
+
+       return dst;
+}
+#endif
diff --git a/common/os/net.h b/common/os/net.h
new file mode 100644 (file)
index 0000000..7247103
--- /dev/null
@@ -0,0 +1,54 @@
+/* Copyright (C) 2008 TightVNC Team.  All Rights Reserved.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ */
+
+#ifndef OS_NET_H
+#define OS_NET_H
+
+#ifdef HAVE_COMMON_CONFIG_H
+#include <common-config.h>
+#endif
+
+#ifdef WIN32
+#include <common-config.win.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef HAVE_SOCKLEN_T
+typedef int socklen_t;
+#endif
+
+/* IPv6 support on server side - we have to have all those functions */
+#if defined(HAVE_INET_NTOP)
+#define HAVE_IPV6
+#endif
+
+/* IPv4-only stub implementation */
+#ifndef HAVE_INET_NTOP
+const char *tight_inet_ntop(int af, const void *restrict src,
+                           char *restrict dst, socklen_t size);
+#define inet_ntop tight_inet_ntop
+#endif
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* OS_NET_H */