Ejemplo n.º 1
0
int btTracker::Initial()
{
	if (Http_url_analyse(BTCONTENT.GetAnnounce(), m_host, &m_port, m_path) <
		0) {
		CONSOLE.Warning(1, "error, invalid tracker url format!");
		return -1;
	}

	char chars[37] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	for (int i = 0; i < 8; i++)
		m_key[i] = chars[random() % 36];
	m_key[8] = 0;

	/* get local ip address */
	struct sockaddr_in addr;
	if (cfg_public_ip) { // Get specified public address.
		if ((addr.sin_addr.s_addr =
			inet_addr(cfg_public_ip)) == INADDR_NONE) {
			struct hostent *h;
			h = gethostbyname(cfg_public_ip);
			memcpy(&addr.sin_addr, h->h_addr,
				sizeof(struct in_addr));
		}
		Self.SetIp(addr);
		goto next_step;
	}
	if (cfg_listen_ip) { // Get specified listen address.
		addr.sin_addr.s_addr = cfg_listen_ip;
		Self.SetIp(addr);
		if (!IsPrivateAddress(cfg_listen_ip))
			goto next_step;
	}
	{ // Try to get address corresponding to the hostname.
		struct hostent *h = NULL;
		char hostname[MAXHOSTNAMELEN] = {0};

		if (gethostname(hostname, MAXHOSTNAMELEN) >= 0) {
			//    CONSOLE.Debug("hostname: %s", hostname);
			h = gethostbyname(hostname);
			if (h) {
				//      CONSOLE.Debug("Host name: %s", h->h_name);
				//      CONSOLE.Debug("Address: %s", inet_ntoa(*((struct in_addr *)h->h_addr)));
				if (!IsPrivateAddress
					(((struct in_addr *) (h->h_addr))->s_addr)
					|| !cfg_listen_ip) {
					memcpy(&addr.sin_addr, h->h_addr,
						sizeof(struct in_addr));
					Self.SetIp(addr);
				}
			}
		}
	}

next_step:
	if (BuildBaseRequest() < 0)
		return -1;

	return 0;
}
Ejemplo n.º 2
0
int btTracker::BuildBaseRequest()
{

	const char *format;
	char *opt = (char *) 0;
	char tmppath[MAXPATHLEN];
	char ih_buf[20 * 3 + 1];
	char pi_buf[20 * 3 + 1];
	struct sockaddr_in addr;

	strcpy(tmppath, m_path);

	if (strchr(m_path, '?'))
		format = REQ_URL_P1A_FMT;
	else
		format = REQ_URL_P1_FMT;

	if (cfg_public_ip) {
		opt = new char[5 + strlen(cfg_public_ip)];
		strcpy(opt, "&ip=");
		strcat(opt, cfg_public_ip);
	} else {

		Self.GetAddress(&addr);
		if (!IsPrivateAddress(addr.sin_addr.s_addr)) {
			opt = new char[20];
			strcpy(opt, "&ip=");
			strcat(opt, inet_ntoa(addr.sin_addr));
		}
	}

	if (MAXPATHLEN < snprintf((char *) m_path, MAXPATHLEN, format,
		tmppath,
		Http_url_encode(ih_buf,
		(char *) BTCONTENT.
		GetInfoHash(), 20),
		Http_url_encode(pi_buf,
		(char *) BTCONTENT.GetPeerId(),
		20), opt ? opt : "",
		cfg_listen_port, m_key)) {
		if (opt) {
			delete[]opt;
			opt = (char *) 0;
		}
		return -1;
	}

	if (opt) {
		delete[]opt;
		opt = (char *) 0;
	}

	return 0;
}
Ejemplo n.º 3
0
int btTracker::BuildBaseRequest()
{
  char ih_buf[20 * 3 + 1], pi_buf[20 * 3 + 1], *tmppath, *tmpreq = (char *)0;

  if( !(tmppath = new char[strlen(m_spec->request) + 1]) ||
      !(tmpreq = new char[strlen(m_spec->request) + 256]) ){
    errno = ENOMEM;
    CONSOLE.Warning(1, "Error building tracker request:  %s", strerror(errno));
    if( tmppath ) delete []tmppath;
    return -1;
  }
  strcpy(tmppath, m_spec->request);
  delete []m_spec->request;
  sprintf(tmpreq,
          "GET %s%cinfo_hash=%s&peer_id=%s&key=%s",
          tmppath,
          strchr(tmppath, '?') ? '&' : '?',
          urlencode(ih_buf, BTCONTENT.GetInfoHash(), 20),
          urlencode(pi_buf, BTCONTENT.GetPeerId(), PEER_ID_LEN),
          m_key);

  if( *cfg_listen_port > 0 ){
    strcat(tmpreq, "&port=");
    sprintf(tmpreq + strlen(tmpreq), "%d", (int)*cfg_listen_port);
  }

  cfg_public_ip.Lock();
  if( *cfg_public_ip ){
    strcat(tmpreq, "&ip=");
    strcat(tmpreq, *cfg_public_ip);
  }else{
    struct sockaddr_in addr;
    Self.GetAddress(&addr);
    if( !IsPrivateAddress(addr.sin_addr.s_addr) ){
      strcat(tmpreq, "&ip=");
      strcat(tmpreq, inet_ntoa(addr.sin_addr));
    }
  }

  if( !(m_spec->request = new char[strlen(tmpreq) + 1]) ){
    errno = ENOMEM;
    CONSOLE.Warning(1, "Error building tracker request:  %s", strerror(errno));
    delete []tmpreq;
    return -1;
  }
  strcpy(m_spec->request, tmpreq);
  delete []tmpreq;
  return 0;
}
Ejemplo n.º 4
0
int MultiTracker::Initial()
{
  struct sockaddr_in addr;
  tier_node *tier, *p, *pt, *pp, *tnext, *pnext;
  int result;

  // Determine local IP address
  if( *cfg_public_ip ){  // Get specified public address.
    if( (addr.sin_addr.s_addr = inet_addr(*cfg_public_ip)) == INADDR_NONE ){
      struct hostent *h;
      h = gethostbyname(*cfg_public_ip);
      memcpy(&addr.sin_addr, h->h_addr, sizeof(struct in_addr));
    }
    Self.SetIp(addr);
    goto next_step;
  }
  if( *cfg_listen_ip ){  // Get specified listen address.
    addr.sin_addr.s_addr = *cfg_listen_ip;
    Self.SetIp(addr);
    if( !IsPrivateAddress(*cfg_listen_ip) ) goto next_step;
  }
  { // Try to get address corresponding to the hostname.
    struct hostent *h;
    char hostname[MAXHOSTNAMELEN];

    if( gethostname(hostname, MAXHOSTNAMELEN) >= 0 ){
//    CONSOLE.Debug("hostname: %s", hostname);
      if( (h = gethostbyname(hostname)) ){
//      CONSOLE.Debug("Host name: %s", h->h_name);
//      CONSOLE.Debug("Address: %s", inet_ntoa(*((struct in_addr *)h->h_addr)));
        if( !IsPrivateAddress(((struct in_addr *)h->h_addr)->s_addr) ||
            !*cfg_listen_ip ){
          memcpy(&addr.sin_addr, h->h_addr, sizeof(struct in_addr));
          Self.SetIp(addr);
        }
      }
    }
  }
 next_step:

  // Call each btTracker's Initial()
  result = -1;
  pt = (tier_node *)0;
  for( tier = m_trackers; tier; pt = tier, tier = tnext ){
    tnext = tier->next_tier;
    pp = (tier_node *)0;
    for( p = tier; p; pp = p, p = pnext ){
      pnext = p->next;
      if( p->tracker->Initial() == 0 ) result = 0;
      else{  // remove bad tracker
        if( pp ){
          pp->next = pnext;
          delete p->tracker;
          delete p;
          p = pp;
        }else{
          if( pnext ){
            delete p->tracker;
            p->tracker = pnext->tracker;
            p->next = pnext->next;
            delete pnext;
            pnext = p;
            p = (tier_node *)0;
          }else{
            pt->next_tier = p->next_tier;
            delete p->tracker;
            delete p;
            if( pt ) tier = pt;
            else{
              m_trackers = tnext;
              tier = (tier_node *)0;
            }
          }
        }
      }
    }
  }

  return result;
}