s_socket.c revision 392aa7cc7d2b122614c5393c3e357da07fd07af3
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/s_socket.c - socket-related functions used by s_client and s_server */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <signal.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 6598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#ifdef FLAT_INC 6698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#include "e_os2.h" 6798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#else 6898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#include "../e_os2.h" 6998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom#endif 7098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* With IPv6, it looks like Digital has mixed up the proper order of 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project recursive header file inclusion, resulting in the compiler complaining 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project is needed to have fileno() declared correctly... So let's define u_int */ 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT) 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define __U_INT 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef unsigned int u_int; 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define USE_SOCKETS 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NON_MAIN 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef USE_SOCKETS 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef NON_MAIN 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "s_apps.h" 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ssl.h> 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef FLAT_INC 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "e_os.h" 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "../e_os.h" 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_SOCK 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_BSDSOCK) 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "netdb.h" 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct hostent *GetHostByName(char *name); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void ssl_sock_cleanup(void); 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ssl_sock_init(void); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_client_ip(int *sock,unsigned char ip[4], int port, int type); 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server(int *sock, int port, int type); 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server_long(int *sock, int port,char *ip, int type); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_accept(int acc_sock, int *sock, char **host); 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int host_ip(char *str, unsigned char ip[4]); 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WIN16 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SOCKET_PROTOCOL IPPROTO_TCP 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int wsa_init_done=0; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINDOWS 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct WSAData wsa_state; 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int wsa_init_done=0; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WIN16 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic HWND topWnd=0; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic FARPROC lpTopWndProc=NULL; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic FARPROC lpTopHookProc=NULL; 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectextern HINSTANCE _hInstance; /* nice global CRT provides */ 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic LONG FAR PASCAL topHookProc(HWND hwnd, UINT message, WPARAM wParam, 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LPARAM lParam) 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (hwnd == topWnd) 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch(message) 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case WM_DESTROY: 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case WM_CLOSE: 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SetWindowLong(topWnd,GWL_WNDPROC,(LONG)lpTopWndProc); 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ssl_sock_cleanup(); 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return CallWindowProc(lpTopWndProc,hwnd,message,wParam,lParam); 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic BOOL CALLBACK enumproc(HWND hwnd,LPARAM lParam) 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project topWnd=hwnd; 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(FALSE); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WIN32 */ 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WINDOWS */ 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WINDOWS 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void ssl_sock_cleanup(void) 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (wsa_init_done) 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=0; 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINCE 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WSACancelBlockingCall(); 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WSACleanup(); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sock_cleanup(void) 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (wsa_init_done) 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=0; 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WSACleanup(); 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int ssl_sock_init(void) 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef WATT32 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project extern int _watt_do_exit; 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project _watt_do_exit = 0; 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sock_init()) 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return (0); 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_WINDOWS) 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!wsa_init_done) 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err; 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef SIGINT 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signal(SIGINT,(void (*)(int))ssl_sock_cleanup); 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=1; 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(&wsa_state,0,sizeof(wsa_state)); 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (WSAStartup(0x0101,&wsa_state)!=0) 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err=WSAGetLastError(); 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to start WINSOCK, error code=%d\n",err); 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_WIN16 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EnumTaskWindows(GetCurrentTask(),enumproc,0L); 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lpTopWndProc=(FARPROC)GetWindowLong(topWnd,GWL_WNDPROC); 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lpTopHookProc=MakeProcInstance((FARPROC)topHookProc,_hInstance); 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SetWindowLong(topWnd,GWL_WNDPROC,(LONG)lpTopHookProc); 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WIN16 */ 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK) 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WORD wVerReq; 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WSADATA wsaData; 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int err; 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!wsa_init_done) 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifdef SIGINT 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project signal(SIGINT,(void (*)(int))sock_cleanup); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wsa_init_done=1; 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wVerReq = MAKEWORD( 2, 0 ); 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err = WSAStartup(wVerReq,&wsaData); 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (err != 0) 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unable to start WINSOCK2, error code=%d\n",err); 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* OPENSSL_SYS_WINDOWS */ 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint init_client(int *sock, char *host, int port, int type) 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char ip[4]; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom memset(ip, '\0', sizeof ip); 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!host_ip(host,&(ip[0]))) 243392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 244392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return init_client_ip(sock,ip,port,type); 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_client_ip(int *sock, unsigned char ip[4], int port, int type) 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long addr; 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct sockaddr_in them; 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int s,i; 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ssl_sock_init()) return(0); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset((char *)&them,0,sizeof(them)); 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project them.sin_family=AF_INET; 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project them.sin_port=htons((unsigned short)port); 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project addr=(unsigned long) 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[0]<<24L)| 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[1]<<16L)| 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[2]<< 8L)| 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ((unsigned long)ip[3]); 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project them.sin_addr.s_addr=htonl(addr); 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (type == SOCK_STREAM) 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else /* ( type == SOCK_DGRAM) */ 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (s == INVALID_SOCKET) { perror("socket"); return(0); } 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(SO_KEEPALIVE) && !defined(OPENSSL_SYS_MPE) 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (type == SOCK_STREAM) 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=0; 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) { perror("keepalive"); return(0); } 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (connect(s,(struct sockaddr *)&them,sizeof(them)) == -1) 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { closesocket(s); perror("connect"); return(0); } 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *sock=s; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint do_server(int port, int type, int *ret, int (*cb)(char *hostname, int s, unsigned char *context), unsigned char *context) 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int sock; 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *name = NULL; 291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int accept_socket = 0; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!init_server(&accept_socket,port,type)) return(0); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret != NULL) 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *ret=accept_socket; 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* return(1);*/ 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (type==SOCK_STREAM) 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (do_accept(accept_socket,&sock,&name) == 0) 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN(accept_socket); 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sock = accept_socket; 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=(*cb)(name,sock, context); 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (name != NULL) OPENSSL_free(name); 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (type==SOCK_STREAM) 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN2(sock); 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN2(accept_socket); 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(i); 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server_long(int *sock, int port, char *ip, int type) 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int ret=0; 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct sockaddr_in server; 32943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom int s= -1; 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ssl_sock_init()) return(0); 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset((char *)&server,0,sizeof(server)); 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project server.sin_family=AF_INET; 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project server.sin_port=htons((unsigned short)port); 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ip == NULL) 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project server.sin_addr.s_addr=INADDR_ANY; 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Added for T3E, address-of fails on bit field (beckman@acl.lanl.gov) */ 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef BIT_FIELD_LIMITS 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(&server.sin_addr.s_addr,ip,4); 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(&server.sin_addr,ip,4); 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (type == SOCK_STREAM) 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else /* type == SOCK_DGRAM */ 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s=socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP); 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (s == INVALID_SOCKET) goto err; 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined SOL_SOCKET && defined SO_REUSEADDR 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int j = 1; 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project setsockopt(s, SOL_SOCKET, SO_REUSEADDR, 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void *) &j, sizeof j); 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINDOWS 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror("bind"); 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Make it 128 for linux */ 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (type==SOCK_STREAM && listen(s,128) == -1) goto err; 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *sock=s; 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=1; 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ret == 0) && (s != -1)) 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project SHUTDOWN(s); 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int init_server(int *sock, int port, int type) 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(init_server_long(sock, port, NULL, type)); 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_accept(int acc_sock, int *sock, char **host) 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 38543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom int ret; 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent *h1,*h2; 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static struct sockaddr_in from; 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int len; 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* struct linger ling; */ 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ssl_sock_init()) return(0); 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_SYS_WINDOWS 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectredoit: 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset((char *)&from,0,sizeof(from)); 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project len=sizeof(from); 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* Note: under VMS with SOCKETSHR the fourth parameter is currently 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * of type (int *) whereas under other systems it is (void *) if 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * you don't have a cast it will choke the compiler: if you do 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * have a cast then you can either go for (int *) or (void *). 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len); 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == INVALID_SOCKET) 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) 40843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom int i; 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=WSAGetLastError(); 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"accept error %d\n",i); 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (errno == EINTR) 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /*check_timeout(); */ 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto redoit; 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project fprintf(stderr,"errno=%d ",errno); 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror("accept"); 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ling.l_onoff=1; 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ling.l_linger=0; 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=setsockopt(ret,SOL_SOCKET,SO_LINGER,(char *)&ling,sizeof(ling)); 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) { perror("linger"); return(0); } 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=0; 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=setsockopt(ret,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i < 0) { perror("keepalive"); return(0); } 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project*/ 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (host == NULL) goto end; 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef BIT_FIELD_LIMITS 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* I should use WSAAsyncGetHostByName() under windows */ 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project h1=gethostbyaddr((char *)&from.sin_addr.s_addr, 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(from.sin_addr.s_addr),AF_INET); 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project h1=gethostbyaddr((char *)&from.sin_addr, 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(struct in_addr),AF_INET); 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (h1 == NULL) 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"bad gethostbyaddr\n"); 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *host=NULL; 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* return(0); */ 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL) 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror("OPENSSL_malloc"); 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BUF_strlcpy(*host,h1->h_name,strlen(h1->h_name)+1); 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project h2=GetHostByName(*host); 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (h2 == NULL) 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"gethostbyname failure\n"); 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (h2->h_addrtype != AF_INET) 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n"); 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *sock=ret; 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint extract_host_port(char *str, char **host_ptr, unsigned char *ip, 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project short *port_ptr) 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *h,*p; 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project h=str; 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project p=strchr(str,':'); 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (p == NULL) 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"no port defined\n"); 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *(p++)='\0'; 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((ip != NULL) && !host_ip(str,ip)) 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (host_ptr != NULL) *host_ptr=h; 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!extract_port(p,port_ptr)) 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int host_ip(char *str, unsigned char ip[4]) 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int in[4]; 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sscanf(str,"%u.%u.%u.%u",&(in[0]),&(in[1]),&(in[2]),&(in[3])) == 4) 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<4; i++) 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (in[i] > 255) 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"invalid IP address\n"); 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[0]=in[0]; 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[1]=in[1]; 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[2]=in[2]; 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[3]=in[3]; 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { /* do a gethostbyname */ 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent *he; 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!ssl_sock_init()) return(0); 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project he=GetHostByName(str); 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (he == NULL) 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"gethostbyname failure\n"); 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto err; 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* cast to short because of win16 winsock definition */ 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((short)he->h_addrtype != AF_INET) 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n"); 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[0]=he->h_addr_list[0][0]; 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[1]=he->h_addr_list[0][1]; 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[2]=he->h_addr_list[0][2]; 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ip[3]=he->h_addr_list[0][3]; 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecterr: 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint extract_port(char *str, short *port_ptr) 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct servent *s; 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=atoi(str); 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i != 0) 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=(unsigned short)i; 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project s=getservbyname(str,"tcp"); 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (s == NULL) 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"getservbyname failure for %s\n",str); 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(0); 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *port_ptr=ntohs((unsigned short)s->s_port); 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(1); 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define GHBN_NUM 4 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct ghbn_cache_st 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char name[128]; 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent ent; 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long order; 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } ghbn_cache[GHBN_NUM]; 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long ghbn_hits=0L; 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned long ghbn_miss=0L; 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic struct hostent *GetHostByName(char *name) 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project struct hostent *ret; 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,lowi=0; 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned long low= (unsigned long)-1; 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<GHBN_NUM; i++) 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (low > ghbn_cache[i].order) 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project low=ghbn_cache[i].order; 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lowi=i; 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ghbn_cache[i].order > 0) 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strncmp(name,ghbn_cache[i].name,128) == 0) 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i == GHBN_NUM) /* no hit*/ 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_miss++; 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret=gethostbyname(name); 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (ret == NULL) return(NULL); 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* else add to cache */ 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(strlen(name) < sizeof ghbn_cache[0].name) 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project strcpy(ghbn_cache[lowi].name,name); 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy((char *)&(ghbn_cache[lowi].ent),ret,sizeof(struct hostent)); 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_cache[lowi].order=ghbn_miss+ghbn_hits; 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_hits++; 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret= &(ghbn_cache[i].ent); 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ghbn_cache[i].order=ghbn_miss+ghbn_hits; 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return(ret); 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 620