2 * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
11 #include <internal/thread_once.h>
13 CRYPTO_RWLOCK
*bio_type_lock
= NULL
;
14 static CRYPTO_ONCE bio_type_init
= CRYPTO_ONCE_STATIC_INIT
;
16 DEFINE_RUN_ONCE_STATIC(do_bio_type_init
)
18 bio_type_lock
= CRYPTO_THREAD_lock_new();
19 return bio_type_lock
!= NULL
;
22 int BIO_get_new_index()
24 static int bio_count
= BIO_TYPE_START
;
27 if (!RUN_ONCE(&bio_type_init
, do_bio_type_init
)) {
28 BIOerr(BIO_F_BIO_GET_NEW_INDEX
, ERR_R_MALLOC_FAILURE
);
31 if (!CRYPTO_atomic_add(&bio_count
, 1, &newval
, bio_type_lock
))
36 BIO_METHOD
*BIO_meth_new(int type
, const char *name
)
38 BIO_METHOD
*biom
= OPENSSL_zalloc(sizeof(BIO_METHOD
));
47 void BIO_meth_free(BIO_METHOD
*biom
)
52 int (*BIO_meth_get_write(BIO_METHOD
*biom
)) (BIO
*, const char *, int)
57 int BIO_meth_set_write(BIO_METHOD
*biom
,
58 int (*bwrite
) (BIO
*, const char *, int))
60 biom
->bwrite
= bwrite
;
64 int (*BIO_meth_get_read(BIO_METHOD
*biom
)) (BIO
*, char *, int)
66 return biom
->bread_old
;
69 int (*BIO_meth_get_read_ex(BIO_METHOD
*biom
)) (BIO
*, char *, size_t, size_t *)
74 /* Conversion for old style bread to new style */
75 int bread_conv(BIO
*bio
, char *out
, size_t outl
, size_t *read
)
82 ret
= bio
->method
->bread_old(bio
, out
, (int)outl
);
94 int BIO_meth_set_read(BIO_METHOD
*biom
,
95 int (*bread
) (BIO
*, char *, int))
97 biom
->bread_old
= bread
;
98 biom
->bread
= bread_conv
;
102 int BIO_meth_set_read_ex(BIO_METHOD
*biom
,
103 int (*bread
) (BIO
*, char *, size_t, size_t *))
109 int (*BIO_meth_get_puts(BIO_METHOD
*biom
)) (BIO
*, const char *)
114 int BIO_meth_set_puts(BIO_METHOD
*biom
,
115 int (*bputs
) (BIO
*, const char *))
121 int (*BIO_meth_get_gets(BIO_METHOD
*biom
)) (BIO
*, char *, int)
126 int BIO_meth_set_gets(BIO_METHOD
*biom
,
127 int (*bgets
) (BIO
*, char *, int))
133 long (*BIO_meth_get_ctrl(BIO_METHOD
*biom
)) (BIO
*, int, long, void *)
138 int BIO_meth_set_ctrl(BIO_METHOD
*biom
,
139 long (*ctrl
) (BIO
*, int, long, void *))
145 int (*BIO_meth_get_create(BIO_METHOD
*biom
)) (BIO
*)
150 int BIO_meth_set_create(BIO_METHOD
*biom
, int (*create
) (BIO
*))
152 biom
->create
= create
;
156 int (*BIO_meth_get_destroy(BIO_METHOD
*biom
)) (BIO
*)
158 return biom
->destroy
;
161 int BIO_meth_set_destroy(BIO_METHOD
*biom
, int (*destroy
) (BIO
*))
163 biom
->destroy
= destroy
;
167 long (*BIO_meth_get_callback_ctrl(BIO_METHOD
*biom
)) (BIO
*, int, bio_info_cb
*)
169 return biom
->callback_ctrl
;
172 int BIO_meth_set_callback_ctrl(BIO_METHOD
*biom
,
173 long (*callback_ctrl
) (BIO
*, int,
176 biom
->callback_ctrl
= callback_ctrl
;