15#ifndef OPENVPN_OPENSSL_BIO_BIO_MEMQ_DGRAM_H
16#define OPENVPN_OPENSSL_BIO_BIO_MEMQ_DGRAM_H
20#include <openssl/err.h>
21#include <openssl/bio.h>
49 long ctrl(BIO *b,
int cmd,
long num,
void *ptr)
61 case BIO_C_SET_BUF_MEM_EOF_RETURN:
64 case BIO_CTRL_GET_CLOSE:
65 ret = (long)(BIO_get_shutdown(b));
67 case BIO_CTRL_SET_CLOSE:
68 BIO_set_shutdown(b, (
int)num);
70 case BIO_CTRL_WPENDING:
73 case BIO_CTRL_PENDING:
80 case BIO_CTRL_DGRAM_QUERY_MTU:
83 case BIO_CTRL_DGRAM_GET_MTU:
86 case BIO_CTRL_DGRAM_SET_MTU:
89 case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
107namespace bio_memq_internal {
113 MemQ *bmq =
new (std::nothrow)
MemQ();
116 BIO_set_shutdown(b, 1);
118 b->return_eof_on_empty =
false;
119 BIO_set_data(b, (
void *)bmq);
127 if (BIO_get_shutdown(b))
129 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
130 if (BIO_get_init(b) && (bmq !=
nullptr))
133 BIO_set_data(b,
nullptr);
141 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
144 BIO_clear_retry_flags(b);
148 bmq->
write((
const unsigned char *)in, (
size_t)len);
153 BIOerr(BIO_F_MEM_WRITE, BIO_R_INVALID_ARGUMENT);
159 BIOerr(BIO_F_MEM_WRITE, BIO_R_NULL_PARAMETER);
166 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
168 BIO_clear_retry_flags(b);
173 ret = (int)bmq->
read((
unsigned char *)
out, (size_t)size);
177 BIOerr(BIO_F_MEM_READ, BIO_R_INVALID_ARGUMENT);
185 BIO_set_retry_read(b);
190inline long memq_ctrl(BIO *b,
int cmd,
long arg1,
void *arg2)
192 MemQ *bmq = (
MemQ *)(BIO_get_data(b));
193 return bmq->
ctrl(b, cmd, arg1, arg2);
198 const int len = std::strlen(
str);
213 BIO_meth_set_destroy(memq_destroy);
214 BIO_meth_set_gets(
nullptr);
234 return (
MemQ *)(BIO_get_data(b));
242 return (
const MemQ *)(BIO_get_data(
const_cast<BIO *
>(b)));
250 query_mtu_return = 0;
251 std::memset(&next_timeout, 0,
sizeof(next_timeout));
void write(const unsigned char *data, size_t size)
size_t read(unsigned char *data, size_t len)
struct timeval next_timeout
long ctrl(BIO *b, int cmd, long num, void *ptr)
const struct timeval * get_next_timeout(void) const
int memq_puts(BIO *b, const char *str)
static int memq_method_type
int memq_read(BIO *b, char *out, int size)
long memq_ctrl(BIO *b, int cmd, long arg1, void *arg2)
static BIO_METHOD * memq_method
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