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