Return TcpListener pointers rather than objects

It is easier to control object life time and avoid magical socket
duplication by having a single TcpListener object to pass around.
We have to be more careful about deleting the object though.
diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx
index 2d9a066..6b5d479 100644
--- a/unix/x0vncserver/x0vncserver.cxx
+++ b/unix/x0vncserver/x0vncserver.cxx
@@ -477,7 +477,7 @@
   signal(SIGINT, CleanupSignalHandler);
   signal(SIGTERM, CleanupSignalHandler);
 
-  std::list<TcpListener> listeners;
+  std::list<TcpListener*> listeners;
 
   try {
     TXWindow::init(dpy,"x0vncserver");
@@ -499,10 +499,10 @@
     const char *hostsData = hostsFile.getData();
     FileTcpFilter fileTcpFilter(hostsData);
     if (strlen(hostsData) != 0)
-      for (std::list<TcpListener>::iterator i = listeners.begin();
+      for (std::list<TcpListener*>::iterator i = listeners.begin();
            i != listeners.end();
            i++)
-        (*i).setFilter(&fileTcpFilter);
+        (*i)->setFilter(&fileTcpFilter);
     delete[] hostsData;
 
     PollingScheduler sched((int)pollingCycle, (int)maxProcessorUsage);
@@ -518,10 +518,10 @@
 
       FD_ZERO(&rfds);
       FD_SET(ConnectionNumber(dpy), &rfds);
-      for (std::list<TcpListener>::iterator i = listeners.begin();
+      for (std::list<TcpListener*>::iterator i = listeners.begin();
            i != listeners.end();
            i++)
-        FD_SET((*i).getFd(), &rfds);
+        FD_SET((*i)->getFd(), &rfds);
 
       server.getSockets(&sockets);
       int clients_connected = 0;
@@ -567,11 +567,11 @@
       }
 
       // Accept new VNC connections
-      for (std::list<TcpListener>::iterator i = listeners.begin();
+      for (std::list<TcpListener*>::iterator i = listeners.begin();
            i != listeners.end();
            i++) {
-        if (FD_ISSET((*i).getFd(), &rfds)) {
-          Socket* sock = (*i).accept();
+        if (FD_ISSET((*i)->getFd(), &rfds)) {
+          Socket* sock = (*i)->accept();
           if (sock) {
             server.addSocket(sock);
           } else {
diff --git a/unix/xserver/hw/vnc/RFBGlue.cc b/unix/xserver/hw/vnc/RFBGlue.cc
index a150792..9a014f1 100644
--- a/unix/xserver/hw/vnc/RFBGlue.cc
+++ b/unix/xserver/hw/vnc/RFBGlue.cc
@@ -190,9 +190,12 @@
 {
   try {
     // Attempt to create TCPListeners on that port.
-    // They go out of scope immediately and are destroyed.
-    std::list<network::TcpListener> dummy;
+    std::list<network::TcpListener*> dummy;
     network::createTcpListeners (&dummy, 0, port);
+    while (!dummy.empty()) {
+      delete dummy.back();
+      dummy.pop_back();
+    }
   } catch (rdr::Exception& e) {
     return 1;
   }
diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc
index 165afbb..9b91d9a 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.cc
+++ b/unix/xserver/hw/vnc/XserverDesktop.cc
@@ -91,8 +91,8 @@
 
 
 XserverDesktop::XserverDesktop(int screenIndex_,
-                               std::list<network::TcpListener> listeners_,
-                               std::list<network::TcpListener> httpListeners_,
+                               std::list<network::TcpListener*> listeners_,
+                               std::list<network::TcpListener*> httpListeners_,
                                const char* name, const rfb::PixelFormat &pf,
                                int width, int height,
                                void* fbptr, int stride)
@@ -114,6 +114,14 @@
 
 XserverDesktop::~XserverDesktop()
 {
+  while (!listeners.empty()) {
+    delete listeners.back();
+    listeners.pop_back();
+  }
+  while (!httpListeners.empty()) {
+    delete httpListeners.back();
+    httpListeners.pop_back();
+  }
   if (!directFbptr)
     delete [] data;
   delete httpServer;
@@ -222,7 +230,7 @@
   }
   if (strcmp(varName, "$PORT") == 0) {
     char* str = new char[10];
-    sprintf(str, "%d", listeners.empty () ? 0 : (*listeners.begin ()).getMyPort());
+    sprintf(str, "%d", listeners.empty () ? 0 : (*listeners.begin ())->getMyPort());
     return str;
   }
   if (strcmp(varName, "$WIDTH") == 0) {
@@ -393,14 +401,14 @@
 
     // Add all sockets we want read events for, after purging
     // any closed sockets.
-    for (std::list<network::TcpListener>::iterator i = listeners.begin();
+    for (std::list<network::TcpListener*>::iterator i = listeners.begin();
          i != listeners.end();
          i++)
-      FD_SET((*i).getFd(), fds);
-    for (std::list<network::TcpListener>::iterator i = httpListeners.begin();
+      FD_SET((*i)->getFd(), fds);
+    for (std::list<network::TcpListener*>::iterator i = httpListeners.begin();
          i != httpListeners.end();
          i++)
-      FD_SET((*i).getFd(), fds);
+      FD_SET((*i)->getFd(), fds);
 
     std::list<Socket*> sockets;
     std::list<Socket*>::iterator i;
@@ -456,24 +464,24 @@
     // First check for file descriptors with something to do
     if (nfds >= 1) {
 
-      for (std::list<network::TcpListener>::iterator i = listeners.begin();
+      for (std::list<network::TcpListener*>::iterator i = listeners.begin();
            i != listeners.end();
            i++) {
-        if (FD_ISSET((*i).getFd(), fds)) {
-          FD_CLR((*i).getFd(), fds);
-          Socket* sock = (*i).accept();
+        if (FD_ISSET((*i)->getFd(), fds)) {
+          FD_CLR((*i)->getFd(), fds);
+          Socket* sock = (*i)->accept();
           sock->outStream().setBlocking(false);
           server->addSocket(sock);
           vlog.debug("new client, sock %d",sock->getFd());
         }
       }
 
-      for (std::list<network::TcpListener>::iterator i = httpListeners.begin();
+      for (std::list<network::TcpListener*>::iterator i = httpListeners.begin();
            i != httpListeners.end();
            i++) {
-        if (FD_ISSET((*i).getFd(), fds)) {
-          FD_CLR((*i).getFd(), fds);
-          Socket* sock = (*i).accept();
+        if (FD_ISSET((*i)->getFd(), fds)) {
+          FD_CLR((*i)->getFd(), fds);
+          Socket* sock = (*i)->accept();
           sock->outStream().setBlocking(false);
           httpServer->addSocket(sock);
           vlog.debug("new http client, sock %d",sock->getFd());
diff --git a/unix/xserver/hw/vnc/XserverDesktop.h b/unix/xserver/hw/vnc/XserverDesktop.h
index 6909a76..c069028 100644
--- a/unix/xserver/hw/vnc/XserverDesktop.h
+++ b/unix/xserver/hw/vnc/XserverDesktop.h
@@ -51,8 +51,8 @@
 public:
 
   XserverDesktop(int screenIndex,
-                 std::list<network::TcpListener> listeners_,
-                 std::list<network::TcpListener> httpListeners_,
+                 std::list<network::TcpListener*> listeners_,
+                 std::list<network::TcpListener*> httpListeners_,
                  const char* name, const rfb::PixelFormat &pf,
                  int width, int height, void* fbptr, int stride);
   virtual ~XserverDesktop();
@@ -113,8 +113,8 @@
   int screenIndex;
   rfb::VNCServerST* server;
   rfb::HTTPServer* httpServer;
-  std::list<network::TcpListener> listeners;
-  std::list<network::TcpListener> httpListeners;
+  std::list<network::TcpListener*> listeners;
+  std::list<network::TcpListener*> httpListeners;
   bool deferredUpdateTimerSet;
   bool directFbptr;
   struct timeval dixTimeout;
diff --git a/unix/xserver/hw/vnc/vncExtInit.cc b/unix/xserver/hw/vnc/vncExtInit.cc
index d9f989a..0ae55b6 100644
--- a/unix/xserver/hw/vnc/vncExtInit.cc
+++ b/unix/xserver/hw/vnc/vncExtInit.cc
@@ -134,13 +134,13 @@
     for (int scr = 0; scr < vncGetScreenCount(); scr++) {
 
       if (!desktop[scr]) {
-        std::list<network::TcpListener> listeners;
-        std::list<network::TcpListener> httpListeners;
+        std::list<network::TcpListener*> listeners;
+        std::list<network::TcpListener*> httpListeners;
         if (scr == 0 && vncInetdSock != -1) {
           if (network::TcpSocket::isSocket(vncInetdSock) &&
               !network::TcpSocket::isConnected(vncInetdSock))
           {
-            listeners.push_back (network::TcpListener(vncInetdSock));
+            listeners.push_back(new network::TcpListener(vncInetdSock));
             vlog.info("inetd wait");
           }
         } else {