Created
June 11, 2013 09:26
-
-
Save Risca/5755605 to your computer and use it in GitHub Desktop.
IPv6 support for Linux Synergy (tested on Sabayon Linux)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -uNr synergy-1.4.10-Source.orig/src/lib/arch/CArchNetworkBSD.cpp synergy-1.4.10-Source/src/lib/arch/CArchNetworkBSD.cpp | |
--- synergy-1.4.10-Source.orig/src/lib/arch/CArchNetworkBSD.cpp 2012-04-06 19:52:29.000000000 +0200 | |
+++ synergy-1.4.10-Source/src/lib/arch/CArchNetworkBSD.cpp 2012-11-13 17:47:14.224995060 +0100 | |
@@ -49,7 +49,8 @@ | |
static const int s_family[] = { | |
PF_UNSPEC, | |
- PF_INET | |
+ PF_INET, | |
+ PF_INET6, | |
}; | |
static const int s_type[] = { | |
SOCK_DGRAM, | |
@@ -187,8 +188,9 @@ | |
{ | |
assert(s != NULL); | |
assert(addr != NULL); | |
+ struct sockaddr* sa = reinterpret_cast<struct sockaddr*> (&addr->m_addr); | |
- if (bind(s->m_fd, &addr->m_addr, addr->m_len) == -1) { | |
+ if (bind(s->m_fd, sa, addr->m_len) == -1) { | |
throwError(errno); | |
} | |
} | |
@@ -220,8 +222,9 @@ | |
*addr = new CArchNetAddressImpl; | |
// accept on socket | |
+ struct sockaddr* sa = reinterpret_cast<struct sockaddr*> (&(*addr)->m_addr); | |
ACCEPT_TYPE_ARG3 len = (ACCEPT_TYPE_ARG3)((*addr)->m_len); | |
- int fd = accept(s->m_fd, &(*addr)->m_addr, &len); | |
+ int fd = accept(s->m_fd, sa, &len); | |
(*addr)->m_len = (socklen_t)len; | |
if (fd == -1) { | |
int err = errno; | |
@@ -263,7 +266,10 @@ | |
assert(s != NULL); | |
assert(addr != NULL); | |
- if (connect(s->m_fd, &addr->m_addr, addr->m_len) == -1) { | |
+ struct sockaddr* sa = reinterpret_cast< struct sockaddr*> (&addr->m_addr); | |
+ | |
+ std::string str = addrToString(addr); | |
+ if (connect(s->m_fd, sa , addr->m_len) == -1) { | |
if (errno == EISCONN) { | |
return true; | |
} | |
@@ -651,6 +657,16 @@ | |
break; | |
} | |
+ case kINET6: { | |
+ struct sockaddr_in6* ipAddr = | |
+ reinterpret_cast<struct sockaddr_in6*>(&addr->m_addr); | |
+ ipAddr->sin6_family = AF_INET6; | |
+ ipAddr->sin6_port = 0; | |
+ ipAddr->sin6_addr = in6addr_any; | |
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in6); | |
+ break; | |
+ } | |
+ | |
default: | |
delete addr; | |
assert(0 && "invalid family"); | |
@@ -674,6 +690,7 @@ | |
// allocate address | |
CArchNetAddressImpl* addr = new CArchNetAddressImpl; | |
+#if 0 | |
// try to convert assuming an IPv4 dot notation address | |
struct sockaddr_in inaddr; | |
memset(&inaddr, 0, sizeof(inaddr)); | |
@@ -715,7 +732,37 @@ | |
// done with static buffer | |
ARCH->unlockMutex(m_mutex); | |
} | |
+#else | |
+ char ipstr[INET6_ADDRSTRLEN]; | |
+ struct addrinfo hints; | |
+ struct addrinfo* p; | |
+ void* ipaddr; | |
+ int rv; | |
+ memset(&hints, 0, sizeof(hints)); | |
+ hints.ai_family = AF_UNSPEC; | |
+ | |
+ ARCH->lockMutex(m_mutex); | |
+ if ((rv = getaddrinfo(name.c_str(), NULL, &hints, &p)) != 0) { | |
+ ARCH->unlockMutex(m_mutex); | |
+ delete addr; | |
+ throwNameError(rv); | |
+ } | |
+ | |
+ // Accept first result | |
+ if (p->ai_family == AF_INET) { // IPv4 | |
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in); | |
+ } | |
+ else { // IPv6 | |
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in6); | |
+ } | |
+ memcpy(&addr->m_addr, p->ai_addr, addr->m_len); | |
+ | |
+ // Free stuff | |
+ freeaddrinfo(p); | |
+ ARCH->unlockMutex(m_mutex); | |
+ | |
+#endif | |
return addr; | |
} | |
@@ -734,6 +781,7 @@ | |
// mutexed name lookup (ugh) | |
ARCH->lockMutex(m_mutex); | |
+#if 0 | |
struct hostent* info = gethostbyaddr( | |
reinterpret_cast<const char*>(&addr->m_addr), | |
addr->m_len, addr->m_addr.sa_family); | |
@@ -747,7 +795,23 @@ | |
// done with static buffer | |
ARCH->unlockMutex(m_mutex); | |
+#else | |
+ char host[1024]; | |
+ char service[20]; | |
+ int rv; | |
+ struct sockaddr* sa = reinterpret_cast<struct sockaddr*> (&addr->m_addr); | |
+ rv = getnameinfo(sa , addr->m_len, host, sizeof(host), service, sizeof(service), 0); | |
+ if (rv != 0) { | |
+ ARCH->unlockMutex(m_mutex); | |
+ throwNameError(rv); | |
+ } | |
+ | |
+ // save name | |
+ std::string name = host; | |
+ ARCH->lockMutex(m_mutex); | |
+ | |
+#endif | |
return name; | |
} | |
@@ -766,6 +830,17 @@ | |
return s; | |
} | |
+ case kINET6: { | |
+ char str[INET6_ADDRSTRLEN]; | |
+ struct sockaddr_in6* ipAddr = | |
+ reinterpret_cast<struct sockaddr_in6*>(&addr->m_addr); | |
+ ARCH->lockMutex(m_mutex); | |
+ inet_ntop(ipAddr->sin6_family, &(ipAddr->sin6_addr), str, INET6_ADDRSTRLEN); | |
+ std::string s(str); | |
+ ARCH->unlockMutex(m_mutex); | |
+ return s; | |
+ } | |
+ | |
default: | |
assert(0 && "unknown address family"); | |
return ""; | |
@@ -777,9 +852,11 @@ | |
{ | |
assert(addr != NULL); | |
- switch (addr->m_addr.sa_family) { | |
+ switch (addr->m_addr.ss_family) { | |
case AF_INET: | |
return kINET; | |
+ case AF_INET6: | |
+ return kINET6; | |
default: | |
return kUNKNOWN; | |
@@ -799,6 +876,13 @@ | |
break; | |
} | |
+ case kINET6: { | |
+ struct sockaddr_in6* ipAddr = | |
+ reinterpret_cast<struct sockaddr_in6*>(&addr->m_addr); | |
+ ipAddr->sin6_port = htons(port); | |
+ break; | |
+ } | |
+ | |
default: | |
assert(0 && "unknown address family"); | |
break; | |
@@ -817,6 +901,12 @@ | |
return ntohs(ipAddr->sin_port); | |
} | |
+ case kINET6: { | |
+ struct sockaddr_in6* ipAddr = | |
+ reinterpret_cast<struct sockaddr_in6*>(&addr->m_addr); | |
+ return ntohs(ipAddr->sin6_port); | |
+ } | |
+ | |
default: | |
assert(0 && "unknown address family"); | |
return 0; | |
@@ -836,6 +926,14 @@ | |
addr->m_len == (socklen_t)sizeof(struct sockaddr_in)); | |
} | |
+ case kINET6: { | |
+ int rv; | |
+ struct sockaddr_in6* ipAddr = | |
+ reinterpret_cast<struct sockaddr_in6*>(&addr->m_addr); | |
+ rv = memcmp(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any)); | |
+ return (rv == 0 && addr->m_len == (socklen_t)sizeof(struct sockaddr_in6)); | |
+ } | |
+ | |
default: | |
assert(0 && "unknown address family"); | |
return true; | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/arch/CArchNetworkBSD.h synergy-1.4.10-Source/src/lib/arch/CArchNetworkBSD.h | |
--- synergy-1.4.10-Source.orig/src/lib/arch/CArchNetworkBSD.h 2012-04-06 19:52:29.000000000 +0200 | |
+++ synergy-1.4.10-Source/src/lib/arch/CArchNetworkBSD.h 2012-11-10 18:53:39.981449117 +0100 | |
@@ -49,8 +49,8 @@ | |
CArchNetAddressImpl() : m_len(sizeof(m_addr)) { } | |
public: | |
- struct sockaddr m_addr; | |
- socklen_t m_len; | |
+ struct sockaddr_storage m_addr; | |
+ socklen_t m_len; | |
}; | |
//! Berkeley (BSD) sockets implementation of IArchNetwork | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/arch/IArchNetwork.h synergy-1.4.10-Source/src/lib/arch/IArchNetwork.h | |
--- synergy-1.4.10-Source.orig/src/lib/arch/IArchNetwork.h 2012-04-02 15:32:06.000000000 +0200 | |
+++ synergy-1.4.10-Source/src/lib/arch/IArchNetwork.h 2012-11-10 15:52:27.545952245 +0100 | |
@@ -64,6 +64,7 @@ | |
enum EAddressFamily { | |
kUNKNOWN, | |
kINET, | |
+ kINET6, | |
}; | |
//! Supported socket types | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/client/CClient.cpp synergy-1.4.10-Source/src/lib/client/CClient.cpp | |
--- synergy-1.4.10-Source.orig/src/lib/client/CClient.cpp 2011-12-24 22:29:48.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/client/CClient.cpp 2012-11-10 20:05:05.881611742 +0100 | |
@@ -130,14 +130,19 @@ | |
// m_serverAddress will be null if the hostname address is not reolved | |
if (m_serverAddress.getAddress() != NULL) { | |
// to help users troubleshoot, show server host name (issue: 60) | |
- LOG((CLOG_NOTE "connecting to '%s': %s:%i", | |
+ LOG((CLOG_NOTE "connecting to '%s': [%s]:%i", | |
m_serverAddress.getHostname().c_str(), | |
ARCH->addrToString(m_serverAddress.getAddress()).c_str(), | |
m_serverAddress.getPort())); | |
} | |
// create the socket | |
+#if ARCH_NETWORK == CArchNetworkBSD | |
+ IArchNetwork::EAddressFamily inetFamily = ARCH->getAddrFamily(m_serverAddress.getAddress()); | |
+ IDataSocket* socket = m_socketFactory->create(inetFamily); | |
+#else | |
IDataSocket* socket = m_socketFactory->create(); | |
+#endif | |
// filter socket messages, including a packetizing filter | |
m_stream = socket; | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/CNetworkAddress.cpp synergy-1.4.10-Source/src/lib/net/CNetworkAddress.cpp | |
--- synergy-1.4.10-Source.orig/src/lib/net/CNetworkAddress.cpp 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/CNetworkAddress.cpp 2012-11-14 17:00:39.576043827 +0100 | |
@@ -54,6 +54,7 @@ | |
// do nothing | |
} | |
+#include <stdio.h> | |
CNetworkAddress::CNetworkAddress(const CString& hostname, int port) : | |
m_address(NULL), | |
m_hostname(hostname), | |
@@ -84,7 +85,7 @@ | |
// notation. in that case we assume it's not a port suffix. | |
// the user can replace the double colon with zeros to | |
// disambiguate. | |
- if ((!doubleColon || dotNotation) || !colonNotation) { | |
+ if ((!doubleColon || dotNotation) && !colonNotation) { | |
// parse port from hostname | |
char* end; | |
const char* chostname = m_hostname.c_str(); | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/CTCPListenSocket.cpp synergy-1.4.10-Source/src/lib/net/CTCPListenSocket.cpp | |
--- synergy-1.4.10-Source.orig/src/lib/net/CTCPListenSocket.cpp 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/CTCPListenSocket.cpp 2012-11-10 19:54:36.788247265 +0100 | |
@@ -32,11 +32,11 @@ | |
// CTCPListenSocket | |
// | |
-CTCPListenSocket::CTCPListenSocket() | |
+CTCPListenSocket::CTCPListenSocket(IArchNetwork::EAddressFamily family) | |
{ | |
m_mutex = new CMutex; | |
try { | |
- m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); | |
+ m_socket = ARCH->newSocket(family, IArchNetwork::kSTREAM); | |
} | |
catch (XArchNetwork& e) { | |
throw XSocketCreate(e.what()); | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/CTCPListenSocket.h synergy-1.4.10-Source/src/lib/net/CTCPListenSocket.h | |
--- synergy-1.4.10-Source.orig/src/lib/net/CTCPListenSocket.h 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/CTCPListenSocket.h 2012-11-10 19:52:36.646703436 +0100 | |
@@ -30,7 +30,7 @@ | |
*/ | |
class CTCPListenSocket : public IListenSocket { | |
public: | |
- CTCPListenSocket(); | |
+ CTCPListenSocket(IArchNetwork::EAddressFamily family = IArchNetwork::kINET); | |
~CTCPListenSocket(); | |
// ISocket overrides | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/CTCPSocket.cpp synergy-1.4.10-Source/src/lib/net/CTCPSocket.cpp | |
--- synergy-1.4.10-Source.orig/src/lib/net/CTCPSocket.cpp 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/CTCPSocket.cpp 2012-11-10 19:49:03.350285045 +0100 | |
@@ -34,12 +34,12 @@ | |
// CTCPSocket | |
// | |
-CTCPSocket::CTCPSocket() : | |
+CTCPSocket::CTCPSocket(IArchNetwork::EAddressFamily family) : | |
m_mutex(), | |
m_flushed(&m_mutex, true) | |
{ | |
try { | |
- m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); | |
+ m_socket = ARCH->newSocket(family, IArchNetwork::kSTREAM); | |
} | |
catch (XArchNetwork& e) { | |
throw XSocketCreate(e.what()); | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/CTCPSocketFactory.cpp synergy-1.4.10-Source/src/lib/net/CTCPSocketFactory.cpp | |
--- synergy-1.4.10-Source.orig/src/lib/net/CTCPSocketFactory.cpp 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/CTCPSocketFactory.cpp 2012-11-10 19:51:57.474176507 +0100 | |
@@ -34,13 +34,13 @@ | |
} | |
IDataSocket* | |
-CTCPSocketFactory::create() const | |
+CTCPSocketFactory::create(IArchNetwork::EAddressFamily family) const | |
{ | |
- return new CTCPSocket; | |
+ return new CTCPSocket(family); | |
} | |
IListenSocket* | |
-CTCPSocketFactory::createListen() const | |
+CTCPSocketFactory::createListen(IArchNetwork::EAddressFamily family) const | |
{ | |
- return new CTCPListenSocket; | |
+ return new CTCPListenSocket(family); | |
} | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/CTCPSocketFactory.h synergy-1.4.10-Source/src/lib/net/CTCPSocketFactory.h | |
--- synergy-1.4.10-Source.orig/src/lib/net/CTCPSocketFactory.h 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/CTCPSocketFactory.h 2012-11-10 19:49:27.886989290 +0100 | |
@@ -27,8 +27,8 @@ | |
virtual ~CTCPSocketFactory(); | |
// ISocketFactory overrides | |
- virtual IDataSocket* create() const; | |
- virtual IListenSocket* createListen() const; | |
+ virtual IDataSocket* create(IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const; | |
+ virtual IListenSocket* createListen(IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const; | |
}; | |
#endif | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/CTCPSocket.h synergy-1.4.10-Source/src/lib/net/CTCPSocket.h | |
--- synergy-1.4.10-Source.orig/src/lib/net/CTCPSocket.h 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/CTCPSocket.h 2012-11-10 19:43:17.088475512 +0100 | |
@@ -34,7 +34,7 @@ | |
*/ | |
class CTCPSocket : public IDataSocket { | |
public: | |
- CTCPSocket(); | |
+ CTCPSocket(IArchNetwork::EAddressFamily family = IArchNetwork::kINET); | |
CTCPSocket(CArchSocket); | |
~CTCPSocket(); | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/net/ISocketFactory.h synergy-1.4.10-Source/src/lib/net/ISocketFactory.h | |
--- synergy-1.4.10-Source.orig/src/lib/net/ISocketFactory.h 2011-01-15 05:12:51.000000000 +0100 | |
+++ synergy-1.4.10-Source/src/lib/net/ISocketFactory.h 2012-11-10 19:50:42.617083251 +0100 | |
@@ -19,6 +19,7 @@ | |
#define ISOCKETFACTORY_H | |
#include "IInterface.h" | |
+#include "IArchNetwork.h" | |
class IDataSocket; | |
class IListenSocket; | |
@@ -34,10 +35,10 @@ | |
//@{ | |
//! Create data socket | |
- virtual IDataSocket* create() const = 0; | |
+ virtual IDataSocket* create(IArchNetwork::EAddressFamily = IArchNetwork::kINET) const = 0; | |
//! Create listen socket | |
- virtual IListenSocket* createListen() const = 0; | |
+ virtual IListenSocket* createListen(IArchNetwork::EAddressFamily = IArchNetwork::kINET) const = 0; | |
//@} | |
}; | |
diff -uNr synergy-1.4.10-Source.orig/src/lib/server/CClientListener.cpp synergy-1.4.10-Source/src/lib/server/CClientListener.cpp | |
--- synergy-1.4.10-Source.orig/src/lib/server/CClientListener.cpp 2012-07-05 20:05:35.000000000 +0200 | |
+++ synergy-1.4.10-Source/src/lib/server/CClientListener.cpp 2012-11-10 20:04:15.007228357 +0100 | |
@@ -45,7 +45,12 @@ | |
try { | |
// create listen socket | |
+#if ARCH_NETWORK == CArchNetworkBSD | |
+ IArchNetwork::EAddressFamily inetFamily = ARCH->getAddrFamily(address.getAddress()); | |
+ m_listen = m_socketFactory->createListen(inetFamily); | |
+#else | |
m_listen = m_socketFactory->createListen(); | |
+#endif | |
// bind listen address | |
LOG((CLOG_DEBUG1 "binding listen socket")); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment