void SharedPortEndpoint::SocketCheck() { if( !m_listening || m_full_name.IsEmpty() || !m_is_file_socket) { return; } priv_state orig_priv = set_condor_priv(); int rc = utime(m_full_name.Value(), NULL); int utime_errno = errno; set_priv(orig_priv); if( rc < 0 ) { dprintf(D_ALWAYS,"SharedPortEndpoint: failed to touch %s: %s\n", m_full_name.Value(), strerror(utime_errno)); if( utime_errno == ENOENT ) { dprintf(D_ALWAYS,"SharedPortEndpoint: attempting to recreate vanished socket!\n"); StopListener(); if( !StartListener() ) { EXCEPT("SharedPortEndpoint: failed to recreate socket"); } } } }
// Stop all listener in Cedar void StopAllListener(CEDAR *c) { LISTENER **array; UINT i, num; // Validate arguments if (c == NULL) { return; } LockList(c->ListenerList); { array = ToArray(c->ListenerList); num = LIST_NUM(c->ListenerList); DeleteAll(c->ListenerList); } UnlockList(c->ListenerList); for (i = 0;i < num;i++) { StopListener(array[i]); ReleaseListener(array[i]); } Free(array); }
// Set the state to dynamic listener void ApplyDynamicListener(DYNAMIC_LISTENER *d) { // Validate arguments if (d == NULL) { return; } Lock(d->Lock); { // Change the state if (*d->EnablePtr) { if (d->Listener == NULL) { // Create a listener WHERE; d->Listener = NewListener(d->Cedar, d->Protocol, d->Port); } } else { // Stop the listener if (d->Listener != NULL) { WHERE; StopListener(d->Listener); ReleaseListener(d->Listener); d->Listener = NULL; } } } Unlock(d->Lock); }
void SharedPortEndpoint::InitAndReconfig() { std::string socket_dir; #if USE_ABSTRACT_DOMAIN_SOCKET m_is_file_socket = false; #endif if (!GetDaemonSocketDir(socket_dir)) { m_is_file_socket = true; if (!GetAltDaemonSocketDir(socket_dir)) { EXCEPT("Unable to determine an appropriate DAEMON_SOCKET_DIR to use."); } } if( !m_listening ) { m_socket_dir = socket_dir; } else if( m_socket_dir != socket_dir ) { dprintf(D_ALWAYS,"SharedPortEndpoint: DAEMON_SOCKET_DIR changed from %s to %s, so restarting.\n", m_socket_dir.Value(), socket_dir.c_str()); StopListener(); m_socket_dir = socket_dir; StartListener(); } m_max_accepts = param_integer("SHARED_ENDPOINT_MAX_ACCEPTS_PER_CYCLE", param_integer("MAX_ACCEPTS_PER_CYCLE", 8)); }
// Release the dynamic listener void FreeDynamicListener(DYNAMIC_LISTENER *d) { // Validate arguments if (d == NULL) { return; } Lock(d->Lock); { if (d->Listener != NULL) { StopListener(d->Listener); ReleaseListener(d->Listener); d->Listener = NULL; } } Unlock(d->Lock); ReleaseCedar(d->Cedar); DeleteLock(d->Lock); Free(d); }
Listener::~Listener(void) { StopListener(); for(int i = 0;i < FD_SETSIZE;++i) { if(m_listenSockets[i] != INVALID_SOCKET) { closesocket(m_listenSockets[i]); m_listenSockets[i] = INVALID_SOCKET; } if(m_hSocketEvents[i]) { CloseHandle(m_hSocketEvents[i]); m_hSocketEvents[i] = nullptr; } } }
LONG CSerialEx::Close (void) { // Stop listener thread (wait until it ends) StopListener(INFINITE); #ifndef SERIAL_NO_OVERLAPPED // Free event handle if (m_hevtOverlappedWorkerThread) { ::CloseHandle(m_hevtOverlappedWorkerThread); m_hevtOverlappedWorkerThread = 0; } #endif // Call the base class return CSerial::Close(); }
SharedPortEndpoint::~SharedPortEndpoint() { StopListener(); #ifdef WIN32 if(wake_select_source) { delete wake_select_source; delete wake_select_dest; } if( thread_killed != INVALID_HANDLE_VALUE ) { DWORD wait_result = WaitForSingleObject(thread_killed, 100); if(wait_result != WAIT_OBJECT_0) dprintf(D_ALWAYS, "SharedPortEndpoint: Destructor: Problem in thread shutdown notification: %d\n", GetLastError()); CloseHandle(thread_killed); } #endif }
// Shutdown the Listener void StopListener(LISTENER *r) { UINT port; SOCK *s = NULL; // Validate arguments if (r == NULL) { return; } Lock(r->lock); if (r->Halt) { Unlock(r->lock); return; } // Stop flag set r->Halt = true; if (r->Sock != NULL) { s = r->Sock; AddRef(s->ref); } Unlock(r->lock); port = r->Port; if (r->ShadowIPv6 == false && r->Protocol == LISTENER_TCP) { SLog(r->Cedar, "LS_LISTENER_STOP_1", port); } // Close the socket if (s != NULL) { Disconnect(s); ReleaseSock(s); s = NULL; } // Set the event Set(r->Event); // Wait for stopping the thread WaitThread(r->Thread, INFINITE); // Stop the shadow listener if (r->ShadowIPv6 == false) { if (r->ShadowListener != NULL) { StopListener(r->ShadowListener); ReleaseListener(r->ShadowListener); r->ShadowListener = NULL; } } if (r->ShadowIPv6 == false && r->Protocol == LISTENER_TCP) { SLog(r->Cedar, "LS_LISTENER_STOP_2", port); } }
void CINSTALLSYS::StopDriver() { StopListener(); }