19#include <openssl/err.h>
20#include <openssl/bio.h>
37 long ctrl(BIO *b,
int cmd,
long num,
void *ptr)
49 case BIO_C_SET_BUF_MEM_EOF_RETURN:
52 case BIO_CTRL_GET_CLOSE:
53 ret = BIO_get_shutdown(b);
55 case BIO_CTRL_SET_CLOSE:
56 BIO_set_shutdown(b, (
int)num);
58 case BIO_CTRL_WPENDING:
61 case BIO_CTRL_PENDING:
88 MemQ *bmq =
new (std::nothrow)
MemQ();
91 BIO_set_shutdown(b, 1);
93 BIO_set_data(b, (
void *)bmq);
101 if (BIO_get_shutdown(b))
103 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
104 if (BIO_get_init(b) && (bmq !=
nullptr))
107 BIO_set_data(b,
nullptr);
113 static inline int memq_write(BIO *b,
const char *in,
int len)
115 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
118 BIO_clear_retry_flags(b);
122 bmq->
write((
const unsigned char *)in, (
size_t)len);
127 BIOerr(BIO_F_MEM_WRITE, BIO_R_INVALID_ARGUMENT);
133 BIOerr(BIO_F_MEM_WRITE, BIO_R_NULL_PARAMETER);
140 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
142 BIO_clear_retry_flags(b);
147 ret = (int)bmq->
read((
unsigned char *)
out, (size_t)size);
158 BIO_set_retry_read(b);
163 static inline long memq_ctrl(BIO *b,
int cmd,
long arg1,
void *arg2)
165 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
166 return bmq->
ctrl(b, cmd, arg1, arg2);
172 auto len = std::strlen(
str);
173 if (is_safe_conversion<int>(len))
213 return (
MemQ *)(BIO_get_data(b));
220 return (
const MemQ *)(BIO_get_data(
const_cast<BIO *
>(b)));
void write(const unsigned char *data, size_t size)
size_t read(unsigned char *data, size_t len)
long ctrl(BIO *b, int cmd, long num, void *ptr)
static int memq_new(BIO *b)
static long memq_ctrl(BIO *b, int cmd, long arg1, void *arg2)
static BIO_METHOD * memq_method
static void init_static()
static int memq_method_type
static int memq_puts(BIO *b, const char *str)
static int memq_read(BIO *b, char *out, int size)
static int memq_free(BIO *b)
static void free_bio_method()
static int memq_write(BIO *b, const char *in, int len)
BIO_METHOD * BIO_s_memq(void)
MemQ * memq_from_bio(BIO *b)
const MemQ * const_memq_from_bio(const BIO *b)
os<< "Session Name: "<< tbc-> session_name<< '\n';os<< "Layer: "<< tbc-> layer str()<< '\n'
static std::stringstream out