+#ifdef EAI_FAMILY
+ do {
+ char h[NI_MAXHOST],s[NI_MAXSERV];
+ size_t l;
+ static union { void *p;
+ int (*f)(const struct sockaddr *,socklen_t,
+ char *,size_t,char *,size_t,int);
+ } getnameinfo = {NULL};
+
+ if (getnameinfo.p==NULL)
+ {
+ if ((getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL)
+ getnameinfo.p=(void*)-1;
+ }
+ if (getnameinfo.p==(void *)-1) break;
+
+ if ((*getnameinfo.f)(&from,sizeof(from),h,sizeof(h),s,sizeof(s),
+ NI_NUMERICHOST|NI_NUMERICSERV)) break;
+ l = strlen(h)+strlen(p)+2; if (len<24) len=24;
+ p = *addr;
+ if (p) p = OPENSSL_realloc(p,l);
+ else p = OPENSSL_malloc(l);
+ if (p==NULL)
+ {
+ BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
+ goto end;
+ }
+ *addr = p;
+ BIO_snprintf(*addr,l,"%s:%s",h,s);
+ goto end;
+ } while(0);
+#endif
+ if (from.sa_family != AF_INET) goto end;
+ sin = (struct sockaddr_in *)&from;
+ l=ntohl(sin->sin_addr.s_addr);
+ port=ntohs(sin->sin_port);