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