Exemplo n.º 1
0
stun_hdr_t *
get_stun_full_request(const char *lufrag,
    const char *rufrag, const char *rpwd)
{
  char fullfrag[128];
  int i;
  uint32_t crc;
  char *ptr;
  stun_hdr_t *stn_req = NULL;
  stun_packet_t *stn_pkt = NULL;
  unsigned long int val;

  ENTER;

  TRACE("Generating stun packet for "
  "rufrag(%s),rpwd(%s),lufrag(%s)\n", rufrag, rpwd, lufrag);

  if (!lufrag || !rufrag || !rpwd)
    return NULL;

  x_sprintf(fullfrag, "%s:%s", rufrag, lufrag);

  stn_pkt = stun_pkt_new();
  stun_set_attr_d(stn_pkt, STUN_PRIORITY, 4, (char *) &stn_pkt);
  val = random();
  stun_set_attr_d(stn_pkt, STUN_ICE_CONTROLLED, 8, (char *) &val);
  stun_set_attr_d(stn_pkt, STUN_USERNAME, strlen(fullfrag), (char *) fullfrag);

  stn_req = stun_hdr_from_packet(stn_pkt);

  stn_req->mcookie = STUN_NET_M_COOKIE;
  stn_req->ver_type.raw = htons(STUN_REQ);
  // set transction id
  x_snprintf(stn_req->trans_id, sizeof(stn_req->trans_id), "%12d",
      (int) random());
  stn_req = stun_add_integrity(stn_req, rpwd);

  // add CRC32
  i = ntohs(stn_req->mlen) + sizeof(stun_hdr_t);
  stn_req = x_realloc(stn_req, i + 8);
  stn_req->mlen = htons(i + 8 - sizeof(stun_hdr_t));
  crc = stun_get_fingerprint(stn_req);

  ptr = (char *) stn_req + i;
  *(uint16_t *) ptr = htons(STUN_FINGERPRINT);
  ptr += sizeof(uint16_t);
  *(uint16_t *) ptr = htons(4);
  ptr += sizeof(uint16_t);
  *(uint32_t *) ptr = htonl(crc ^ STUN_FINGERPRINT_XOR);

  stun_pkt_free(stn_pkt);

  EXIT;
  return stn_req;
}
Exemplo n.º 2
0
void _loempa(const char *function, const int line, const int level, const char *fmt, ...) {

  va_list ap;
  char buffer[BSIZE];
  x_size i;

  i = x_snprintf(buffer, BSIZE, "OS %35s %4d: ", function, line);
  va_start(ap, fmt);
  i += x_vsnprintf(buffer + i, BSIZE - i, fmt, ap);
  va_end(ap);

  write(1, buffer, i);

}