19#include <openssl/err.h>
20#include <openssl/bio.h>
39 long ctrl(BIO *b,
int cmd,
long num,
void *ptr)
51 case BIO_C_SET_BUF_MEM_EOF_RETURN:
54 case BIO_CTRL_GET_CLOSE:
55 ret = BIO_get_shutdown(b);
57 case BIO_CTRL_SET_CLOSE:
58 BIO_set_shutdown(b, (
int)num);
60 case BIO_CTRL_WPENDING:
63 case BIO_CTRL_PENDING:
90 MemQ *bmq =
new (std::nothrow)
MemQ();
93 BIO_set_shutdown(b, 1);
95 BIO_set_data(b, (
void *)bmq);
103 if (BIO_get_shutdown(b))
105 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
106 if (BIO_get_init(b) && (bmq !=
nullptr))
109 BIO_set_data(b,
nullptr);
115 static inline int memq_write(BIO *b,
const char *in,
int len)
117 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
120 BIO_clear_retry_flags(b);
124 bmq->
write((
const unsigned char *)in, (
size_t)len);
129 BIOerr(BIO_F_MEM_WRITE, BIO_R_INVALID_ARGUMENT);
135 BIOerr(BIO_F_MEM_WRITE, BIO_R_NULL_PARAMETER);
142 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
144 BIO_clear_retry_flags(b);
149 ret = (int)bmq->
read((
unsigned char *)
out, (size_t)size);
160 BIO_set_retry_read(b);
165 static inline long memq_ctrl(BIO *b,
int cmd,
long arg1,
void *arg2)
167 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
168 return bmq->
ctrl(b, cmd, arg1, arg2);
174 auto len = std::strlen(
str);
175 if (is_safe_conversion<int>(len))
215 return (
MemQ *)(BIO_get_data(b));
223 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