OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
b_sock.c
Go to the documentation of this file.
1 /* crypto/bio/b_sock.c */
2 /* Copyright (C) 1995-1998 Eric Young ([email protected])
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young ([email protected]).
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 ([email protected]).
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 ([email protected])"
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 ([email protected])"
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  {
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 */
145  locked = 1;
146  he=BIO_gethostbyname(str);
147  if (he == NULL)
148  {
150  goto err;
151  }
152 
153  /* cast to short because of win16 winsock definition */
154  if ((short)he->h_addrtype != AF_INET)
155  {
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)
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  {
183  return(0);
184  }
185  i=atoi(str);
186  if (i != 0)
187  *port_ptr=(unsigned short)i;
188  else
189  {
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);
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  {
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; */
267  return(BIO_ghbn_miss);
268  /* break; */
270  return(GHBN_NUM);
271  /* break; */
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  */
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  {
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
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();
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  {
517  return(-1);
518  }
519  }
520 #endif
521 
522  return(1);
523  }
524 
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 # if defined(OPENSSL_SYS_VMS)
555  /* 2011-02-18 SMS.
556  * VMS ioctl() can't tolerate a 64-bit "void *arg", but we
557  * observe that all the consumers pass in an "unsigned long *",
558  * so we arrange a local copy with a short pointer, and use
559  * that, instead.
560  */
561 # if __INITIAL_POINTER_SIZE == 64
562 # define ARG arg_32p
563 # pragma pointer_size save
564 # pragma pointer_size 32
565  unsigned long arg_32;
566  unsigned long *arg_32p;
567 # pragma pointer_size restore
568  arg_32p = &arg_32;
569  arg_32 = *((unsigned long *) arg);
570 # else /* __INITIAL_POINTER_SIZE == 64 */
571 # define ARG arg
572 # endif /* __INITIAL_POINTER_SIZE == 64 [else] */
573 # else /* defined(OPENSSL_SYS_VMS) */
574 # define ARG arg
575 # endif /* defined(OPENSSL_SYS_VMS) [else] */
576 
577  i=ioctlsocket(fd,type,ARG);
578 #endif /* __DJGPP__ */
579  if (i < 0)
581  return(i);
582  }
583 #endif /* __VMS_VER */
584 
585 /* The reason I have implemented this instead of using sscanf is because
586  * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
587 static int get_ip(const char *str, unsigned char ip[4])
588  {
589  unsigned int tmp[4];
590  int num=0,c,ok=0;
591 
592  tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
593 
594  for (;;)
595  {
596  c= *(str++);
597  if ((c >= '0') && (c <= '9'))
598  {
599  ok=1;
600  tmp[num]=tmp[num]*10+c-'0';
601  if (tmp[num] > 255) return(0);
602  }
603  else if (c == '.')
604  {
605  if (!ok) return(-1);
606  if (num == 3) return(0);
607  num++;
608  ok=0;
609  }
610  else if (c == '\0' && (num == 3) && ok)
611  break;
612  else
613  return(0);
614  }
615  ip[0]=tmp[0];
616  ip[1]=tmp[1];
617  ip[2]=tmp[2];
618  ip[3]=tmp[3];
619  return(1);
620  }
621 
622 int BIO_get_accept_socket(char *host, int bind_mode)
623  {
624  int ret=0;
625  union {
626  struct sockaddr sa;
627  struct sockaddr_in sa_in;
628 #if OPENSSL_USE_IPV6
629  struct sockaddr_in6 sa_in6;
630 #endif
631  } server,client;
632  int s=INVALID_SOCKET,cs,addrlen;
633  unsigned char ip[4];
634  unsigned short port;
635  char *str=NULL,*e;
636  char *h,*p;
637  unsigned long l;
638  int err_num;
639 
640  if (BIO_sock_init() != 1) return(INVALID_SOCKET);
641 
642  if ((str=BUF_strdup(host)) == NULL) return(INVALID_SOCKET);
643 
644  h=p=NULL;
645  h=str;
646  for (e=str; *e; e++)
647  {
648  if (*e == ':')
649  {
650  p=e;
651  }
652  else if (*e == '/')
653  {
654  *e='\0';
655  break;
656  }
657  }
658  if (p) *p++='\0'; /* points at last ':', '::port' is special [see below] */
659  else p=h,h=NULL;
660 
661 #ifdef EAI_FAMILY
662  do {
663  static union { void *p;
664  int (WSAAPI *f)(const char *,const char *,
665  const struct addrinfo *,
666  struct addrinfo **);
667  } p_getaddrinfo = {NULL};
668  static union { void *p;
669  void (WSAAPI *f)(struct addrinfo *);
670  } p_freeaddrinfo = {NULL};
671  struct addrinfo *res,hint;
672 
673  if (p_getaddrinfo.p==NULL)
674  {
675  if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL ||
676  (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL)
677  p_getaddrinfo.p=(void*)-1;
678  }
679  if (p_getaddrinfo.p==(void *)-1) break;
680 
681  /* '::port' enforces IPv6 wildcard listener. Some OSes,
682  * e.g. Solaris, default to IPv6 without any hint. Also
683  * note that commonly IPv6 wildchard socket can service
684  * IPv4 connections just as well... */
685  memset(&hint,0,sizeof(hint));
686  hint.ai_flags = AI_PASSIVE;
687  if (h)
688  {
689  if (strchr(h,':'))
690  {
691  if (h[1]=='\0') h=NULL;
692 #if OPENSSL_USE_IPV6
693  hint.ai_family = AF_INET6;
694 #else
695  h=NULL;
696 #endif
697  }
698  else if (h[0]=='*' && h[1]=='\0')
699  {
700  hint.ai_family = AF_INET;
701  h=NULL;
702  }
703  }
704 
705  if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break;
706 
707  addrlen = res->ai_addrlen<=sizeof(server) ?
708  res->ai_addrlen :
709  sizeof(server);
710  memcpy(&server, res->ai_addr, addrlen);
711 
712  (*p_freeaddrinfo.f)(res);
713  goto again;
714  } while (0);
715 #endif
716 
717  if (!BIO_get_port(p,&port)) goto err;
718 
719  memset((char *)&server,0,sizeof(server));
720  server.sa_in.sin_family=AF_INET;
721  server.sa_in.sin_port=htons(port);
722  addrlen = sizeof(server.sa_in);
723 
724  if (h == NULL || strcmp(h,"*") == 0)
725  server.sa_in.sin_addr.s_addr=INADDR_ANY;
726  else
727  {
728  if (!BIO_get_host_ip(h,&(ip[0]))) goto err;
729  l=(unsigned long)
730  ((unsigned long)ip[0]<<24L)|
731  ((unsigned long)ip[1]<<16L)|
732  ((unsigned long)ip[2]<< 8L)|
733  ((unsigned long)ip[3]);
734  server.sa_in.sin_addr.s_addr=htonl(l);
735  }
736 
737 again:
738  s=socket(server.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
739  if (s == INVALID_SOCKET)
740  {
742  ERR_add_error_data(3,"port='",host,"'");
744  goto err;
745  }
746 
747 #ifdef SO_REUSEADDR
748  if (bind_mode == BIO_BIND_REUSEADDR)
749  {
750  int i=1;
751 
752  ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i));
753  bind_mode=BIO_BIND_NORMAL;
754  }
755 #endif
756  if (bind(s,&server.sa,addrlen) == -1)
757  {
758 #ifdef SO_REUSEADDR
759  err_num=get_last_socket_error();
760  if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&
761 #ifdef OPENSSL_SYS_WINDOWS
762  /* Some versions of Windows define EADDRINUSE to
763  * a dummy value.
764  */
765  (err_num == WSAEADDRINUSE))
766 #else
767  (err_num == EADDRINUSE))
768 #endif
769  {
770  client = server;
771  if (h == NULL || strcmp(h,"*") == 0)
772  {
773 #if OPENSSL_USE_IPV6
774  if (client.sa.sa_family == AF_INET6)
775  {
776  memset(&client.sa_in6.sin6_addr,0,sizeof(client.sa_in6.sin6_addr));
777  client.sa_in6.sin6_addr.s6_addr[15]=1;
778  }
779  else
780 #endif
781  if (client.sa.sa_family == AF_INET)
782  {
783  client.sa_in.sin_addr.s_addr=htonl(0x7F000001);
784  }
785  else goto err;
786  }
787  cs=socket(client.sa.sa_family,SOCK_STREAM,SOCKET_PROTOCOL);
788  if (cs != INVALID_SOCKET)
789  {
790  int ii;
791  ii=connect(cs,&client.sa,addrlen);
792  closesocket(cs);
793  if (ii == INVALID_SOCKET)
794  {
795  bind_mode=BIO_BIND_REUSEADDR;
796  closesocket(s);
797  goto again;
798  }
799  /* else error */
800  }
801  /* else error */
802  }
803 #endif
804  SYSerr(SYS_F_BIND,err_num);
805  ERR_add_error_data(3,"port='",host,"'");
807  goto err;
808  }
809  if (listen(s,MAX_LISTEN) == -1)
810  {
812  ERR_add_error_data(3,"port='",host,"'");
814  goto err;
815  }
816  ret=1;
817 err:
818  if (str != NULL) OPENSSL_free(str);
819  if ((ret == 0) && (s != INVALID_SOCKET))
820  {
821  closesocket(s);
822  s= INVALID_SOCKET;
823  }
824  return(s);
825  }
826 
827 int BIO_accept(int sock, char **addr)
828  {
829  int ret=INVALID_SOCKET;
830  unsigned long l;
831  unsigned short port;
832  char *p;
833 
834  struct {
835  /*
836  * As for following union. Trouble is that there are platforms
837  * that have socklen_t and there are platforms that don't, on
838  * some platforms socklen_t is int and on some size_t. So what
839  * one can do? One can cook #ifdef spaghetti, which is nothing
840  * but masochistic. Or one can do union between int and size_t.
841  * One naturally does it primarily for 64-bit platforms where
842  * sizeof(int) != sizeof(size_t). But would it work? Note that
843  * if size_t member is initialized to 0, then later int member
844  * assignment naturally does the job on little-endian platforms
845  * regardless accept's expectations! What about big-endians?
846  * If accept expects int*, then it works, and if size_t*, then
847  * length value would appear as unreasonably large. But this
848  * won't prevent it from filling in the address structure. The
849  * trouble of course would be if accept returns more data than
850  * actual buffer can accomodate and overwrite stack... That's
851  * where early OPENSSL_assert comes into picture. Besides, the
852  * only 64-bit big-endian platform found so far that expects
853  * size_t* is HP-UX, where stack grows towards higher address.
854  * <appro>
855  */
856  union { size_t s; int i; } len;
857  union {
858  struct sockaddr sa;
859  struct sockaddr_in sa_in;
860 #if OPENSSL_USE_IPV6
861  struct sockaddr_in6 sa_in6;
862 #endif
863  } from;
864  } sa;
865 
866  sa.len.s=0;
867  sa.len.i=sizeof(sa.from);
868  memset(&sa.from,0,sizeof(sa.from));
869  ret=accept(sock,&sa.from.sa,(void *)&sa.len);
870  if (sizeof(sa.len.i)!=sizeof(sa.len.s) && sa.len.i==0)
871  {
872  OPENSSL_assert(sa.len.s<=sizeof(sa.from));
873  sa.len.i = (int)sa.len.s;
874  /* use sa.len.i from this point */
875  }
876  if (ret == INVALID_SOCKET)
877  {
878  if(BIO_sock_should_retry(ret)) return -2;
881  goto end;
882  }
883 
884  if (addr == NULL) goto end;
885 
886 #ifdef EAI_FAMILY
887  do {
888  char h[NI_MAXHOST],s[NI_MAXSERV];
889  size_t nl;
890  static union { void *p;
891  int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/,
892  char *,size_t,char *,size_t,int);
893  } p_getnameinfo = {NULL};
894  /* 2nd argument to getnameinfo is specified to
895  * be socklen_t. Unfortunately there is a number
896  * of environments where socklen_t is not defined.
897  * As it's passed by value, it's safe to pass it
898  * as size_t... <appro> */
899 
900  if (p_getnameinfo.p==NULL)
901  {
902  if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL)
903  p_getnameinfo.p=(void*)-1;
904  }
905  if (p_getnameinfo.p==(void *)-1) break;
906 
907  if ((*p_getnameinfo.f)(&sa.from.sa,sa.len.i,h,sizeof(h),s,sizeof(s),
908  NI_NUMERICHOST|NI_NUMERICSERV)) break;
909  nl = strlen(h)+strlen(s)+2;
910  p = *addr;
911  if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); }
912  else { p = OPENSSL_malloc(nl); }
913  if (p==NULL)
914  {
916  goto end;
917  }
918  *addr = p;
919  BIO_snprintf(*addr,nl,"%s:%s",h,s);
920  goto end;
921  } while(0);
922 #endif
923  if (sa.from.sa.sa_family != AF_INET) goto end;
924  l=ntohl(sa.from.sa_in.sin_addr.s_addr);
925  port=ntohs(sa.from.sa_in.sin_port);
926  if (*addr == NULL)
927  {
928  if ((p=OPENSSL_malloc(24)) == NULL)
929  {
931  goto end;
932  }
933  *addr=p;
934  }
935  BIO_snprintf(*addr,24,"%d.%d.%d.%d:%d",
936  (unsigned char)(l>>24L)&0xff,
937  (unsigned char)(l>>16L)&0xff,
938  (unsigned char)(l>> 8L)&0xff,
939  (unsigned char)(l )&0xff,
940  port);
941 end:
942  return(ret);
943  }
944 
945 int BIO_set_tcp_ndelay(int s, int on)
946  {
947  int ret=0;
948 #if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP))
949  int opt;
950 
951 #ifdef SOL_TCP
952  opt=SOL_TCP;
953 #else
954 #ifdef IPPROTO_TCP
955  opt=IPPROTO_TCP;
956 #endif
957 #endif
958 
959  ret=setsockopt(s,opt,TCP_NODELAY,(char *)&on,sizeof(on));
960 #endif
961  return(ret == 0);
962  }
963 
964 int BIO_socket_nbio(int s, int mode)
965  {
966  int ret= -1;
967  int l;
968 
969  l=mode;
970 #ifdef FIONBIO
971  ret=BIO_socket_ioctl(s,FIONBIO,&l);
972 #endif
973  return(ret == 0);
974  }
975 #endif