From be4c3acee78f27f979849677c52b3c5d9dc5acb0 Mon Sep 17 00:00:00 2001 From: Adam Tkac Date: Wed, 10 Dec 2008 16:42:33 +0000 Subject: [PATCH] [Layout] Added os/net.[ch]. They will include wrappers for missing IPv6 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 | 9 +++--- common/network/TcpSocket.cxx | 20 ++++++------- common/os/Makefile.am | 4 +-- common/os/net.c | 52 ++++++++++++++++++++++++++++++++++ common/os/net.h | 54 ++++++++++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 common/os/net.c create mode 100644 common/os/net.h diff --git a/common/configure.ac b/common/configure.ac index c07b7fd9..ab7829b0 100644 --- a/common/configure.ac +++ b/common/configure.ac @@ -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]) diff --git a/common/network/TcpSocket.cxx b/common/network/TcpSocket.cxx index 4a37d01c..7ceff0b0 100644 --- a/common/network/TcpSocket.cxx +++ b/common/network/TcpSocket.cxx @@ -24,9 +24,6 @@ //#include #include #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 #include +#include #include #include @@ -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); diff --git a/common/os/Makefile.am b/common/os/Makefile.am index 23e4dfb2..3d892609 100644 --- a/common/os/Makefile.am +++ b/common/os/Makefile.am @@ -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 index 00000000..50ce8687 --- /dev/null +++ b/common/os/net.c @@ -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 +#endif + +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#include +#endif + +#include + + +#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 index 00000000..72471032 --- /dev/null +++ b/common/os/net.h @@ -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 +#endif + +#ifdef WIN32 +#include +#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 */ -- 2.39.5