Browse Source

[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
tags/v0.0.90
Adam Tkac 15 years ago
parent
commit
be4c3acee7
5 changed files with 122 additions and 17 deletions
  1. 5
    4
      common/configure.ac
  2. 9
    11
      common/network/TcpSocket.cxx
  3. 2
    2
      common/os/Makefile.am
  4. 52
    0
      common/os/net.c
  5. 54
    0
      common/os/net.h

+ 5
- 4
common/configure.ac View 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])


+ 9
- 11
common/network/TcpSocket.cxx View 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);

+ 2
- 2
common/os/Makefile.am View 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

+ 52
- 0
common/os/net.c View File

@@ -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

+ 54
- 0
common/os/net.h View File

@@ -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 */

Loading…
Cancel
Save