5 // Created by Martin Baulig on 14/11/15.
6 // Copyright (c) 2015 Xamarin. All rights reserved.
15 MonoBtlsReadFunc read_func;
16 MonoBtlsWriteFunc write_func;
17 MonoBtlsControlFunc control_func;
22 mono_debug (const char *message)
25 bio_err = BIO_new_fp (stderr, BIO_NOCLOSE);
26 fprintf (stderr, "DEBUG: %s\n", message);
27 ERR_print_errors (bio_err);
32 mono_read (BIO *bio, char *out, int outl)
34 MonoBtlsBio *mono = (MonoBtlsBio *)bio->ptr;
40 ret = mono->read_func (mono->instance, out, outl, &wantMore);
49 BIO_set_retry_read (bio);
57 mono_write (BIO *bio, const char *in, int inl)
59 MonoBtlsBio *mono = (MonoBtlsBio *)bio->ptr;
64 return mono->write_func (mono->instance, in, inl);
68 mono_ctrl (BIO *bio, int cmd, int64_t num, void *ptr)
70 MonoBtlsBio *mono = (MonoBtlsBio *)bio->ptr;
75 // fprintf (stderr, "mono_ctrl: %x - %lx - %p\n", cmd, num, ptr);
78 return mono->control_func (mono->instance, MONO_BTLS_CONTROL_COMMAND_FLUSH, 0);
88 // mono_debug("mono_new!\n");
98 // mono_debug ("mono_free!\n");
100 MonoBtlsBio *mono = (MonoBtlsBio *)bio->ptr;
103 mono->instance = NULL;
104 mono->read_func = NULL;
105 mono->write_func = NULL;
106 mono->control_func = NULL;
112 static const BIO_METHOD mono_method = {
113 BIO_TYPE_NONE, "mono", mono_write, mono_read,
114 NULL, NULL, mono_ctrl, mono_new, mono_free, NULL
118 mono_btls_bio_mono_new (void)
121 MonoBtlsBio *monoBio;
123 bio = BIO_new (&mono_method);
127 monoBio = calloc (1, sizeof (MonoBtlsBio));
140 mono_btls_bio_mono_initialize (BIO *bio, const void *instance,
141 MonoBtlsReadFunc read_func, MonoBtlsWriteFunc write_func,
142 MonoBtlsControlFunc control_func)
144 MonoBtlsBio *monoBio = bio->ptr;
146 monoBio->instance = instance;
147 monoBio->read_func = read_func;
148 monoBio->write_func = write_func;
149 monoBio->control_func = control_func;
155 mono_btls_bio_read (BIO *bio, void *data, int len)
157 return BIO_read (bio, data, len);
161 mono_btls_bio_write (BIO *bio, const void *data, int len)
163 return BIO_write (bio, data, len);
167 mono_btls_bio_flush (BIO *bio)
169 return BIO_flush (bio);
173 mono_btls_bio_indent (BIO *bio, unsigned indent, unsigned max_indent)
175 return BIO_indent (bio, indent, max_indent);
179 mono_btls_bio_hexdump (BIO *bio, const uint8_t *data, int len, unsigned indent)
181 return BIO_hexdump (bio, data, len, indent);
185 mono_btls_bio_print_errors (BIO *bio)
187 BIO_print_errors (bio);
191 mono_btls_bio_free (BIO *bio)
197 mono_btls_bio_mem_new (void)
199 return BIO_new (BIO_s_mem ());
203 mono_btls_bio_mem_get_data (BIO *bio, void **data)
205 return (int)BIO_get_mem_data (bio, (char**)data);