char *str,*e;
char *str=NULL,*e;
int BIO_get_accept_socket(char *host, int bind_mode)	{	int ret=0;	struct sockaddr_in server,client;	int s= -1,cs;	unsigned char ip[4];	unsigned short port;	char *str,*e;	const char *h,*p;	unsigned long l;	int err_num;	if (BIO_sock_init() != 1) return(INVALID_SOCKET);	if ((str=BUF_strdup(host)) == NULL) return(INVALID_SOCKET);	h=p=NULL;	h=str;	for (e=str; *e; e++)		{		if (*e == ':')			{			p= &(e[1]);			*e='\0';			}		else if (*e == '/')			{			*e='\0';			break;			}		}	if (p == NULL)		{		p=h;		h="*";		}	if (!BIO_get_port(p,&port)) return(INVALID_SOCKET);	memset((char *)&server,0,sizeof(server));	server.sin_family=AF_INET;	server.sin_port=htons(port);	if (strcmp(h,"*") == 0)		server.sin_addr.s_addr=INADDR_ANY;	else		{		if (!BIO_get_host_ip(h,&(ip[0]))) return(INVALID_SOCKET);		l=(unsigned long)			((unsigned long)ip[0]<<24L)|			((unsigned long)ip[1]<<16L)|			((unsigned long)ip[2]<< 8L)|			((unsigned long)ip[3]);		server.sin_addr.s_addr=htonl(l);		}again:	s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);	if (s == INVALID_SOCKET)		{		SYSerr(SYS_F_SOCKET,get_last_socket_error());		ERR_add_error_data(3,"port='",host,"'");		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET);		goto err;		}#ifdef SO_REUSEADDR	if (bind_mode == BIO_BIND_REUSEADDR)		{		int i=1;		ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i));		bind_mode=BIO_BIND_NORMAL;		}#endif	if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1)		{#ifdef SO_REUSEADDR		err_num=get_last_socket_error();		if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&			(err_num == EADDRINUSE))			{			memcpy((char *)&client,(char *)&server,sizeof(server));			if (strcmp(h,"*") == 0)				client.sin_addr.s_addr=htonl(0x7F000001);			cs=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);			if (cs != INVALID_SOCKET)				{				int ii;				ii=connect(cs,(struct sockaddr *)&client,					sizeof(client));				closesocket(cs);				if (ii == INVALID_SOCKET)					{					bind_mode=BIO_BIND_REUSEADDR;					closesocket(s);					goto again;					}				/* else error */				}			/* else error */			}#endif		SYSerr(SYS_F_BIND,err_num);		ERR_add_error_data(3,"port='",host,"'");		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET);		goto err;		}	if (listen(s,MAX_LISTEN) == -1)		{		SYSerr(SYS_F_BIND,get_last_socket_error());		ERR_add_error_data(3,"port='",host,"'");		BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET);		goto err;		}	ret=1;err:	if (str != NULL) OPENSSL_free(str);	if ((ret == 0) && (s != INVALID_SOCKET))		{		closesocket(s);		s= INVALID_SOCKET;		}	return(s);	}