Beispiel #1
0
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);
}
Beispiel #2
0
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);
	}
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
	}
}
Beispiel #5
0
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);
  }
}