示例#1
0
文件: users.cpp 项目: dream1986/anope
void User::SetMode(ServiceBot *bi, UserMode *um, const Anope::string &param)
{
	if (!um || HasMode(um->name))
		return;

	ModeManager::StackerAdd(bi, this, um, true, param);
	SetModeInternal(bi, um, param);
}
void PosixSelectorBase::SetMode(List<Watched>& from, const PosixSelectListener* listener, int fd, Type mode)
{
	for (Watched *watched = from.First(); watched; watched = watched->Suc())
	{
		if (watched->m_listener == listener && (fd == -1 || fd == watched->m_fd))
		{
			if (watched->m_mode == mode)
				continue;

			Log(SPEW, "%010p: Adjusting %010p listener (file %d=%d) mode %d -> %d\n",
				this, listener, fd, watched->m_fd, (int)watched->m_mode, (int)mode);
			watched->m_mode = mode;
			OpStatus::Ignore(SetModeInternal(watched, mode));
		}
	}
}
OP_STATUS PosixSelectorBase::Watch(int fd, Type mode, PosixSelectListener *listener, const OpSocketAddress* connect, bool)
{
	OP_ASSERT(listener);

	OpAutoPtr<Watched> watched (OP_NEW(Watched, (listener, fd, mode)));
	if (!watched.get())
		return OpStatus::ERR_NO_MEMORY;

#ifdef POSIX_OK_NETADDR
	/* Tries to connect the address the first time, see PosixSelector documentation.
	 * If the connection succeeds, watched->address will be NULL afterwards.
	 */
	if (connect)
		RETURN_IF_ERROR(PrepareSocketAddress(watched->m_address, connect, fd, listener));
#endif // POSIX_OK_NETADDR

	RETURN_IF_ERROR(SetModeInternal(watched.get(), mode));
	watched->SetWatched(true);

#ifdef POSIX_OK_NETADDR
	if (watched->m_address)
	{
		Log(VERBOSE, "%010p: Watching %d with %010p in mode %d - waiting to connect.\n",
			this, fd, listener, (int)mode);
		watched.release()->Into(&m_connecting);
	}
	else
#endif
	{
		Log(VERBOSE, "%010p: Watching %d with %010p in mode %d.\n",
			this, fd, listener, (int)mode);
		watched.release()->Into(&m_watched);
	}

	return OpStatus::OK;
}