1/* $OpenBSD: b_print.c,v 1.28 2024/03/02 09:18:28 tb Exp $ */
2
3/* Theo de Raadt places this file in the public domain. */
4
5#include <openssl/bio.h>
6
7#include "bio_local.h"
8
9#ifdef HAVE_FUNOPEN
10static int
11_BIO_write(void *cookie, const char *buf, int nbytes)
12{
13	return BIO_write(cookie, buf, nbytes);
14}
15
16int
17BIO_vprintf(BIO *bio, const char *format, va_list args)
18{
19	int ret;
20	FILE *fp;
21
22	fp = funopen(bio, NULL, &_BIO_write, NULL, NULL);
23	if (fp == NULL) {
24		ret = -1;
25		goto fail;
26	}
27	ret = vfprintf(fp, format, args);
28	fclose(fp);
29fail:
30	return (ret);
31}
32
33#else /* !HAVE_FUNOPEN */
34
35int
36BIO_vprintf(BIO *bio, const char *format, va_list args)
37{
38	int ret;
39	char *buf = NULL;
40
41	ret = vasprintf(&buf, format, args);
42	if (ret == -1)
43		return (ret);
44	BIO_write(bio, buf, ret);
45	free(buf);
46	return (ret);
47}
48
49#endif /* HAVE_FUNOPEN */
50
51int
52BIO_printf(BIO *bio, const char *format, ...)
53{
54	va_list args;
55	int ret;
56
57	va_start(args, format);
58	ret = BIO_vprintf(bio, format, args);
59	va_end(args);
60	return (ret);
61}
62LCRYPTO_ALIAS(BIO_printf);
63