void User::SetMode(ServiceBot *bi, UserMode *um, const Anope::string ¶m) { 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; }