newlen= vb->used+len;
if (vb->avail < newlen) {
+ if (newlen<20) newlen= 20;
newlen <<= 1;
nb= realloc(vb->buf,newlen);
- if (!nb) { newlen >>= 1; nb= realloc(vb->buf,newlen); }
+ if (!nb) { newlen= vb->used+len; nb= realloc(vb->buf,newlen); }
if (!nb) return 0;
vb->buf= nb;
vb->avail= newlen;
return 1;
}
+void adns__vbuf_free(vbuf *vb) {
+ free(vb->buf);
+ adns__vbuf_init(vb);
+}
+
/* Additional diagnostic functions */
const char *adns__diag_domain(adns_state ads, int serv, adns_query qu, vbuf *vb,
*
* _alloc_interim can fail, in which case it will fail the query too,
* so nothing more need be done with it.
+ *
+ * adns__alloc_interim(qu,0) will not return 0, but it will not
+ * necessarily return a distinct pointer each time.
*/
void *adns__alloc_mine(adns_query qu, size_t sz);
*/
void *adns__alloc_final(adns_query qu, size_t sz);
-/* Cannot fail.
+/* Cannot fail, and cannot return 0.
*/
void adns__makefinal_block(adns_query qu, void **blpp, size_t sz);
*query_r= qu;
- qu->query_dgram= malloc(qumsg_vb->used);
- if (!qu->query_dgram) {
- adns__query_fail(qu,adns_s_nolocalmem);
- return adns_s_ok;
+ qu->query_dglen= qumsg_vb->used;
+ if (qumsg_vb->used) {
+ qu->query_dgram= malloc(qumsg_vb->used);
+ if (!qu->query_dgram) {
+ adns__query_fail(qu,adns_s_nolocalmem);
+ return adns_s_ok;
+ }
+ memcpy(qu->query_dgram,qumsg_vb->buf,qumsg_vb->used);
+ } else {
+ qu->query_dgram= 0;
}
- memcpy(qu->query_dgram,qumsg_vb->buf,qumsg_vb->used);
qu->vb= *qumsg_vb;
adns__vbuf_init(qumsg_vb);
void *adns__alloc_interim(adns_query qu, size_t sz) {
allocnode *an;
+ if (!sz) return qu; /* Any old pointer will do */
assert(!qu->final_allocspace);
sz= MEM_ROUND(sz);
an= malloc(MEM_ROUND(MEM_ROUND(sizeof(*an)) + sz));