Exemple #1
0
Protocol GetProtocolByIndex(int index)
{
	std::vector<PROTOACCOUNT *> protos;
	GetAccounts(&protos);
	int protosSize = protos.size();
	
	if (protosSize < 1)
		return Protocol(NULL);
	
	index = (index % protosSize + protosSize) % protosSize;
	return Protocol(protos[index]->szModuleName);
}
Exemple #2
0
Protocol GetProtocolByName(const char *moduleName)
{
	std::vector<PROTOACCOUNT *> protos;
	GetAccounts(&protos);
	
	int protosSize = (int) protos.size();
	for(int i = 0; i < protosSize; ++i)
	{
		if (strcmp(protos[i]->szModuleName, moduleName) == 0)
			return Protocol(protos[i]->szModuleName);
	}
	
	return Protocol(NULL);
}
Exemple #3
0
int testPinging() {
    Protocol p;
    
    p = Protocol();
    std::vector<ProtocolPacket> out;
    
    #define T(STATE) \
        p.state = STATE;\
        out = p._timerEvent(p.pingInterval);\
        ASSERT(out.size() == 0);\
        ASSERT(p.lastPingSendTime == 0);\
        out = p._timerEvent(p.pingInterval + 1);\
        if (STATE == STATE_CONNECTED) { \
            ASSERT(out.size() == 1);\
            ASSERT(out[0].type == TYPE_PING);\
            ASSERT(p.lastPingSendTime == (p.pingInterval + 1));\
        } else { \
            ASSERT(out.size() == 0);\
            ASSERT(p.lastPingSendTime == 0);\
        }
       
    T(STATE_UNINIT);
    T(STATE_LISTENING);
    T(STATE_CONNECTING);
    T(STATE_CONNECTED);
    
    #undef T
    
    return 0;
}
Exemple #4
0
int testProtocolConstructors() {
    Protocol p = Protocol();
    
    ASSERT(p.state == STATE_UNINIT);
    ASSERT(p.lastKeepAlive == 0);
    ASSERT(p.lastPingSendTime == 0);
    
    return 0;
}
Exemple #5
0
void GetProtocols(std::vector<Protocol> *result)
{
	std::vector<PROTOACCOUNT *> accs;
	GetAccounts(&accs);

	unsigned int accsSize = accs.size();
	for (unsigned int i = 0; i < accsSize ; ++i)
		result->push_back(Protocol(accs[i]->szModuleName));
}
Exemple #6
0
void setup()
{
    p = Protocol();

    //movement_api
    initialize();


    attachInterrupt(1, interrupt_handler_explore, FALLING);
}
Exemple #7
0
 std::future<error_code> WorldServer::Connect(
     const uint32_t port,
     const time_duration timeout) {
   if (!IsPortValid(port)) {
     return GetInvalidPortResult(port);
   }
   _port = port;
   _timeout = timeout;
   auto result = _world_server.Connect(_port, _timeout);
   ExecuteProtocol(Protocol(_timeout));
   return result;
 }
Exemple #8
0
int testAck() {
    char hello[] = "hello";
    Protocol p;
    
    std::vector<ProtocolPacket> out;
    p = Protocol();
    p.state = STATE_CONNECTED;
    p.seqnum = 5;
    p.outgoingDataPacket = std::tr1::shared_ptr<ProtocolPacket>(new ProtocolPacket(TYPE_DATA,5,hello,5));
    
    ProtocolPacket pp = ProtocolPacket(TYPE_ACK,4);
    out = p._packetEvent(pp,8).first;
    ASSERT(p.lastKeepAlive == 0);
    ASSERT(p.seqnum == 5);
    ASSERT(out.size() == 0);
    ASSERT(p.outgoingDataPacket);
    pp = ProtocolPacket(TYPE_ACK,5);
    out = p._packetEvent(pp,8).first;
    ASSERT(p.lastKeepAlive == 8);
    ASSERT(p.seqnum == 6);
    ASSERT(out.size() == 0);
    ASSERT(!(p.outgoingDataPacket));
   
    p = Protocol();
    p.state = STATE_CONNECTED;
    p.seqnum = 5;
    p.outgoingDataPacket = std::tr1::shared_ptr<ProtocolPacket>(new ProtocolPacket(TYPE_DATA,5,hello,5));   
    
    pp = ProtocolPacket(TYPE_DATA,5);
    out = p._packetEvent(pp,8).first;
    ASSERT(p.lastKeepAlive != 8);
    ASSERT(p.seqnum == 5);
    ASSERT(out.size() == 0);
    ASSERT(p.outgoingDataPacket);
    return 0;
}
/* {{{ MySQL_Uri::Host() -I- */
const sql::SQLString & MySQL_Uri::Host()
{
	static const sql::SQLString hostValue4Pipe(".");
	const sql::SQLString & hostValue4sock= util::LOCALHOST;

	switch (Protocol())
	{
	case NativeAPI::PROTOCOL_TCP:
		return host;
	case NativeAPI::PROTOCOL_PIPE:
		return hostValue4Pipe;
	case NativeAPI::PROTOCOL_SOCKET:
		return hostValue4sock;
	}

	// throw smoething maybe?
	return host;
}
/* {{{ MySQL_Uri::Host() -I- */
const sql::SQLString & MySQL_Uri::Host()
{
  static const sql::SQLString hostValue4Pipe(".");
  static const sql::SQLString hostValue4sock(util::LOCALHOST);

  switch (Protocol())
  {
  case NativeAPI::PROTOCOL_TCP:
    return host;
  case NativeAPI::PROTOCOL_PIPE:
    return hostValue4Pipe;
  case NativeAPI::PROTOCOL_SOCKET:
    return hostValue4sock;

  case NativeAPI::PROTOCOL_COUNT:
      throw sql::InvalidArgumentException("NativeAPI::PROTOCOL_COUNT shouldn't be used.");
    break;
  }

  // throw smoething maybe?
  return host;
}
Exemple #11
0
void CSocket::Connect(const tchar* pszHost, uint nPort)
{
	ASSERT(m_hSocket == INVALID_SOCKET);
	ASSERT(pszHost   != nullptr);
	ASSERT(nPort     <= USHRT_MAX);

	// Save parameters.
	m_strHost = pszHost;
	m_nPort   = nPort;

	sockaddr_in	addr = { 0 };

	addr.sin_family      = AF_INET;
	addr.sin_addr.s_addr = inet_addr(T2A(pszHost));
	addr.sin_port        = htons(static_cast<ushort>(nPort));

	// Host name isn't an IP Address?
	if (addr.sin_addr.s_addr == INADDR_NONE)
	{
		// Resolve host name.
		hostent* pHost = gethostbyname(T2A(pszHost));

		if (pHost == nullptr)
			throw CSocketException(CSocketException::E_RESOLVE_FAILED, CWinSock::LastError());

		memcpy(&addr.sin_addr, pHost->h_addr_list[0], pHost->h_length);
	}

	// Create the socket.
	Create(AF_INET, Type(), Protocol());

	// Connect to host.
	if (connect(m_hSocket, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) == SOCKET_ERROR)
		throw CSocketException(CSocketException::E_CONNECT_FAILED, CWinSock::LastError());

	// If async mode, do select.
	if (m_eMode == ASYNC)
		CWinSock::BeginAsyncSelect(this, (FD_READ | FD_WRITE | FD_CLOSE));
}
Exemple #12
0
/*
 * Envio un comando a otro servidor o usuario
 */
void sendcmdto_one(struct Client *to, struct Client *from, char *cmd, char *token, const char *pattern, ...)
{
  va_list vl;
  
  /* Evito que el mensaje vuelva al origen */
  if(cli_from(from)==cli_from(to))
    return;
  
#if !defined(NO_PROTOCOL9)
  if (Protocol(cli_from(to)) > 9)
  {
#endif
    if (IsUser(from)) {
      if(IsUser(to))
        sprintf_irc(sendbuf, "%s%s %s %s%s ", NumNick(from), token, NumNick(to));
      else
        sprintf_irc(sendbuf, "%s%s %s %s ", NumNick(from), token, NumServ(to));
    } else {
      if(IsUser(to))
        sprintf_irc(sendbuf, "%s %s %s%s ", NumServ(from), token, NumNick(to));
      else
        sprintf_irc(sendbuf, "%s %s %s ", NumServ(from), token, NumServ(to));
    }
#if !defined(NO_PROTOCOL9)
  } else 
    sprintf_irc(sendbuf, ":%s %s %s ", from->name, cmd, to->name);
#endif

  if(!pattern || !*pattern)
    sendbuf[strlen(sendbuf)-1]='\0';
  else
  {
    va_start(vl, pattern);
    vsprintf_irc(sendbuf + strlen(sendbuf), pattern, vl);
    va_end(vl);
  }
  
  sendbufto_one(to);
}
// -----------------------------------------------------------------------------
// CNATTraversalControllerExample::RefreshNATBindingL
// From CSIPNATTraversalController
// -----------------------------------------------------------------------------
//
TBool CNATTraversalControllerExample::RefreshNATBindingL(
    RSocket& aSocket,
    const MSIPNATBindingObserver* /*aBindingObserver*/)
    {
    TBool maintainPersistentConnection = EFalse;
    
    // If it was detected that the terminal is behind a NAT, 
    // some kind of NAT binding keepalive should be started.
    // Some suggestions about the keepalive mechanisms can be found from
    // http://www.ietf.org/internet-drafts/draft-ietf-sip-outbound-04.txt    
    // aBindingObserver can be used for notifying flow failures 
    // specified in the above draft.

    if (Protocol(aSocket) == KProtocolInetTcp)
        {
        // If it was found that the terminal is behind a NAT
        // and the protocol of aSocket is TCP, 
        // then maintainPersistentConnection should be set to ETrue
        // to keep the TCP connection open for NAT binding keepalive.
        }

	return maintainPersistentConnection;
    }
Exemple #14
0
/** Handle a connection that has sent a valid PASS and SERVER.
 * @param cptr New peer server.
 * @param aconf Connect block for \a cptr.
 * @return Zero.
 */
int server_estab(struct Client *cptr, struct ConfItem *aconf)
{
  struct Client* acptr = 0;
  const char*    inpath;
  int            i;

  assert(0 != cptr);
  assert(0 != cli_local(cptr));

  inpath = cli_name(cptr);

  if (IsUnknown(cptr)) {
    if (aconf->passwd[0])
      sendrawto_one(cptr, MSG_PASS " :%s", aconf->passwd);
    /*
     *  Pass my info to the new server
     */
    sendrawto_one(cptr, MSG_SERVER " %s 1 %Tu %Tu J%s %s%s +%s6 :%s",
		  cli_name(&me), cli_serv(&me)->timestamp,
		  cli_serv(cptr)->timestamp, MAJOR_PROTOCOL, NumServCap(&me),
		  feature_bool(FEAT_HUB) ? "h" : "",
		  *(cli_info(&me)) ? cli_info(&me) : "IRCers United");
  }

  det_confs_butmask(cptr, CONF_SERVER);

  if (!IsHandshake(cptr))
    hAddClient(cptr);
  SetServer(cptr);
  cli_handler(cptr) = SERVER_HANDLER;
  Count_unknownbecomesserver(UserStats);
  SetBurst(cptr);

/*    nextping = CurrentTime; */

  /*
   * NOTE: check for acptr->user == cptr->serv->user is necessary to insure
   * that we got the same one... bleah
   */
  if (cli_serv(cptr)->user && *(cli_serv(cptr))->by &&
      (acptr = findNUser(cli_serv(cptr)->by))) {
    if (cli_user(acptr) == cli_serv(cptr)->user) {
      sendcmdto_one(&me, CMD_NOTICE, acptr, "%C :Link with %s established.",
                    acptr, inpath);
    }
    else {
      /*
       * if not the same client, set by to empty string
       */
      acptr = 0;
      *(cli_serv(cptr))->by = '\0';
    }
  }

  sendto_opmask(acptr, SNO_OLDSNO, "Link with %s established.", inpath);
  cli_serv(cptr)->up = &me;
  cli_serv(cptr)->updown = add_dlink(&(cli_serv(&me))->down, cptr);
  sendto_opmask(0, SNO_NETWORK, "Net junction: %s %s", cli_name(&me),
                cli_name(cptr));
  SetJunction(cptr);
  /*
   * Old sendto_serv_but_one() call removed because we now
   * need to send different names to different servers
   * (domain name matching) Send new server to other servers.
   */
  for (i = 0; i <= HighestFd; i++)
  {
    if (!(acptr = LocalClientArray[i]) || !IsServer(acptr) ||
        acptr == cptr || IsMe(acptr))
      continue;
    if (!match(cli_name(&me), cli_name(cptr)))
      continue;
    sendcmdto_one(&me, CMD_SERVER, acptr,
		  "%s 2 0 %Tu J%02u %s%s +%s%s%s :%s", cli_name(cptr),
		  cli_serv(cptr)->timestamp, Protocol(cptr), NumServCap(cptr),
		  IsHub(cptr) ? "h" : "", IsService(cptr) ? "s" : "",
		  IsIPv6(cptr) ? "6" : "", cli_info(cptr));
  }

  /* Send these as early as possible so that glined users/juped servers can
   * be removed from the network while the remote server is still chewing
   * our burst.
   */
  gline_burst(cptr);
  jupe_burst(cptr);

  /*
   * Pass on my client information to the new server
   *
   * First, pass only servers (idea is that if the link gets
   * canceled because the server was already there,
   * there are no NICK's to be canceled...). Of course,
   * if cancellation occurs, all this info is sent anyway,
   * and I guess the link dies when a read is attempted...? --msa
   *
   * Note: Link cancellation to occur at this point means
   * that at least two servers from my fragment are building
   * up connection this other fragment at the same time, it's
   * a race condition, not the normal way of operation...
   */

  for (acptr = &me; acptr; acptr = cli_prev(acptr)) {
    /* acptr->from == acptr for acptr == cptr */
    if (cli_from(acptr) == cptr)
      continue;
    if (IsServer(acptr)) {
      const char* protocol_str;

      if (Protocol(acptr) > 9)
        protocol_str = IsBurst(acptr) ? "J" : "P";
      else
        protocol_str = IsBurst(acptr) ? "J0" : "P0";

      if (0 == match(cli_name(&me), cli_name(acptr)))
        continue;
      sendcmdto_one(cli_serv(acptr)->up, CMD_SERVER, cptr,
		    "%s %d 0 %Tu %s%u %s%s +%s%s%s :%s", cli_name(acptr),
		    cli_hopcount(acptr) + 1, cli_serv(acptr)->timestamp,
		    protocol_str, Protocol(acptr), NumServCap(acptr),
		    IsHub(acptr) ? "h" : "", IsService(acptr) ? "s" : "",
		    IsIPv6(acptr) ? "6" : "", cli_info(acptr));
    }
  }

  for (acptr = &me; acptr; acptr = cli_prev(acptr))
  {
    /* acptr->from == acptr for acptr == cptr */
    if (cli_from(acptr) == cptr)
      continue;
    if (IsUser(acptr))
    {
      char xxx_buf[25];
      char *s = umode_str(acptr);
      sendcmdto_one(cli_user(acptr)->server, CMD_NICK, cptr,
		    "%s %d %Tu %s %s %s%s%s%s %s%s :%s",
		    cli_name(acptr), cli_hopcount(acptr) + 1, cli_lastnick(acptr),
		    cli_user(acptr)->username, cli_user(acptr)->realhost,
		    *s ? "+" : "", s, *s ? " " : "",
		    iptobase64(xxx_buf, &cli_ip(acptr), sizeof(xxx_buf), IsIPv6(cptr)),
		    NumNick(acptr), cli_info(acptr));
    }
  }
  /*
   * Last, send the BURST.
   * (Or for 2.9 servers: pass all channels plus statuses)
   */
  {
    struct Channel *chptr;
    for (chptr = GlobalChannelList; chptr; chptr = chptr->next)
      send_channel_modes(cptr, chptr);
  }
  sendcmdto_one(&me, CMD_END_OF_BURST, cptr, "");
  return 0;
}
void FileManagerAPI::initializePaths() {
	mProtocols.clear();
	/*
	 * Defines paths
	 */
	
	// Internal
	boost::filesystem::path internalPath = FB::BrowserPlugin::getFSPath();
	internalPath = internalPath.parent_path();
	internalPath /= std::string(PLUGIN_SHAREDIR);
	
	// Temp
	boost::filesystem::path tempPath = boost::filesystem::path(FB::System::getTempPath());
	tempPath /= FBSTRING_ProductDomain;
	tempPath /= boost::filesystem::unique_path();
	
	// Local
	boost::filesystem::path localPath = tempPath; // fallback
	FB::PluginCorePtr plugin = getFactory()->getPlugin();
	FB::URI loc = FB::URI::fromString(plugin->getHost()->getDOMWindow()->getLocation());
	if(!loc.domain.empty()) {
		std::string localPathString = FB::System::getLocalAppDataPath(FBSTRING_ProductDomain);
		if(!localPathString.empty()) {
			localPath = boost::filesystem::path(localPathString);
			localPath /= std::string(loc.domain);
		} else {
			FBLOG_WARN("FileManagerAPI::setFactory", "Can't find local path: using temp path");
		}
	} else {
		FBLOG_WARN("FileManagerAPI::setFactory", "Can't find browser url: using temp path");
	}
	
	// Create directories
	// boost::filesystem::create_directories(internalPath);
	boost::filesystem::create_directories(tempPath);
	boost::filesystem::create_directories(localPath);

	// Normalize
	internalPath = boost::filesystem::canonical(internalPath);
	tempPath = boost::filesystem::canonical(tempPath);
	localPath = boost::filesystem::canonical(localPath);

	// Make generics
	internalPath = boost::filesystem::path(internalPath.generic_string());
	tempPath = boost::filesystem::path(tempPath.generic_string());
	localPath = boost::filesystem::path(localPath.generic_string());

	
	mProtocols.push_back(Protocol(Protocol::internal, internalPath));
	mProtocols.push_back(Protocol(Protocol::temp, tempPath));
	mProtocols.push_back(Protocol(Protocol::local, localPath));
	
	
	// Order bigger path first
	mProtocols.sort(boost::bind(std::greater<std::size_t>(),
								boost::bind(&std::string::length, boost::bind(&boost::filesystem::path::string<std::string>, boost::bind(&Protocol::getPath, _1))),
								boost::bind(&std::string::length, boost::bind(&boost::filesystem::path::string<std::string>, boost::bind(&Protocol::getPath, _2)))
								)
								
	);

	
	for(std::list<Protocol>::iterator it = mProtocols.begin(); it != mProtocols.end(); ++it) {
		FBLOG_DEBUG("FileManagerAPI::setFactory", it->getProtocol() << "=" << it->getPath());
	}
}
Exemple #16
0
cString cServerConnection::ToText() const
{	return cString::sprintf("%s\t%s:%d", Protocol(), RemoteIp().c_str(), RemotePort()); }
Exemple #17
0
bool cServerConnection::Close()
{
	if (IsOpen())
		isyslog("streamdev-server: closing %s connection to %s:%d", Protocol(), RemoteIp().c_str(), RemotePort());
	return cTBSocket::Close();
}
/** Handle a SERVER message from another server.
 *
 * \a parv has the following elements:
 * \li \a parv[1] is the server name
 * \li \a parv[2] is the hop count to the server
 * \li \a parv[3] is the start timestamp for the server
 * \li \a parv[4] is the link timestamp
 * \li \a parv[5] is the protocol version (P10 or J10)
 * \li \a parv[6] is the numnick mask for the server
 * \li \a parv[7] is a string of flags like +hs to mark hubs and services
 * \li \a parv[\a parc - 1] is the server description
 *
 * See @ref m_functions for discussion of the arguments.
 * @param[in] cptr Client that sent us the message.
 * @param[in] sptr Original source of message.
 * @param[in] parc Number of arguments.
 * @param[in] parv Argument vector.
 */
int ms_server(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
  int              i;
  char*            host;
  struct Client*   acptr;
  struct Client*   bcptr;
  int              hop;
  int              ret;
  unsigned short   prot;
  time_t           start_timestamp;
  time_t           timestamp;

  if (parc < 8)
  {
    return need_more_params(sptr, "SERVER");
    return exit_client(cptr, cptr, &me, "Need more parameters");
  }
  host = clean_servername(parv[1]);
  if (!host)
  {
    sendto_opmask_butone(0, SNO_OLDSNO, "Bogus server name (%s) from %s",
			 host, cli_name(cptr));
    return exit_client_msg(cptr, cptr, &me, "Bogus server name (%s)", host);
  }

  /*
   * Detect protocol
   */
  hop = atoi(parv[2]);
  start_timestamp = atoi(parv[3]);
  timestamp = atoi(parv[4]);
  prot = parse_protocol(parv[5]);
  if (!prot)
    return exit_client_msg(cptr, sptr, &me, "Bogus protocol (%s)", parv[5]);
  else if (prot < atoi(MINOR_PROTOCOL))
    return exit_new_server(cptr, sptr, host, timestamp,
                           "Incompatible protocol: %s", parv[5]);

  Debug((DEBUG_INFO, "Got SERVER %s with timestamp [%s] age %Tu (%Tu)",
	 host, parv[4], start_timestamp, cli_serv(&me)->timestamp));

  if (timestamp < OLDEST_TS)
    return exit_client_msg(cptr, sptr, &me,
        "Bogus timestamps (%s %s)", parv[3], parv[4]);

  if (parv[parc - 1][0] == '\0')
    return exit_client_msg(cptr, cptr, &me,
                           "No server info specified for %s", host);

  ret = check_loop_and_lh(cptr, sptr, NULL, host, (parc > 7 ? parv[6] : NULL), timestamp, hop, parv[5][0] == 'J');
  if (ret != 1)
    return ret;

  /*
   * Server is informing about a new server behind
   * this link. Create REMOTE server structure,
   * add it to list and propagate word to my other
   * server links...
   */

  acptr = make_client(cptr, STAT_SERVER);
  make_server(acptr);
  cli_serv(acptr)->prot = prot;
  cli_serv(acptr)->timestamp = timestamp;
  cli_hopcount(acptr) = hop;
  ircd_strncpy(cli_name(acptr), host, HOSTLEN);
  ircd_strncpy(cli_info(acptr), parv[parc-1], REALLEN);
  cli_serv(acptr)->up = sptr;
  cli_serv(acptr)->updown = add_dlink(&(cli_serv(sptr))->down, acptr);
  /* Use cptr, because we do protocol 9 -> 10 translation
     for numeric nicks ! */
  SetServerYXX(cptr, acptr, parv[6]);

  /* Attach any necessary UWorld config items. */
  attach_confs_byhost(cptr, host, CONF_UWORLD);

  if (*parv[7] == '+')
    set_server_flags(acptr, parv[7] + 1);

  Count_newremoteserver(UserStats);
  if (Protocol(acptr) < 10)
    SetFlag(acptr, FLAG_TS8);
  add_client_to_list(acptr);
  hAddClient(acptr);
  if (*parv[5] == 'J')
  {
    SetBurst(acptr);
    SetJunction(acptr);
    for (bcptr = cli_serv(acptr)->up; !IsMe(bcptr); bcptr = cli_serv(bcptr)->up)
      if (IsBurstOrBurstAck(bcptr))
          break;
    if (IsMe(bcptr))
      sendto_opmask_butone(0, SNO_NETWORK, "Net junction: %s %s",
                           cli_name(sptr), cli_name(acptr));
  }
  /*
   * Old sendto_serv_but_one() call removed because we now need to send
   * different names to different servers (domain name matching).
   */
  for (i = 0; i <= HighestFd; i++)
  {
    if (!(bcptr = LocalClientArray[i]) || !IsServer(bcptr) ||
        bcptr == cptr || IsMe(bcptr))
      continue;
    if (0 == match(cli_name(&me), cli_name(acptr)))
      continue;
    sendcmdto_one(sptr, CMD_SERVER, bcptr, "%s %d 0 %s %s %s%s +%s%s%s :%s",
                  cli_name(acptr), hop + 1, parv[4], parv[5],
                  NumServCap(acptr), IsHub(acptr) ? "h" : "",
                  IsService(acptr) ? "s" : "", IsIPv6(acptr) ? "6" : "",
                  cli_info(acptr));
  }
  return 0;
}
Exemple #19
0
#include "Tank.h"

Protocol Tank::protocol = Protocol();
Tank::Tank(){}
Tank::Tank(int i){
	idx = i;
}
Tank::Tank(const Tank& orig){}
Tank::~Tank(){}

void Tank::evalPfield(GameConstants &gc,
	Polygon &base,
	vector<Tank*> &tanks,
	vector<Flag*> &flags,
	vector<Tank*> &enemy_tanks,
	vector<Flag*> &enemy_flags,
	vector<Polygon*> &obstacles
){			
	double pi = 3.1415926435;
	Vector2d result = Vector2d(0);
	
	for (int i=0; i < obstacles.size(); i++){
		result += 0.4*obstacles[i]->potentialField(loc,dir);
	}
	/*for (int i=0; i < enemy_tanks.size(); i++)
	{
		result += enemy_tanks[i]->potentialField(loc,dir);
	}
	for (int i=0; i < enemy_flags.size(); i++)
	{
		result -= 30 * enemy_flags[i]->potentialField(loc,dir);
Exemple #20
0
static
void do_trace(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
{
    int i;
    struct Client *acptr;
    struct Client *acptr2;
    const struct ConnectionClass* cl;
    char* tname;
    int doall;
    int *link_s;
    int *link_u;
    int cnt = 0;
    int wilds;
    int dow;

    if (parc < 2 || BadPtr(parv[1]))
    {
        /* just "TRACE" without parameters. Must be from local client */
        parc = 1;
        acptr = &me;
        tname = cli_name(&me);
        i = HUNTED_ISME;
    }
    else if (parc < 3 || BadPtr(parv[2]))
    {
        /* No target specified. Make one before propagating. */
        parc = 2;
        tname = parv[1];
        if ((acptr = find_match_server(parv[1])) ||
                ((acptr = FindClient(parv[1])) && !MyUser(acptr)))
        {
            if (IsUser(acptr))
                parv[2] = cli_name(cli_user(acptr)->server);
            else
                parv[2] = cli_name(acptr);
            parc = 3;
            parv[3] = 0;
            if ((i = hunt_server_cmd(sptr, CMD_TRACE, cptr, IsServer(acptr),
                                     "%s :%C", 2, parc, parv)) == HUNTED_NOSUCH)
                return;
        }
        else
            i = HUNTED_ISME;
    } else {
        /* Got "TRACE <tname> :<target>" */
        parc = 3;
        if (MyUser(sptr) || Protocol(cptr) < 10)
            acptr = find_match_server(parv[2]);
        else
            acptr = FindNServer(parv[2]);
        if ((i = hunt_server_cmd(sptr, CMD_TRACE, cptr, 0, "%s :%C", 2, parc,
                                 parv)) == HUNTED_NOSUCH)
            return;
        tname = parv[1];
    }

    if (i == HUNTED_PASS) {
        if (!acptr)
            acptr = next_client(GlobalClientList, tname);
        else
            acptr = cli_from(acptr);
        send_reply(sptr, RPL_TRACELINK,
                   version, debugmode, tname,
                   acptr ? cli_name(cli_from(acptr)) : "<No_match>");
        return;
    }

    doall = (parv[1] && (parc > 1)) ? !match(tname, cli_name(&me)) : 1;
    wilds = !parv[1] || strchr(tname, '*') || strchr(tname, '?');
    dow = wilds || doall;

    /* Don't give (long) remote listings to lusers */
    if (dow && !MyConnect(sptr) && !IsAnOper(sptr)) {
        send_reply(sptr, RPL_TRACEEND);
        return;
    }

    link_s = MyCalloc(2 * maxconnections, sizeof(link_s[0]));
    link_u = link_s + maxconnections;

    if (doall) {
        for (acptr = GlobalClientList; acptr; acptr = cli_next(acptr)) {
            if (IsUser(acptr))
                link_u[cli_fd(cli_from(acptr))]++;
            else if (IsServer(acptr))
                link_s[cli_fd(cli_from(acptr))]++;
        }
    }

    /* report all direct connections */

    for (i = 0; i <= HighestFd; i++) {
        const char *conClass;

        if (!(acptr = LocalClientArray[i])) /* Local Connection? */
            continue;
        if (IsInvisible(acptr) && dow && !(MyConnect(sptr) && IsOper(sptr)) &&
                !IsAnOper(acptr) && (acptr != sptr))
            continue;
        if (!doall && wilds && match(tname, cli_name(acptr)))
            continue;
        if (!dow && 0 != ircd_strcmp(tname, cli_name(acptr)))
            continue;

        conClass = get_client_class(acptr);

        switch (cli_status(acptr)) {
        case STAT_CONNECTING:
            send_reply(sptr, RPL_TRACECONNECTING, conClass, cli_name(acptr));
            cnt++;
            break;
        case STAT_HANDSHAKE:
            send_reply(sptr, RPL_TRACEHANDSHAKE, conClass, cli_name(acptr));
            cnt++;
            break;
        case STAT_ME:
            break;
        case STAT_UNKNOWN:
        case STAT_UNKNOWN_USER:
            send_reply(sptr, RPL_TRACEUNKNOWN, conClass,
                       get_client_name(acptr, HIDE_IP));
            cnt++;
            break;
        case STAT_UNKNOWN_SERVER:
            send_reply(sptr, RPL_TRACEUNKNOWN, conClass, "Unknown Server");
            cnt++;
            break;
        case STAT_USER:
            /* Only opers see users if there is a wildcard
               but anyone can see all the opers. */
            if ((IsAnOper(sptr) && (MyUser(sptr) ||
                                    !(dow && IsInvisible(acptr)))) || !dow || IsAnOper(acptr)) {
                if (IsAnOper(acptr))
                    send_reply(sptr, RPL_TRACEOPERATOR, conClass,
                               get_client_name(acptr, SHOW_IP),
                               CurrentTime - cli_lasttime(acptr));
                else
                    send_reply(sptr, RPL_TRACEUSER, conClass,
                               get_client_name(acptr, SHOW_IP),
                               CurrentTime - cli_lasttime(acptr));
                cnt++;
            }
            break;
        /*
         * Connection is a server
         *
         * Serv <class> <nS> <nC> <name> <ConnBy> <last> <age>
         *
         * class        Class the server is in
         * nS           Number of servers reached via this link
         * nC           Number of clients reached via this link
         * name         Name of the server linked
         * ConnBy       Who established this link
         * last         Seconds since we got something from this link
         * age          Seconds this link has been alive
         *
         * Additional comments etc......        -Cym-<*****@*****.**>
         */

        case STAT_SERVER:
            if (cli_serv(acptr)->user) {
                if (!cli_serv(acptr)->by[0]
                        || !(acptr2 = findNUser(cli_serv(acptr)->by))
                        || (cli_user(acptr2) != cli_serv(acptr)->user))
                    acptr2 = NULL;
                send_reply(sptr, RPL_TRACESERVER, conClass, link_s[i],
                           link_u[i], cli_name(acptr),
                           acptr2 ? cli_name(acptr2) : "*",
                           cli_serv(acptr)->user->username,
                           cli_serv(acptr)->user->host,
                           CurrentTime - cli_lasttime(acptr),
                           CurrentTime - cli_serv(acptr)->timestamp);
            } else
                send_reply(sptr, RPL_TRACESERVER, conClass, link_s[i],
                           link_u[i], cli_name(acptr),
                           (*(cli_serv(acptr))->by) ?  cli_serv(acptr)->by : "*", "*",
                           cli_name(&me), CurrentTime - cli_lasttime(acptr),
                           CurrentTime - cli_serv(acptr)->timestamp);
            cnt++;
            break;
        default:                  /* We actually shouldn't come here, -msa */
            send_reply(sptr, RPL_TRACENEWTYPE, get_client_name(acptr, HIDE_IP));
            cnt++;
            break;
        }
    }
    /*
     * Add these lines to summarize the above which can get rather long
     * and messy when done remotely - Avalon
     */
    if (IsAnOper(sptr) && doall) {
        for (cl = get_class_list(); cl; cl = cl->next) {
            if (Links(cl) > 1)
                send_reply(sptr, RPL_TRACECLASS, ConClass(cl), Links(cl) - 1);
        }
    }
    send_reply(sptr, RPL_TRACEEND);
    MyFree(link_s);
}
Exemple #21
0
 Protocol Protocol::v6()
 {
     return Protocol(0);
 }