1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/bio/b_sock.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 <stdlib.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_BSDSOCK) 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <netdb.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(NETWARE_CLIB) 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/ioctl.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectNETDB_DEFINE_CONTEXT 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SOCK 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <openssl/dso.h> 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SOCKET_PROTOCOL IPPROTO_TCP 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SO_MAXCONN 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define MAX_LISTEN SO_MAXCONN 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(SOMAXCONN) 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define MAX_LISTEN SOMAXCONN 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define MAX_LISTEN 32 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int wsa_init_done=0; 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/* 92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * WSAAPI specifier is required to make indirect calls to run-time 93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * linked WinSock 2 functions used in this module, to be specific 94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * [get|free]addrinfo and getnameinfo. This is because WinSock uses 95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * uses non-C calling convention, __stdcall vs. __cdecl, on x86 96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * Windows. On non-WinSock platforms WSAAPI needs to be void. 97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */ 98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef WSAAPI 99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define WSAAPI 100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long BIO_ghbn_hits=0L; 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long BIO_ghbn_miss=0L; 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define GHBN_NUM 4 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct ghbn_cache_st 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char name[129]; 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent *ent; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long order; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } ghbn_cache[GHBN_NUM]; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int get_ip(const char *str,unsigned char *ip); 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void ghbn_free(struct hostent *a); 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct hostent *ghbn_dup(struct hostent *a); 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_get_host_ip(const char *str, unsigned char *ip) 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err = 1; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int locked = 0; 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent *he; 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=get_ip(str,ip); 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* At this point, we have something that is most probably correct 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in some way, so let's init the socket. */ 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_sock_init() != 1) 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; /* don't generate another error code here */ 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If the string actually contained an IP address, we need not do 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project anything more */ 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i > 0) return(1); 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* do a gethostbyname */ 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project locked = 1; 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project he=BIO_gethostbyname(str); 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (he == NULL) 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP); 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* cast to short because of win16 winsock definition */ 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((short)he->h_addrtype != AF_INET) 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<4; i++) 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[i]=he->h_addr_list[0][i]; 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err = 0; 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err: 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (locked) 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (err) 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_add_error_data(2,"host=",str); 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_get_port(const char *str, unsigned short *port_ptr) 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct servent *s; 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (str == NULL) 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED); 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=atoi(str); 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i != 0) 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=(unsigned short)i; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME); 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Note: under VMS with SOCKETSHR, it seems like the first 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * parameter is 'char *', instead of 'const char *' 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CONST_STRICT 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s=getservbyname((char *)str,"tcp"); 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s=getservbyname(str,"tcp"); 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(s != NULL) 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=ntohs((unsigned short)s->s_port); 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME); 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(s == NULL) 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(str,"http") == 0) 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=80; 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(str,"telnet") == 0) 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=23; 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(str,"socks") == 0) 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=1080; 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(str,"https") == 0) 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=443; 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(str,"ssl") == 0) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=443; 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(str,"ftp") == 0) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=21; 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(str,"gopher") == 0) 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=70; 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(str,"wais") == 0) 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=21; 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_GETSERVBYNAME,get_last_socket_error()); 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_add_error_data(3,"service='",str,"'"); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_sock_error(int sock) 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int j,i; 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int size; 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(OPENSSL_SYS_BEOS_R5) 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project size=sizeof(int); 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Note: under Windows the third parameter is of type (char *) 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * whereas under other systems it is (void *) if you don't have 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * a cast it will choke the compiler: if you do have a cast then 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * you can either go for (char *) or (void *). 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size); 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(j); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectlong BIO_ghbn_ctrl(int cmd, int iarg, char *parg) 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char **p; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (cmd) 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_GHBN_CTRL_HITS: 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(BIO_ghbn_hits); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* break; */ 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_GHBN_CTRL_MISSES: 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(BIO_ghbn_miss); 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* break; */ 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_GHBN_CTRL_CACHE_SIZE: 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(GHBN_NUM); 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* break; */ 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_GHBN_CTRL_GET_ENTRY: 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((iarg >= 0) && (iarg <GHBN_NUM) && 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (ghbn_cache[iarg].order > 0)) 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p=(char **)parg; 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p == NULL) return(0); 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *p=ghbn_cache[iarg].name; 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_cache[iarg].name[128]='\0'; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* break; */ 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case BIO_GHBN_CTRL_FLUSH: 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<GHBN_NUM; i++) 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_cache[i].order=0; 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct hostent *ghbn_dup(struct hostent *a) 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent *ret; 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,j; 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_off(); 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent)); 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) return(NULL); 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(ret,0,sizeof(struct hostent)); 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; a->h_aliases[i] != NULL; i++) 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ; 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i++; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *)); 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret->h_aliases == NULL) 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(ret->h_aliases, 0, i*sizeof(char *)); 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; a->h_addr_list[i] != NULL; i++) 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ; 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i++; 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *)); 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret->h_addr_list == NULL) 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(ret->h_addr_list, 0, i*sizeof(char *)); 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=strlen(a->h_name)+1; 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err; 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy((char *)ret->h_name,a->h_name,j); 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; a->h_aliases[i] != NULL; i++) 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=strlen(a->h_aliases[i])+1; 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err; 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(ret->h_aliases[i],a->h_aliases[i],j); 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->h_length=a->h_length; 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret->h_addrtype=a->h_addrtype; 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; a->h_addr_list[i] != NULL; i++) 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL) 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (0) 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret != NULL) 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_free(ret); 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=NULL; 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MemCheck_on(); 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void ghbn_free(struct hostent *a) 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(a == NULL) 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return; 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->h_aliases != NULL) 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; a->h_aliases[i] != NULL; i++) 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a->h_aliases[i]); 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a->h_aliases); 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->h_addr_list != NULL) 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; a->h_addr_list[i] != NULL; i++) 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a->h_addr_list[i]); 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a->h_addr_list); 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (a->h_name != NULL) OPENSSL_free(a->h_name); 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(a); 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct hostent *BIO_gethostbyname(const char *name) 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 1 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Caching gethostbyname() results forever is wrong, 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * so we have to let the true gethostbyname() worry about this */ 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if (defined(NETWARE_BSDSOCK) && !defined(__NOVELL_LIBC__)) 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return gethostbyname((char*)name); 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return gethostbyname(name); 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent *ret; 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,lowi=0,j; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long low= (unsigned long)-1; 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if 0 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* It doesn't make sense to use locking here: The function interface 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * is not thread-safe, because threads can never be sure when 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * some other thread destroys the data they were given a pointer to. 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME); 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=strlen(name); 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (j < 128) 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<GHBN_NUM; i++) 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (low > ghbn_cache[i].order) 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project low=ghbn_cache[i].order; 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lowi=i; 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ghbn_cache[i].order > 0) 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strncmp(name,ghbn_cache[i].name,128) == 0) 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=GHBN_NUM; 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i == GHBN_NUM) /* no hit*/ 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_ghbn_miss++; 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Note: under VMS with SOCKETSHR, it seems like the first 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * parameter is 'char *', instead of 'const char *' 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifndef CONST_STRICT 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=gethostbyname((char *)name); 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# else 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=gethostbyname(name); 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (j > 128) /* too big to cache */ 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if 0 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* If we were trying to make this function thread-safe (which 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * is bound to fail), we'd have to give up in this case 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (or allocate more memory). */ 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret = NULL; 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* else add to cache */ 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ghbn_cache[lowi].ent != NULL) 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */ 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_cache[lowi].name[0] = '\0'; 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL) 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE); 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project strncpy(ghbn_cache[lowi].name,name,128); 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_ghbn_hits++; 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret= ghbn_cache[i].ent; 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if 0 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME); 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_sock_init(void) 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINDOWS 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static struct WSAData wsa_state; 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!wsa_init_done) 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err; 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=1; 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(&wsa_state,0,sizeof(wsa_state)); 482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Not making wsa_state available to the rest of the 483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * code is formally wrong. But the structures we use 484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * are [beleived to be] invariable among Winsock DLLs, 485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * while API availability is [expected to be] probed 486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * at run-time with DSO_global_lookup. */ 487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (WSAStartup(0x0202,&wsa_state)!=0) 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err=WSAGetLastError(); 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_WSASTARTUP,err); 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-1); 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WINDOWS */ 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extern int _watt_do_exit; 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project _watt_do_exit = 0; /* don't make sock_init() call exit() */ 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sock_init()) 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return (-1); 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WORD wVerReq; 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WSADATA wsaData; 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err; 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!wsa_init_done) 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=1; 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wVerReq = MAKEWORD( 2, 0 ); 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err = WSAStartup(wVerReq,&wsaData); 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (err != 0) 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_WSASTARTUP,err); 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP); 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(-1); 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid BIO_sock_cleanup(void) 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINDOWS 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (wsa_init_done) 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=0; 531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if 0 /* this call is claimed to be non-present in Winsock2 */ 532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom WSACancelBlockingCall(); 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WSACleanup(); 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (wsa_init_done) 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=0; 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WSACleanup(); 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_socket_ioctl(int fd, long type, void *arg) 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef __DJGPP__ 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=ioctlsocket(fd,type,(char *)arg); 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 554ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# if defined(OPENSSL_SYS_VMS) 555ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom /* 2011-02-18 SMS. 556ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom * VMS ioctl() can't tolerate a 64-bit "void *arg", but we 557ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom * observe that all the consumers pass in an "unsigned long *", 558ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom * so we arrange a local copy with a short pointer, and use 559ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom * that, instead. 560ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom */ 561ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# if __INITIAL_POINTER_SIZE == 64 562ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# define ARG arg_32p 563ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# pragma pointer_size save 564ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# pragma pointer_size 32 565ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom unsigned long arg_32; 566ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom unsigned long *arg_32p; 567ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# pragma pointer_size restore 568ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom arg_32p = &arg_32; 569ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom arg_32 = *((unsigned long *) arg); 570ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# else /* __INITIAL_POINTER_SIZE == 64 */ 571ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# define ARG arg 572ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# endif /* __INITIAL_POINTER_SIZE == 64 [else] */ 573ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# else /* defined(OPENSSL_SYS_VMS) */ 574ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# define ARG arg 575ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom# endif /* defined(OPENSSL_SYS_VMS) [else] */ 576ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom 577ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom i=ioctlsocket(fd,type,ARG); 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* __DJGPP__ */ 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error()); 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* __VMS_VER */ 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The reason I have implemented this instead of using sscanf is because 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int get_ip(const char *str, unsigned char ip[4]) 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int tmp[4]; 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int num=0,c,ok=0; 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp[0]=tmp[1]=tmp[2]=tmp[3]=0; 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c= *(str++); 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((c >= '0') && (c <= '9')) 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ok=1; 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project tmp[num]=tmp[num]*10+c-'0'; 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (tmp[num] > 255) return(0); 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (c == '.') 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ok) return(-1); 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (num == 3) return(0); 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project num++; 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ok=0; 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (c == '\0' && (num == 3) && ok) 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[0]=tmp[0]; 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[1]=tmp[1]; 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[2]=tmp[2]; 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[3]=tmp[3]; 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_get_accept_socket(char *host, int bind_mode) 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=0; 625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom union { 626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr sa; 627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in sa_in; 628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in6 sa_in6; 630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } server,client; 632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int s=INVALID_SOCKET,cs,addrlen; 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char ip[4]; 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned short port; 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *str=NULL,*e; 636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *h,*p; 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long l; 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err_num; 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_sock_init() != 1) return(INVALID_SOCKET); 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((str=BUF_strdup(host)) == NULL) return(INVALID_SOCKET); 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project h=p=NULL; 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project h=str; 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (e=str; *e; e++) 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*e == ':') 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p=e; 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (*e == '/') 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *e='\0'; 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p) *p++='\0'; /* points at last ':', '::port' is special [see below] */ 659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else p=h,h=NULL; 660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef EAI_FAMILY 662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom do { 663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom static union { void *p; 664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int (WSAAPI *f)(const char *,const char *, 665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const struct addrinfo *, 666221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct addrinfo **); 667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } p_getaddrinfo = {NULL}; 668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom static union { void *p; 669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom void (WSAAPI *f)(struct addrinfo *); 670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } p_freeaddrinfo = {NULL}; 671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct addrinfo *res,hint; 672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p_getaddrinfo.p==NULL) 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL || 676221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL) 677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p_getaddrinfo.p=(void*)-1; 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p_getaddrinfo.p==(void *)-1) break; 680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* '::port' enforces IPv6 wildcard listener. Some OSes, 682221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * e.g. Solaris, default to IPv6 without any hint. Also 683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * note that commonly IPv6 wildchard socket can service 684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * IPv4 connections just as well... */ 685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memset(&hint,0,sizeof(hint)); 686ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom hint.ai_flags = AI_PASSIVE; 687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (h) 688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 689221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (strchr(h,':')) 690221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 691221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (h[1]=='\0') h=NULL; 692221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom hint.ai_family = AF_INET6; 694221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else 695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom h=NULL; 696221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 697221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 698221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (h[0]=='*' && h[1]=='\0') 699ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom { 700ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom hint.ai_family = AF_INET; 701221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom h=NULL; 702ee7afb3c942c4eefef6ed06201eafaf8ec58e2e3Brian Carlstrom } 703221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break; 706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 707221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom addrlen = res->ai_addrlen<=sizeof(server) ? 708221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom res->ai_addrlen : 709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sizeof(server); 710221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(&server, res->ai_addr, addrlen); 711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (*p_freeaddrinfo.f)(res); 713221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto again; 714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } while (0); 715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BIO_get_port(p,&port)) goto err; 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset((char *)&server,0,sizeof(server)); 720221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom server.sa_in.sin_family=AF_INET; 721221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom server.sa_in.sin_port=htons(port); 722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom addrlen = sizeof(server.sa_in); 723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (h == NULL || strcmp(h,"*") == 0) 725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom server.sa_in.sin_addr.s_addr=INADDR_ANY; 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!BIO_get_host_ip(h,&(ip[0]))) goto err; 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project l=(unsigned long) 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[0]<<24L)| 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[1]<<16L)| 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[2]<< 8L)| 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[3]); 734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom server.sa_in.sin_addr.s_addr=htonl(l); 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectagain: 738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (s == INVALID_SOCKET) 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_SOCKET,get_last_socket_error()); 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_add_error_data(3,"port='",host,"'"); 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SO_REUSEADDR 748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bind_mode == BIO_BIND_REUSEADDR) 749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i=1; 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i)); 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bind_mode=BIO_BIND_NORMAL; 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 756221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (bind(s,&server.sa,addrlen) == -1) 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SO_REUSEADDR 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err_num=get_last_socket_error(); 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) && 7613d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom#ifdef OPENSSL_SYS_WINDOWS 7623d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom /* Some versions of Windows define EADDRINUSE to 7633d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom * a dummy value. 7643d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom */ 7653d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom (err_num == WSAEADDRINUSE)) 7663d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom#else 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (err_num == EADDRINUSE)) 7683d3a1b8fcf46ca3bdb3d8f09acd6ef604624a30dBrian Carlstrom#endif 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom client = server; 771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (h == NULL || strcmp(h,"*") == 0) 772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (client.sa.sa_family == AF_INET6) 775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr)); 777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom client.sa_in6.sin6_addr.s6_addr[15]=1; 778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 779221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 780221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 781221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (client.sa.sa_family == AF_INET) 782221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 783221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom client.sa_in.sin_addr.s_addr=htonl(0x7F000001); 784221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 785221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else goto err; 786221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 787221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL); 788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cs != INVALID_SOCKET) 789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ii; 791221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ii=connect(cs,&client.sa,addrlen); 792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project closesocket(cs); 793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ii == INVALID_SOCKET) 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bind_mode=BIO_BIND_REUSEADDR; 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project closesocket(s); 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto again; 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* else error */ 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* else error */ 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_BIND,err_num); 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_add_error_data(3,"port='",host,"'"); 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (listen(s,MAX_LISTEN) == -1) 810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_BIND,get_last_socket_error()); 812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_add_error_data(3,"port='",host,"'"); 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET); 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=1; 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (str != NULL) OPENSSL_free(str); 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret == 0) && (s != INVALID_SOCKET)) 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project closesocket(s); 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s= INVALID_SOCKET; 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(s); 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_accept(int sock, char **addr) 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=INVALID_SOCKET; 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long l; 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned short port; 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *p; 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 834221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct { 835221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* 836221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * As for following union. Trouble is that there are platforms 837221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * that have socklen_t and there are platforms that don't, on 838221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * some platforms socklen_t is int and on some size_t. So what 839221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * one can do? One can cook #ifdef spaghetti, which is nothing 840221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * but masochistic. Or one can do union between int and size_t. 841221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * One naturally does it primarily for 64-bit platforms where 842221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * sizeof(int) != sizeof(size_t). But would it work? Note that 843221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * if size_t member is initialized to 0, then later int member 844221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * assignment naturally does the job on little-endian platforms 845221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * regardless accept's expectations! What about big-endians? 846221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * If accept expects int*, then it works, and if size_t*, then 847221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * length value would appear as unreasonably large. But this 848221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * won't prevent it from filling in the address structure. The 849221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * trouble of course would be if accept returns more data than 850221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * actual buffer can accomodate and overwrite stack... That's 851221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * where early OPENSSL_assert comes into picture. Besides, the 852221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * only 64-bit big-endian platform found so far that expects 853221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * size_t* is HP-UX, where stack grows towards higher address. 854221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * <appro> 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 856221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom union { size_t s; int i; } len; 857221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom union { 858221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr sa; 859221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in sa_in; 860221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if OPENSSL_USE_IPV6 861221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sockaddr_in6 sa_in6; 862221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 863221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } from; 864221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } sa; 865221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 866221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sa.len.s=0; 867221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sa.len.i=sizeof(sa.from); 868221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memset(&sa.from,0,sizeof(sa.from)); 869221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret=accept(sock,&sa.from.sa,(void *)&sa.len); 870221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0) 871221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 872221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_assert(sa.len.s<=sizeof(sa.from)); 873221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sa.len.i = (int)sa.len.s; 874221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* use sa.len.i from this point */ 875221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == INVALID_SOCKET) 877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(BIO_sock_should_retry(ret)) return -2; 879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SYSerr(SYS_F_ACCEPT,get_last_socket_error()); 880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR); 881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (addr == NULL) goto end; 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 886221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef EAI_FAMILY 887221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom do { 888221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char h[NI_MAXHOST],s[NI_MAXSERV]; 889221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom size_t nl; 890221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom static union { void *p; 891221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/, 892221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *,size_t,char *,size_t,int); 893221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } p_getnameinfo = {NULL}; 894221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* 2nd argument to getnameinfo is specified to 895221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * be socklen_t. Unfortunately there is a number 896221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * of environments where socklen_t is not defined. 897221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * As it's passed by value, it's safe to pass it 898221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * as size_t... <appro> */ 899221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 900221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p_getnameinfo.p==NULL) 901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 902221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL) 903221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p_getnameinfo.p=(void*)-1; 904221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 905221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p_getnameinfo.p==(void *)-1) break; 906221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 907221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s), 908221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom NI_NUMERICHOST|NI_NUMERICSERV)) break; 909221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom nl = strlen(h)+strlen(s)+2; 910221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom p = *addr; 911221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); } 912221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else { p = OPENSSL_malloc(nl); } 913221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (p==NULL) 914221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 915221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); 916221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 917221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 918221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *addr = p; 919221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_snprintf(*addr,nl,"%s:%s",h,s); 920221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 921221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } while(0); 922221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 923221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sa.from.sa.sa_family != AF_INET) goto end; 924221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom l=ntohl(sa.from.sa_in.sin_addr.s_addr); 925221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom port=ntohs(sa.from.sa_in.sin_port); 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (*addr == NULL) 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((p=OPENSSL_malloc(24)) == NULL) 929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE); 931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *addr=p; 934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_snprintf(*addr,24,"%d.%d.%d.%d:%d", 936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (unsigned char)(l>>24L)&0xff, 937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (unsigned char)(l>>16L)&0xff, 938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (unsigned char)(l>> 8L)&0xff, 939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (unsigned char)(l )&0xff, 940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project port); 941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_set_tcp_ndelay(int s, int on) 946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=0; 948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) 949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int opt; 950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SOL_TCP 952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project opt=SOL_TCP; 953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef IPPROTO_TCP 955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project opt=IPPROTO_TCP; 956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on)); 960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret == 0); 962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_socket_nbio(int s, int mode) 965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret= -1; 967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int l; 968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project l=mode; 970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FIONBIO 971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=BIO_socket_ioctl(s,FIONBIO,&l); 972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret == 0); 974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 975a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom#endif 976