Skip to content

Instantly share code, notes, and snippets.

@Risca
Created June 11, 2013 09:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Risca/5755605 to your computer and use it in GitHub Desktop.
Save Risca/5755605 to your computer and use it in GitHub Desktop.
IPv6 support for Linux Synergy (tested on Sabayon Linux)
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