| 539 | } |
| 540 | |
| 541 | void cbm_http_replyf(cbm_http_conn_t *c, int status, const char *extra_headers, const char *fmt, |
| 542 | ...) { |
| 543 | va_list ap; |
| 544 | va_start(ap, fmt); |
| 545 | va_list ap2; |
| 546 | va_copy(ap2, ap); |
| 547 | int need = vsnprintf(NULL, 0, fmt, ap); |
| 548 | va_end(ap); |
| 549 | if (need < 0) { |
| 550 | va_end(ap2); |
| 551 | return; |
| 552 | } |
| 553 | |
| 554 | char stack_buf[4096]; |
| 555 | char *body = stack_buf; |
| 556 | if ((size_t)need >= sizeof(stack_buf)) { |
| 557 | body = malloc((size_t)need + 1); |
| 558 | if (!body) { |
| 559 | va_end(ap2); |
| 560 | return; |
| 561 | } |
| 562 | } |
| 563 | vsnprintf(body, (size_t)need + 1, fmt, ap2); |
| 564 | va_end(ap2); |
| 565 | |
| 566 | cbm_http_reply_buf(c, status, extra_headers, body, (size_t)need); |
| 567 | if (body != stack_buf) |
| 568 | free(body); |
| 569 | } |
| 570 | |
| 571 | /* ── Pure helpers ─────────────────────────────────────────────── */ |
| 572 |
no test coverage detected