Home | History | Annotate | Download | only in bio
      1 /* crypto/bio/b_sock.c */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 
     59 #include <stdio.h>
     60 #include <stdlib.h>
     61 #include <errno.h>
     62 #define USE_SOCKETS
     63 #include "cryptlib.h"
     64 #include <openssl/bio.h>
     65 #if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_BSDSOCK)
     66 #include <netdb.h>
     67 #if defined(NETWARE_CLIB)
     68 #include <sys/ioctl.h>
     69 NETDB_DEFINE_CONTEXT
     70 #endif
     71 #endif
     72 
     73 #ifndef OPENSSL_NO_SOCK
     74 
     75 #include <openssl/dso.h>
     76 
     77 #define SOCKET_PROTOCOL IPPROTO_TCP
     78 
     79 #ifdef SO_MAXCONN
     80 #define MAX_LISTEN  SO_MAXCONN
     81 #elif defined(SOMAXCONN)
     82 #define MAX_LISTEN  SOMAXCONN
     83 #else
     84 #define MAX_LISTEN  32
     85 #endif
     86 
     87 #if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
     88 static int wsa_init_done=0;
     89 #endif
     90 
     91 /*
     92  * WSAAPI specifier is required to make indirect calls to run-time
     93  * linked WinSock 2 functions used in this module, to be specific
     94  * [get|free]addrinfo and getnameinfo. This is because WinSock uses
     95  * uses non-C calling convention, __stdcall vs. __cdecl, on x86
     96  * Windows. On non-WinSock platforms WSAAPI needs to be void.
     97  */
     98 #ifndef WSAAPI
     99 #define WSAAPI
    100 #endif
    101 
    102 #if 0
    103 static unsigned long BIO_ghbn_hits=0L;
    104 static unsigned long BIO_ghbn_miss=0L;
    105 
    106 #define GHBN_NUM	4
    107 static struct ghbn_cache_st
    108 	{
    109 	char name[129];
    110 	struct hostent *ent;
    111 	unsigned long order;
    112 	} ghbn_cache[GHBN_NUM];
    113 #endif
    114 
    115 static int get_ip(const char *str,unsigned char *ip);
    116 #if 0
    117 static void ghbn_free(struct hostent *a);
    118 static struct hostent *ghbn_dup(struct hostent *a);
    119 #endif
    120 int BIO_get_host_ip(const char *str, unsigned char *ip)
    121 	{
    122 	int i;
    123 	int err = 1;
    124 	int locked = 0;
    125 	struct hostent *he;
    126 
    127 	i=get_ip(str,ip);
    128 	if (i < 0)
    129 		{
    130 		BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS);
    131 		goto err;
    132 		}
    133 
    134 	/* At this point, we have something that is most probably correct
    135 	   in some way, so let's init the socket. */
    136 	if (BIO_sock_init() != 1)
    137 		return 0; /* don't generate another error code here */
    138 
    139 	/* If the string actually contained an IP address, we need not do
    140 	   anything more */
    141 	if (i > 0) return(1);
    142 
    143 	/* do a gethostbyname */
    144 	CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
    145 	locked = 1;
    146 	he=BIO_gethostbyname(str);
    147 	if (he == NULL)
    148 		{
    149 		BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP);
    150 		goto err;
    151 		}
    152 
    153 	/* cast to short because of win16 winsock definition */
    154 	if ((short)he->h_addrtype != AF_INET)
    155 		{
    156 		BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
    157 		goto err;
    158 		}
    159 	for (i=0; i<4; i++)
    160 		ip[i]=he->h_addr_list[0][i];
    161 	err = 0;
    162 
    163  err:
    164 	if (locked)
    165 		CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
    166 	if (err)
    167 		{
    168 		ERR_add_error_data(2,"host=",str);
    169 		return 0;
    170 		}
    171 	else
    172 		return 1;
    173 	}
    174 
    175 int BIO_get_port(const char *str, unsigned short *port_ptr)
    176 	{
    177 	int i;
    178 	struct servent *s;
    179 
    180 	if (str == NULL)
    181 		{
    182 		BIOerr(BIO_F_BIO_GET_PORT,BIO_R_NO_PORT_DEFINED);
    183 		return(0);
    184 		}
    185 	i=atoi(str);
    186 	if (i != 0)
    187 		*port_ptr=(unsigned short)i;
    188 	else
    189 		{
    190 		CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME);
    191 		/* Note: under VMS with SOCKETSHR, it seems like the first
    192 		 * parameter is 'char *', instead of 'const char *'
    193 		 */
    194 #ifndef CONST_STRICT
    195 		s=getservbyname((char *)str,"tcp");
    196 #else
    197 		s=getservbyname(str,"tcp");
    198 #endif
    199 		if(s != NULL)
    200 			*port_ptr=ntohs((unsigned short)s->s_port);
    201 		CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
    202 		if(s == NULL)
    203 			{
    204 			if (strcmp(str,"http") == 0)
    205 				*port_ptr=80;
    206 			else if (strcmp(str,"telnet") == 0)
    207 				*port_ptr=23;
    208 			else if (strcmp(str,"socks") == 0)
    209 				*port_ptr=1080;
    210 			else if (strcmp(str,"https") == 0)
    211 				*port_ptr=443;
    212 			else if (strcmp(str,"ssl") == 0)
    213 				*port_ptr=443;
    214 			else if (strcmp(str,"ftp") == 0)
    215 				*port_ptr=21;
    216 			else if (strcmp(str,"gopher") == 0)
    217 				*port_ptr=70;
    218 #if 0
    219 			else if (strcmp(str,"wais") == 0)
    220 				*port_ptr=21;
    221 #endif
    222 			else
    223 				{
    224 				SYSerr(SYS_F_GETSERVBYNAME,get_last_socket_error());
    225 				ERR_add_error_data(3,"service='",str,"'");
    226 				return(0);
    227 				}
    228 			}
    229 		}
    230 	return(1);
    231 	}
    232 
    233 int BIO_sock_error(int sock)
    234 	{
    235 	int j,i;
    236 	int size;
    237 
    238 #if defined(OPENSSL_SYS_BEOS_R5)
    239 	return 0;
    240 #endif
    241 
    242 	size=sizeof(int);
    243 	/* Note: under Windows the third parameter is of type (char *)
    244 	 * whereas under other systems it is (void *) if you don't have
    245 	 * a cast it will choke the compiler: if you do have a cast then
    246 	 * you can either go for (char *) or (void *).
    247 	 */
    248 	i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size);
    249 	if (i < 0)
    250 		return(1);
    251 	else
    252 		return(j);
    253 	}
    254 
    255 #if 0
    256 long BIO_ghbn_ctrl(int cmd, int iarg, char *parg)
    257 	{
    258 	int i;
    259 	char **p;
    260 
    261 	switch (cmd)
    262 		{
    263 	case BIO_GHBN_CTRL_HITS:
    264 		return(BIO_ghbn_hits);
    265 		/* break; */
    266 	case BIO_GHBN_CTRL_MISSES:
    267 		return(BIO_ghbn_miss);
    268 		/* break; */
    269 	case BIO_GHBN_CTRL_CACHE_SIZE:
    270 		return(GHBN_NUM);
    271 		/* break; */
    272 	case BIO_GHBN_CTRL_GET_ENTRY:
    273 		if ((iarg >= 0) && (iarg <GHBN_NUM) &&
    274 			(ghbn_cache[iarg].order > 0))
    275 			{
    276 			p=(char **)parg;
    277 			if (p == NULL) return(0);
    278 			*p=ghbn_cache[iarg].name;
    279 			ghbn_cache[iarg].name[128]='\0';
    280 			return(1);
    281 			}
    282 		return(0);
    283 		/* break; */
    284 	case BIO_GHBN_CTRL_FLUSH:
    285 		for (i=0; i<GHBN_NUM; i++)
    286 			ghbn_cache[i].order=0;
    287 		break;
    288 	default:
    289 		return(0);
    290 		}
    291 	return(1);
    292 	}
    293 #endif
    294 
    295 #if 0
    296 static struct hostent *ghbn_dup(struct hostent *a)
    297 	{
    298 	struct hostent *ret;
    299 	int i,j;
    300 
    301 	MemCheck_off();
    302 	ret=(struct hostent *)OPENSSL_malloc(sizeof(struct hostent));
    303 	if (ret == NULL) return(NULL);
    304 	memset(ret,0,sizeof(struct hostent));
    305 
    306 	for (i=0; a->h_aliases[i] != NULL; i++)
    307 		;
    308 	i++;
    309 	ret->h_aliases = (char **)OPENSSL_malloc(i*sizeof(char *));
    310 	if (ret->h_aliases == NULL)
    311 		goto err;
    312 	memset(ret->h_aliases, 0, i*sizeof(char *));
    313 
    314 	for (i=0; a->h_addr_list[i] != NULL; i++)
    315 		;
    316 	i++;
    317 	ret->h_addr_list=(char **)OPENSSL_malloc(i*sizeof(char *));
    318 	if (ret->h_addr_list == NULL)
    319 		goto err;
    320 	memset(ret->h_addr_list, 0, i*sizeof(char *));
    321 
    322 	j=strlen(a->h_name)+1;
    323 	if ((ret->h_name=OPENSSL_malloc(j)) == NULL) goto err;
    324 	memcpy((char *)ret->h_name,a->h_name,j);
    325 	for (i=0; a->h_aliases[i] != NULL; i++)
    326 		{
    327 		j=strlen(a->h_aliases[i])+1;
    328 		if ((ret->h_aliases[i]=OPENSSL_malloc(j)) == NULL) goto err;
    329 		memcpy(ret->h_aliases[i],a->h_aliases[i],j);
    330 		}
    331 	ret->h_length=a->h_length;
    332 	ret->h_addrtype=a->h_addrtype;
    333 	for (i=0; a->h_addr_list[i] != NULL; i++)
    334 		{
    335 		if ((ret->h_addr_list[i]=OPENSSL_malloc(a->h_length)) == NULL)
    336 			goto err;
    337 		memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length);
    338 		}
    339 	if (0)
    340 		{
    341 err:
    342 		if (ret != NULL)
    343 			ghbn_free(ret);
    344 		ret=NULL;
    345 		}
    346 	MemCheck_on();
    347 	return(ret);
    348 	}
    349 
    350 static void ghbn_free(struct hostent *a)
    351 	{
    352 	int i;
    353 
    354 	if(a == NULL)
    355 	    return;
    356 
    357 	if (a->h_aliases != NULL)
    358 		{
    359 		for (i=0; a->h_aliases[i] != NULL; i++)
    360 			OPENSSL_free(a->h_aliases[i]);
    361 		OPENSSL_free(a->h_aliases);
    362 		}
    363 	if (a->h_addr_list != NULL)
    364 		{
    365 		for (i=0; a->h_addr_list[i] != NULL; i++)
    366 			OPENSSL_free(a->h_addr_list[i]);
    367 		OPENSSL_free(a->h_addr_list);
    368 		}
    369 	if (a->h_name != NULL) OPENSSL_free(a->h_name);
    370 	OPENSSL_free(a);
    371 	}
    372 
    373 #endif
    374 
    375 struct hostent *BIO_gethostbyname(const char *name)
    376 	{
    377 #if 1
    378 	/* Caching gethostbyname() results forever is wrong,
    379 	 * so we have to let the true gethostbyname() worry about this */
    380 #if (defined(NETWARE_BSDSOCK) && !defined(__NOVELL_LIBC__))
    381 	return gethostbyname((char*)name);
    382 #else
    383 	return gethostbyname(name);
    384 #endif
    385 #else
    386 	struct hostent *ret;
    387 	int i,lowi=0,j;
    388 	unsigned long low= (unsigned long)-1;
    389 
    390 
    391 #  if 0
    392 	/* It doesn't make sense to use locking here: The function interface
    393 	 * is not thread-safe, because threads can never be sure when
    394 	 * some other thread destroys the data they were given a pointer to.
    395 	 */
    396 	CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
    397 #  endif
    398 	j=strlen(name);
    399 	if (j < 128)
    400 		{
    401 		for (i=0; i<GHBN_NUM; i++)
    402 			{
    403 			if (low > ghbn_cache[i].order)
    404 				{
    405 				low=ghbn_cache[i].order;
    406 				lowi=i;
    407 				}
    408 			if (ghbn_cache[i].order > 0)
    409 				{
    410 				if (strncmp(name,ghbn_cache[i].name,128) == 0)
    411 					break;
    412 				}
    413 			}
    414 		}
    415 	else
    416 		i=GHBN_NUM;
    417 
    418 	if (i == GHBN_NUM) /* no hit*/
    419 		{
    420 		BIO_ghbn_miss++;
    421 		/* Note: under VMS with SOCKETSHR, it seems like the first
    422 		 * parameter is 'char *', instead of 'const char *'
    423 		 */
    424 #  ifndef CONST_STRICT
    425 		ret=gethostbyname((char *)name);
    426 #  else
    427 		ret=gethostbyname(name);
    428 #  endif
    429 
    430 		if (ret == NULL)
    431 			goto end;
    432 		if (j > 128) /* too big to cache */
    433 			{
    434 #  if 0
    435 			/* If we were trying to make this function thread-safe (which
    436 			 * is bound to fail), we'd have to give up in this case
    437 			 * (or allocate more memory). */
    438 			ret = NULL;
    439 #  endif
    440 			goto end;
    441 			}
    442 
    443 		/* else add to cache */
    444 		if (ghbn_cache[lowi].ent != NULL)
    445 			ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */
    446 		ghbn_cache[lowi].name[0] = '\0';
    447 
    448 		if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL)
    449 			{
    450 			BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE);
    451 			goto end;
    452 			}
    453 		strncpy(ghbn_cache[lowi].name,name,128);
    454 		ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits;
    455 		}
    456 	else
    457 		{
    458 		BIO_ghbn_hits++;
    459 		ret= ghbn_cache[i].ent;
    460 		ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits;
    461 		}
    462 end:
    463 #  if 0
    464 	CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
    465 #  endif
    466 	return(ret);
    467 #endif
    468 	}
    469 
    470 
    471 int BIO_sock_init(void)
    472 	{
    473 #ifdef OPENSSL_SYS_WINDOWS
    474 	static struct WSAData wsa_state;
    475 
    476 	if (!wsa_init_done)
    477 		{
    478 		int err;
    479 
    480 		wsa_init_done=1;
    481 		memset(&wsa_state,0,sizeof(wsa_state));
    482 		/* Not making wsa_state available to the rest of the
    483 		 * code is formally wrong. But the structures we use
    484 		 * are [beleived to be] invariable among Winsock DLLs,
    485 		 * while API availability is [expected to be] probed
    486 		 * at run-time with DSO_global_lookup. */
    487 		if (WSAStartup(0x0202,&wsa_state)!=0)
    488 			{
    489 			err=WSAGetLastError();
    490 			SYSerr(SYS_F_WSASTARTUP,err);
    491 			BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP);
    492 			return(-1);
    493 			}
    494 		}
    495 #endif /* OPENSSL_SYS_WINDOWS */
    496 #ifdef WATT32
    497 	extern int _watt_do_exit;
    498 	_watt_do_exit = 0;    /* don't make sock_init() call exit() */
    499 	if (sock_init())
    500 		return (-1);
    501 #endif
    502 
    503 #if defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
    504     WORD wVerReq;
    505     WSADATA wsaData;
    506     int err;
    507 
    508     if (!wsa_init_done)
    509     {
    510         wsa_init_done=1;
    511         wVerReq = MAKEWORD( 2, 0 );
    512         err = WSAStartup(wVerReq,&wsaData);
    513         if (err != 0)
    514         {
    515             SYSerr(SYS_F_WSASTARTUP,err);
    516             BIOerr(BIO_F_BIO_SOCK_INIT,BIO_R_WSASTARTUP);
    517             return(-1);
    518 			}
    519 		}
    520 #endif
    521 
    522 	return(1);
    523 	}
    524 
    525 void BIO_sock_cleanup(void)
    526 	{
    527 #ifdef OPENSSL_SYS_WINDOWS
    528 	if (wsa_init_done)
    529 		{
    530 		wsa_init_done=0;
    531 #if 0		/* this call is claimed to be non-present in Winsock2 */
    532 		WSACancelBlockingCall();
    533 #endif
    534 		WSACleanup();
    535 		}
    536 #elif defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)
    537    if (wsa_init_done)
    538         {
    539         wsa_init_done=0;
    540         WSACleanup();
    541 		}
    542 #endif
    543 	}
    544 
    545 #if !defined(OPENSSL_SYS_VMS) || __VMS_VER >= 70000000
    546 
    547 int BIO_socket_ioctl(int fd, long type, void *arg)
    548 	{
    549 	int i;
    550 
    551 #ifdef __DJGPP__
    552 	i=ioctlsocket(fd,type,(char *)arg);
    553 #else
    554 	i=ioctlsocket(fd,type,arg);
    555 #endif /* __DJGPP__ */
    556 	if (i < 0)
    557 		SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error());
    558 	return(i);
    559 	}
    560 #endif /* __VMS_VER */
    561 
    562 /* The reason I have implemented this instead of using sscanf is because
    563  * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
    564 static int get_ip(const char *str, unsigned char ip[4])
    565 	{
    566 	unsigned int tmp[4];
    567 	int num=0,c,ok=0;
    568 
    569 	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
    570 
    571 	for (;;)
    572 		{
    573 		c= *(str++);
    574 		if ((c >= '0') && (c <= '9'))
    575 			{
    576 			ok=1;
    577 			tmp[num]=tmp[num]*10+c-'0';
    578 			if (tmp[num] > 255) return(0);
    579 			}
    580 		else if (c == '.')
    581 			{
    582 			if (!ok) return(-1);
    583 			if (num == 3) return(0);
    584 			num++;
    585 			ok=0;
    586 			}
    587 		else if (c == '\0' && (num == 3) && ok)
    588 			break;
    589 		else
    590 			return(0);
    591 		}
    592 	ip[0]=tmp[0];
    593 	ip[1]=tmp[1];
    594 	ip[2]=tmp[2];
    595 	ip[3]=tmp[3];
    596 	return(1);
    597 	}
    598 
    599 int BIO_get_accept_socket(char *host, int bind_mode)
    600 	{
    601 	int ret=0;
    602 	union {
    603 		struct sockaddr sa;
    604 		struct sockaddr_in sa_in;
    605 #if OPENSSL_USE_IPV6
    606 		struct sockaddr_in6 sa_in6;
    607 #endif
    608 	} server,client;
    609 	int s=INVALID_SOCKET,cs,addrlen;
    610 	unsigned char ip[4];
    611 	unsigned short port;
    612 	char *str=NULL,*e;
    613 	char *h,*p;
    614 	unsigned long l;
    615 	int err_num;
    616 
    617 	if (BIO_sock_init() != 1) return(INVALID_SOCKET);
    618 
    619 	if ((str=BUF_strdup(host)) == NULL) return(INVALID_SOCKET);
    620 
    621 	h=p=NULL;
    622 	h=str;
    623 	for (e=str; *e; e++)
    624 		{
    625 		if (*e == ':')
    626 			{
    627 			p=e;
    628 			}
    629 		else if (*e == '/')
    630 			{
    631 			*e='\0';
    632 			break;
    633 			}
    634 		}
    635 	if (p)	*p++='\0';	/* points at last ':', '::port' is special [see below] */
    636 	else	p=h,h=NULL;
    637 
    638 #ifdef EAI_FAMILY
    639 	do {
    640 	static union {	void *p;
    641 			int (WSAAPI *f)(const char *,const char *,
    642 				 const struct addrinfo *,
    643 				 struct addrinfo **);
    644 			} p_getaddrinfo = {NULL};
    645 	static union {	void *p;
    646 			void (WSAAPI *f)(struct addrinfo *);
    647 			} p_freeaddrinfo = {NULL};
    648 	struct addrinfo *res,hint;
    649 
    650 	if (p_getaddrinfo.p==NULL)
    651 		{
    652 		if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL ||
    653 		    (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL)
    654 			p_getaddrinfo.p=(void*)-1;
    655 		}
    656 	if (p_getaddrinfo.p==(void *)-1) break;
    657 
    658 	/* '::port' enforces IPv6 wildcard listener. Some OSes,
    659 	 * e.g. Solaris, default to IPv6 without any hint. Also
    660 	 * note that commonly IPv6 wildchard socket can service
    661 	 * IPv4 connections just as well...  */
    662 	memset(&hint,0,sizeof(hint));
    663 	if (h)
    664 		{
    665 		if (strchr(h,':'))
    666 			{
    667 			if (h[1]=='\0') h=NULL;
    668 #if OPENSSL_USE_IPV6
    669 			hint.ai_family = AF_INET6;
    670 #else
    671 			h=NULL;
    672 #endif
    673 			}
    674 	    	else if (h[0]=='*' && h[1]=='\0')
    675 			h=NULL;
    676 		}
    677 
    678 	if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break;
    679 
    680 	addrlen = res->ai_addrlen<=sizeof(server) ?
    681 			res->ai_addrlen :
    682 			sizeof(server);
    683 	memcpy(&server, res->ai_addr, addrlen);
    684 
    685 	(*p_freeaddrinfo.f)(res);
    686 	goto again;
    687 	} while (0);
    688 #endif
    689 
    690 	if (!BIO_get_port(p,&port)) goto err;
    691 
    692 	memset((char *)&server,0,sizeof(server));
    693 	server.sa_in.sin_family=AF_INET;
    694 	server.sa_in.sin_port=htons(port);
    695 	addrlen = sizeof(server.sa_in);
    696 
    697 	if (h == NULL || strcmp(h,"*") == 0)
    698 		server.sa_in.sin_addr.s_addr=INADDR_ANY;
    699 	else
    700 		{
    701                 if (!BIO_get_host_ip(h,&(ip[0]))) goto err;
    702 		l=(unsigned long)
    703 			((unsigned long)ip[0]<<24L)|
    704 			((unsigned long)ip[1]<<16L)|
    705 			((unsigned long)ip[2]<< 8L)|
    706 			((unsigned long)ip[3]);
    707 		server.sa_in.sin_addr.s_addr=htonl(l);
    708 		}
    709 
    710 again:
    711 	s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
    712 	if (s == INVALID_SOCKET)
    713 		{
    714 		SYSerr(SYS_F_SOCKET,get_last_socket_error());
    715 		ERR_add_error_data(3,"port='",host,"'");
    716 		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET);
    717 		goto err;
    718 		}
    719 
    720 #ifdef SO_REUSEADDR
    721 	if (bind_mode == BIO_BIND_REUSEADDR)
    722 		{
    723 		int i=1;
    724 
    725 		ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i));
    726 		bind_mode=BIO_BIND_NORMAL;
    727 		}
    728 #endif
    729 	if (bind(s,&server.sa,addrlen) == -1)
    730 		{
    731 #ifdef SO_REUSEADDR
    732 		err_num=get_last_socket_error();
    733 		if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&
    734 #ifdef OPENSSL_SYS_WINDOWS
    735 			/* Some versions of Windows define EADDRINUSE to
    736 			 * a dummy value.
    737 			 */
    738 			(err_num == WSAEADDRINUSE))
    739 #else
    740 			(err_num == EADDRINUSE))
    741 #endif
    742 			{
    743 			client = server;
    744 			if (h == NULL || strcmp(h,"*") == 0)
    745 				{
    746 #if OPENSSL_USE_IPV6
    747 				if (client.sa.sa_family == AF_INET6)
    748 					{
    749 					memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr));
    750 					client.sa_in6.sin6_addr.s6_addr[15]=1;
    751 					}
    752 				else
    753 #endif
    754 				if (client.sa.sa_family == AF_INET)
    755 					{
    756 					client.sa_in.sin_addr.s_addr=htonl(0x7F000001);
    757 					}
    758 				else	goto err;
    759 				}
    760 			cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
    761 			if (cs != INVALID_SOCKET)
    762 				{
    763 				int ii;
    764 				ii=connect(cs,&client.sa,addrlen);
    765 				closesocket(cs);
    766 				if (ii == INVALID_SOCKET)
    767 					{
    768 					bind_mode=BIO_BIND_REUSEADDR;
    769 					closesocket(s);
    770 					goto again;
    771 					}
    772 				/* else error */
    773 				}
    774 			/* else error */
    775 			}
    776 #endif
    777 		SYSerr(SYS_F_BIND,err_num);
    778 		ERR_add_error_data(3,"port='",host,"'");
    779 		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET);
    780 		goto err;
    781 		}
    782 	if (listen(s,MAX_LISTEN) == -1)
    783 		{
    784 		SYSerr(SYS_F_BIND,get_last_socket_error());
    785 		ERR_add_error_data(3,"port='",host,"'");
    786 		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET);
    787 		goto err;
    788 		}
    789 	ret=1;
    790 err:
    791 	if (str != NULL) OPENSSL_free(str);
    792 	if ((ret == 0) && (s != INVALID_SOCKET))
    793 		{
    794 		closesocket(s);
    795 		s= INVALID_SOCKET;
    796 		}
    797 	return(s);
    798 	}
    799 
    800 int BIO_accept(int sock, char **addr)
    801 	{
    802 	int ret=INVALID_SOCKET;
    803 	unsigned long l;
    804 	unsigned short port;
    805 	char *p;
    806 
    807 	struct {
    808 	/*
    809 	 * As for following union. Trouble is that there are platforms
    810 	 * that have socklen_t and there are platforms that don't, on
    811 	 * some platforms socklen_t is int and on some size_t. So what
    812 	 * one can do? One can cook #ifdef spaghetti, which is nothing
    813 	 * but masochistic. Or one can do union between int and size_t.
    814 	 * One naturally does it primarily for 64-bit platforms where
    815 	 * sizeof(int) != sizeof(size_t). But would it work? Note that
    816 	 * if size_t member is initialized to 0, then later int member
    817 	 * assignment naturally does the job on little-endian platforms
    818 	 * regardless accept's expectations! What about big-endians?
    819 	 * If accept expects int*, then it works, and if size_t*, then
    820 	 * length value would appear as unreasonably large. But this
    821 	 * won't prevent it from filling in the address structure. The
    822 	 * trouble of course would be if accept returns more data than
    823 	 * actual buffer can accomodate and overwrite stack... That's
    824 	 * where early OPENSSL_assert comes into picture. Besides, the
    825 	 * only 64-bit big-endian platform found so far that expects
    826 	 * size_t* is HP-UX, where stack grows towards higher address.
    827 	 * <appro>
    828 	 */
    829 	union { size_t s; int i; } len;
    830 	union {
    831 		struct sockaddr sa;
    832 		struct sockaddr_in sa_in;
    833 #if OPENSSL_USE_IPV6
    834 		struct sockaddr_in6 sa_in6;
    835 #endif
    836 		} from;
    837 	} sa;
    838 
    839 	sa.len.s=0;
    840 	sa.len.i=sizeof(sa.from);
    841 	memset(&sa.from,0,sizeof(sa.from));
    842 	ret=accept(sock,&sa.from.sa,(void *)&sa.len);
    843 	if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0)
    844 		{
    845 		OPENSSL_assert(sa.len.s<=sizeof(sa.from));
    846 		sa.len.i = (int)sa.len.s;
    847 		/* use sa.len.i from this point */
    848 		}
    849 	if (ret == INVALID_SOCKET)
    850 		{
    851 		if(BIO_sock_should_retry(ret)) return -2;
    852 		SYSerr(SYS_F_ACCEPT,get_last_socket_error());
    853 		BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR);
    854 		goto end;
    855 		}
    856 
    857 	if (addr == NULL) goto end;
    858 
    859 #ifdef EAI_FAMILY
    860 	do {
    861 	char   h[NI_MAXHOST],s[NI_MAXSERV];
    862 	size_t nl;
    863 	static union {	void *p;
    864 			int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/,
    865 				 char *,size_t,char *,size_t,int);
    866 			} p_getnameinfo = {NULL};
    867 			/* 2nd argument to getnameinfo is specified to
    868 			 * be socklen_t. Unfortunately there is a number
    869 			 * of environments where socklen_t is not defined.
    870 			 * As it's passed by value, it's safe to pass it
    871 			 * as size_t... <appro> */
    872 
    873 	if (p_getnameinfo.p==NULL)
    874 		{
    875 		if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL)
    876 			p_getnameinfo.p=(void*)-1;
    877 		}
    878 	if (p_getnameinfo.p==(void *)-1) break;
    879 
    880 	if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s),
    881 	    NI_NUMERICHOST|NI_NUMERICSERV)) break;
    882 	nl = strlen(h)+strlen(s)+2;
    883 	p = *addr;
    884 	if (p)	{ *p = '\0'; p = OPENSSL_realloc(p,nl);	}
    885 	else	{ p = OPENSSL_malloc(nl);		}
    886 	if (p==NULL)
    887 		{
    888 		BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
    889 		goto end;
    890 		}
    891 	*addr = p;
    892 	BIO_snprintf(*addr,nl,"%s:%s",h,s);
    893 	goto end;
    894 	} while(0);
    895 #endif
    896 	if (sa.from.sa.sa_family != AF_INET) goto end;
    897 	l=ntohl(sa.from.sa_in.sin_addr.s_addr);
    898 	port=ntohs(sa.from.sa_in.sin_port);
    899 	if (*addr == NULL)
    900 		{
    901 		if ((p=OPENSSL_malloc(24)) == NULL)
    902 			{
    903 			BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
    904 			goto end;
    905 			}
    906 		*addr=p;
    907 		}
    908 	BIO_snprintf(*addr,24,"%d.%d.%d.%d:%d",
    909 		     (unsigned char)(l>>24L)&0xff,
    910 		     (unsigned char)(l>>16L)&0xff,
    911 		     (unsigned char)(l>> 8L)&0xff,
    912 		     (unsigned char)(l     )&0xff,
    913 		     port);
    914 end:
    915 	return(ret);
    916 	}
    917 
    918 int BIO_set_tcp_ndelay(int s, int on)
    919 	{
    920 	int ret=0;
    921 #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP))
    922 	int opt;
    923 
    924 #ifdef SOL_TCP
    925 	opt=SOL_TCP;
    926 #else
    927 #ifdef IPPROTO_TCP
    928 	opt=IPPROTO_TCP;
    929 #endif
    930 #endif
    931 
    932 	ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on));
    933 #endif
    934 	return(ret == 0);
    935 	}
    936 #endif
    937 
    938 int BIO_socket_nbio(int s, int mode)
    939 	{
    940 	int ret= -1;
    941 	int l;
    942 
    943 	l=mode;
    944 #ifdef FIONBIO
    945 	ret=BIO_socket_ioctl(s,FIONBIO,&l);
    946 #endif
    947 	return(ret == 0);
    948 	}
    949