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; }
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); }