Quellcode durchsuchen

Use abstract SocketListener class

Makes the code more general and not directly tied to specifically
TCP sockets.
tags/v1.8.90
Pierre Ossman vor 6 Jahren
Ursprung
Commit
e3a2be69c4

+ 2
- 0
common/network/Socket.h Datei anzeigen

// 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;}

+ 4
- 4
common/network/TcpSocket.cxx Datei anzeigen

} }




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();



+ 5
- 4
common/network/TcpSocket.h Datei anzeigen

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 {

+ 4
- 4
unix/x0vncserver/x0vncserver.cxx Datei anzeigen

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)) {

+ 1
- 1
unix/xserver/hw/vnc/RFBGlue.cc Datei anzeigen

{ {
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();

+ 7
- 7
unix/xserver/hw/vnc/XserverDesktop.cc Datei anzeigen

#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)

+ 6
- 6
unix/xserver/hw/vnc/XserverDesktop.h Datei anzeigen

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;

+ 2
- 2
unix/xserver/hw/vnc/vncExtInit.cc Datei anzeigen

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))
{ {

+ 3
- 3
vncviewer/vncviewer.cxx Datei anzeigen

#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)) {

+ 4
- 4
win/winvnc/ManagedListener.cxx Datei anzeigen



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)

+ 1
- 1
win/winvnc/ManagedListener.h Datei anzeigen



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;

Laden…
Abbrechen
Speichern