xref: /openbsd-src/lib/libcrypto/bio/b_print.c (revision 8bb5c4c3224143edd7f111344f3d0928006433fa)
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