| 762 | } |
| 763 | |
| 764 | void cbm_http_replyf(cbm_http_conn_t *c, int status, const char *extra_headers, const char *fmt, |
| 765 | ...) { |
| 766 | va_list ap; |
| 767 | va_start(ap, fmt); |
| 768 | va_list ap2; |
| 769 | va_copy(ap2, ap); |
| 770 | int need = vsnprintf(NULL, 0, fmt, ap); |
| 771 | va_end(ap); |
| 772 | if (need < 0) { |
| 773 | va_end(ap2); |
| 774 | return; |
| 775 | } |
| 776 | |
| 777 | char stack_buf[4096]; |
| 778 | char *body = stack_buf; |
| 779 | if ((size_t)need >= sizeof(stack_buf)) { |
| 780 | body = malloc((size_t)need + 1); |
| 781 | if (!body) { |
| 782 | va_end(ap2); |
| 783 | return; |
| 784 | } |
| 785 | } |
| 786 | vsnprintf(body, (size_t)need + 1, fmt, ap2); |
| 787 | va_end(ap2); |
| 788 | |
| 789 | cbm_http_reply_buf(c, status, extra_headers, body, (size_t)need); |
| 790 | if (body != stack_buf) |
| 791 | free(body); |
| 792 | } |
| 793 | |
| 794 | /* ── Pure helpers ─────────────────────────────────────────────── */ |
| 795 |
no test coverage detected