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");
			}
		}
	}
}
예제 #2
0
// 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);
}
예제 #3
0
// 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));
}
예제 #5
0
// 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);
}
예제 #6
0
파일: Listener.cpp 프로젝트: edwig/Marlin
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;
    }
	}
}
예제 #7
0
파일: SerialEx.cpp 프로젝트: ror13/diplom
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
}
예제 #9
0
// 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);
	}
}
예제 #10
0
void CINSTALLSYS::StopDriver()
{
	StopListener();
}