/** * UpdateHostHelper * * Updates the host for a user. * * @param Host the host (nick!ident\@host) */ void CIRCConnection::UpdateHostHelper(const char *Host) { const char *NickEnd; size_t Offset; char *Copy; if (GetOwner() != NULL && GetOwner()->GetLeanMode() > 0 && m_Site != NULL) { return; } NickEnd = strchr(Host, '!'); if (NickEnd == NULL) { return; } Offset = NickEnd - Host; Copy = strdup(Host); if (AllocFailed(Copy)) { return; } const char *Nick = Copy; char *Site = Copy + Offset; *Site = '\0'; Site++; if (m_CurrentNick && strcasecmp(Nick, m_CurrentNick) == 0) { free(m_Site); m_Site = strdup(Site); if (AllocFailed(m_Site)) {} } if (GetOwner()->GetLeanMode() > 0) { free(Copy); return; } int i = 0; while (hash_t<CChannel *> *Chan = m_Channels->Iterate(i++)) { if (!Chan->Value || !Chan->Value->HasNames()) { continue; } CNick *NickObj = Chan->Value->GetNames()->Get(Nick); if (NickObj && NickObj->GetSite() == NULL) { NickObj->SetSite(Site); } } free(Copy); }