/* build an ACK from the given invite and reply. * NOTE: space has to be allocated allready for the ACK */ void build_ack(char *invite, char *reply, char *ack) { char *body; int len; body = STRSTR(invite, "\r\n\r\n"); if (body) { body++; body++; len = body - invite; memcpy(ack, invite, len); *(ack+len+1) = '\0'; replace_string(ack, "INVITE", "ACK"); cpy_to(ack,reply); set_cl(ack, 0); } }
static void check(const struct sdparm_mode_page_item * mpi, const struct sdparm_mode_page_item * mpi_b) { unsigned char mask; const struct sdparm_mode_page_item * kp = mpi; const struct sdparm_mode_page_item * jp = mpi; const char * acron; int res, prev_mp, prev_msp, prev_pdt, sbyte, sbit, nbits; int second_k = 0; int second_j = 0; clear_cl(); for (prev_mp = 0, prev_msp = 0, prev_pdt = -1; ; ++kp) { if (NULL == kp->acron) { if ((NULL == mpi_b) || second_k) break; prev_mp = 0; prev_msp = 0; kp = mpi_b; second_k = 1; } acron = kp->acron ? kp->acron : "?"; if ((prev_mp != kp->page_num) || (prev_msp != kp->subpage_num)) { if (prev_mp > kp->page_num) printf(" mode page 0x%x,0x%x out of order\n", kp->page_num, kp->subpage_num); if ((prev_mp == kp->page_num) && (prev_msp > kp->subpage_num)) printf(" mode subpage 0x%x,0x%x out of order, previous msp " "was 0x%x\n", kp->page_num, kp->subpage_num, prev_msp); prev_mp = kp->page_num; prev_msp = kp->subpage_num; prev_pdt = kp->pdt; clear_cl(); } else if ((prev_pdt >= 0) && (prev_pdt != kp->pdt)) { if (prev_pdt > kp->pdt) printf(" mode page 0x%x,0x%x pdt out of order, pdt was " "%d, now %d\n", kp->page_num, kp->subpage_num, prev_pdt, kp->pdt); prev_pdt = kp->pdt; } for (jp = kp + 1, second_j = second_k; ; ++jp) { if (NULL == jp->acron) { if ((NULL == mpi_b) || second_j) break; jp = mpi_b; second_j = 1; } if ((0 == strcmp(acron, jp->acron)) && (! (jp->flags & MF_CLASH_OK))) printf(" acronym '%s' with this description: '%s'\n " "clashes with '%s'\n", acron, kp->description, jp->description); } sbyte = kp->start_byte; if ((unsigned)sbyte + 8 > MAX_MP_LEN) { printf(" acronym: %s start byte too large: %d\n", kp->acron, sbyte); continue; } sbit = kp->start_bit; if ((unsigned)sbit > 7) { printf(" acronym: %s start bit too large: %d\n", kp->acron, sbit); continue; } nbits = kp->num_bits; if (nbits > 64) { printf(" acronym: %s number of bits too large: %d\n", kp->acron, nbits); continue; } if (nbits < 1) { printf(" acronym: %s number of bits too small: %d\n", kp->acron, nbits); continue; } mask = (1 << (sbit + 1)) - 1; if ((nbits - 1) < sbit) mask &= ~((1 << (sbit + 1 - nbits)) - 1); res = check_cl(sbyte, kp->pdt, mask); if (res) { if (1 == res) printf(" 0x%x,0x%x: clash at start_byte: %d, bit: %d " "[latest acron: %s, this pdt]\n", prev_mp, prev_msp, sbyte, sbit, acron); else if (2 == res) printf(" 0x%x,0x%x: clash at start_byte: %d, bit: %d " "[latest acron: %s, another pdt]\n", prev_mp, prev_msp, sbyte, sbit, acron); else printf(" 0x%x,0x%x: clash, bad data at start_byte: %d, " "bit: %d [latest acron: %s]\n", prev_mp, prev_msp, sbyte, sbit, acron); } set_cl(sbyte, kp->pdt, mask); if ((nbits - 1) > sbit) { nbits -= (sbit + 1); if ((nbits > 7) && (0 != (nbits % 8))) printf(" 0x%x,0x%x: check nbits: %d, start_byte: %d, bit: " "%d [acron: %s]\n", prev_mp, prev_msp, kp->num_bits, sbyte, sbit, acron); do { ++sbyte; mask = 0xff; if (nbits > 7) nbits -= 8; else { mask &= ~((1 << (8 - nbits)) - 1); nbits = 0; } res = check_cl(sbyte, kp->pdt, mask); if (res) { if (1 == res) printf(" 0x%x,0x%x: clash at start_byte: %d, " "bit: %d [latest acron: %s, this pdt]\n", prev_mp, prev_msp, sbyte, sbit, acron); else if (2 == res) printf(" 0x%x,0x%x: clash at start_byte: %d, " "bit: %d [latest acron: %s, another pdt]\n", prev_mp, prev_msp, sbyte, sbit, acron); else printf(" 0x%x,0x%x: clash, bad at start_byte: " "%d, bit: %d [latest acron: %s]\n", prev_mp, prev_msp, sbyte, sbit, acron); } set_cl(sbyte, kp->pdt, mask); } while (nbits > 0); } } }