summaryrefslogtreecommitdiffstats
path: root/crypto/bio
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/bio')
-rw-r--r--crypto/bio/Makefile.ssl6
-rw-r--r--crypto/bio/b_dump.c2
-rw-r--r--crypto/bio/b_print.c2
-rw-r--r--crypto/bio/b_sock.c206
-rw-r--r--crypto/bio/bf_buff.c51
-rw-r--r--crypto/bio/bf_nbio.c6
-rw-r--r--crypto/bio/bf_null.c6
-rw-r--r--crypto/bio/bio.err35
-rw-r--r--crypto/bio/bio.h199
-rw-r--r--crypto/bio/bio_cb.c14
-rw-r--r--crypto/bio/bio_err.c13
-rw-r--r--crypto/bio/bio_lib.c122
-rw-r--r--crypto/bio/bss_acpt.c20
-rw-r--r--crypto/bio/bss_conn.c348
-rw-r--r--crypto/bio/bss_fd.c2
-rw-r--r--crypto/bio/bss_file.c57
-rw-r--r--crypto/bio/bss_mem.c5
-rw-r--r--crypto/bio/bss_null.c5
-rw-r--r--crypto/bio/bss_rtcp.c5
-rw-r--r--crypto/bio/bss_sock.c28
20 files changed, 791 insertions, 341 deletions
diff --git a/crypto/bio/Makefile.ssl b/crypto/bio/Makefile.ssl
index 9d21a3594d..42e11e1c94 100644
--- a/crypto/bio/Makefile.ssl
+++ b/crypto/bio/Makefile.ssl
@@ -35,7 +35,7 @@ LIBOBJ= bio_lib.o bio_cb.o $(ERRC).o \
SRC= $(LIBSRC)
-EXHEADER= bio.h
+EXHEADER= bio.h bss_file.c
HEADER= $(EXHEADER)
ALL= $(GENERAL) $(SRC) $(HEADER)
@@ -61,7 +61,7 @@ links:
$(TOP)/util/mklink.sh ../../apps $(APPS)
install:
- @for i in $(EXHEADER) ; \
+ @for i in $(EXHEADER) bss_file.c ; \
do \
(cp $$i $(INSTALLTOP)/include/$$i; \
chmod 644 $(INSTALLTOP)/include/$$i ); \
@@ -87,6 +87,6 @@ clean:
errors:
perl $(TOP)/util/err-ins.pl $(ERR).err $(ERR).h
- perl ../err/err_genc.pl $(ERR).h $(ERRC).c
+ perl ../err/err_genc.pl -s $(ERR).h $(ERRC).c
# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/crypto/bio/b_dump.c b/crypto/bio/b_dump.c
index 287aff2a5e..db84ad3d47 100644
--- a/crypto/bio/b_dump.c
+++ b/crypto/bio/b_dump.c
@@ -1,5 +1,5 @@
/* crypto/bio/b_dump.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
diff --git a/crypto/bio/b_print.c b/crypto/bio/b_print.c
index 0296296a7d..cdadeb839a 100644
--- a/crypto/bio/b_print.c
+++ b/crypto/bio/b_print.c
@@ -1,5 +1,5 @@
/* crypto/bio/b_print.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c
index adab62135e..a45909527c 100644
--- a/crypto/bio/b_sock.c
+++ b/crypto/bio/b_sock.c
@@ -1,5 +1,5 @@
/* crypto/bio/b_sock.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
@@ -59,6 +59,7 @@
#ifndef NO_SOCK
#include <stdio.h>
+#include <stdlib.h>
#include <errno.h>
#define USE_SOCKETS
#include "cryptlib.h"
@@ -72,17 +73,37 @@
#define SOCKET_PROTOCOL IPPROTO_TCP
#endif
+#ifdef SO_MAXCONN
+#define MAX_LISTEN SOMAXCONN
+#elif defined(SO_MAXCONN)
+#define MAX_LISTEN SO_MAXCONN
+#else
+#define MAX_LISTEN 32
+#endif
+
#ifdef WINDOWS
static int wsa_init_done=0;
#endif
-unsigned long BIO_ghbn_hits=0L;
-unsigned long BIO_ghbn_miss=0L;
+static unsigned long BIO_ghbn_hits=0L;
+static unsigned long BIO_ghbn_miss=0L;
+
+#define GHBN_NUM 4
+static struct ghbn_cache_st
+ {
+ char name[129];
+ struct hostent *ent;
+ unsigned long order;
+ } ghbn_cache[GHBN_NUM];
#ifndef NOPROTO
static int get_ip(char *str,unsigned char *ip);
+static void ghbn_free(struct hostent *a);
+static struct hostent *ghbn_dup(struct hostent *a);
#else
static int get_ip();
+static void ghbn_free();
+static struct hostent *ghbn_dup();
#endif
int BIO_get_host_ip(str,ip)
@@ -97,6 +118,7 @@ unsigned char *ip;
if (i < 0)
{
BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS);
+ ERR_add_error_data(2,"host=",str);
return(0);
}
else
@@ -107,6 +129,7 @@ unsigned char *ip;
if (he == NULL)
{
BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP);
+ ERR_add_error_data(2,"host=",str);
return(0);
}
@@ -114,6 +137,7 @@ unsigned char *ip;
if ((short)he->h_addrtype != AF_INET)
{
BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
+ ERR_add_error_data(2,"host=",str);
return(0);
}
for (i=0; i<4; i++)
@@ -162,7 +186,8 @@ short *port_ptr;
#endif
else
{
- SYSerr(SYS_F_GETSERVBYNAME,errno);
+ SYSerr(SYS_F_GETSERVBYNAME,get_last_socket_error());
+ ERR_add_error_data(3,"service='",str,"'");
return(0);
}
return(1);
@@ -186,23 +211,128 @@ int sock;
return(j);
}
-#define GHBN_NUM 4
-static struct ghbn_cache_st
+long BIO_ghbn_ctrl(cmd,iarg,parg)
+int cmd;
+int iarg;
+char *parg;
{
- char name[128];
- struct hostent ent;
- unsigned long order;
- } ghbn_cache[GHBN_NUM];
+ int i;
+ char **p;
+
+ switch (cmd)
+ {
+ case BIO_GHBN_CTRL_HITS:
+ return(BIO_ghbn_hits);
+ break;
+ case BIO_GHBN_CTRL_MISSES:
+ return(BIO_ghbn_miss);
+ break;
+ case BIO_GHBN_CTRL_CACHE_SIZE:
+ return(GHBN_NUM);
+ break;
+ case BIO_GHBN_CTRL_GET_ENTRY:
+ if ((iarg >= 0) && (iarg <GHBN_NUM) &&
+ (ghbn_cache[iarg].order > 0))
+ {
+ p=(char **)parg;
+ if (p == NULL) return(0);
+ *p=ghbn_cache[iarg].name;
+ ghbn_cache[iarg].name[128]='\0';
+ return(1);
+ }
+ return(0);
+ break;
+ case BIO_GHBN_CTRL_FLUSH:
+ for (i=0; i<GHBN_NUM; i++)
+ ghbn_cache[i].order=0;
+ break;
+ default:
+ return(0);
+ }
+ return(1);
+ }
+
+static struct hostent *ghbn_dup(a)
+struct hostent *a;
+ {
+ struct hostent *ret;
+ int i,j;
+
+ ret=(struct hostent *)malloc(sizeof(struct hostent));
+ if (ret == NULL) return(NULL);
+ memset(ret,0,sizeof(struct hostent));
+
+ for (i=0; a->h_aliases[i] != NULL; i++)
+ ;
+ i++;
+ ret->h_aliases=(char **)malloc(sizeof(char *)*i);
+ memset(ret->h_aliases,0,sizeof(char *)*i);
+ if (ret == NULL) goto err;
+
+ for (i=0; a->h_addr_list[i] != NULL; i++)
+ ;
+ i++;
+ ret->h_addr_list=(char **)malloc(sizeof(char *)*i);
+ memset(ret->h_addr_list,0,sizeof(char *)*i);
+ if (ret->h_addr_list == NULL) goto err;
+
+ j=strlen(a->h_name)+1;
+ if ((ret->h_name=malloc(j)) == NULL) goto err;
+ memcpy((char *)ret->h_name,a->h_name,j);
+ for (i=0; a->h_aliases[i] != NULL; i++)
+ {
+ j=strlen(a->h_aliases[i])+1;
+ if ((ret->h_aliases[i]=malloc(j)) == NULL) goto err;
+ memcpy(ret->h_aliases[i],a->h_aliases[i],j);
+ }
+ ret->h_length=a->h_length;
+ ret->h_addrtype=a->h_addrtype;
+ for (i=0; a->h_addr_list[i] != NULL; i++)
+ {
+ if ((ret->h_addr_list[i]=malloc(a->h_length)) == NULL)
+ goto err;
+ memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length);
+ }
+ return(ret);
+err:
+ if (ret != NULL)
+ ghbn_free(ret);
+ return(NULL);
+ }
+
+static void ghbn_free(a)
+struct hostent *a;
+ {
+ int i;
+
+ if (a->h_aliases != NULL)
+ {
+ for (i=0; a->h_aliases[i] != NULL; i++)
+ free(a->h_aliases[i]);
+ free(a->h_aliases);
+ }
+ if (a->h_addr_list != NULL)
+ {
+ for (i=0; a->h_addr_list[i] != NULL; i++)
+ free(a->h_addr_list[i]);
+ free(a->h_addr_list);
+ }
+ if (a->h_name != NULL) free((char *)a->h_name);
+ free(a);
+ }
struct hostent *BIO_gethostbyname(name)
char *name;
{
struct hostent *ret;
- int i,lowi=0;
+ int i,lowi=0,j;
unsigned long low= (unsigned long)-1;
+/* return(gethostbyname(name)); */
+
CRYPTO_w_lock(CRYPTO_LOCK_BIO_GETHOSTBYNAME);
- if (strlen(name) < 128)
+ j=strlen(name);
+ if (j < 128)
{
for (i=0; i<GHBN_NUM; i++)
{
@@ -225,16 +355,22 @@ char *name;
{
BIO_ghbn_miss++;
ret=gethostbyname(name);
+
if (ret == NULL) return(NULL);
+ if (j > 128) return(ret); /* too big to cache */
+
/* else add to cache */
+ if (ghbn_cache[lowi].ent != NULL)
+ ghbn_free(ghbn_cache[lowi].ent);
+
strncpy(ghbn_cache[lowi].name,name,128);
- memcpy((char *)&(ghbn_cache[lowi].ent),ret,sizeof(struct hostent));
+ ghbn_cache[lowi].ent=ghbn_dup(ret);
ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits;
}
else
{
BIO_ghbn_hits++;
- ret= &(ghbn_cache[i].ent);
+ ret= ghbn_cache[i].ent;
ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits;
}
CRYPTO_w_unlock(CRYPTO_LOCK_BIO_GETHOSTBYNAME);
@@ -284,22 +420,11 @@ int fd;
long type;
unsigned long *arg;
{
- int i,err;
+ int i;
-#ifdef WINDOWS
i=ioctlsocket(fd,type,arg);
-#else
- i=ioctl(fd,type,arg);
-#endif
if (i < 0)
- {
-#ifdef WINDOWS
- err=WSAGetLastError();
-#else
- err=errno;
-#endif
- SYSerr(SYS_F_IOCTLSOCKET,err);
- }
+ SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error());
return(i);
}
@@ -401,28 +526,22 @@ char *host;
s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
if (s == INVALID_SOCKET)
{
-#ifdef WINDOWS
- errno=WSAGetLastError();
-#endif
- SYSerr(SYS_F_SOCKET,errno);
- BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_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;
}
if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1)
{
-#ifdef WINDOWS
- errno=WSAGetLastError();
-#endif
- SYSerr(SYS_F_BIND,errno);
+ 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_BIND_SOCKET);
goto err;
}
- if (listen(s,5) == -1)
+ if (listen(s,MAX_LISTEN) == -1)
{
-#ifdef WINDOWS
- errno=WSAGetLastError();
-#endif
- SYSerr(SYS_F_LISTEN,errno);
+ 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;
}
@@ -457,10 +576,7 @@ char **addr;
ret=accept(sock,(struct sockaddr *)&from,&len);
if (ret == INVALID_SOCKET)
{
-#ifdef WINDOWS
- errno=WSAGetLastError();
-#endif
- SYSerr(SYS_F_ACCEPT,errno);
+ SYSerr(SYS_F_ACCEPT,get_last_socket_error());
BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR);
goto end;
}
diff --git a/crypto/bio/bf_buff.c b/crypto/bio/bf_buff.c
index ac3ba14fe0..7912b88473 100644
--- a/crypto/bio/bf_buff.c
+++ b/crypto/bio/bf_buff.c
@@ -1,5 +1,5 @@
/* crypto/bio/bf_buff.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
@@ -84,7 +84,8 @@ static int buffer_free();
static BIO_METHOD methods_buffer=
{
- BIO_TYPE_BUFFER,"buffer",
+ BIO_TYPE_BUFFER,
+ "buffer",
buffer_write,
buffer_read,
buffer_puts,
@@ -329,6 +330,19 @@ char *ptr;
if (ret == 0)
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
break;
+ case BIO_C_SET_BUFF_READ_DATA:
+ if (num > ctx->ibuf_size)
+ {
+ p1=Malloc((int)num);
+ if (p1 == NULL) goto malloc_error;
+ if (ctx->ibuf != NULL) Free(ctx->ibuf);
+ ctx->ibuf=p1;
+ }
+ ctx->ibuf_off=0;
+ ctx->ibuf_len=(int)num;
+ memcpy(ctx->ibuf,ptr,(int)num);
+ ret=1;
+ break;
case BIO_C_SET_BUFF_SIZE:
if (ptr != NULL)
{
@@ -354,16 +368,15 @@ char *ptr;
if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size))
{
p1=(char *)Malloc((int)num);
- if (p1 == NULL) { ret=0; break; }
+ if (p1 == NULL) goto malloc_error;
}
if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size))
{
p2=(char *)Malloc((int)num);
if (p2 == NULL)
{
- ret=0;
if (p1 != ctx->ibuf) Free(p1);
- break;
+ goto malloc_error;
}
}
if (ctx->ibuf != p1)
@@ -391,7 +404,10 @@ char *ptr;
case BIO_CTRL_FLUSH:
if (ctx->obuf_len <= 0)
+ {
+ ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
break;
+ }
for (;;)
{
@@ -428,6 +444,9 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_
break;
}
return(ret);
+malloc_error:
+ BIOerr(BIO_F_BUFFER_CTRL,ERR_R_MALLOC_FAILURE);
+ return(0);
}
static int buffer_gets(b,buf,size)
@@ -436,32 +455,36 @@ char *buf;
int size;
{
BIO_F_BUFFER_CTX *ctx;
- int num=0,i;
+ int num=0,i,flag;
char *p;
ctx=(BIO_F_BUFFER_CTX *)b->ptr;
- size--;
+ size--; /* reserve space for a '\0' */
BIO_clear_retry_flags(b);
for (;;)
{
- if (ctx->ibuf_len != 0)
+ if (ctx->ibuf_len > 0)
{
p= &(ctx->ibuf[ctx->ibuf_off]);
- for (i=0; (i<ctx->ibuf_len) && (i<(size-1)); i++)
+ flag=0;
+ for (i=0; (i<ctx->ibuf_len) && (i<size); i++)
{
*(buf++)=p[i];
- if (p[i] == '\n') break;
+ if (p[i] == '\n')
+ {
+ flag=1;
+ i++;
+ break;
+ }
}
num+=i;
size-=i;
ctx->ibuf_len-=i;
ctx->ibuf_off+=i;
- if (p[i] == '\n')
+ if ((flag) || (i == size))
{
- buf[i+1]='\0';
- ctx->ibuf_len--;
- ctx->ibuf_off++;
+ *buf='\0';
return(num);
}
}
diff --git a/crypto/bio/bf_nbio.c b/crypto/bio/bf_nbio.c
index b493100ba4..034b3024df 100644
--- a/crypto/bio/bf_nbio.c
+++ b/crypto/bio/bf_nbio.c
@@ -1,5 +1,5 @@
/* crypto/bio/bf_nbio.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
@@ -93,7 +93,8 @@ typedef struct nbio_test_st
static BIO_METHOD methods_nbiof=
{
- BIO_TYPE_NBIO_TEST,"non-blocking IO test filter",
+ BIO_TYPE_NBIO_TEST,
+ "non-blocking IO test filter",
nbiof_write,
nbiof_read,
nbiof_puts,
@@ -237,6 +238,7 @@ char *ptr;
BIO_copy_next_retry(b);
break;
case BIO_CTRL_DUP:
+ ret=0L;
break;
default:
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
diff --git a/crypto/bio/bf_null.c b/crypto/bio/bf_null.c
index 9864f4a03c..a47a65741a 100644
--- a/crypto/bio/bf_null.c
+++ b/crypto/bio/bf_null.c
@@ -1,5 +1,5 @@
/* crypto/bio/bf_null.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
@@ -85,7 +85,8 @@ static int nullf_free();
static BIO_METHOD methods_nullf=
{
- BIO_TYPE_NULL_FILTER,"NULL filter",
+ BIO_TYPE_NULL_FILTER,
+ "NULL filter",
nullf_write,
nullf_read,
nullf_puts,
@@ -166,6 +167,7 @@ char *ptr;
BIO_copy_next_retry(b);
break;
case BIO_CTRL_DUP:
+ ret=0L;
break;
default:
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
diff --git a/crypto/bio/bio.err b/crypto/bio/bio.err
index 3363971b31..6e2f2b63ca 100644
--- a/crypto/bio/bio.err
+++ b/crypto/bio/bio.err
@@ -14,10 +14,12 @@
#define BIO_F_BIO_READ 110
#define BIO_F_BIO_SOCK_INIT 111
#define BIO_F_BIO_WRITE 112
-#define BIO_F_CONN_STATE 113
-#define BIO_F_FILE_CTRL 114
-#define BIO_F_MEM_WRITE 115
-#define BIO_F_WSASTARTUP 116
+#define BIO_F_BUFFER_CTRL 113
+#define BIO_F_CONN_STATE 114
+#define BIO_F_FILE_CTRL 115
+#define BIO_F_MEM_WRITE 116
+#define BIO_F_SSL_NEW 117
+#define BIO_F_WSASTARTUP 118
/* Reason codes. */
#define BIO_R_ACCEPT_ERROR 100
@@ -29,15 +31,16 @@
#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106
#define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107
#define BIO_R_INVALID_IP_ADDRESS 108
-#define BIO_R_NBIO_CONNECT_ERROR 109
-#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 110
-#define BIO_R_NO_HOSTHNAME_SPECIFIED 111
-#define BIO_R_NO_PORT_DEFINED 112
-#define BIO_R_NO_PORT_SPECIFIED 113
-#define BIO_R_NULL_PARAMETER 114
-#define BIO_R_UNABLE_TO_BIND_SOCKET 115
-#define BIO_R_UNABLE_TO_CREATE_SOCKET 116
-#define BIO_R_UNABLE_TO_LISTEN_SOCKET 117
-#define BIO_R_UNINITALISED 118
-#define BIO_R_UNSUPPORTED_METHOD 119
-#define BIO_R_WSASTARTUP 120
+#define BIO_R_KEEPALIVE 109
+#define BIO_R_NBIO_CONNECT_ERROR 110
+#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111
+#define BIO_R_NO_HOSTHNAME_SPECIFIED 112
+#define BIO_R_NO_PORT_DEFINED 113
+#define BIO_R_NO_PORT_SPECIFIED 114
+#define BIO_R_NULL_PARAMETER 115
+#define BIO_R_UNABLE_TO_BIND_SOCKET 116
+#define BIO_R_UNABLE_TO_CREATE_SOCKET 117
+#define BIO_R_UNABLE_TO_LISTEN_SOCKET 118
+#define BIO_R_UNINITALISED 119
+#define BIO_R_UNSUPPORTED_METHOD 120
+#define BIO_R_WSASTARTUP 121
diff --git a/crypto/bio/bio.h b/crypto/bio/bio.h
index 0b2c6e77e1..300b330e00 100644
--- a/crypto/bio/bio.h
+++ b/crypto/bio/bio.h
@@ -1,5 +1,5 @@
/* crypto/bio/bio.h */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
@@ -63,6 +63,8 @@
extern "C" {
#endif
+#include "crypto.h"
+
/* These are the 'types' of BIOs */
#define BIO_TYPE_NONE 0
#define BIO_TYPE_MEM (1|0x0400)
@@ -78,7 +80,7 @@ extern "C" {
#define BIO_TYPE_BASE64 (11|0x0200) /* filter */
#define BIO_TYPE_CONNECT (12|0x0400|0x0100) /* socket - connect */
#define BIO_TYPE_ACCEPT (13|0x0400|0x0100) /* socket for accept */
-#define BIO_TYPE_PROXY_CLIENT (14|0x0400) /* client proxy BIO */
+#define BIO_TYPE_PROXY_CLIENT (14|0x0200) /* client proxy BIO */
#define BIO_TYPE_PROXY_SERVER (15|0x0200) /* server proxy BIO */
#define BIO_TYPE_NBIO_TEST (16|0x0200) /* server proxy BIO */
#define BIO_TYPE_NULL_FILTER (17|0x0200)
@@ -107,6 +109,9 @@ extern "C" {
#define BIO_CTRL_FLUSH 11 /* opt - 'flush' buffered output */
#define BIO_CTRL_DUP 12 /* man - extra stuff for 'duped' BIO */
#define BIO_CTRL_WPENDING 13 /* opt - number of bytes still to write */
+/* callback is int cb(BIO *bio,state,ret); */
+#define BIO_CTRL_SET_CALLBACK 14 /* opt - set callback function */
+#define BIO_CTRL_GET_CALLBACK 15 /* opt - set callback function */
#define BIO_CTRL_SET_FILENAME 30 /* BIO_s_file special */
@@ -122,12 +127,24 @@ extern "C" {
#define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL)
#define BIO_FLAGS_SHOULD_RETRY 0x08
+/* Used in BIO_gethostbyname() */
+#define BIO_GHBN_CTRL_HITS 1
+#define BIO_GHBN_CTRL_MISSES 2
+#define BIO_GHBN_CTRL_CACHE_SIZE 3
+#define BIO_GHBN_CTRL_GET_ENTRY 4
+#define BIO_GHBN_CTRL_FLUSH 5
+
/* Mostly used in the SSL BIO */
-#define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10
-#define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20
-#define BIO_FLAGS_PROTOCOL_STARTUP 0x40
+/* Not used anymore
+ * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10
+ * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20
+ * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40
+ */
+
+#define BIO_FLAGS_BASE64_NO_NL 0x100
#define BIO_set_flags(b,f) ((b)->flags|=(f))
+#define BIO_get_flags(b) ((b)->flags)
#define BIO_set_retry_special(b) \
((b)->flags|=(BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY))
#define BIO_set_retry_read(b) \
@@ -232,7 +249,7 @@ typedef struct bio_st
unsigned long num_read;
unsigned long num_write;
- char *app_data;
+ CRYPTO_EX_DATA ex_data;
} BIO;
typedef struct bio_f_buffer_ctx_struct
@@ -250,6 +267,17 @@ typedef struct bio_f_buffer_ctx_struct
int obuf_off; /* write/read offset */
} BIO_F_BUFFER_CTX;
+/* connect BIO stuff */
+#define BIO_CONN_S_BEFORE 1
+#define BIO_CONN_S_GET_IP 2
+#define BIO_CONN_S_GET_PORT 3
+#define BIO_CONN_S_CREATE_SOCKET 4
+#define BIO_CONN_S_CONNECT 5
+#define BIO_CONN_S_OK 6
+#define BIO_CONN_S_BLOCKED_CONNECT 7
+#define BIO_CONN_S_NBIO 8
+#define BIO_CONN_get_param_hostname BIO_ctrl
+
#define BIO_number_read(b) ((b)->num_read)
#define BIO_number_written(b) ((b)->num_write)
@@ -275,19 +303,40 @@ typedef struct bio_f_buffer_ctx_struct
#define BIO_C_SSL_MODE 119
#define BIO_C_GET_MD_CTX 120
#define BIO_C_GET_PROXY_PARAM 121
-
-#define BIO_set_app_data(s,arg) ((s)->app_data=(char *)arg)
-#define BIO_get_app_data(s) ((s)->app_data)
+#define BIO_C_SET_BUFF_READ_DATA 122 /* data to read first */
+#define BIO_C_GET_CONNECT 123
+#define BIO_C_GET_ACCEPT 124
+#define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125
+#define BIO_C_GET_SSL_NUM_RENEGOTIATES 126
+#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127
+
+#define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,(char *)arg)
+#define BIO_get_app_data(s) BIO_get_ex_data(s,0)
+
+int BIO_get_ex_num(BIO *bio);
+int BIO_set_ex_data(BIO *bio,int idx,char *data);
+char *BIO_get_ex_data(BIO *bio,int idx);
+void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)());
+int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
+ int (*dup_func)(), void (*free_func)());
/* BIO_s_connect_socket() */
-#define BIO_set_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name)
-#define BIO_set_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port)
+#define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name)
+#define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port)
+#define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip)
+#define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port)
+#define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)
+#define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)
+#define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2)
+#define BIO_get_conn_int port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port)
+
#define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)
/* BIO_s_accept_socket() */
#define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name)
+#define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0)
/* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */
-#define BIO_set_nbio_accpet(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL)
+#define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL)
#define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio)
#define BIO_do_connect(b) BIO_do_handshake(b)
@@ -302,12 +351,14 @@ typedef struct bio_f_buffer_ctx_struct
/* BIO *BIO_get_filter_bio(BIO *bio); */
#define BIO_set_proxy_cb(b,cb) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(char *)(cb))
#define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk)
+#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool)
#define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp)
#define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p))
#define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url))
+#define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL)
-#define BIO_set_fd(b,fd,c) BIO_ctrl_int(b,BIO_C_SET_FD,c,fd)
+#define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd)
#define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c)
#define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp)
@@ -320,9 +371,19 @@ typedef struct bio_f_buffer_ctx_struct
#define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
BIO_CLOSE|BIO_FP_APPEND,name)
+/* WARNING WARNING, this ups the reference count on the read bio of the
+ * SSL structure. This is because the ssl read BIO is now pointed to by
+ * the next_bio field in the bio. So when you free the BIO, make sure
+ * you are doing a BIO_free_all() to catch the underlying BIO. */
#define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl)
#define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp)
#define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL)
+#define BIO_set_ssl_renegotiate_bytes(b,num) \
+ BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL);
+#define BIO_get_num_renegotiates(b) \
+ BIO_ctrl(b,BIO_C_SET_SSL_NUM_RENEGOTIATES,0,NULL);
+#define BIO_set_ssl_renegotiate_timeout(b,seconds) \
+ BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL);
/* defined in evp.h */
/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */
@@ -333,11 +394,12 @@ typedef struct bio_f_buffer_ctx_struct
/* For the BIO_f_buffer() type */
#define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL)
#define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL)
-#define BIO_set_read_buffer_size(b,size) BIO_ctrl_int(b,BIO_C_SET_BUFF_SIZE,size,0)
-#define BIO_set_write_buffer_size(b,size) BIO_ctrl_int(b,BIO_C_SET_BUFF_SIZE,size,1)
+#define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0)
+#define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1)
+#define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf)
/* Don't use the next one unless you know what you are doing :-) */
-#define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)ret)
+#define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret))
#define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL)
#define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL)
@@ -346,10 +408,50 @@ typedef struct bio_f_buffer_ctx_struct
#define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL)
#define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL)
#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL)
+#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp)
+#define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb)
/* For the BIO_f_buffer() type */
#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL)
+#ifdef NO_STDIO
+#define NO_FP_API
+#endif
+
+#ifndef NOPROTO
+# if defined(WIN16) && defined(_WINDLL)
+BIO_METHOD *BIO_s_file_internal(void);
+BIO *BIO_new_file_internal(char *filename, char *mode);
+BIO *BIO_new_fp_internal(FILE *stream, int close_flag);
+# define BIO_s_file BIO_s_file_internal
+# define BIO_new_file BIO_new_file_internal
+# define BIO_new_fp BIO_new_fp_internal
+# else /* FP_API */
+BIO_METHOD *BIO_s_file(void );
+BIO *BIO_new_file(char *filename, char *mode);
+BIO *BIO_new_fp(FILE *stream, int close_flag);
+# define BIO_s_file_internal BIO_s_file
+# define BIO_new_file_internal BIO_new_file
+# define BIO_new_fp_internal BIO_s_file
+# endif /* FP_API */
+#else
+# if defined(WIN16) && defined(_WINDLL)
+BIO_METHOD *BIO_s_file_internal();
+BIO *BIO_new_file_internal();
+BIO *BIO_new_fp_internal();
+# define BIO_s_file BIO_s_file_internal
+# define BIO_new_file BIO_new_file_internal
+# define BIO_new_fp BIO_new_fp_internal
+# else /* FP_API */
+BIO_METHOD *BIO_s_file();
+BIO *BIO_new_file();
+BIO *BIO_new_fp();
+# define BIO_s_file_internal BIO_s_file
+# define BIO_new_file_internal BIO_new_file
+# define BIO_new_fp_internal BIO_s_file
+# endif /* FP_API */
+#endif
+
#ifndef NOPROTO
BIO * BIO_new(BIO_METHOD *type);
int BIO_set(BIO *a,BIO_METHOD *type);
@@ -359,7 +461,8 @@ int BIO_gets(BIO *bp,char *buf, int size);
int BIO_write(BIO *b, char *data, int len);
int BIO_puts(BIO *bp,char *buf);
long BIO_ctrl(BIO *bp,int cmd,long larg,char *parg);
-long BIO_ctrl_int(BIO *bp,int cmd,long larg,int iarg);
+char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg);
+long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg);
BIO * BIO_push(BIO *b,BIO *append);
BIO * BIO_pop(BIO *b);
void BIO_free_all(BIO *a);
@@ -376,12 +479,6 @@ long _far _loadds BIO_debug_callback(BIO *bio,int cmd,char *argp,int argi,
long argl,long ret);
#endif
-#if !defined(WIN16) || defined(APPS_WIN16)
-BIO_METHOD *BIO_s_file(void);
-#else
-BIO_METHOD *BIO_s_file_internal_w16(void);
-#endif
-
BIO_METHOD *BIO_s_mem(void);
BIO_METHOD *BIO_s_socket(void);
BIO_METHOD *BIO_s_connect(void);
@@ -411,10 +508,6 @@ int BIO_set_tcp_ndelay(int sock,int turn_on);
void ERR_load_BIO_strings(void );
-#if !defined(WIN16) || defined(APPS_WIN16)
-BIO *BIO_new_file(char *filename, char *mode);
-BIO *BIO_new_fp(FILE *stream, int close_flag);
-#endif
BIO *BIO_new_socket(int sock, int close_flag);
BIO *BIO_new_fd(int fd, int close_flag);
BIO *BIO_new_connect(char *host_port);
@@ -422,6 +515,8 @@ BIO *BIO_new_accept(char *host_port);
void BIO_copy_next_retry(BIO *b);
+long BIO_ghbn_ctrl(int cmd,int iarg,char *parg);
+
#else
BIO * BIO_new();
@@ -431,8 +526,9 @@ int BIO_read();
int BIO_gets();
int BIO_write();
int BIO_puts();
+char * BIO_ptr_ctrl();
long BIO_ctrl();
-long BIO_ctrl_int();
+long BIO_int_ctrl();
BIO * BIO_push();
BIO * BIO_pop();
void BIO_free_all();
@@ -447,12 +543,6 @@ long BIO_debug_callback();
long _far _loadds BIO_debug_callback();
#endif
-#if !defined(WIN16) || defined(APPS_WIN16)
-BIO_METHOD *BIO_s_file();
-#else
-BIO_METHOD *BIO_s_file_internal_w16();
-#endif
-
BIO_METHOD *BIO_s_mem();
BIO_METHOD *BIO_s_socket();
BIO_METHOD *BIO_s_connect();
@@ -482,10 +572,6 @@ int BIO_set_tcp_ndelay();
void ERR_load_BIO_strings();
-#if !defined(WIN16) || defined(APPS_WIN16)
-BIO *BIO_new_file();