s_socket.c revision 98d58bb80c64b02a33662f0ea80351d4a1535267
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	short p=0;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!host_ip(host,&(ip[0])))
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (p != 0) port=p;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(init_client_ip(sock,ip,port,type));
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_client_ip(int *sock, unsigned char ip[4], int port, int type)
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long addr;
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr_in them;
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int s,i;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ssl_sock_init()) return(0);
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset((char *)&them,0,sizeof(them));
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	them.sin_family=AF_INET;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	them.sin_port=htons((unsigned short)port);
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	addr=(unsigned long)
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[0]<<24L)|
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[1]<<16L)|
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[2]<< 8L)|
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		((unsigned long)ip[3]);
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	them.sin_addr.s_addr=htonl(addr);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (type == SOCK_STREAM)
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else /* ( type == SOCK_DGRAM) */
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (s == INVALID_SOCKET) { perror("socket"); return(0); }
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_MPE
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (type == SOCK_STREAM)
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=0;
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i < 0) { perror("keepalive"); return(0); }
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (connect(s,(struct sockaddr *)&them,sizeof(them)) == -1)
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ close(s); perror("connect"); return(0); }
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*sock=s;
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint do_server(int port, int type, int *ret, int (*cb)(char *hostname, int s, unsigned char *context), unsigned char *context)
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int sock;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *name = NULL;
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int accept_socket;
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!init_server(&accept_socket,port,type)) return(0);
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret != NULL)
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*ret=accept_socket;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* return(1);*/
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  	for (;;)
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  		{
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (type==SOCK_STREAM)
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (do_accept(accept_socket,&sock,&name) == 0)
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SHUTDOWN(accept_socket);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return(0);
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sock = accept_socket;
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=(*cb)(name,sock, context);
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (name != NULL) OPENSSL_free(name);
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (type==SOCK_STREAM)
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SHUTDOWN2(sock);
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i < 0)
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			SHUTDOWN2(accept_socket);
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(i);
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server_long(int *sock, int port, char *ip, int type)
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret=0;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct sockaddr_in server;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int s= -1,i;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ssl_sock_init()) return(0);
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset((char *)&server,0,sizeof(server));
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	server.sin_family=AF_INET;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	server.sin_port=htons((unsigned short)port);
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ip == NULL)
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		server.sin_addr.s_addr=INADDR_ANY;
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Added for T3E, address-of fails on bit field (beckman@acl.lanl.gov) */
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef BIT_FIELD_LIMITS
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(&server.sin_addr.s_addr,ip,4);
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(&server.sin_addr,ip,4);
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (type == SOCK_STREAM)
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else /* type == SOCK_DGRAM */
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			s=socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (s == INVALID_SOCKET) goto err;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined SOL_SOCKET && defined SO_REUSEADDR
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		int j = 1;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			   (void *) &j, sizeof j);
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1)
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINDOWS
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		perror("bind");
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Make it 128 for linux */
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (type==SOCK_STREAM && listen(s,128) == -1) goto err;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=0;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*sock=s;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=1;
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((ret == 0) && (s != -1))
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		SHUTDOWN(s);
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server(int *sock, int port, int type)
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(init_server_long(sock, port, NULL, type));
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_accept(int acc_sock, int *sock, char **host)
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret,i;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct hostent *h1,*h2;
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static struct sockaddr_in from;
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int len;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*	struct linger ling; */
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ssl_sock_init()) return(0);
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINDOWS
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectredoit:
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset((char *)&from,0,sizeof(from));
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=sizeof(from);
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Note: under VMS with SOCKETSHR the fourth parameter is currently
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * of type (int *) whereas under other systems it is (void *) if
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * you don't have a cast it will choke the compiler: if you do
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * have a cast then you can either go for (int *) or (void *).
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len);
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret == INVALID_SOCKET)
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=WSAGetLastError();
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"accept error %d\n",i);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (errno == EINTR)
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/*check_timeout(); */
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto redoit;
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fprintf(stderr,"errno=%d ",errno);
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		perror("accept");
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ling.l_onoff=1;
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ling.l_linger=0;
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=setsockopt(ret,SOL_SOCKET,SO_LINGER,(char *)&ling,sizeof(ling));
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i < 0) { perror("linger"); return(0); }
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=0;
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=setsockopt(ret,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i < 0) { perror("keepalive"); return(0); }
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project*/
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (host == NULL) goto end;
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef BIT_FIELD_LIMITS
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* I should use WSAAsyncGetHostByName() under windows */
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h1=gethostbyaddr((char *)&from.sin_addr.s_addr,
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(from.sin_addr.s_addr),AF_INET);
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h1=gethostbyaddr((char *)&from.sin_addr,
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sizeof(struct in_addr),AF_INET);
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (h1 == NULL)
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"bad gethostbyaddr\n");
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*host=NULL;
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* return(0); */
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL)
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			perror("OPENSSL_malloc");
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BUF_strlcpy(*host,h1->h_name,strlen(h1->h_name)+1);
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		h2=GetHostByName(*host);
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (h2 == NULL)
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname failure\n");
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		i=0;
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (h2->h_addrtype != AF_INET)
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n");
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend:
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*sock=ret;
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint extract_host_port(char *str, char **host_ptr, unsigned char *ip,
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     short *port_ptr)
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *h,*p;
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h=str;
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p=strchr(str,':');
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (p == NULL)
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIO_printf(bio_err,"no port defined\n");
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(0);
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*(p++)='\0';
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((ip != NULL) && !host_ip(str,ip))
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (host_ptr != NULL) *host_ptr=h;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!extract_port(p,port_ptr))
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int host_ip(char *str, unsigned char ip[4])
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int in[4];
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sscanf(str,"%u.%u.%u.%u",&(in[0]),&(in[1]),&(in[2]),&(in[3])) == 4)
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<4; i++)
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (in[i] > 255)
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				BIO_printf(bio_err,"invalid IP address\n");
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[0]=in[0];
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[1]=in[1];
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[2]=in[2];
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[3]=in[3];
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ /* do a gethostbyname */
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		struct hostent *he;
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ssl_sock_init()) return(0);
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		he=GetHostByName(str);
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (he == NULL)
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname failure\n");
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			goto err;
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* cast to short because of win16 winsock definition */
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((short)he->h_addrtype != AF_INET)
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n");
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[0]=he->h_addr_list[0][0];
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[1]=he->h_addr_list[0][1];
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[2]=he->h_addr_list[0][2];
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ip[3]=he->h_addr_list[0][3];
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr:
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint extract_port(char *str, short *port_ptr)
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct servent *s;
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=atoi(str);
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i != 0)
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*port_ptr=(unsigned short)i;
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=getservbyname(str,"tcp");
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (s == NULL)
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			BIO_printf(bio_err,"getservbyname failure for %s\n",str);
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*port_ptr=ntohs((unsigned short)s->s_port);
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define GHBN_NUM	4
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct ghbn_cache_st
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char name[128];
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct hostent ent;
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long order;
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} ghbn_cache[GHBN_NUM];
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long ghbn_hits=0L;
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long ghbn_miss=0L;
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct hostent *GetHostByName(char *name)
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct hostent *ret;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,lowi=0;
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long low= (unsigned long)-1;
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<GHBN_NUM; i++)
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (low > ghbn_cache[i].order)
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			low=ghbn_cache[i].order;
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			lowi=i;
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ghbn_cache[i].order > 0)
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (strncmp(name,ghbn_cache[i].name,128) == 0)
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i == GHBN_NUM) /* no hit*/
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ghbn_miss++;
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=gethostbyname(name);
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ret == NULL) return(NULL);
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* else add to cache */
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(strlen(name) < sizeof ghbn_cache[0].name)
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			strcpy(ghbn_cache[lowi].name,name);
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy((char *)&(ghbn_cache[lowi].ent),ret,sizeof(struct hostent));
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ghbn_cache[lowi].order=ghbn_miss+ghbn_hits;
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(ret);
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ghbn_hits++;
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret= &(ghbn_cache[i].ent);
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ghbn_cache[i].order=ghbn_miss+ghbn_hits;
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(ret);
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
624