isc_result_t isc_buffer_copyregion(isc_buffer_t *b, const isc_region_t *r) { unsigned char *base; unsigned int available; isc_result_t result; REQUIRE(ISC_BUFFER_VALID(b)); REQUIRE(r != NULL); /* * XXXDCL */ base = isc_buffer_used(b); available = isc_buffer_availablelength(b); if (ISC_UNLIKELY(b->autore)) { result = isc_buffer_reserve(&b, r->length); if (result != ISC_R_SUCCESS) return (result); } if (r->length > available) return (ISC_R_NOSPACE); memmove(base, r->base, r->length); b->used += r->length; return (ISC_R_SUCCESS); }
static isc_result_t putstr(isc_buffer_t **b, const char *str) { isc_result_t result; result = isc_buffer_reserve(b, strlen(str)); if (result != ISC_R_SUCCESS) return (result); isc_buffer_putstr(*b, str); return (ISC_R_SUCCESS); }
void isc__buffer_putuint32(isc_buffer_t *b, isc_uint32_t val) { isc_result_t result; REQUIRE(ISC_BUFFER_VALID(b)); if (ISC_UNLIKELY(b->autore)) { result = isc_buffer_reserve(&b, 4); REQUIRE(result == ISC_R_SUCCESS); } REQUIRE(isc_buffer_availablelength(b) >= 4); ISC__BUFFER_PUTUINT32(b, val); }
void isc__buffer_putmem(isc_buffer_t *b, const unsigned char *base, unsigned int length) { isc_result_t result; REQUIRE(ISC_BUFFER_VALID(b)); if (ISC_UNLIKELY(b->autore)) { result = isc_buffer_reserve(&b, length); REQUIRE(result == ISC_R_SUCCESS); } REQUIRE(isc_buffer_availablelength(b) >= length); ISC__BUFFER_PUTMEM(b, base, length); }
void isc__buffer_putuint48(isc_buffer_t *b, isc_uint64_t val) { isc_result_t result; isc_uint16_t valhi; isc_uint32_t vallo; REQUIRE(ISC_BUFFER_VALID(b)); if (ISC_UNLIKELY(b->autore)) { result = isc_buffer_reserve(&b, 6); REQUIRE(result == ISC_R_SUCCESS); } REQUIRE(isc_buffer_availablelength(b) >= 6); valhi = (isc_uint16_t)(val >> 32); vallo = (isc_uint32_t)(val & 0xFFFFFFFF); ISC__BUFFER_PUTUINT16(b, valhi); ISC__BUFFER_PUTUINT32(b, vallo); }
void isc_buffer_putdecint(isc_buffer_t *b, isc_int64_t v) { unsigned int l=0; unsigned char *cp; char buf[21]; isc_result_t result; REQUIRE(ISC_BUFFER_VALID(b)); /* xxxwpk do it more low-level way ? */ l = snprintf(buf, 21, "%" ISC_PRINT_QUADFORMAT "d", v); RUNTIME_CHECK(l <= 21); if (ISC_UNLIKELY(b->autore)) { result = isc_buffer_reserve(&b, l); REQUIRE(result == ISC_R_SUCCESS); } REQUIRE(isc_buffer_availablelength(b) >= l); cp = isc_buffer_used(b); memmove(cp, buf, l); b->used += l; }
static void print_packet(dns_dtdata_t *dt, const dns_master_style_t *style) { isc_buffer_t *b = NULL; isc_result_t result; if (dt->msg != NULL) { size_t textlen = 2048; isc_buffer_allocate(mctx, &b, textlen); if (b == NULL) fatal("out of memory"); for (;;) { isc_buffer_reserve(&b, textlen); if (b == NULL) fatal("out of memory"); result = dns_message_totext(dt->msg, style, 0, b); if (result == ISC_R_NOSPACE) { textlen *= 2; continue; } else if (result == ISC_R_SUCCESS) { printf("%.*s", (int) isc_buffer_usedlength(b), (char *) isc_buffer_base(b)); isc_buffer_free(&b); } else { isc_buffer_free(&b); CHECKM(result, "dns_message_totext"); } break; } } cleanup: if (b != NULL) isc_buffer_free(&b); }
void isc__buffer_putstr(isc_buffer_t *b, const char *source) { unsigned int l; unsigned char *cp; isc_result_t result; REQUIRE(ISC_BUFFER_VALID(b)); REQUIRE(source != NULL); /* * Do not use ISC__BUFFER_PUTSTR(), so strlen is only done once. */ l = strlen(source); if (ISC_UNLIKELY(b->autore)) { result = isc_buffer_reserve(&b, l); REQUIRE(result == ISC_R_SUCCESS); } REQUIRE(isc_buffer_availablelength(b) >= l); cp = isc_buffer_used(b); memmove(cp, source, l); b->used += l; }