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-ca57d06f2519tags/v0.0.90
@@ -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]) | |||
@@ -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); |
@@ -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 |
@@ -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 |
@@ -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 */ |