1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/bio/bio_lib.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/crypto.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/stack.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_new(BIO_METHOD *method) 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *ret=NULL; 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=(BIO *)OPENSSL_malloc(sizeof(BIO)); 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_NEW,ERR_R_MALLOC_FAILURE); 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(NULL); 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BIO_set(ret,method)) 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(ret); 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=NULL; 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_set(BIO *bio, BIO_METHOD *method) 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->method=method; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->callback=NULL; 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->cb_arg=NULL; 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->init=0; 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->shutdown=1; 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->flags=0; 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->retry_reason=0; 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->num=0; 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->ptr=NULL; 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->prev_bio=NULL; 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->next_bio=NULL; 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->references=1; 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->num_read=0L; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->num_write=0L; 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_new_ex_data(CRYPTO_EX_INDEX_BIO, bio, &bio->ex_data); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (method->create != NULL) 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!method->create(bio)) 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, bio, 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &bio->ex_data); 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_free(BIO *a) 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 11343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom int i; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a == NULL) return(0); 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_BIO); 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project REF_PRINT("BIO",a); 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i > 0) return(1); 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_CHECK 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fprintf(stderr,"BIO_free, bad reference count\n"); 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project abort(); 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((a->callback != NULL) && 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_free_ex_data(CRYPTO_EX_INDEX_BIO, a, &a->ex_data); 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 135c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root if ((a->method != NULL) && (a->method->destroy != NULL)) 136c64f6fe2be99cb3fa8e491b5bede9a217de87a4cKenny Root a->method->destroy(a); 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a); 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_vfree(BIO *a) 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { BIO_free(a); } 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_clear_flags(BIO *b, int flags) 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->flags &= ~flags; 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_test_flags(const BIO *b, int flags) 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return (b->flags & flags); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_set_flags(BIO *b, int flags) 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->flags |= flags; 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong (*BIO_get_callback(const BIO *b))(struct bio_st *,int,const char *,int, long,long) 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return b->callback; 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_set_callback(BIO *b, long (*cb)(struct bio_st *,int,const char *,int, long,long)) 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->callback = cb; 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_set_callback_arg(BIO *b, char *arg) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->cb_arg = arg; 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar * BIO_get_callback_arg(const BIO *b) 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return b->cb_arg; 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char * BIO_method_name(const BIO *b) 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return b->method->name; 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_method_type(const BIO *b) 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return b->method->type; 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_read(BIO *b, void *out, int outl) 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long (*cb)(BIO *,int,const char *,int,long,long); 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_READ,BIO_R_UNSUPPORTED_METHOD); 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cb=b->callback; 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((cb != NULL) && 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((i=(int)cb(b,BIO_CB_READ,out,outl,0L,1L)) <= 0)) 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!b->init) 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED); 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=b->method->bread(b,out,outl); 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i > 0) b->num_read+=(unsigned long)i; 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cb != NULL) 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=(int)cb(b,BIO_CB_READ|BIO_CB_RETURN,out,outl, 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 0L,(long)i); 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_write(BIO *b, const void *in, int inl) 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long (*cb)(BIO *,int,const char *,int,long,long); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b == NULL) 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cb=b->callback; 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((b->method == NULL) || (b->method->bwrite == NULL)) 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_WRITE,BIO_R_UNSUPPORTED_METHOD); 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((cb != NULL) && 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((i=(int)cb(b,BIO_CB_WRITE,in,inl,0L,1L)) <= 0)) 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!b->init) 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED); 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=b->method->bwrite(b,in,inl); 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i > 0) b->num_write+=(unsigned long)i; 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cb != NULL) 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 0L,(long)i); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_puts(BIO *b, const char *in) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long (*cb)(BIO *,int,const char *,int,long,long); 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_PUTS,BIO_R_UNSUPPORTED_METHOD); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cb=b->callback; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((cb != NULL) && 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((i=(int)cb(b,BIO_CB_PUTS,in,0,0L,1L)) <= 0)) 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!b->init) 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED); 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=b->method->bputs(b,in); 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i > 0) b->num_write+=(unsigned long)i; 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cb != NULL) 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 0L,(long)i); 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_gets(BIO *b, char *in, int inl) 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long (*cb)(BIO *,int,const char *,int,long,long); 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GETS,BIO_R_UNSUPPORTED_METHOD); 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cb=b->callback; 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((cb != NULL) && 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((i=(int)cb(b,BIO_CB_GETS,in,inl,0L,1L)) <= 0)) 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!b->init) 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED); 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=b->method->bgets(b,in,inl); 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cb != NULL) 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=(int)cb(b,BIO_CB_GETS|BIO_CB_RETURN,in,inl, 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 0L,(long)i); 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_indent(BIO *b,int indent,int max) 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(indent < 0) 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project indent=0; 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(indent > max) 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project indent=max; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while(indent--) 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(BIO_puts(b," ") != 1) 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg) 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=iarg; 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(BIO_ctrl(b,cmd,larg,(char *)&i)); 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *BIO_ptr_ctrl(BIO *b, int cmd, long larg) 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *p=NULL; 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_ctrl(b,cmd,larg,(char *)&p) <= 0) 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(NULL); 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(p); 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong BIO_ctrl(BIO *b, int cmd, long larg, void *parg) 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ret; 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long (*cb)(BIO *,int,const char *,int,long,long); 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b == NULL) return(0); 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((b->method == NULL) || (b->method->ctrl == NULL)) 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cb=b->callback; 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((cb != NULL) && 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((ret=cb(b,BIO_CB_CTRL,parg,cmd,larg,1L)) <= 0)) 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=b->method->ctrl(b,cmd,larg,parg); 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cb != NULL) 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project larg,ret); 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long)) 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ret; 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long (*cb)(BIO *,int,const char *,int,long,long); 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b == NULL) return(0); 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_CALLBACK_CTRL,BIO_R_UNSUPPORTED_METHOD); 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-2); 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cb=b->callback; 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((cb != NULL) && 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=b->method->callback_ctrl(b,cmd,fp); 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cb != NULL) 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 0,ret); 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * do; but those macros have inappropriate return type, and for interfacing 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * from other programming languages, C macros aren't much of a help anyway. */ 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsize_t BIO_ctrl_pending(BIO *bio) 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsize_t BIO_ctrl_wpending(BIO *bio) 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* put the 'bio' on the end of b's list of operators */ 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_push(BIO *b, BIO *bio) 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *lb; 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b == NULL) return(bio); 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lb=b; 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (lb->next_bio != NULL) 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lb=lb->next_bio; 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lb->next_bio=bio; 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio != NULL) 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio->prev_bio=lb; 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* called to do internal processing */ 432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_ctrl(b,BIO_CTRL_PUSH,0,lb); 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(b); 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Remove the first and return the rest */ 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_pop(BIO *b) 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *ret; 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b == NULL) return(NULL); 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=b->next_bio; 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_ctrl(b,BIO_CTRL_POP,0,b); 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b->prev_bio != NULL) 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->prev_bio->next_bio=b->next_bio; 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b->next_bio != NULL) 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->next_bio->prev_bio=b->prev_bio; 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->next_bio=NULL; 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->prev_bio=NULL; 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_get_retry_BIO(BIO *bio, int *reason) 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *b,*last; 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b=last=bio; 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BIO_should_retry(b)) break; 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project last=b; 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b=b->next_bio; 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b == NULL) break; 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (reason != NULL) *reason=last->retry_reason; 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(last); 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_get_retry_reason(BIO *bio) 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(bio->retry_reason); 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_find_type(BIO *bio, int type) 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int mt,mask; 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!bio) return NULL; 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mask=type&0xff; 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project do { 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio->method != NULL) 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mt=bio->method->type; 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!mask) 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (mt & type) return(bio); 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (mt == type) 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(bio); 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio=bio->next_bio; 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } while (bio != NULL); 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(NULL); 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_next(BIO *b) 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!b) return NULL; 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return b->next_bio; 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_free_all(BIO *bio) 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *b; 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ref; 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (bio != NULL) 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b=bio; 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ref=b->references; 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio=bio->next_bio; 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(b); 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Since ref count > 1, don't free anyone else. */ 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ref > 1) break; 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_dup_chain(BIO *in) 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 524a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom BIO *ret=NULL,*eoc=NULL,*bio,*new_bio; 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (bio=in; bio != NULL; bio=bio->next_bio) 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 528a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom if ((new_bio=BIO_new(bio->method)) == NULL) goto err; 529a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom new_bio->callback=bio->callback; 530a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom new_bio->cb_arg=bio->cb_arg; 531a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom new_bio->init=bio->init; 532a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom new_bio->shutdown=bio->shutdown; 533a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom new_bio->flags=bio->flags; 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* This will let SSL_s_sock() work with stdin/stdout */ 536a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom new_bio->num=bio->num; 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 538a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom if (!BIO_dup_state(bio,(char *)new_bio)) 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 540a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom BIO_free(new_bio); 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* copy app data */ 545a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data, 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &bio->ex_data)) 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 551a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom eoc=new_bio; 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=eoc; 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 556a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom BIO_push(eoc,new_bio); 557a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom eoc=new_bio; 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret != NULL) 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(ret); 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(NULL); 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_copy_next_retry(BIO *b) 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->retry_reason=b->next_bio->retry_reason; 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_BIO, argl, argp, 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project new_func, dup_func, free_func); 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_set_ex_data(BIO *bio, int idx, void *data) 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *BIO_get_ex_data(BIO *bio, int idx) 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned long BIO_number_read(BIO *bio) 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(bio) return bio->num_read; 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned long BIO_number_written(BIO *bio) 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(bio) return bio->num_write; 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(BIO) 603