bss_dgram.c revision 656d9c7f52f88b3a3daccafa7655dec086c4756e
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/bio/bio_dgram.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DTLS implementation written by Nagendra Modadugu 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * openssl-core@OpenSSL.org. 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 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, 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DGRAM 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define IP_MTU 14 /* linux is lame */ 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sock_write SockWrite /* Watt-32 uses same names */ 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sock_read SockRead 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sock_puts SockPuts 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_write(BIO *h, const char *buf, int num); 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_read(BIO *h, char *buf, int size); 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_puts(BIO *h, const char *str); 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic long dgram_ctrl(BIO *h, int cmd, long arg1, void *arg2); 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_new(BIO *h); 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_free(BIO *data); 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_clear(BIO *bio); 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_dgram_should_retry(int s); 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic BIO_METHOD methods_dgramp= 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_TYPE_DGRAM, 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "datagram socket", 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dgram_write, 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dgram_read, 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dgram_puts, 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, /* dgram_gets, */ 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dgram_ctrl, 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dgram_new, 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dgram_free, 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project NULL, 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project }; 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct bio_dgram_data_st 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct sockaddr peer; 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int connected; 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int _errno; 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int mtu; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } bio_dgram_data; 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO_METHOD *BIO_s_datagram(void) 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(&methods_dgramp); 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIO *BIO_new_dgram(int fd, int close_flag) 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *ret; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=BIO_new(BIO_s_datagram()); 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) return(NULL); 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fd(ret,fd,close_flag); 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_new(BIO *bi) 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_dgram_data *data = NULL; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bi->init=0; 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bi->num=0; 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data = OPENSSL_malloc(sizeof(bio_dgram_data)); 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (data == NULL) 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(data, 0x00, sizeof(bio_dgram_data)); 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bi->ptr = data; 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bi->flags=0; 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_free(BIO *a) 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_dgram_data *data; 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a == NULL) return(0); 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( ! dgram_clear(a)) 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data = (bio_dgram_data *)a->ptr; 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(data != NULL) OPENSSL_free(data); 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_clear(BIO *a) 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a == NULL) return(0); 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->shutdown) 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->init) 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN2(a->num); 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project a->init=0; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project a->flags=0; 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_read(BIO *b, char *out, int outl) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=0; 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_dgram_data *data = (bio_dgram_data *)b->ptr; 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct sockaddr peer; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int peerlen = sizeof(peer); 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (out != NULL) 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project clear_socket_error(); 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(&peer, 0x00, peerlen); 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Last arg in recvfrom is signed on some platforms and 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * unsigned on others. It is of type socklen_t on some 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * but this is not universal. Cast to (void *) to avoid 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * compiler warnings. 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=recvfrom(b->num,out,outl,0,&peer,(void *)&peerlen); 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( ! data->connected && ret > 0) 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_ctrl(b, BIO_CTRL_DGRAM_CONNECT, 0, &peer); 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_clear_retry_flags(b); 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret <= 0) 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_dgram_should_retry(ret)) 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_retry_read(b); 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->_errno = get_last_socket_error(); 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_write(BIO *b, const char *in, int inl) 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret; 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_dgram_data *data = (bio_dgram_data *)b->ptr; 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project clear_socket_error(); 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( data->connected ) 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=writesocket(b->num,in,inl); 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(NETWARE_CLIB) && defined(NETWARE_BSDSOCK) 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=sendto(b->num, (char *)in, inl, 0, &data->peer, sizeof(data->peer)); 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=sendto(b->num, in, inl, 0, &data->peer, sizeof(data->peer)); 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_clear_retry_flags(b); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret <= 0) 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_sock_should_retry(ret)) 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_retry_write(b); 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->_errno = get_last_socket_error(); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 /* higher layers are responsible for querying MTU, if necessary */ 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( data->_errno == EMSGSIZE) 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* retrieve the new MTU */ 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_ctrl(b, BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic long dgram_ctrl(BIO *b, int cmd, long num, void *ptr) 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long ret=1; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int *ip; 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct sockaddr *to = NULL; 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bio_dgram_data *data = NULL; 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project long sockopt_val = 0; 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int sockopt_len = 0; 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data = (bio_dgram_data *)b->ptr; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (cmd) 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_RESET: 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project num=0; 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_C_FILE_SEEK: 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_C_FILE_TELL: 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_INFO: 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_C_SET_FD: 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project dgram_clear(b); 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->num= *((int *)ptr); 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->shutdown=(int)num; 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->init=1; 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_C_GET_FD: 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (b->init) 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip=(int *)ptr; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ip != NULL) *ip=b->num; 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=b->num; 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret= -1; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_GET_CLOSE: 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=b->shutdown; 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_SET_CLOSE: 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project b->shutdown=(int)num; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_PENDING: 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_WPENDING: 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DUP: 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_FLUSH: 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=1; 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_CONNECT: 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project to = (struct sockaddr *)ptr; 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (connect(b->num, to, sizeof(struct sockaddr)) < 0) 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { perror("connect"); ret = 0; } 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(&(data->peer),to, sizeof(struct sockaddr)); 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* (Linux)kernel sets DF bit on outgoing IP packets */ 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef IP_MTU_DISCOVER 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_MTU_DISCOVER: 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sockopt_val = IP_PMTUDISC_DO; 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER, 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &sockopt_val, sizeof(sockopt_val))) < 0) 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror("setsockopt"); 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_QUERY_MTU: 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sockopt_len = sizeof(sockopt_val); 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret = getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val, 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &sockopt_len)) < 0 || sockopt_val < 0) 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { ret = 0; } 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->mtu = sockopt_val; 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = data->mtu; 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_GET_MTU: 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return data->mtu; 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_SET_MTU: 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->mtu = num; 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = num; 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_SET_CONNECTED: 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project to = (struct sockaddr *)ptr; 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( to != NULL) 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->connected = 1; 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(&(data->peer),to, sizeof(struct sockaddr)); 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->connected = 0; 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(&(data->peer), 0x00, sizeof(struct sockaddr)); 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_SET_PEER: 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project to = (struct sockaddr *) ptr; 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(&(data->peer), to, sizeof(struct sockaddr)); 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT: 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr, 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(struct timeval)) < 0) 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { perror("setsockopt"); ret = -1; } 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT: 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ptr, (void *)&ret) < 0) 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { perror("getsockopt"); ret = -1; } 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT: 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr, 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(struct timeval)) < 0) 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { perror("setsockopt"); ret = -1; } 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT: 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ptr, (void *)&ret) < 0) 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { perror("getsockopt"); ret = -1; } 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP: 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* fall-through */ 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP: 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( data->_errno == EAGAIN) 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 1; 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->_errno = 0; 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EMSGSIZE 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_CTRL_DGRAM_MTU_EXCEEDED: 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ( data->_errno == EMSGSIZE) 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 1; 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project data->_errno = 0; 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = 0; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=0; 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dgram_puts(BIO *bp, const char *str) 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int n,ret; 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project n=strlen(str); 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=dgram_write(bp,str,n); 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_dgram_should_retry(int i) 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err; 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i == 0) || (i == -1)) 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err=get_last_socket_error(); 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */ 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((i == -1) && (err == 0)) 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(BIO_dgram_non_fatal_error(err)); 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_dgram_non_fatal_error(int err) 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (err) 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if defined(WSAEWOULDBLOCK) 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case WSAEWOULDBLOCK: 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if 0 /* This appears to always be an error */ 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if defined(WSAENOTCONN) 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case WSAENOTCONN: 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EWOULDBLOCK 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifdef WSAEWOULDBLOCK 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if WSAEWOULDBLOCK != EWOULDBLOCK 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EWOULDBLOCK: 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# else 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EWOULDBLOCK: 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(ENOTCONN) 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case ENOTCONN: 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EINTR 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EINTR: 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EAGAIN 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if EWOULDBLOCK != EAGAIN 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EAGAIN: 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EPROTO 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EPROTO: 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EINPROGRESS 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EINPROGRESS: 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EALREADY 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EALREADY: 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* DF bit set, and packet larger than MTU */ 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EMSGSIZE 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EMSGSIZE: 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* break; */ 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 489