Makes the code more general and not directly tied to specifically TCP sockets.tags/v1.8.90
// if one is installed. Otherwise, returns 0. | // if one is installed. Otherwise, returns 0. | ||||
virtual Socket* accept() = 0; | virtual Socket* accept() = 0; | ||||
virtual int getMyPort() = 0; | |||||
// setFilter() applies the specified filter to all new connections | // setFilter() applies the specified filter to all new connections | ||||
void setFilter(ConnectionFilter* f) {filter = f;} | void setFilter(ConnectionFilter* f) {filter = f;} | ||||
int getFd() {return fd;} | int getFd() {return fd;} |
} | } | ||||
void network::createLocalTcpListeners(std::list<TcpListener*> *listeners, | |||||
void network::createLocalTcpListeners(std::list<SocketListener*> *listeners, | |||||
int port) | int port) | ||||
{ | { | ||||
struct addrinfo ai[2]; | struct addrinfo ai[2]; | ||||
createTcpListeners(listeners, ai); | createTcpListeners(listeners, ai); | ||||
} | } | ||||
void network::createTcpListeners(std::list<TcpListener*> *listeners, | |||||
void network::createTcpListeners(std::list<SocketListener*> *listeners, | |||||
const char *addr, | const char *addr, | ||||
int port) | int port) | ||||
{ | { | ||||
} | } | ||||
} | } | ||||
void network::createTcpListeners(std::list<TcpListener*> *listeners, | |||||
void network::createTcpListeners(std::list<SocketListener*> *listeners, | |||||
const struct addrinfo *ai) | const struct addrinfo *ai) | ||||
{ | { | ||||
const struct addrinfo *current; | const struct addrinfo *current; | ||||
std::list<TcpListener*> new_listeners; | |||||
std::list<SocketListener*> new_listeners; | |||||
initSockets(); | initSockets(); | ||||
virtual void shutdown(); | virtual void shutdown(); | ||||
virtual Socket* accept(); | virtual Socket* accept(); | ||||
virtual int getMyPort(); | |||||
static void getMyAddresses(std::list<char*>* result); | static void getMyAddresses(std::list<char*>* result); | ||||
int getMyPort(); | |||||
}; | }; | ||||
void createLocalTcpListeners(std::list<TcpListener*> *listeners, | |||||
void createLocalTcpListeners(std::list<SocketListener*> *listeners, | |||||
int port); | int port); | ||||
void createTcpListeners(std::list<TcpListener*> *listeners, | |||||
void createTcpListeners(std::list<SocketListener*> *listeners, | |||||
const char *addr, | const char *addr, | ||||
int port); | int port); | ||||
void createTcpListeners(std::list<TcpListener*> *listeners, | |||||
void createTcpListeners(std::list<SocketListener*> *listeners, | |||||
const struct addrinfo *ai); | const struct addrinfo *ai); | ||||
typedef struct vnc_sockaddr { | typedef struct vnc_sockaddr { |
signal(SIGINT, CleanupSignalHandler); | signal(SIGINT, CleanupSignalHandler); | ||||
signal(SIGTERM, CleanupSignalHandler); | signal(SIGTERM, CleanupSignalHandler); | ||||
std::list<TcpListener*> listeners; | |||||
std::list<SocketListener*> listeners; | |||||
try { | try { | ||||
TXWindow::init(dpy,"x0vncserver"); | TXWindow::init(dpy,"x0vncserver"); | ||||
const char *hostsData = hostsFile.getData(); | const char *hostsData = hostsFile.getData(); | ||||
FileTcpFilter fileTcpFilter(hostsData); | FileTcpFilter fileTcpFilter(hostsData); | ||||
if (strlen(hostsData) != 0) | if (strlen(hostsData) != 0) | ||||
for (std::list<TcpListener*>::iterator i = listeners.begin(); | |||||
for (std::list<SocketListener*>::iterator i = listeners.begin(); | |||||
i != listeners.end(); | i != listeners.end(); | ||||
i++) | i++) | ||||
(*i)->setFilter(&fileTcpFilter); | (*i)->setFilter(&fileTcpFilter); | ||||
FD_ZERO(&wfds); | FD_ZERO(&wfds); | ||||
FD_SET(ConnectionNumber(dpy), &rfds); | FD_SET(ConnectionNumber(dpy), &rfds); | ||||
for (std::list<TcpListener*>::iterator i = listeners.begin(); | |||||
for (std::list<SocketListener*>::iterator i = listeners.begin(); | |||||
i != listeners.end(); | i != listeners.end(); | ||||
i++) | i++) | ||||
FD_SET((*i)->getFd(), &rfds); | FD_SET((*i)->getFd(), &rfds); | ||||
} | } | ||||
// Accept new VNC connections | // Accept new VNC connections | ||||
for (std::list<TcpListener*>::iterator i = listeners.begin(); | |||||
for (std::list<SocketListener*>::iterator i = listeners.begin(); | |||||
i != listeners.end(); | i != listeners.end(); | ||||
i++) { | i++) { | ||||
if (FD_ISSET((*i)->getFd(), &rfds)) { | if (FD_ISSET((*i)->getFd(), &rfds)) { |
{ | { | ||||
try { | try { | ||||
// Attempt to create TCPListeners on that port. | // Attempt to create TCPListeners on that port. | ||||
std::list<network::TcpListener*> dummy; | |||||
std::list<network::SocketListener*> dummy; | |||||
network::createTcpListeners (&dummy, 0, port); | network::createTcpListeners (&dummy, 0, port); | ||||
while (!dummy.empty()) { | while (!dummy.empty()) { | ||||
delete dummy.back(); | delete dummy.back(); |
#include <fcntl.h> | #include <fcntl.h> | ||||
#include <sys/utsname.h> | #include <sys/utsname.h> | ||||
#include <network/TcpSocket.h> | |||||
#include <network/Socket.h> | |||||
#include <rfb/Exception.h> | #include <rfb/Exception.h> | ||||
#include <rfb/VNCServerST.h> | #include <rfb/VNCServerST.h> | ||||
#include <rfb/HTTPServer.h> | #include <rfb/HTTPServer.h> | ||||
XserverDesktop::XserverDesktop(int screenIndex_, | XserverDesktop::XserverDesktop(int screenIndex_, | ||||
std::list<network::TcpListener*> listeners_, | |||||
std::list<network::TcpListener*> httpListeners_, | |||||
std::list<network::SocketListener*> listeners_, | |||||
std::list<network::SocketListener*> httpListeners_, | |||||
const char* name, const rfb::PixelFormat &pf, | const char* name, const rfb::PixelFormat &pf, | ||||
int width, int height, | int width, int height, | ||||
void* fbptr, int stride) | void* fbptr, int stride) | ||||
if (!httpListeners.empty ()) | if (!httpListeners.empty ()) | ||||
httpServer = new FileHTTPServer(this); | httpServer = new FileHTTPServer(this); | ||||
for (std::list<TcpListener*>::iterator i = listeners.begin(); | |||||
for (std::list<SocketListener*>::iterator i = listeners.begin(); | |||||
i != listeners.end(); | i != listeners.end(); | ||||
i++) { | i++) { | ||||
vncSetNotifyFd((*i)->getFd(), screenIndex, true, false); | vncSetNotifyFd((*i)->getFd(), screenIndex, true, false); | ||||
} | } | ||||
for (std::list<TcpListener*>::iterator i = httpListeners.begin(); | |||||
for (std::list<SocketListener*>::iterator i = httpListeners.begin(); | |||||
i != httpListeners.end(); | i != httpListeners.end(); | ||||
i++) { | i++) { | ||||
vncSetNotifyFd((*i)->getFd(), screenIndex, true, false); | vncSetNotifyFd((*i)->getFd(), screenIndex, true, false); | ||||
} | } | ||||
bool XserverDesktop::handleListenerEvent(int fd, | bool XserverDesktop::handleListenerEvent(int fd, | ||||
std::list<TcpListener*>* sockets, | |||||
std::list<SocketListener*>* sockets, | |||||
SocketServer* sockserv) | SocketServer* sockserv) | ||||
{ | { | ||||
std::list<TcpListener*>::iterator i; | |||||
std::list<SocketListener*>::iterator i; | |||||
for (i = sockets->begin(); i != sockets->end(); i++) { | for (i = sockets->begin(); i != sockets->end(); i++) { | ||||
if ((*i)->getFd() == fd) | if ((*i)->getFd() == fd) |
class VNCServerST; | class VNCServerST; | ||||
} | } | ||||
namespace network { class TcpListener; class Socket; class SocketServer; } | |||||
namespace network { class SocketListener; class Socket; class SocketServer; } | |||||
class XserverDesktop : public rfb::SDesktop, public rfb::FullFramePixelBuffer, | class XserverDesktop : public rfb::SDesktop, public rfb::FullFramePixelBuffer, | ||||
public rdr::Substitutor, | public rdr::Substitutor, | ||||
public: | public: | ||||
XserverDesktop(int screenIndex, | XserverDesktop(int screenIndex, | ||||
std::list<network::TcpListener*> listeners_, | |||||
std::list<network::TcpListener*> httpListeners_, | |||||
std::list<network::SocketListener*> listeners_, | |||||
std::list<network::SocketListener*> httpListeners_, | |||||
const char* name, const rfb::PixelFormat &pf, | const char* name, const rfb::PixelFormat &pf, | ||||
int width, int height, void* fbptr, int stride); | int width, int height, void* fbptr, int stride); | ||||
virtual ~XserverDesktop(); | virtual ~XserverDesktop(); | ||||
protected: | protected: | ||||
bool handleListenerEvent(int fd, | bool handleListenerEvent(int fd, | ||||
std::list<network::TcpListener*>* sockets, | |||||
std::list<network::SocketListener*>* sockets, | |||||
network::SocketServer* sockserv); | network::SocketServer* sockserv); | ||||
bool handleSocketEvent(int fd, | bool handleSocketEvent(int fd, | ||||
network::SocketServer* sockserv, | network::SocketServer* sockserv, | ||||
int screenIndex; | int screenIndex; | ||||
rfb::VNCServerST* server; | rfb::VNCServerST* server; | ||||
rfb::HTTPServer* httpServer; | rfb::HTTPServer* httpServer; | ||||
std::list<network::TcpListener*> listeners; | |||||
std::list<network::TcpListener*> httpListeners; | |||||
std::list<network::SocketListener*> listeners; | |||||
std::list<network::SocketListener*> httpListeners; | |||||
bool directFbptr; | bool directFbptr; | ||||
uint32_t queryConnectId; | uint32_t queryConnectId; |
for (int scr = 0; scr < vncGetScreenCount(); scr++) { | for (int scr = 0; scr < vncGetScreenCount(); scr++) { | ||||
if (!desktop[scr]) { | if (!desktop[scr]) { | ||||
std::list<network::TcpListener*> listeners; | |||||
std::list<network::TcpListener*> httpListeners; | |||||
std::list<network::SocketListener*> listeners; | |||||
std::list<network::SocketListener*> httpListeners; | |||||
if (scr == 0 && vncInetdSock != -1) { | if (scr == 0 && vncInetdSock != -1) { | ||||
if (network::TcpSocket::isListening(vncInetdSock)) | if (network::TcpSocket::isListening(vncInetdSock)) | ||||
{ | { |
#endif | #endif | ||||
if (listenMode) { | if (listenMode) { | ||||
std::list<TcpListener*> listeners; | |||||
std::list<SocketListener*> listeners; | |||||
try { | try { | ||||
int port = 5500; | int port = 5500; | ||||
if (isdigit(vncServerName[0])) | if (isdigit(vncServerName[0])) | ||||
while (sock == NULL) { | while (sock == NULL) { | ||||
fd_set rfds; | fd_set rfds; | ||||
FD_ZERO(&rfds); | FD_ZERO(&rfds); | ||||
for (std::list<TcpListener*>::iterator i = listeners.begin(); | |||||
for (std::list<SocketListener*>::iterator i = listeners.begin(); | |||||
i != listeners.end(); | i != listeners.end(); | ||||
i++) | i++) | ||||
FD_SET((*i)->getFd(), &rfds); | FD_SET((*i)->getFd(), &rfds); | ||||
} | } | ||||
} | } | ||||
for (std::list<TcpListener*>::iterator i = listeners.begin (); | |||||
for (std::list<SocketListener*>::iterator i = listeners.begin (); | |||||
i != listeners.end(); | i != listeners.end(); | ||||
i++) | i++) | ||||
if (FD_ISSET((*i)->getFd(), &rfds)) { | if (FD_ISSET((*i)->getFd(), &rfds)) { |
ManagedListener::~ManagedListener() { | ManagedListener::~ManagedListener() { | ||||
if (!sockets.empty()) { | if (!sockets.empty()) { | ||||
std::list<network::TcpListener*>::iterator iter; | |||||
std::list<network::SocketListener*>::iterator iter; | |||||
for (iter = sockets.begin(); iter != sockets.end(); ++iter) | for (iter = sockets.begin(); iter != sockets.end(); ++iter) | ||||
manager->remListener(*iter); | manager->remListener(*iter); | ||||
sockets.clear(); | sockets.clear(); | ||||
delete filter; | delete filter; | ||||
filter = new network::TcpFilter(filterStr); | filter = new network::TcpFilter(filterStr); | ||||
if (!sockets.empty() && !localOnly) { | if (!sockets.empty() && !localOnly) { | ||||
std::list<network::TcpListener*>::iterator iter; | |||||
std::list<network::SocketListener*>::iterator iter; | |||||
for (iter = sockets.begin(); iter != sockets.end(); ++iter) | for (iter = sockets.begin(); iter != sockets.end(); ++iter) | ||||
(*iter)->setFilter(filter); | (*iter)->setFilter(filter); | ||||
} | } | ||||
} | } | ||||
void ManagedListener::refresh() { | void ManagedListener::refresh() { | ||||
std::list<network::TcpListener*>::iterator iter; | |||||
std::list<network::SocketListener*>::iterator iter; | |||||
if (!sockets.empty()) { | if (!sockets.empty()) { | ||||
for (iter = sockets.begin(); iter != sockets.end(); ++iter) | for (iter = sockets.begin(); iter != sockets.end(); ++iter) | ||||
manager->remListener(*iter); | manager->remListener(*iter); | ||||
for (iter = sockets.begin(); iter != sockets.end(); ++iter) | for (iter = sockets.begin(); iter != sockets.end(); ++iter) | ||||
manager->addListener(*iter, server, addrChangeNotifier); | manager->addListener(*iter, server, addrChangeNotifier); | ||||
} catch (...) { | } catch (...) { | ||||
std::list<network::TcpListener*>::iterator iter2; | |||||
std::list<network::SocketListener*>::iterator iter2; | |||||
for (iter2 = sockets.begin(); iter2 != iter; ++iter2) | for (iter2 = sockets.begin(); iter2 != iter; ++iter2) | ||||
manager->remListener(*iter2); | manager->remListener(*iter2); | ||||
for (; iter2 != sockets.end(); ++iter2) | for (; iter2 != sockets.end(); ++iter2) |
protected: | protected: | ||||
void refresh(); | void refresh(); | ||||
std::list<network::TcpListener*> sockets; | |||||
std::list<network::SocketListener*> sockets; | |||||
network::TcpFilter* filter; | network::TcpFilter* filter; | ||||
rfb::win32::SocketManager* manager; | rfb::win32::SocketManager* manager; | ||||
rfb::win32::SocketManager::AddressChangeNotifier* addrChangeNotifier; | rfb::win32::SocketManager::AddressChangeNotifier* addrChangeNotifier; |