#include "cryptlib.h"
#include <openssl/bio.h>
#if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_BSDSOCK)
-#include "netdb.h"
+#include <netdb.h>
+#if defined(NETWARE_CLIB)
+#include <sys/ioctl.h>
+NETDB_DEFINE_CONTEXT
+#endif
#endif
#ifndef OPENSSL_NO_SOCK
static int wsa_init_done=0;
#endif
+#if defined(OPENSSL_SYS_BEOS_BONE)
+/* BONE's IP6 support is incomplete */
+#undef AF_INET6
+#endif
+
#if 0
static unsigned long BIO_ghbn_hits=0L;
static unsigned long BIO_ghbn_miss=0L;
/* Note: under VMS with SOCKETSHR, it seems like the first
* parameter is 'char *', instead of 'const char *'
*/
- s=getservbyname(
#ifndef CONST_STRICT
- (char *)
+ s=getservbyname((char *)str,"tcp");
+#else
+ s=getservbyname(str,"tcp");
#endif
- str,"tcp");
if(s != NULL)
*port_ptr=ntohs((unsigned short)s->s_port);
CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
int j,i;
int size;
+#if defined(OPENSSL_SYS_BEOS_R5)
+ return 0;
+#endif
+
size=sizeof(int);
/* Note: under Windows the third parameter is of type (char *)
* whereas under other systems it is (void *) if you don't have
#if 1
/* Caching gethostbyname() results forever is wrong,
* so we have to let the true gethostbyname() worry about this */
+#if (defined(NETWARE_BSDSOCK) && !defined(__NOVELL_LIBC__))
+ return gethostbyname((char*)name);
+#else
return gethostbyname(name);
+#endif
#else
struct hostent *ret;
int i,lowi=0,j;
/* Note: under VMS with SOCKETSHR, it seems like the first
* parameter is 'char *', instead of 'const char *'
*/
- ret=gethostbyname(
# ifndef CONST_STRICT
- (char *)
+ ret=gethostbyname((char *)name);
+# else
+ ret=gethostbyname(name);
# endif
- name);
if (ret == NULL)
goto end;
{
int err;
-#ifdef SIGINT
- signal(SIGINT,(void (*)(int))BIO_sock_cleanup);
-#endif
wsa_init_done=1;
memset(&wsa_state,0,sizeof(wsa_state));
/* Not making wsa_state available to the rest of the
if (!wsa_init_done)
{
-
-# ifdef SIGINT
- signal(SIGINT,(void (*)(int))BIO_sock_cleanup);
-# endif
-
wsa_init_done=1;
wVerReq = MAKEWORD( 2, 0 );
err = WSAStartup(wVerReq,&wsaData);
if (wsa_init_done)
{
wsa_init_done=0;
-#ifndef OPENSSL_SYS_WINCE
+#if 0 /* this call is claimed to be non-present in Winsock2 */
WSACancelBlockingCall();
#endif
WSACleanup();
{
int ret=0;
struct sockaddr server,client;
- struct sockaddr_in *sin;
+ struct sockaddr_in *sa_in;
int s=INVALID_SOCKET,cs;
unsigned char ip[4];
unsigned short port;
int (*f)(const char *,const char *,
const struct addrinfo *,
struct addrinfo **);
- } getaddrinfo = {NULL};
+ } p_getaddrinfo = {NULL};
static union { void *p;
void (*f)(struct addrinfo *);
- } freeaddrinfo = {NULL};
+ } p_freeaddrinfo = {NULL};
struct addrinfo *res,hint;
- if (getaddrinfo.p==NULL)
+ if (p_getaddrinfo.p==NULL)
{
- if ((getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL ||
- (freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL)
- getaddrinfo.p=(void*)-1;
+ if ((p_getaddrinfo.p=DSO_global_lookup("getaddrinfo"))==NULL ||
+ (p_freeaddrinfo.p=DSO_global_lookup("freeaddrinfo"))==NULL)
+ p_getaddrinfo.p=(void*)-1;
}
- if (getaddrinfo.p==(void *)-1) break;
+ if (p_getaddrinfo.p==(void *)-1) break;
/* '::port' enforces IPv6 wildcard listener. Some OSes,
* e.g. Solaris, default to IPv6 without any hint. Also
* note that commonly IPv6 wildchard socket can service
* IPv4 connections just as well... */
memset(&hint,0,sizeof(hint));
- if (h && strchr(h,':')) hint.ai_family = AF_INET6;
- if ((*getaddrinfo.f)(h,p,&hint,&res)) break;
+ if (h)
+ {
+ if (strchr(h,':'))
+ {
+ if (h[1]=='\0') h=NULL;
+#ifdef AF_INET6
+ hint.ai_family = AF_INET6;
+#else
+ h=NULL;
+#endif
+ }
+ else if (h[0]=='*' && h[1]=='\0')
+ h=NULL;
+ }
+
+ if ((*p_getaddrinfo.f)(h,p,&hint,&res)) break;
server = *res->ai_addr;
- (*freeaddrinfo.f)(res);
+ (*p_freeaddrinfo.f)(res);
goto again;
} while (0);
#endif
if (!BIO_get_port(p,&port)) goto err;
memset((char *)&server,0,sizeof(server));
- sin = (struct sockaddr_in *)&server;
- sin->sin_family=AF_INET;
- sin->sin_port=htons(port);
+ sa_in = (struct sockaddr_in *)&server;
+ sa_in->sin_family=AF_INET;
+ sa_in->sin_port=htons(port);
if (h == NULL || strcmp(h,"*") == 0)
- sin->sin_addr.s_addr=INADDR_ANY;
+ sa_in->sin_addr.s_addr=INADDR_ANY;
else
{
if (!BIO_get_host_ip(h,&(ip[0]))) goto err;
((unsigned long)ip[1]<<16L)|
((unsigned long)ip[2]<< 8L)|
((unsigned long)ip[3]);
- sin->sin_addr.s_addr=htonl(l);
+ sa_in->sin_addr.s_addr=htonl(l);
}
again:
#ifdef AF_INET6
if (client.sa_family == AF_INET6)
{
- struct sockaddr_in6 *sin =
+ struct sockaddr_in6 *sin6 =
(struct sockaddr_in6 *)&client;
- memset(&sin->sin6_addr,0,sizeof(sin->sin6_addr));
- sin->sin6_addr.s6_addr[15]=1;
+ memset(&sin6->sin6_addr,0,sizeof(sin6->sin6_addr));
+ sin6->sin6_addr.s6_addr[15]=1;
}
else
#endif
if (client.sa_family == AF_INET)
{
- struct sockaddr_in *sin =
+ struct sockaddr_in *sin6 =
(struct sockaddr_in *)&client;
- sin->sin_addr.s_addr=htonl(0x7F000001);
+ sin6->sin_addr.s_addr=htonl(0x7F000001);
}
else goto err;
}
{
int ret=INVALID_SOCKET;
struct sockaddr from;
- struct sockaddr_in *sin;
+ struct sockaddr_in *sa_in;
unsigned long l;
unsigned short port;
int len;
if (addr == NULL) goto end;
#ifdef EAI_FAMILY
+# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_BEOS_BONE) || defined(OPENSSL_SYS_MSDOS)
+# define SOCKLEN_T size_t
+# else
+# define SOCKLEN_T socklen_t
+#endif
do {
char h[NI_MAXHOST],s[NI_MAXSERV];
- size_t l;
+ size_t nl;
static union { void *p;
- int (*f)(const struct sockaddr *,socklen_t,
+ int (*f)(const struct sockaddr *,SOCKLEN_T,
char *,size_t,char *,size_t,int);
- } getnameinfo = {NULL};
+ } p_getnameinfo = {NULL};
- if (getnameinfo.p==NULL)
+ if (p_getnameinfo.p==NULL)
{
- if ((getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL)
- getnameinfo.p=(void*)-1;
+ if ((p_getnameinfo.p=DSO_global_lookup("getnameinfo"))==NULL)
+ p_getnameinfo.p=(void*)-1;
}
- if (getnameinfo.p==(void *)-1) break;
+ if (p_getnameinfo.p==(void *)-1) break;
- if ((*getnameinfo.f)(&from,sizeof(from),h,sizeof(h),s,sizeof(s),
+ if ((*p_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;
+ nl = strlen(h)+strlen(s)+2; if (len<24) len=24;
p = *addr;
- if (p) p = OPENSSL_realloc(p,l);
- else p = OPENSSL_malloc(l);
+ if (p) { *p = '\0'; p = OPENSSL_realloc(p,nl); }
+ else { p = OPENSSL_malloc(nl); }
if (p==NULL)
{
BIOerr(BIO_F_BIO_ACCEPT,ERR_R_MALLOC_FAILURE);
goto end;
}
*addr = p;
- BIO_snprintf(*addr,l,"%s:%s",h,s);
+ BIO_snprintf(*addr,nl,"%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);
+ sa_in = (struct sockaddr_in *)&from;
+ l=ntohl(sa_in->sin_addr.s_addr);
+ port=ntohs(sa_in->sin_port);
if (*addr == NULL)
{
if ((p=OPENSSL_malloc(24)) == NULL)