void dazeus::Network::joinedChannel(const std::string &user, const std::string &receiver) { if(user == nick_ && !contains_ci(knownUsers_, receiver)) { knownUsers_[receiver] = std::vector<std::string>(); } std::vector<std::string> users = find_ci(knownUsers_, receiver)->second; if(!contains_ci(users, user)) find_ci(knownUsers_, receiver)->second.push_back(user); }
void dazeus::Network::kickedChannel(const std::string&, const std::string &user, const std::string&, const std::string &receiver) { if(user == nick_) { erase_ci(knownUsers_, receiver); } else { erase_ci(find_ci(knownUsers_, receiver)->second, user); } if(!isKnownUser(user)) { erase_ci(identifiedUsers_, user); } }
void unpatch(U32 maddr, U32 (*code)(struct m_registers *, void *)) { struct seg_info *seg; struct code_info *ci; if ((!(seg = find_seg(code_tree, maddr))) || (!(ci = find_ci(&seg->codeinfo, maddr))) || (!(ci->flags & CIF_PATCHED))) { return; } ci->code = code; ci->flags &= ~CIF_PATCHED; }
void dazeus::Network::slotNamesReceived(const std::string&, const std::string &channel, const std::vector<std::string> &names, const std::string & ) { assert(contains_ci(knownUsers_, channel)); std::vector<std::string> &users = find_ci(knownUsers_, channel)->second; std::vector<std::string>::const_iterator it; for(it = names.begin(); it != names.end(); ++it) { std::string n = *it; unsigned int nickStart; for(nickStart = 0; nickStart < n.length(); ++nickStart) { if(n[nickStart] != '@' && n[nickStart] != '~' && n[nickStart] != '+' && n[nickStart] != '%' && n[nickStart] != '!') { break; } } n = n.substr(nickStart); if(!contains_ci(users, n)) users.push_back(n); } }
U32 (*setpatch(U32 maddr, U32 (*code)(struct m_registers *, void *)))(struct m_registers *, void *) { struct seg_info *seg; struct code_info *ci; #ifdef DEBUG printf("Setpatch(0x%08x)\n", maddr); #endif /* DEBUG */ if (maddr & 0xff000001) { fprintf(stderr, "setpatch: Bad address 0x%08x\n", maddr); return(NULL); } if ((!(seg = find_seg(code_tree, maddr))) || (!(ci = find_ci(&seg->codeinfo, maddr)))) { U32 mend; ci = new_codeinfo(maddr); #ifdef DEBUG if (debuglevel & DL_RUNTIME_TRACE) { fprintf(stdout, "setpatch: Compiling 0x%08x...\n", maddr); } #endif /* DEBUG */ mend = compile(ci); if (!seg) { #ifdef DEBUG if (debuglevel & DL_COMPILER_VERBOSE) { fprintf(stdout, "Creating new segment, maddr: %08x, end: %08x\n", maddr, mend); } #endif /* DEBUG */ seg = insert_seg(&code_tree, maddr, mend); if (!seg) { /* BUS ERROR? */ fprintf(stderr, "Out of memory?\n"); abort(); } } else if (mend != seg->mend) { fprintf(stderr, "Strange ending, orig:%08x, new:%08x\n", seg->mend, mend); abort(); } /* Link it first */ ci->next = seg->codeinfo; seg->codeinfo = ci; #ifdef DEBUG if (debuglevel & DL_COMPILER_DISASSEMBLY) { disassemble(maddr, mend); } #endif /* DEBUG */ } /* Don't attempt to patch an already patched function */ if (ci->flags & CIF_PATCHED) { return(NULL); } else { U32 (*retval)(struct m_registers *, void *); /* Don't attempt to free a patched function in the garbage collector */ retval = ci->code; if (retval) { ci->flags |= CIF_LOCKED | CIF_PATCHED; ci->code = code; } else { fprintf(stderr, "Setpatch(0x%08x): retval == NULL\n", maddr); breakme(); } return(retval); } }