vncServer::~vncServer() { vnclog.Print(LL_STATE, VNCLOG("shutting down server object\n")); // If there is a socket_conn object then delete it if (m_socketConn != NULL) { delete m_socketConn; m_socketConn = NULL; } if (m_jingleConn != NULL) { delete m_jingleConn; m_jingleConn = NULL; } // Remove any active clients! KillAuthClients(); KillUnauthClients(); // Wait for all the clients to die WaitUntilAuthEmpty(); WaitUntilUnauthEmpty(); // Don't free the desktop until no KillClient is likely to free it { omni_mutex_lock l(m_desktopLock); if (m_desktop != NULL) { delete m_desktop; m_desktop = NULL; } } // Don't free the authhosts string until no more connections are possible if (m_auth_hosts != 0) { free(m_auth_hosts); m_auth_hosts = 0; } if (m_name != NULL) { free(m_name); m_name = NULL; } if (m_clientquitsig != NULL) { delete m_clientquitsig; m_clientquitsig = NULL; } vnclog.Print(LL_STATE, VNCLOG("shutting down server object(4)\n")); }
// Socket connection handling BOOL vncServer::SockConnect(BOOL On) { // Are we being asked to switch socket connects on or off? if (On) { // Is there a listening socket? if (m_socketConn == NULL) { m_socketConn = new vncSockConnect(); if (m_socketConn == NULL) return FALSE; // Are we to use automatic port selection? if (m_autoportselect) { BOOL ok = FALSE; // Yes, so cycle through the ports, looking for a free one! for (int i=0; i < 99; i++) { m_port = DISPLAY_TO_PORT(i); vnclog.Print(LL_CLIENTS, VNCLOG("trying port number %d\n"), m_port); // Attempt to connect to the port VSocket tempsock; if (tempsock.Create()) { if (!tempsock.Connect("localhost", m_port)) { // Couldn't connect, so this port is probably usable! if (m_socketConn->Init(this, m_port)) { ok = TRUE; break; } } } } if (!ok) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } else { // No autoportselect if (!m_socketConn->Init(this, m_port)) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } } } else { // *** JNW - Trying to fix up a lock-up when the listening socket closes KillAuthClients(); KillUnauthClients(); WaitUntilAuthEmpty(); WaitUntilUnauthEmpty(); // Is there a listening socket? if (m_socketConn != NULL) { // Close the socket delete m_socketConn; m_socketConn = NULL; } } return TRUE; }
vncServer::~vncServer() { vnclog.Print(LL_STATE, VNCLOG("shutting down server object\n")); // If there is a socket_conn object then delete it if (m_socketConn != NULL) { delete m_socketConn; m_socketConn = NULL; } // Modif Jeremy C. if(m_impersonationtoken) CloseHandle(m_impersonationtoken); // Remove any active clients! KillAuthClients(); KillUnauthClients(); // Wait for all the clients to die WaitUntilAuthEmpty(); WaitUntilUnauthEmpty(); // Don't free the desktop until no KillClient is likely to free it { omni_mutex_lock l(m_desktopLock); if (m_desktop != NULL) { delete m_desktop; m_desktop = NULL; } } while (g_Desktop_running) { Sleep(100); vnclog.Print(LL_STATE, VNCLOG("Waiting for desktop to shutdown\n")); } // Don't free the authhosts string until no more connections are possible if (m_auth_hosts != 0) { free(m_auth_hosts); m_auth_hosts = 0; } if (m_name != NULL) { free(m_name); m_name = NULL; } if (m_clientquitsig != NULL) { delete m_clientquitsig; m_clientquitsig = NULL; } // Modif sf@2002 - DSMPlugin handling if (m_pDSMPlugin != NULL) delete(m_pDSMPlugin); // Free the host blacklist while (m_blacklist) { vncServer::BlacklistEntry *current = m_blacklist; m_blacklist=m_blacklist->_next; free (current->_machineName); delete current; } //We need to give the client thread to give some time to close // bad hack Sleep(500); //sometimes crash, vnclog seems already removed // vnclog.Print(LL_STATE, VNCLOG("shutting down server object(4)\n")); g_Server_running=false; }
// Socket connection handling BOOL vncServer::SockConnect(BOOL On) { // Are we being asked to switch socket connects on or off? if (On) { // Is there a listening socket? if (m_socketConn == NULL) { m_socketConn = new vncSockConnect(); if (m_socketConn == NULL) return FALSE; // Are we to use automatic port selection? if (m_autoportselect) { BOOL ok = FALSE; // Yes, so cycle through the ports, looking for a free one! for (int i = 0; i < 99; i++) { m_port = DISPLAY_TO_PORT(i); m_port_http = DISPLAY_TO_HPORT(i); vnclog.Print(LL_CLIENTS, VNCLOG("trying port number %d\n"), m_port); // Attempt to connect to the port VSocket tempsock; if (tempsock.Create()) { if (!tempsock.Connect("localhost", m_port)) { // Couldn't connect, so this port is probably usable! if (m_socketConn->Init(this, m_port)) { ok = TRUE; break; } } } } if (!ok) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } else { // No autoportselect if (!m_socketConn->Init(this, m_port)) { delete m_socketConn; m_socketConn = NULL; return FALSE; } } // Now let's start the HTTP connection stuff if (m_port_http == m_port) { vnclog.Print(LL_INTERR, VNCLOG("cannot start both RFB and HTTP servers " "on the same port\n")); } if (m_httpConn == NULL && m_httpd_enabled && m_port_http != m_port) { m_httpConn = new vncHTTPConnect; if (m_httpConn != NULL) { // Start up the HTTP server if (!m_httpConn->Init(this, m_port_http, m_httpd_params_enabled)) { delete m_httpConn; m_httpConn = NULL; return FALSE; } } } } } else { // *** JNW - Trying to fix up a lock-up when the listening socket closes #ifndef HORIZONLIVE KillAuthClients(); KillUnauthClients(); WaitUntilAuthEmpty(); WaitUntilUnauthEmpty(); #endif // Is there a listening socket? if (m_socketConn != NULL) { // Close the socket delete m_socketConn; m_socketConn = NULL; } // Is there an HTTP socket active? if (m_httpConn != NULL) { // Close the socket delete m_httpConn; m_httpConn = NULL; } } return TRUE; }