1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/s_socket.c -  socket-related functions used by s_client and s_server */
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 <string.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <signal.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
6598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#ifdef FLAT_INC
6698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#include "e_os2.h"
6798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#else
6898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#include "../e_os2.h"
6998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#endif
7098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* With IPv6, it looks like Digital has mixed up the proper order of
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   recursive header file inclusion, resulting in the compiler complaining
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   is needed to have fileno() declared correctly...  So let's define u_int */
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define __U_INT
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef unsigned int u_int;
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NON_MAIN
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h"
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef USE_SOCKETS
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef NON_MAIN
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "s_apps.h"
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ssl.h>
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FLAT_INC
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "e_os.h"
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "../e_os.h"
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SOCK
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_BSDSOCK)
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "netdb.h"
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct hostent *GetHostByName(char *name);
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void ssl_sock_cleanup(void);
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ssl_sock_init(void);
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_client_ip(int *sock,unsigned char ip[4], int port, int type);
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server(int *sock, int port, int type);
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server_long(int *sock, int port,char *ip, int type);
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_accept(int acc_sock, int *sock, char **host);
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int host_ip(char *str, unsigned char ip[4]);
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WIN16
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SOCKET_PROTOCOL	0 /* more microsoft stupidity */
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SOCKET_PROTOCOL	IPPROTO_TCP
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int wsa_init_done=0;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINDOWS
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct WSAData wsa_state;
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int wsa_init_done=0;
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WIN16
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic HWND topWnd=0;
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic FARPROC lpTopWndProc=NULL;
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic FARPROC lpTopHookProc=NULL;
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectextern HINSTANCE _hInstance;  /* nice global CRT provides */
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic LONG FAR PASCAL topHookProc(HWND hwnd, UINT message, WPARAM wParam,
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     LPARAM lParam)
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (hwnd == topWnd)
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		switch(message)
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case WM_DESTROY:
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case WM_CLOSE:
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SetWindowLong(topWnd,GWL_WNDPROC,(LONG)lpTopWndProc);
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ssl_sock_cleanup();
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return CallWindowProc(lpTopWndProc,hwnd,message,wParam,lParam);
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic BOOL CALLBACK enumproc(HWND hwnd,LPARAM lParam)
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	topWnd=hwnd;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(FALSE);
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WIN32 */
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WINDOWS */
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINDOWS
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void ssl_sock_cleanup(void)
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (wsa_init_done)
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		wsa_init_done=0;
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINCE
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		WSACancelBlockingCall();
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		WSACleanup();
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sock_cleanup(void)
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (wsa_init_done)
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        {
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        wsa_init_done=0;
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		WSACleanup();
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ssl_sock_init(void)
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	extern int _watt_do_exit;
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_watt_do_exit = 0;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sock_init())
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return (0);
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_WINDOWS)
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!wsa_init_done)
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int err;
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGINT
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		signal(SIGINT,(void (*)(int))ssl_sock_cleanup);
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		wsa_init_done=1;
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memset(&wsa_state,0,sizeof(wsa_state));
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (WSAStartup(0x0101,&wsa_state)!=0)
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			err=WSAGetLastError();
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"unable to start WINSOCK, error code=%d\n",err);
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WIN16
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EnumTaskWindows(GetCurrentTask(),enumproc,0L);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lpTopWndProc=(FARPROC)GetWindowLong(topWnd,GWL_WNDPROC);
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		lpTopHookProc=MakeProcInstance((FARPROC)topHookProc,_hInstance);
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SetWindowLong(topWnd,GWL_WNDPROC,(LONG)lpTopHookProc);
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WIN16 */
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   WORD wVerReq;
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   WSADATA wsaData;
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   int err;
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   if (!wsa_init_done)
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      {
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifdef SIGINT
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      signal(SIGINT,(void (*)(int))sock_cleanup);
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      wsa_init_done=1;
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      wVerReq = MAKEWORD( 2, 0 );
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      err = WSAStartup(wVerReq,&wsaData);
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      if (err != 0)
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         {
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         BIO_printf(bio_err,"unable to start WINSOCK2, error code=%d\n",err);
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         return(0);
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project         }
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      }
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WINDOWS */
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint init_client(int *sock, char *host, int port, int type)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char ip[4];
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	memset(ip, '\0', sizeof ip);
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!host_ip(host,&(ip[0])))
243392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		return 0;
244392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	return init_client_ip(sock,ip,port,type);
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_client_ip(int *sock, unsigned char ip[4], int port, int type)
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long addr;
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr_in them;
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int s,i;
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ssl_sock_init()) return(0);
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset((char *)&them,0,sizeof(them));
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	them.sin_family=AF_INET;
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	them.sin_port=htons((unsigned short)port);
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	addr=(unsigned long)
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[0]<<24L)|
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[1]<<16L)|
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[2]<< 8L)|
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[3]);
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	them.sin_addr.s_addr=htonl(addr);
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (type == SOCK_STREAM)
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else /* ( type == SOCK_DGRAM) */
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (s == INVALID_SOCKET) { perror("socket"); return(0); }
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE)
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (type == SOCK_STREAM)
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=0;
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
27777c6be7176c48d2ce4d5979a84876d34204eedafKenny Root		if (i < 0) { closesocket(s); perror("keepalive"); return(0); }
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (connect(s,(struct sockaddr *)&them,sizeof(them)) == -1)
282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{ closesocket(s); perror("connect"); return(0); }
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*sock=s;
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint do_server(int port, int type, int *ret, int (*cb)(char *hostname, int s, unsigned char *context), unsigned char *context)
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int sock;
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *name = NULL;
291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int accept_socket = 0;
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!init_server(&accept_socket,port,type)) return(0);
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret != NULL)
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*ret=accept_socket;
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* return(1);*/
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  	for (;;)
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  		{
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (type==SOCK_STREAM)
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (do_accept(accept_socket,&sock,&name) == 0)
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SHUTDOWN(accept_socket);
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return(0);
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sock = accept_socket;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=(*cb)(name,sock, context);
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (name != NULL) OPENSSL_free(name);
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (type==SOCK_STREAM)
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SHUTDOWN2(sock);
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i < 0)
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SHUTDOWN2(accept_socket);
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(i);
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server_long(int *sock, int port, char *ip, int type)
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=0;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr_in server;
32943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	int s= -1;
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ssl_sock_init()) return(0);
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset((char *)&server,0,sizeof(server));
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	server.sin_family=AF_INET;
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	server.sin_port=htons((unsigned short)port);
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ip == NULL)
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		server.sin_addr.s_addr=INADDR_ANY;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Added for T3E, address-of fails on bit field (beckman@acl.lanl.gov) */
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef BIT_FIELD_LIMITS
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(&server.sin_addr.s_addr,ip,4);
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(&server.sin_addr,ip,4);
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (type == SOCK_STREAM)
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else /* type == SOCK_DGRAM */
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s=socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (s == INVALID_SOCKET) goto err;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined SOL_SOCKET && defined SO_REUSEADDR
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int j = 1;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   (void *) &j, sizeof j);
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1)
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINDOWS
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		perror("bind");
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Make it 128 for linux */
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (type==SOCK_STREAM && listen(s,128) == -1) goto err;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*sock=s;
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=1;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((ret == 0) && (s != -1))
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SHUTDOWN(s);
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server(int *sock, int port, int type)
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(init_server_long(sock, port, NULL, type));
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_accept(int acc_sock, int *sock, char **host)
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
38543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	int ret;
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct hostent *h1,*h2;
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static struct sockaddr_in from;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int len;
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*	struct linger ling; */
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ssl_sock_init()) return(0);
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINDOWS
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectredoit:
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset((char *)&from,0,sizeof(from));
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=sizeof(from);
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Note: under VMS with SOCKETSHR the fourth parameter is currently
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * of type (int *) whereas under other systems it is (void *) if
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * you don't have a cast it will choke the compiler: if you do
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * have a cast then you can either go for (int *) or (void *).
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len);
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret == INVALID_SOCKET)
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
40843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom		int i;
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=WSAGetLastError();
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"accept error %d\n",i);
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (errno == EINTR)
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/*check_timeout(); */
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto redoit;
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fprintf(stderr,"errno=%d ",errno);
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		perror("accept");
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ling.l_onoff=1;
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ling.l_linger=0;
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=setsockopt(ret,SOL_SOCKET,SO_LINGER,(char *)&ling,sizeof(ling));
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i < 0) { perror("linger"); return(0); }
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=0;
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=setsockopt(ret,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i < 0) { perror("keepalive"); return(0); }
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project*/
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (host == NULL) goto end;
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef BIT_FIELD_LIMITS
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* I should use WSAAsyncGetHostByName() under windows */
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h1=gethostbyaddr((char *)&from.sin_addr.s_addr,
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(from.sin_addr.s_addr),AF_INET);
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h1=gethostbyaddr((char *)&from.sin_addr,
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(struct in_addr),AF_INET);
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (h1 == NULL)
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"bad gethostbyaddr\n");
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*host=NULL;
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* return(0); */
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL)
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			perror("OPENSSL_malloc");
45377c6be7176c48d2ce4d5979a84876d34204eedafKenny Root			closesocket(ret);
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BUF_strlcpy(*host,h1->h_name,strlen(h1->h_name)+1);
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		h2=GetHostByName(*host);
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (h2 == NULL)
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname failure\n");
46277c6be7176c48d2ce4d5979a84876d34204eedafKenny Root			closesocket(ret);
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (h2->h_addrtype != AF_INET)
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n");
46877c6be7176c48d2ce4d5979a84876d34204eedafKenny Root			closesocket(ret);
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend:
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*sock=ret;
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint extract_host_port(char *str, char **host_ptr, unsigned char *ip,
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     short *port_ptr)
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *h,*p;
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h=str;
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p=strchr(str,':');
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (p == NULL)
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"no port defined\n");
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*(p++)='\0';
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((ip != NULL) && !host_ip(str,ip))
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (host_ptr != NULL) *host_ptr=h;
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!extract_port(p,port_ptr))
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int host_ip(char *str, unsigned char ip[4])
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int in[4];
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sscanf(str,"%u.%u.%u.%u",&(in[0]),&(in[1]),&(in[2]),&(in[3])) == 4)
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<4; i++)
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (in[i] > 255)
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"invalid IP address\n");
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[0]=in[0];
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[1]=in[1];
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[2]=in[2];
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[3]=in[3];
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ /* do a gethostbyname */
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		struct hostent *he;
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ssl_sock_init()) return(0);
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		he=GetHostByName(str);
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (he == NULL)
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname failure\n");
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* cast to short because of win16 winsock definition */
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((short)he->h_addrtype != AF_INET)
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n");
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[0]=he->h_addr_list[0][0];
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[1]=he->h_addr_list[0][1];
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[2]=he->h_addr_list[0][2];
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[3]=he->h_addr_list[0][3];
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint extract_port(char *str, short *port_ptr)
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct servent *s;
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=atoi(str);
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i != 0)
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*port_ptr=(unsigned short)i;
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=getservbyname(str,"tcp");
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (s == NULL)
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"getservbyname failure for %s\n",str);
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*port_ptr=ntohs((unsigned short)s->s_port);
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define GHBN_NUM	4
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct ghbn_cache_st
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char name[128];
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct hostent ent;
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long order;
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} ghbn_cache[GHBN_NUM];
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long ghbn_hits=0L;
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long ghbn_miss=0L;
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct hostent *GetHostByName(char *name)
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct hostent *ret;
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,lowi=0;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long low= (unsigned long)-1;
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<GHBN_NUM; i++)
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (low > ghbn_cache[i].order)
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			low=ghbn_cache[i].order;
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			lowi=i;
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ghbn_cache[i].order > 0)
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strncmp(name,ghbn_cache[i].name,128) == 0)
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i == GHBN_NUM) /* no hit*/
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ghbn_miss++;
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=gethostbyname(name);
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ret == NULL) return(NULL);
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* else add to cache */
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(strlen(name) < sizeof ghbn_cache[0].name)
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			strcpy(ghbn_cache[lowi].name,name);
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy((char *)&(ghbn_cache[lowi].ent),ret,sizeof(struct hostent));
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ghbn_cache[lowi].order=ghbn_miss+ghbn_hits;
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(ret);
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ghbn_hits++;
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret= &(ghbn_cache[i].ent);
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ghbn_cache[i].order=ghbn_miss+ghbn_hits;
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(ret);
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
623