1 /* $OpenBSD: b_print.c,v 1.25 2014/06/12 15:49:28 deraadt Exp $ */
3 /* Theo de Raadt places this file in the public domain. */
5 #include <openssl/bio.h>
8 BIO_printf(BIO
*bio
, const char *format
, ...)
13 va_start(args
, format
);
14 ret
= BIO_vprintf(bio
, format
, args
);
21 _BIO_write(void *cookie
, const char *buf
, int nbytes
)
23 return BIO_write(cookie
, buf
, nbytes
);
27 BIO_vprintf(BIO
*bio
, const char *format
, va_list args
)
32 fp
= funopen(bio
, NULL
, &_BIO_write
, NULL
, NULL
);
37 ret
= vfprintf(fp
, format
, args
);
43 #else /* !HAVE_FUNOPEN */
46 BIO_vprintf(BIO
*bio
, const char *format
, va_list args
)
51 ret
= vasprintf(&buf
, format
, args
);
56 BIO_write(bio
, buf
, ret
);
62 #endif /* HAVE_FUNOPEN */
65 * BIO_snprintf and BIO_vsnprintf return -1 for overflow,
66 * due to the history of this API. Justification:
68 * Traditional snprintf surfaced in 4.4BSD, and returned
69 * "number of bytes wanted". Solaris and Windows opted to
70 * return -1. A draft standard was written which returned -1.
71 * Due to the large volume of code already using the first
72 * semantics, the draft was repaired before standardization to
73 * specify "number of bytes wanted" plus "-1 for character conversion
74 * style errors". Solaris adapted to this rule, but Windows stuck
77 * Original OpenSSL comment which is full of lies:
79 * "In case of truncation, return -1 like traditional snprintf.
80 * (Current drafts for ISO/IEC 9899 say snprintf should return
81 * the number of characters that would have been written,
82 * had the buffer been large enough.)"
85 BIO_snprintf(char *buf
, size_t n
, const char *format
, ...)
90 va_start(args
, format
);
91 ret
= vsnprintf(buf
, n
, format
, args
);
94 if (ret
>= n
|| ret
== -1)
100 BIO_vsnprintf(char *buf
, size_t n
, const char *format
, va_list args
)
104 ret
= vsnprintf(buf
, n
, format
, args
);
106 if (ret
>= n
|| ret
== -1)