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