summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/bio')
-rw-r--r--src/lib/libcrypto/bio/Makefile.ssl170
-rw-r--r--src/lib/libcrypto/bio/b_dump.c13
-rw-r--r--src/lib/libcrypto/bio/b_print.c19
-rw-r--r--src/lib/libcrypto/bio/b_sock.c319
-rw-r--r--src/lib/libcrypto/bio/bf_buff.c49
-rw-r--r--src/lib/libcrypto/bio/bf_nbio.c50
-rw-r--r--src/lib/libcrypto/bio/bf_null.c48
-rw-r--r--src/lib/libcrypto/bio/bio.err46
-rw-r--r--src/lib/libcrypto/bio/bio.h343
-rw-r--r--src/lib/libcrypto/bio/bio_cb.c13
-rw-r--r--src/lib/libcrypto/bio/bio_err.c131
-rw-r--r--src/lib/libcrypto/bio/bio_lib.c147
-rw-r--r--src/lib/libcrypto/bio/bss_acpt.c132
-rw-r--r--src/lib/libcrypto/bio/bss_bio.c588
-rw-r--r--src/lib/libcrypto/bio/bss_conn.c146
-rw-r--r--src/lib/libcrypto/bio/bss_file.c60
-rw-r--r--src/lib/libcrypto/bio/bss_log.c232
-rw-r--r--src/lib/libcrypto/bio/bss_mem.c59
-rw-r--r--src/lib/libcrypto/bio/bss_null.c46
-rw-r--r--src/lib/libcrypto/bio/bss_rtcp.c56
-rw-r--r--src/lib/libcrypto/bio/bss_sock.c118
21 files changed, 1709 insertions, 1076 deletions
diff --git a/src/lib/libcrypto/bio/Makefile.ssl b/src/lib/libcrypto/bio/Makefile.ssl
index 42e11e1c94..f54c7ee1f0 100644
--- a/src/lib/libcrypto/bio/Makefile.ssl
+++ b/src/lib/libcrypto/bio/Makefile.ssl
@@ -7,36 +7,36 @@ TOP= ../..
7CC= cc 7CC= cc
8INCLUDES= -I.. -I../../include 8INCLUDES= -I.. -I../../include
9CFLAG=-g 9CFLAG=-g
10INSTALL_PREFIX=
11OPENSSLDIR= /usr/local/ssl
10INSTALLTOP=/usr/local/ssl 12INSTALLTOP=/usr/local/ssl
11MAKE= make -f Makefile.ssl 13MAKE= make -f Makefile.ssl
12MAKEDEPEND= makedepend -f Makefile.ssl 14MAKEDEPEND= $(TOP)/util/domd $(TOP)
13MAKEFILE= Makefile.ssl 15MAKEFILE= Makefile.ssl
14AR= ar r 16AR= ar r
15 17
16CFLAGS= $(INCLUDES) $(CFLAG) 18CFLAGS= $(INCLUDES) $(CFLAG)
17 19
18ERR=bio
19ERRC=bio_err
20GENERAL=Makefile 20GENERAL=Makefile
21TEST= 21TEST=
22APPS= 22APPS=
23 23
24LIB=$(TOP)/libcrypto.a 24LIB=$(TOP)/libcrypto.a
25LIBSRC= bio_lib.c bio_cb.c $(ERRC).c \ 25LIBSRC= bio_lib.c bio_cb.c bio_err.c \
26 bss_mem.c bss_null.c bss_fd.c \ 26 bss_mem.c bss_null.c bss_fd.c \
27 bss_file.c bss_sock.c bss_conn.c \ 27 bss_file.c bss_sock.c bss_conn.c \
28 bf_null.c bf_buff.c b_print.c b_dump.c \ 28 bf_null.c bf_buff.c b_print.c b_dump.c \
29 b_sock.c bss_acpt.c bf_nbio.c 29 b_sock.c bss_acpt.c bf_nbio.c bss_log.c bss_bio.c
30LIBOBJ= bio_lib.o bio_cb.o $(ERRC).o \ 30LIBOBJ= bio_lib.o bio_cb.o bio_err.o \
31 bss_mem.o bss_null.o bss_fd.o \ 31 bss_mem.o bss_null.o bss_fd.o \
32 bss_file.o bss_sock.o bss_conn.o \ 32 bss_file.o bss_sock.o bss_conn.o \
33 bf_null.o bf_buff.o b_print.o b_dump.o \ 33 bf_null.o bf_buff.o b_print.o b_dump.o \
34 b_sock.o bss_acpt.o bf_nbio.o 34 b_sock.o bss_acpt.o bf_nbio.o bss_log.o bss_bio.o
35 35
36SRC= $(LIBSRC) 36SRC= $(LIBSRC)
37 37
38EXHEADER= bio.h bss_file.c 38EXHEADER= bio.h
39HEADER= $(EXHEADER) 39HEADER= bss_file.c $(EXHEADER)
40 40
41ALL= $(GENERAL) $(SRC) $(HEADER) 41ALL= $(GENERAL) $(SRC) $(HEADER)
42 42
@@ -47,24 +47,23 @@ all: lib
47 47
48lib: $(LIBOBJ) 48lib: $(LIBOBJ)
49 $(AR) $(LIB) $(LIBOBJ) 49 $(AR) $(LIB) $(LIBOBJ)
50 sh $(TOP)/util/ranlib.sh $(LIB) 50 $(RANLIB) $(LIB)
51 @touch lib 51 @touch lib
52 52
53files: 53files:
54 perl $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO 54 $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
55 55
56links: 56links:
57 /bin/rm -f Makefile 57 @$(TOP)/util/point.sh Makefile.ssl Makefile
58 $(TOP)/util/point.sh Makefile.ssl Makefile; 58 @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
59 $(TOP)/util/mklink.sh ../../include $(EXHEADER) 59 @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
60 $(TOP)/util/mklink.sh ../../test $(TEST) 60 @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
61 $(TOP)/util/mklink.sh ../../apps $(APPS)
62 61
63install: 62install:
64 @for i in $(EXHEADER) bss_file.c ; \ 63 @for i in $(EXHEADER); \
65 do \ 64 do \
66 (cp $$i $(INSTALLTOP)/include/$$i; \ 65 (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
67 chmod 644 $(INSTALLTOP)/include/$$i ); \ 66 chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
68 done; 67 done;
69 68
70tags: 69tags:
@@ -76,17 +75,136 @@ lint:
76 lint -DLINT $(INCLUDES) $(SRC)>fluff 75 lint -DLINT $(INCLUDES) $(SRC)>fluff
77 76
78depend: 77depend:
79 $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC) 78 $(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
80 79
81dclean: 80dclean:
82 perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new 81 $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
83 mv -f Makefile.new $(MAKEFILE) 82 mv -f Makefile.new $(MAKEFILE)
84 83
85clean: 84clean:
86 /bin/rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff 85 rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
87
88errors:
89 perl $(TOP)/util/err-ins.pl $(ERR).err $(ERR).h
90 perl ../err/err_genc.pl -s $(ERR).h $(ERRC).c
91 86
92# DO NOT DELETE THIS LINE -- make depend depends on it. 87# DO NOT DELETE THIS LINE -- make depend depends on it.
88
89b_dump.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
90b_dump.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
91b_dump.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
92b_dump.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
93b_dump.o: ../../include/openssl/stack.h ../cryptlib.h
94b_print.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
95b_print.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
96b_print.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
97b_print.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
98b_print.o: ../../include/openssl/stack.h ../cryptlib.h
99b_sock.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
100b_sock.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
101b_sock.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
102b_sock.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
103b_sock.o: ../../include/openssl/stack.h ../cryptlib.h
104bf_buff.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
105bf_buff.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h
106bf_buff.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h
107bf_buff.o: ../../include/openssl/crypto.h ../../include/openssl/des.h
108bf_buff.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h
109bf_buff.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
110bf_buff.o: ../../include/openssl/err.h ../../include/openssl/evp.h
111bf_buff.o: ../../include/openssl/idea.h ../../include/openssl/md2.h
112bf_buff.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h
113bf_buff.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
114bf_buff.o: ../../include/openssl/opensslv.h ../../include/openssl/rc2.h
115bf_buff.o: ../../include/openssl/rc4.h ../../include/openssl/rc5.h
116bf_buff.o: ../../include/openssl/ripemd.h ../../include/openssl/rsa.h
117bf_buff.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
118bf_buff.o: ../../include/openssl/stack.h ../cryptlib.h
119bf_nbio.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
120bf_nbio.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h
121bf_nbio.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h
122bf_nbio.o: ../../include/openssl/crypto.h ../../include/openssl/des.h
123bf_nbio.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h
124bf_nbio.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
125bf_nbio.o: ../../include/openssl/err.h ../../include/openssl/evp.h
126bf_nbio.o: ../../include/openssl/idea.h ../../include/openssl/md2.h
127bf_nbio.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h
128bf_nbio.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
129bf_nbio.o: ../../include/openssl/opensslv.h ../../include/openssl/rand.h
130bf_nbio.o: ../../include/openssl/rc2.h ../../include/openssl/rc4.h
131bf_nbio.o: ../../include/openssl/rc5.h ../../include/openssl/ripemd.h
132bf_nbio.o: ../../include/openssl/rsa.h ../../include/openssl/safestack.h
133bf_nbio.o: ../../include/openssl/sha.h ../../include/openssl/stack.h
134bf_nbio.o: ../cryptlib.h
135bf_null.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
136bf_null.o: ../../include/openssl/blowfish.h ../../include/openssl/bn.h
137bf_null.o: ../../include/openssl/buffer.h ../../include/openssl/cast.h
138bf_null.o: ../../include/openssl/crypto.h ../../include/openssl/des.h
139bf_null.o: ../../include/openssl/dh.h ../../include/openssl/dsa.h
140bf_null.o: ../../include/openssl/e_os.h ../../include/openssl/e_os2.h
141bf_null.o: ../../include/openssl/err.h ../../include/openssl/evp.h
142bf_null.o: ../../include/openssl/idea.h ../../include/openssl/md2.h
143bf_null.o: ../../include/openssl/md5.h ../../include/openssl/mdc2.h
144bf_null.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
145bf_null.o: ../../include/openssl/opensslv.h ../../include/openssl/rc2.h
146bf_null.o: ../../include/openssl/rc4.h ../../include/openssl/rc5.h
147bf_null.o: ../../include/openssl/ripemd.h ../../include/openssl/rsa.h
148bf_null.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
149bf_null.o: ../../include/openssl/stack.h ../cryptlib.h
150bio_cb.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
151bio_cb.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
152bio_cb.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
153bio_cb.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
154bio_cb.o: ../../include/openssl/stack.h ../cryptlib.h
155bio_err.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h
156bio_err.o: ../../include/openssl/err.h ../../include/openssl/opensslv.h
157bio_err.o: ../../include/openssl/stack.h
158bio_lib.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
159bio_lib.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
160bio_lib.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
161bio_lib.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
162bio_lib.o: ../../include/openssl/stack.h ../cryptlib.h
163bss_acpt.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
164bss_acpt.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
165bss_acpt.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
166bss_acpt.o: ../../include/openssl/opensslconf.h
167bss_acpt.o: ../../include/openssl/opensslv.h ../../include/openssl/stack.h
168bss_acpt.o: ../cryptlib.h
169bss_bio.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h
170bss_bio.o: ../../include/openssl/err.h ../../include/openssl/opensslv.h
171bss_bio.o: ../../include/openssl/stack.h
172bss_conn.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
173bss_conn.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
174bss_conn.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
175bss_conn.o: ../../include/openssl/opensslconf.h
176bss_conn.o: ../../include/openssl/opensslv.h ../../include/openssl/stack.h
177bss_conn.o: ../cryptlib.h
178bss_fd.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
179bss_fd.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
180bss_fd.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
181bss_fd.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
182bss_fd.o: ../../include/openssl/stack.h ../cryptlib.h bss_sock.c
183bss_file.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
184bss_file.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
185bss_file.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
186bss_file.o: ../../include/openssl/opensslconf.h
187bss_file.o: ../../include/openssl/opensslv.h ../../include/openssl/stack.h
188bss_file.o: ../cryptlib.h
189bss_log.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
190bss_log.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
191bss_log.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
192bss_log.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
193bss_log.o: ../../include/openssl/stack.h ../cryptlib.h
194bss_mem.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
195bss_mem.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
196bss_mem.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
197bss_mem.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
198bss_mem.o: ../../include/openssl/stack.h ../cryptlib.h
199bss_null.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
200bss_null.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
201bss_null.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
202bss_null.o: ../../include/openssl/opensslconf.h
203bss_null.o: ../../include/openssl/opensslv.h ../../include/openssl/stack.h
204bss_null.o: ../cryptlib.h
205bss_sock.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
206bss_sock.o: ../../include/openssl/crypto.h ../../include/openssl/e_os.h
207bss_sock.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
208bss_sock.o: ../../include/openssl/opensslconf.h
209bss_sock.o: ../../include/openssl/opensslv.h ../../include/openssl/stack.h
210bss_sock.o: ../cryptlib.h
diff --git a/src/lib/libcrypto/bio/b_dump.c b/src/lib/libcrypto/bio/b_dump.c
index db84ad3d47..a7cd828978 100644
--- a/src/lib/libcrypto/bio/b_dump.c
+++ b/src/lib/libcrypto/bio/b_dump.c
@@ -62,15 +62,12 @@
62 62
63#include <stdio.h> 63#include <stdio.h>
64#include "cryptlib.h" 64#include "cryptlib.h"
65#include "bio.h" 65#include <openssl/bio.h>
66 66
67#define TRUNCATE 67#define TRUNCATE
68#define DUMP_WIDTH 16 68#define DUMP_WIDTH 16
69 69
70int BIO_dump(bio,s,len) 70int BIO_dump(BIO *bio, const char *s, int len)
71BIO *bio;
72char *s;
73int len;
74{ 71{
75 int ret=0; 72 int ret=0;
76 char buf[160+1],tmp[20]; 73 char buf[160+1],tmp[20];
@@ -105,7 +102,13 @@ int len;
105 if (((i*DUMP_WIDTH)+j)>=len) 102 if (((i*DUMP_WIDTH)+j)>=len)
106 break; 103 break;
107 ch=((unsigned char)*((char *)(s)+i*DUMP_WIDTH+j)) & 0xff; 104 ch=((unsigned char)*((char *)(s)+i*DUMP_WIDTH+j)) & 0xff;
105#ifndef CHARSET_EBCDIC
108 sprintf(tmp,"%c",((ch>=' ')&&(ch<='~'))?ch:'.'); 106 sprintf(tmp,"%c",((ch>=' ')&&(ch<='~'))?ch:'.');
107#else
108 sprintf(tmp,"%c",((ch>=os_toascii[' '])&&(ch<=os_toascii['~']))
109 ? os_toebcdic[ch]
110 : '.');
111#endif
109 strcat(buf,tmp); 112 strcat(buf,tmp);
110 } 113 }
111 strcat(buf,"\n"); 114 strcat(buf,"\n");
diff --git a/src/lib/libcrypto/bio/b_print.c b/src/lib/libcrypto/bio/b_print.c
index cdadeb839a..f448004298 100644
--- a/src/lib/libcrypto/bio/b_print.c
+++ b/src/lib/libcrypto/bio/b_print.c
@@ -61,32 +61,27 @@
61 */ 61 */
62 62
63#include <stdio.h> 63#include <stdio.h>
64#include <stdarg.h>
64#include "cryptlib.h" 65#include "cryptlib.h"
65#include "bio.h" 66#include <openssl/bio.h>
66 67
67int BIO_printf ( VAR_PLIST( BIO *, bio ) ) 68int BIO_printf (BIO *bio, ...)
68VAR_ALIST
69 { 69 {
70 VAR_BDEFN(args, BIO *, bio); 70 va_list args;
71 char *format; 71 char *format;
72 int ret; 72 int ret;
73 MS_STATIC char hugebuf[1024*2]; /* 10k in one chunk is the limit */ 73 MS_STATIC char hugebuf[1024*2]; /* 10k in one chunk is the limit */
74 74
75 VAR_INIT(args, BIO *, bio); 75 va_start(args, bio);
76 VAR_ARG(args, char *, format); 76 format=va_arg(args, char *);
77 77
78 hugebuf[0]='\0'; 78 hugebuf[0]='\0';
79 79
80/* no-one uses _doprnt anymore and it appears to be broken under SunOS 4.1.4 */
81#if 0 && defined(sun) && !defined(VAR_ANSI) /**/
82 _doprnt(hugebuf,format,args);
83#else /* !sun */
84 vsprintf(hugebuf,format,args); 80 vsprintf(hugebuf,format,args);
85#endif /* sun */
86 81
87 ret=BIO_write(bio,hugebuf,strlen(hugebuf)); 82 ret=BIO_write(bio,hugebuf,strlen(hugebuf));
88 83
89 VAR_END( args ); 84 va_end(args);
90 return(ret); 85 return(ret);
91 } 86 }
92 87
diff --git a/src/lib/libcrypto/bio/b_sock.c b/src/lib/libcrypto/bio/b_sock.c
index a45909527c..d29b29ff8b 100644
--- a/src/lib/libcrypto/bio/b_sock.c
+++ b/src/lib/libcrypto/bio/b_sock.c
@@ -63,9 +63,7 @@
63#include <errno.h> 63#include <errno.h>
64#define USE_SOCKETS 64#define USE_SOCKETS
65#include "cryptlib.h" 65#include "cryptlib.h"
66#include "bio.h" 66#include <openssl/bio.h>
67
68/* BIOerr(BIO_F_WSASTARTUP,BIO_R_WSASTARTUP ); */
69 67
70#ifdef WIN16 68#ifdef WIN16
71#define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ 69#define SOCKET_PROTOCOL 0 /* more microsoft stupidity */
@@ -96,21 +94,14 @@ static struct ghbn_cache_st
96 unsigned long order; 94 unsigned long order;
97 } ghbn_cache[GHBN_NUM]; 95 } ghbn_cache[GHBN_NUM];
98 96
99#ifndef NOPROTO 97static int get_ip(const char *str,unsigned char *ip);
100static int get_ip(char *str,unsigned char *ip);
101static void ghbn_free(struct hostent *a); 98static void ghbn_free(struct hostent *a);
102static struct hostent *ghbn_dup(struct hostent *a); 99static struct hostent *ghbn_dup(struct hostent *a);
103#else 100int BIO_get_host_ip(const char *str, unsigned char *ip)
104static int get_ip();
105static void ghbn_free();
106static struct hostent *ghbn_dup();
107#endif
108
109int BIO_get_host_ip(str,ip)
110char *str;
111unsigned char *ip;
112 { 101 {
113 int i; 102 int i;
103 int err = 1;
104 int locked = 0;
114 struct hostent *he; 105 struct hostent *he;
115 106
116 i=get_ip(str,ip); 107 i=get_ip(str,ip);
@@ -118,37 +109,45 @@ unsigned char *ip;
118 if (i < 0) 109 if (i < 0)
119 { 110 {
120 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); 111 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS);
121 ERR_add_error_data(2,"host=",str); 112 goto err;
122 return(0);
123 } 113 }
124 else
125 { /* do a gethostbyname */
126 if (!BIO_sock_init()) return(0);
127 114
128 he=BIO_gethostbyname(str); 115 /* do a gethostbyname */
129 if (he == NULL) 116 if (!BIO_sock_init())
130 { 117 return(0); /* don't generate another error code here */
131 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP);
132 ERR_add_error_data(2,"host=",str);
133 return(0);
134 }
135 118
136 /* cast to short because of win16 winsock definition */ 119 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
137 if ((short)he->h_addrtype != AF_INET) 120 locked = 1;
138 { 121 he=BIO_gethostbyname(str);
139 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); 122 if (he == NULL)
140 ERR_add_error_data(2,"host=",str); 123 {
141 return(0); 124 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP);
142 } 125 goto err;
143 for (i=0; i<4; i++)
144 ip[i]=he->h_addr_list[0][i];
145 } 126 }
146 return(1); 127
128 /* cast to short because of win16 winsock definition */
129 if ((short)he->h_addrtype != AF_INET)
130 {
131 BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET);
132 goto err;
133 }
134 for (i=0; i<4; i++)
135 ip[i]=he->h_addr_list[0][i];
136 err = 0;
137
138 err:
139 if (locked)
140 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
141 if (err)
142 {
143 ERR_add_error_data(2,"host=",str);
144 return 0;
145 }
146 else
147 return 1;
147 } 148 }
148 149
149int BIO_get_port(str,port_ptr) 150int BIO_get_port(const char *str, unsigned short *port_ptr)
150char *str;
151short *port_ptr;
152 { 151 {
153 int i; 152 int i;
154 struct servent *s; 153 struct servent *s;
@@ -163,8 +162,12 @@ short *port_ptr;
163 *port_ptr=(unsigned short)i; 162 *port_ptr=(unsigned short)i;
164 else 163 else
165 { 164 {
166 s=getservbyname(str,"tcp"); 165 CRYPTO_w_lock(CRYPTO_LOCK_GETSERVBYNAME);
167 if (s == NULL) 166 s=getservbyname(str,"tcp");
167 if(s != NULL)
168 *port_ptr=ntohs((unsigned short)s->s_port);
169 CRYPTO_w_unlock(CRYPTO_LOCK_GETSERVBYNAME);
170 if(s == NULL)
168 { 171 {
169 if (strcmp(str,"http") == 0) 172 if (strcmp(str,"http") == 0)
170 *port_ptr=80; 173 *port_ptr=80;
@@ -190,31 +193,30 @@ short *port_ptr;
190 ERR_add_error_data(3,"service='",str,"'"); 193 ERR_add_error_data(3,"service='",str,"'");
191 return(0); 194 return(0);
192 } 195 }
193 return(1);
194 } 196 }
195 *port_ptr=htons((unsigned short)s->s_port);
196 } 197 }
197 return(1); 198 return(1);
198 } 199 }
199 200
200int BIO_sock_error(sock) 201int BIO_sock_error(int sock)
201int sock;
202 { 202 {
203 int j,i,size; 203 int j,i;
204 int size;
204 205
205 size=sizeof(int); 206 size=sizeof(int);
206 207 /* Note: under Windows the third parameter is of type (char *)
207 i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(char *)&j,&size); 208 * whereas under other systems it is (void *) if you don't have
209 * a cast it will choke the compiler: if you do have a cast then
210 * you can either go for (char *) or (void *).
211 */
212 i=getsockopt(sock,SOL_SOCKET,SO_ERROR,(void *)&j,(void *)&size);
208 if (i < 0) 213 if (i < 0)
209 return(1); 214 return(1);
210 else 215 else
211 return(j); 216 return(j);
212 } 217 }
213 218
214long BIO_ghbn_ctrl(cmd,iarg,parg) 219long BIO_ghbn_ctrl(int cmd, int iarg, char *parg)
215int cmd;
216int iarg;
217char *parg;
218 { 220 {
219 int i; 221 int i;
220 char **p; 222 char **p;
@@ -223,13 +225,13 @@ char *parg;
223 { 225 {
224 case BIO_GHBN_CTRL_HITS: 226 case BIO_GHBN_CTRL_HITS:
225 return(BIO_ghbn_hits); 227 return(BIO_ghbn_hits);
226 break; 228 /* break; */
227 case BIO_GHBN_CTRL_MISSES: 229 case BIO_GHBN_CTRL_MISSES:
228 return(BIO_ghbn_miss); 230 return(BIO_ghbn_miss);
229 break; 231 /* break; */
230 case BIO_GHBN_CTRL_CACHE_SIZE: 232 case BIO_GHBN_CTRL_CACHE_SIZE:
231 return(GHBN_NUM); 233 return(GHBN_NUM);
232 break; 234 /* break; */
233 case BIO_GHBN_CTRL_GET_ENTRY: 235 case BIO_GHBN_CTRL_GET_ENTRY:
234 if ((iarg >= 0) && (iarg <GHBN_NUM) && 236 if ((iarg >= 0) && (iarg <GHBN_NUM) &&
235 (ghbn_cache[iarg].order > 0)) 237 (ghbn_cache[iarg].order > 0))
@@ -241,7 +243,7 @@ char *parg;
241 return(1); 243 return(1);
242 } 244 }
243 return(0); 245 return(0);
244 break; 246 /* break; */
245 case BIO_GHBN_CTRL_FLUSH: 247 case BIO_GHBN_CTRL_FLUSH:
246 for (i=0; i<GHBN_NUM; i++) 248 for (i=0; i<GHBN_NUM; i++)
247 ghbn_cache[i].order=0; 249 ghbn_cache[i].order=0;
@@ -252,77 +254,84 @@ char *parg;
252 return(1); 254 return(1);
253 } 255 }
254 256
255static struct hostent *ghbn_dup(a) 257static struct hostent *ghbn_dup(struct hostent *a)
256struct hostent *a;
257 { 258 {
258 struct hostent *ret; 259 struct hostent *ret;
259 int i,j; 260 int i,j;
260 261
261 ret=(struct hostent *)malloc(sizeof(struct hostent)); 262 MemCheck_off();
263 ret=(struct hostent *)Malloc(sizeof(struct hostent));
262 if (ret == NULL) return(NULL); 264 if (ret == NULL) return(NULL);
263 memset(ret,0,sizeof(struct hostent)); 265 memset(ret,0,sizeof(struct hostent));
264 266
265 for (i=0; a->h_aliases[i] != NULL; i++) 267 for (i=0; a->h_aliases[i] != NULL; i++)
266 ; 268 ;
267 i++; 269 i++;
268 ret->h_aliases=(char **)malloc(sizeof(char *)*i); 270 ret->h_aliases = (char **)Malloc(i*sizeof(char *));
269 memset(ret->h_aliases,0,sizeof(char *)*i); 271 if (ret->h_aliases == NULL)
270 if (ret == NULL) goto err; 272 goto err;
273 memset(ret->h_aliases, 0, i*sizeof(char *));
271 274
272 for (i=0; a->h_addr_list[i] != NULL; i++) 275 for (i=0; a->h_addr_list[i] != NULL; i++)
273 ; 276 ;
274 i++; 277 i++;
275 ret->h_addr_list=(char **)malloc(sizeof(char *)*i); 278 ret->h_addr_list=(char **)Malloc(i*sizeof(char *));
276 memset(ret->h_addr_list,0,sizeof(char *)*i); 279 if (ret->h_addr_list == NULL)
277 if (ret->h_addr_list == NULL) goto err; 280 goto err;
281 memset(ret->h_addr_list, 0, i*sizeof(char *));
278 282
279 j=strlen(a->h_name)+1; 283 j=strlen(a->h_name)+1;
280 if ((ret->h_name=malloc(j)) == NULL) goto err; 284 if ((ret->h_name=Malloc(j)) == NULL) goto err;
281 memcpy((char *)ret->h_name,a->h_name,j); 285 memcpy((char *)ret->h_name,a->h_name,j+1);
282 for (i=0; a->h_aliases[i] != NULL; i++) 286 for (i=0; a->h_aliases[i] != NULL; i++)
283 { 287 {
284 j=strlen(a->h_aliases[i])+1; 288 j=strlen(a->h_aliases[i])+1;
285 if ((ret->h_aliases[i]=malloc(j)) == NULL) goto err; 289 if ((ret->h_aliases[i]=Malloc(j)) == NULL) goto err;
286 memcpy(ret->h_aliases[i],a->h_aliases[i],j); 290 memcpy(ret->h_aliases[i],a->h_aliases[i],j+1);
287 } 291 }
288 ret->h_length=a->h_length; 292 ret->h_length=a->h_length;
289 ret->h_addrtype=a->h_addrtype; 293 ret->h_addrtype=a->h_addrtype;
290 for (i=0; a->h_addr_list[i] != NULL; i++) 294 for (i=0; a->h_addr_list[i] != NULL; i++)
291 { 295 {
292 if ((ret->h_addr_list[i]=malloc(a->h_length)) == NULL) 296 if ((ret->h_addr_list[i]=Malloc(a->h_length)) == NULL)
293 goto err; 297 goto err;
294 memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); 298 memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length);
295 } 299 }
296 return(ret); 300 if (0)
301 {
297err: 302err:
298 if (ret != NULL) 303 if (ret != NULL)
299 ghbn_free(ret); 304 ghbn_free(ret);
300 return(NULL); 305 ret=NULL;
306 }
307 MemCheck_on();
308 return(ret);
301 } 309 }
302 310
303static void ghbn_free(a) 311static void ghbn_free(struct hostent *a)
304struct hostent *a;
305 { 312 {
306 int i; 313 int i;
307 314
315 if(a == NULL)
316 return;
317
308 if (a->h_aliases != NULL) 318 if (a->h_aliases != NULL)
309 { 319 {
310 for (i=0; a->h_aliases[i] != NULL; i++) 320 for (i=0; a->h_aliases[i] != NULL; i++)
311 free(a->h_aliases[i]); 321 Free(a->h_aliases[i]);
312 free(a->h_aliases); 322 Free(a->h_aliases);
313 } 323 }
314 if (a->h_addr_list != NULL) 324 if (a->h_addr_list != NULL)
315 { 325 {
316 for (i=0; a->h_addr_list[i] != NULL; i++) 326 for (i=0; a->h_addr_list[i] != NULL; i++)
317 free(a->h_addr_list[i]); 327 Free(a->h_addr_list[i]);
318 free(a->h_addr_list); 328 Free(a->h_addr_list);
319 } 329 }
320 if (a->h_name != NULL) free((char *)a->h_name); 330 if (a->h_name != NULL) Free((char *)a->h_name);
321 free(a); 331 Free(a);
322 } 332 }
323 333
324struct hostent *BIO_gethostbyname(name) 334struct hostent *BIO_gethostbyname(const char *name)
325char *name;
326 { 335 {
327 struct hostent *ret; 336 struct hostent *ret;
328 int i,lowi=0,j; 337 int i,lowi=0,j;
@@ -330,7 +339,12 @@ char *name;
330 339
331/* return(gethostbyname(name)); */ 340/* return(gethostbyname(name)); */
332 341
333 CRYPTO_w_lock(CRYPTO_LOCK_BIO_GETHOSTBYNAME); 342#if 0 /* It doesn't make sense to use locking here: The function interface
343 * is not thread-safe, because threads can never be sure when
344 * some other thread destroys the data they were given a pointer to.
345 */
346 CRYPTO_w_lock(CRYPTO_LOCK_GETHOSTBYNAME);
347#endif
334 j=strlen(name); 348 j=strlen(name);
335 if (j < 128) 349 if (j < 128)
336 { 350 {
@@ -356,15 +370,29 @@ char *name;
356 BIO_ghbn_miss++; 370 BIO_ghbn_miss++;
357 ret=gethostbyname(name); 371 ret=gethostbyname(name);
358 372
359 if (ret == NULL) return(NULL); 373 if (ret == NULL)
360 if (j > 128) return(ret); /* too big to cache */ 374 goto end;
375 if (j > 128) /* too big to cache */
376 {
377#if 0 /* If we were trying to make this function thread-safe (which
378 * is bound to fail), we'd have to give up in this case
379 * (or allocate more memory). */
380 ret = NULL;
381#endif
382 goto end;
383 }
361 384
362 /* else add to cache */ 385 /* else add to cache */
363 if (ghbn_cache[lowi].ent != NULL) 386 if (ghbn_cache[lowi].ent != NULL)
364 ghbn_free(ghbn_cache[lowi].ent); 387 ghbn_free(ghbn_cache[lowi].ent); /* XXX not thread-safe */
388 ghbn_cache[lowi].name[0] = '\0';
365 389
390 if((ret=ghbn_cache[lowi].ent=ghbn_dup(ret)) == NULL)
391 {
392 BIOerr(BIO_F_BIO_GETHOSTBYNAME,ERR_R_MALLOC_FAILURE);
393 goto end;
394 }
366 strncpy(ghbn_cache[lowi].name,name,128); 395 strncpy(ghbn_cache[lowi].name,name,128);
367 ghbn_cache[lowi].ent=ghbn_dup(ret);
368 ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; 396 ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits;
369 } 397 }
370 else 398 else
@@ -373,11 +401,14 @@ char *name;
373 ret= ghbn_cache[i].ent; 401 ret= ghbn_cache[i].ent;
374 ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; 402 ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits;
375 } 403 }
376 CRYPTO_w_unlock(CRYPTO_LOCK_BIO_GETHOSTBYNAME); 404end:
405#if 0
406 CRYPTO_w_unlock(CRYPTO_LOCK_GETHOSTBYNAME);
407#endif
377 return(ret); 408 return(ret);
378 } 409 }
379 410
380int BIO_sock_init() 411int BIO_sock_init(void)
381 { 412 {
382#ifdef WINDOWS 413#ifdef WINDOWS
383 static struct WSAData wsa_state; 414 static struct WSAData wsa_state;
@@ -403,7 +434,7 @@ int BIO_sock_init()
403 return(1); 434 return(1);
404 } 435 }
405 436
406void BIO_sock_cleanup() 437void BIO_sock_cleanup(void)
407 { 438 {
408#ifdef WINDOWS 439#ifdef WINDOWS
409 if (wsa_init_done) 440 if (wsa_init_done)
@@ -415,10 +446,9 @@ void BIO_sock_cleanup()
415#endif 446#endif
416 } 447 }
417 448
418int BIO_socket_ioctl(fd,type,arg) 449#if !defined(VMS) || __VMS_VER >= 70000000
419int fd; 450
420long type; 451int BIO_socket_ioctl(int fd, long type, unsigned long *arg)
421unsigned long *arg;
422 { 452 {
423 int i; 453 int i;
424 454
@@ -427,12 +457,11 @@ unsigned long *arg;
427 SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error()); 457 SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error());
428 return(i); 458 return(i);
429 } 459 }
460#endif /* __VMS_VER */
430 461
431/* The reason I have implemented this instead of using sscanf is because 462/* The reason I have implemented this instead of using sscanf is because
432 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */ 463 * Visual C 1.52c gives an unresolved external when linking a DLL :-( */
433static int get_ip(str,ip) 464static int get_ip(const char *str, unsigned char ip[4])
434char *str;
435unsigned char ip[4];
436 { 465 {
437 unsigned int tmp[4]; 466 unsigned int tmp[4];
438 int num=0,c,ok=0; 467 int num=0,c,ok=0;
@@ -467,16 +496,17 @@ unsigned char ip[4];
467 return(1); 496 return(1);
468 } 497 }
469 498
470int BIO_get_accept_socket(host) 499int BIO_get_accept_socket(char *host, int bind_mode)
471char *host;
472 { 500 {
473 int ret=0; 501 int ret=0;
474 struct sockaddr_in server; 502 struct sockaddr_in server,client;
475 int s= -1; 503 int s= -1,cs;
476 unsigned char ip[4]; 504 unsigned char ip[4];
477 short port; 505 unsigned short port;
478 char *str,*h,*p,*e; 506 char *str,*e;
507 const char *h,*p;
479 unsigned long l; 508 unsigned long l;
509 int err_num;
480 510
481 if (!BIO_sock_init()) return(INVALID_SOCKET); 511 if (!BIO_sock_init()) return(INVALID_SOCKET);
482 512
@@ -508,7 +538,7 @@ char *host;
508 538
509 memset((char *)&server,0,sizeof(server)); 539 memset((char *)&server,0,sizeof(server));
510 server.sin_family=AF_INET; 540 server.sin_family=AF_INET;
511 server.sin_port=htons((unsigned short)port); 541 server.sin_port=htons(port);
512 542
513 if (strcmp(h,"*") == 0) 543 if (strcmp(h,"*") == 0)
514 server.sin_addr.s_addr=INADDR_ANY; 544 server.sin_addr.s_addr=INADDR_ANY;
@@ -517,12 +547,13 @@ char *host;
517 if (!BIO_get_host_ip(h,&(ip[0]))) return(INVALID_SOCKET); 547 if (!BIO_get_host_ip(h,&(ip[0]))) return(INVALID_SOCKET);
518 l=(unsigned long) 548 l=(unsigned long)
519 ((unsigned long)ip[0]<<24L)| 549 ((unsigned long)ip[0]<<24L)|
520 ((unsigned long)ip[0]<<16L)| 550 ((unsigned long)ip[1]<<16L)|
521 ((unsigned long)ip[0]<< 8L)| 551 ((unsigned long)ip[2]<< 8L)|
522 ((unsigned long)ip[0]); 552 ((unsigned long)ip[3]);
523 server.sin_addr.s_addr=htonl(l); 553 server.sin_addr.s_addr=htonl(l);
524 } 554 }
525 555
556again:
526 s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); 557 s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
527 if (s == INVALID_SOCKET) 558 if (s == INVALID_SOCKET)
528 { 559 {
@@ -531,9 +562,45 @@ char *host;
531 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); 562 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET);
532 goto err; 563 goto err;
533 } 564 }
565
566#ifdef SO_REUSEADDR
567 if (bind_mode == BIO_BIND_REUSEADDR)
568 {
569 int i=1;
570
571 ret=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i));
572 bind_mode=BIO_BIND_NORMAL;
573 }
574#endif
534 if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) 575 if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1)
535 { 576 {
536 SYSerr(SYS_F_BIND,get_last_socket_error()); 577#ifdef SO_REUSEADDR
578 err_num=get_last_socket_error();
579 if ((bind_mode == BIO_BIND_REUSEADDR_IF_UNUSED) &&
580 (err_num == EADDRINUSE))
581 {
582 memcpy((char *)&client,(char *)&server,sizeof(server));
583 if (strcmp(h,"*") == 0)
584 client.sin_addr.s_addr=htonl(0x7F000001);
585 cs=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL);
586 if (cs != INVALID_SOCKET)
587 {
588 int ii;
589 ii=connect(cs,(struct sockaddr *)&client,
590 sizeof(client));
591 closesocket(cs);
592 if (ii == INVALID_SOCKET)
593 {
594 bind_mode=BIO_BIND_REUSEADDR;
595 closesocket(s);
596 goto again;
597 }
598 /* else error */
599 }
600 /* else error */
601 }
602#endif
603 SYSerr(SYS_F_BIND,err_num);
537 ERR_add_error_data(3,"port='",host,"'"); 604 ERR_add_error_data(3,"port='",host,"'");
538 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); 605 BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET);
539 goto err; 606 goto err;
@@ -550,30 +617,29 @@ err:
550 if (str != NULL) Free(str); 617 if (str != NULL) Free(str);
551 if ((ret == 0) && (s != INVALID_SOCKET)) 618 if ((ret == 0) && (s != INVALID_SOCKET))
552 { 619 {
553#ifdef WINDOWS
554 closesocket(s); 620 closesocket(s);
555#else
556 close(s);
557#endif
558 s= INVALID_SOCKET; 621 s= INVALID_SOCKET;
559 } 622 }
560 return(s); 623 return(s);
561 } 624 }
562 625
563int BIO_accept(sock,addr) 626int BIO_accept(int sock, char **addr)
564int sock;
565char **addr;
566 { 627 {
567 int ret=INVALID_SOCKET; 628 int ret=INVALID_SOCKET;
568 static struct sockaddr_in from; 629 static struct sockaddr_in from;
569 unsigned long l; 630 unsigned long l;
570 short port; 631 unsigned short port;
571 int len; 632 int len;
572 char *p; 633 char *p;
573 634
574 memset((char *)&from,0,sizeof(from)); 635 memset((char *)&from,0,sizeof(from));
575 len=sizeof(from); 636 len=sizeof(from);
576 ret=accept(sock,(struct sockaddr *)&from,&len); 637 /* Note: under VMS with SOCKETSHR the fourth parameter is currently
638 * of type (int *) whereas under other systems it is (void *) if
639 * you don't have a cast it will choke the compiler: if you do
640 * have a cast then you can either go for (int *) or (void *).
641 */
642 ret=accept(sock,(struct sockaddr *)&from,(void *)&len);
577 if (ret == INVALID_SOCKET) 643 if (ret == INVALID_SOCKET)
578 { 644 {
579 SYSerr(SYS_F_ACCEPT,get_last_socket_error()); 645 SYSerr(SYS_F_ACCEPT,get_last_socket_error());
@@ -604,9 +670,7 @@ end:
604 return(ret); 670 return(ret);
605 } 671 }
606 672
607int BIO_set_tcp_ndelay(s,on) 673int BIO_set_tcp_ndelay(int s, int on)
608int s;
609int on;
610 { 674 {
611 int ret=0; 675 int ret=0;
612#if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP)) 676#if defined(TCP_NODELAY) && (defined(IPPROTO_TCP) || defined(SOL_TCP))
@@ -626,3 +690,14 @@ int on;
626 } 690 }
627#endif 691#endif
628 692
693int BIO_socket_nbio(int s, int mode)
694 {
695 int ret= -1;
696 unsigned long l;
697
698 l=mode;
699#ifdef FIONBIO
700 ret=BIO_socket_ioctl(s,FIONBIO,&l);
701#endif
702 return(ret == 0);
703 }
diff --git a/src/lib/libcrypto/bio/bf_buff.c b/src/lib/libcrypto/bio/bf_buff.c
index 7912b88473..acd8148138 100644
--- a/src/lib/libcrypto/bio/bf_buff.c
+++ b/src/lib/libcrypto/bio/bf_buff.c
@@ -59,10 +59,9 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include "bio.h" 62#include <openssl/bio.h>
63#include "evp.h" 63#include <openssl/evp.h>
64 64
65#ifndef NOPROTO
66static int buffer_write(BIO *h,char *buf,int num); 65static int buffer_write(BIO *h,char *buf,int num);
67static int buffer_read(BIO *h,char *buf,int size); 66static int buffer_read(BIO *h,char *buf,int size);
68static int buffer_puts(BIO *h,char *str); 67static int buffer_puts(BIO *h,char *str);
@@ -70,16 +69,6 @@ static int buffer_gets(BIO *h,char *str,int size);
70static long buffer_ctrl(BIO *h,int cmd,long arg1,char *arg2); 69static long buffer_ctrl(BIO *h,int cmd,long arg1,char *arg2);
71static int buffer_new(BIO *h); 70static int buffer_new(BIO *h);
72static int buffer_free(BIO *data); 71static int buffer_free(BIO *data);
73#else
74static int buffer_write();
75static int buffer_read();
76static int buffer_puts();
77static int buffer_gets();
78static long buffer_ctrl();
79static int buffer_new();
80static int buffer_free();
81#endif
82
83#define DEFAULT_BUFFER_SIZE 1024 72#define DEFAULT_BUFFER_SIZE 1024
84 73
85static BIO_METHOD methods_buffer= 74static BIO_METHOD methods_buffer=
@@ -95,13 +84,12 @@ static BIO_METHOD methods_buffer=
95 buffer_free, 84 buffer_free,
96 }; 85 };
97 86
98BIO_METHOD *BIO_f_buffer() 87BIO_METHOD *BIO_f_buffer(void)
99 { 88 {
100 return(&methods_buffer); 89 return(&methods_buffer);
101 } 90 }
102 91
103static int buffer_new(bi) 92static int buffer_new(BIO *bi)
104BIO *bi;
105 { 93 {
106 BIO_F_BUFFER_CTX *ctx; 94 BIO_F_BUFFER_CTX *ctx;
107 95
@@ -124,8 +112,7 @@ BIO *bi;
124 return(1); 112 return(1);
125 } 113 }
126 114
127static int buffer_free(a) 115static int buffer_free(BIO *a)
128BIO *a;
129 { 116 {
130 BIO_F_BUFFER_CTX *b; 117 BIO_F_BUFFER_CTX *b;
131 118
@@ -140,10 +127,7 @@ BIO *a;
140 return(1); 127 return(1);
141 } 128 }
142 129
143static int buffer_read(b,out,outl) 130static int buffer_read(BIO *b, char *out, int outl)
144BIO *b;
145char *out;
146int outl;
147 { 131 {
148 int i,num=0; 132 int i,num=0;
149 BIO_F_BUFFER_CTX *ctx; 133 BIO_F_BUFFER_CTX *ctx;
@@ -209,10 +193,7 @@ start:
209 goto start; 193 goto start;
210 } 194 }
211 195
212static int buffer_write(b,in,inl) 196static int buffer_write(BIO *b, char *in, int inl)
213BIO *b;
214char *in;
215int inl;
216 { 197 {
217 int i,num=0; 198 int i,num=0;
218 BIO_F_BUFFER_CTX *ctx; 199 BIO_F_BUFFER_CTX *ctx;
@@ -285,11 +266,7 @@ start:
285 goto start; 266 goto start;
286 } 267 }
287 268
288static long buffer_ctrl(b,cmd,num,ptr) 269static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr)
289BIO *b;
290int cmd;
291long num;
292char *ptr;
293 { 270 {
294 BIO *dbio; 271 BIO *dbio;
295 BIO_F_BUFFER_CTX *ctx; 272 BIO_F_BUFFER_CTX *ctx;
@@ -432,6 +409,7 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_
432 break; 409 break;
433 } 410 }
434 } 411 }
412 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
435 break; 413 break;
436 case BIO_CTRL_DUP: 414 case BIO_CTRL_DUP:
437 dbio=(BIO *)ptr; 415 dbio=(BIO *)ptr;
@@ -449,10 +427,7 @@ malloc_error:
449 return(0); 427 return(0);
450 } 428 }
451 429
452static int buffer_gets(b,buf,size) 430static int buffer_gets(BIO *b, char *buf, int size)
453BIO *b;
454char *buf;
455int size;
456 { 431 {
457 BIO_F_BUFFER_CTX *ctx; 432 BIO_F_BUFFER_CTX *ctx;
458 int num=0,i,flag; 433 int num=0,i,flag;
@@ -503,9 +478,7 @@ int size;
503 } 478 }
504 } 479 }
505 480
506static int buffer_puts(b,str) 481static int buffer_puts(BIO *b, char *str)
507BIO *b;
508char *str;
509 { 482 {
510 return(BIO_write(b,str,strlen(str))); 483 return(BIO_write(b,str,strlen(str)));
511 } 484 }
diff --git a/src/lib/libcrypto/bio/bf_nbio.c b/src/lib/libcrypto/bio/bf_nbio.c
index 034b3024df..cbec2bae29 100644
--- a/src/lib/libcrypto/bio/bf_nbio.c
+++ b/src/lib/libcrypto/bio/bf_nbio.c
@@ -59,14 +59,13 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include "rand.h" 62#include <openssl/rand.h>
63#include "bio.h" 63#include <openssl/bio.h>
64#include "evp.h" 64#include <openssl/evp.h>
65 65
66/* BIO_put and BIO_get both add to the digest, 66/* BIO_put and BIO_get both add to the digest,
67 * BIO_gets returns the digest */ 67 * BIO_gets returns the digest */
68 68
69#ifndef NOPROTO
70static int nbiof_write(BIO *h,char *buf,int num); 69static int nbiof_write(BIO *h,char *buf,int num);
71static int nbiof_read(BIO *h,char *buf,int size); 70static int nbiof_read(BIO *h,char *buf,int size);
72static int nbiof_puts(BIO *h,char *str); 71static int nbiof_puts(BIO *h,char *str);
@@ -74,16 +73,6 @@ static int nbiof_gets(BIO *h,char *str,int size);
74static long nbiof_ctrl(BIO *h,int cmd,long arg1,char *arg2); 73static long nbiof_ctrl(BIO *h,int cmd,long arg1,char *arg2);
75static int nbiof_new(BIO *h); 74static int nbiof_new(BIO *h);
76static int nbiof_free(BIO *data); 75static int nbiof_free(BIO *data);
77#else
78static int nbiof_write();
79static int nbiof_read();
80static int nbiof_puts();
81static int nbiof_gets();
82static long nbiof_ctrl();
83static int nbiof_new();
84static int nbiof_free();
85#endif
86
87typedef struct nbio_test_st 76typedef struct nbio_test_st
88 { 77 {
89 /* only set if we sent a 'should retry' error */ 78 /* only set if we sent a 'should retry' error */
@@ -104,13 +93,12 @@ static BIO_METHOD methods_nbiof=
104 nbiof_free, 93 nbiof_free,
105 }; 94 };
106 95
107BIO_METHOD *BIO_f_nbio_test() 96BIO_METHOD *BIO_f_nbio_test(void)
108 { 97 {
109 return(&methods_nbiof); 98 return(&methods_nbiof);
110 } 99 }
111 100
112static int nbiof_new(bi) 101static int nbiof_new(BIO *bi)
113BIO *bi;
114 { 102 {
115 NBIO_TEST *nt; 103 NBIO_TEST *nt;
116 104
@@ -123,8 +111,7 @@ BIO *bi;
123 return(1); 111 return(1);
124 } 112 }
125 113
126static int nbiof_free(a) 114static int nbiof_free(BIO *a)
127BIO *a;
128 { 115 {
129 if (a == NULL) return(0); 116 if (a == NULL) return(0);
130 if (a->ptr != NULL) 117 if (a->ptr != NULL)
@@ -135,10 +122,7 @@ BIO *a;
135 return(1); 122 return(1);
136 } 123 }
137 124
138static int nbiof_read(b,out,outl) 125static int nbiof_read(BIO *b, char *out, int outl)
139BIO *b;
140char *out;
141int outl;
142 { 126 {
143 NBIO_TEST *nt; 127 NBIO_TEST *nt;
144 int ret=0; 128 int ret=0;
@@ -173,10 +157,7 @@ int outl;
173 return(ret); 157 return(ret);
174 } 158 }
175 159
176static int nbiof_write(b,in,inl) 160static int nbiof_write(BIO *b, char *in, int inl)
177BIO *b;
178char *in;
179int inl;
180 { 161 {
181 NBIO_TEST *nt; 162 NBIO_TEST *nt;
182 int ret=0; 163 int ret=0;
@@ -221,11 +202,7 @@ int inl;
221 return(ret); 202 return(ret);
222 } 203 }
223 204
224static long nbiof_ctrl(b,cmd,num,ptr) 205static long nbiof_ctrl(BIO *b, int cmd, long num, char *ptr)
225BIO *b;
226int cmd;
227long num;
228char *ptr;
229 { 206 {
230 long ret; 207 long ret;
231 208
@@ -247,19 +224,14 @@ char *ptr;
247 return(ret); 224 return(ret);
248 } 225 }
249 226
250static int nbiof_gets(bp,buf,size) 227static int nbiof_gets(BIO *bp, char *buf, int size)
251BIO *bp;
252char *buf;
253int size;
254 { 228 {
255 if (bp->next_bio == NULL) return(0); 229 if (bp->next_bio == NULL) return(0);
256 return(BIO_gets(bp->next_bio,buf,size)); 230 return(BIO_gets(bp->next_bio,buf,size));
257 } 231 }
258 232
259 233
260static int nbiof_puts(bp,str) 234static int nbiof_puts(BIO *bp, char *str)
261BIO *bp;
262char *str;
263 { 235 {
264 if (bp->next_bio == NULL) return(0); 236 if (bp->next_bio == NULL) return(0);
265 return(BIO_puts(bp->next_bio,str)); 237 return(BIO_puts(bp->next_bio,str));
diff --git a/src/lib/libcrypto/bio/bf_null.c b/src/lib/libcrypto/bio/bf_null.c
index a47a65741a..3254a55dce 100644
--- a/src/lib/libcrypto/bio/bf_null.c
+++ b/src/lib/libcrypto/bio/bf_null.c
@@ -59,13 +59,12 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include "bio.h" 62#include <openssl/bio.h>
63#include "evp.h" 63#include <openssl/evp.h>
64 64
65/* BIO_put and BIO_get both add to the digest, 65/* BIO_put and BIO_get both add to the digest,
66 * BIO_gets returns the digest */ 66 * BIO_gets returns the digest */
67 67
68#ifndef NOPROTO
69static int nullf_write(BIO *h,char *buf,int num); 68static int nullf_write(BIO *h,char *buf,int num);
70static int nullf_read(BIO *h,char *buf,int size); 69static int nullf_read(BIO *h,char *buf,int size);
71static int nullf_puts(BIO *h,char *str); 70static int nullf_puts(BIO *h,char *str);
@@ -73,16 +72,6 @@ static int nullf_gets(BIO *h,char *str,int size);
73static long nullf_ctrl(BIO *h,int cmd,long arg1,char *arg2); 72static long nullf_ctrl(BIO *h,int cmd,long arg1,char *arg2);
74static int nullf_new(BIO *h); 73static int nullf_new(BIO *h);
75static int nullf_free(BIO *data); 74static int nullf_free(BIO *data);
76#else
77static int nullf_write();
78static int nullf_read();
79static int nullf_puts();
80static int nullf_gets();
81static long nullf_ctrl();
82static int nullf_new();
83static int nullf_free();
84#endif
85
86static BIO_METHOD methods_nullf= 75static BIO_METHOD methods_nullf=
87 { 76 {
88 BIO_TYPE_NULL_FILTER, 77 BIO_TYPE_NULL_FILTER,
@@ -96,13 +85,12 @@ static BIO_METHOD methods_nullf=
96 nullf_free, 85 nullf_free,
97 }; 86 };
98 87
99BIO_METHOD *BIO_f_null() 88BIO_METHOD *BIO_f_null(void)
100 { 89 {
101 return(&methods_nullf); 90 return(&methods_nullf);
102 } 91 }
103 92
104static int nullf_new(bi) 93static int nullf_new(BIO *bi)
105BIO *bi;
106 { 94 {
107 bi->init=1; 95 bi->init=1;
108 bi->ptr=NULL; 96 bi->ptr=NULL;
@@ -110,8 +98,7 @@ BIO *bi;
110 return(1); 98 return(1);
111 } 99 }
112 100
113static int nullf_free(a) 101static int nullf_free(BIO *a)
114BIO *a;
115 { 102 {
116 if (a == NULL) return(0); 103 if (a == NULL) return(0);
117/* a->ptr=NULL; 104/* a->ptr=NULL;
@@ -120,10 +107,7 @@ BIO *a;
120 return(1); 107 return(1);
121 } 108 }
122 109
123static int nullf_read(b,out,outl) 110static int nullf_read(BIO *b, char *out, int outl)
124BIO *b;
125char *out;
126int outl;
127 { 111 {
128 int ret=0; 112 int ret=0;
129 113
@@ -135,10 +119,7 @@ int outl;
135 return(ret); 119 return(ret);
136 } 120 }
137 121
138static int nullf_write(b,in,inl) 122static int nullf_write(BIO *b, char *in, int inl)
139BIO *b;
140char *in;
141int inl;
142 { 123 {
143 int ret=0; 124 int ret=0;
144 125
@@ -150,11 +131,7 @@ int inl;
150 return(ret); 131 return(ret);
151 } 132 }
152 133
153static long nullf_ctrl(b,cmd,num,ptr) 134static long nullf_ctrl(BIO *b, int cmd, long num, char *ptr)
154BIO *b;
155int cmd;
156long num;
157char *ptr;
158 { 135 {
159 long ret; 136 long ret;
160 137
@@ -175,19 +152,14 @@ char *ptr;
175 return(ret); 152 return(ret);
176 } 153 }
177 154
178static int nullf_gets(bp,buf,size) 155static int nullf_gets(BIO *bp, char *buf, int size)
179BIO *bp;
180char *buf;
181int size;
182 { 156 {
183 if (bp->next_bio == NULL) return(0); 157 if (bp->next_bio == NULL) return(0);
184 return(BIO_gets(bp->next_bio,buf,size)); 158 return(BIO_gets(bp->next_bio,buf,size));
185 } 159 }
186 160
187 161
188static int nullf_puts(bp,str) 162static int nullf_puts(BIO *bp, char *str)
189BIO *bp;
190char *str;
191 { 163 {
192 if (bp->next_bio == NULL) return(0); 164 if (bp->next_bio == NULL) return(0);
193 return(BIO_puts(bp->next_bio,str)); 165 return(BIO_puts(bp->next_bio,str));
diff --git a/src/lib/libcrypto/bio/bio.err b/src/lib/libcrypto/bio/bio.err
deleted file mode 100644
index 6e2f2b63ca..0000000000
--- a/src/lib/libcrypto/bio/bio.err
+++ /dev/null
@@ -1,46 +0,0 @@
1/* Error codes for the BIO functions. */
2
3/* Function codes. */
4#define BIO_F_ACPT_STATE 100
5#define BIO_F_BIO_ACCEPT 101
6#define BIO_F_BIO_CTRL 102
7#define BIO_F_BIO_GETS 103
8#define BIO_F_BIO_GET_ACCEPT_SOCKET 104
9#define BIO_F_BIO_GET_HOST_IP 105
10#define BIO_F_BIO_GET_PORT 106
11#define BIO_F_BIO_NEW 107
12#define BIO_F_BIO_NEW_FILE 108
13#define BIO_F_BIO_PUTS 109
14#define BIO_F_BIO_READ 110
15#define BIO_F_BIO_SOCK_INIT 111
16#define BIO_F_BIO_WRITE 112
17#define BIO_F_BUFFER_CTRL 113
18#define BIO_F_CONN_STATE 114
19#define BIO_F_FILE_CTRL 115
20#define BIO_F_MEM_WRITE 116
21#define BIO_F_SSL_NEW 117
22#define BIO_F_WSASTARTUP 118
23
24/* Reason codes. */
25#define BIO_R_ACCEPT_ERROR 100
26#define BIO_R_BAD_FOPEN_MODE 101
27#define BIO_R_BAD_HOSTNAME_LOOKUP 102
28#define BIO_R_CONNECT_ERROR 103
29#define BIO_R_ERROR_SETTING_NBIO 104
30#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105
31#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106
32#define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107
33#define BIO_R_INVALID_IP_ADDRESS 108
34#define BIO_R_KEEPALIVE 109
35#define BIO_R_NBIO_CONNECT_ERROR 110
36#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111
37#define BIO_R_NO_HOSTHNAME_SPECIFIED 112
38#define BIO_R_NO_PORT_DEFINED 113
39#define BIO_R_NO_PORT_SPECIFIED 114
40#define BIO_R_NULL_PARAMETER 115
41#define BIO_R_UNABLE_TO_BIND_SOCKET 116
42#define BIO_R_UNABLE_TO_CREATE_SOCKET 117
43#define BIO_R_UNABLE_TO_LISTEN_SOCKET 118
44#define BIO_R_UNINITALISED 119
45#define BIO_R_UNSUPPORTED_METHOD 120
46#define BIO_R_WSASTARTUP 121
diff --git a/src/lib/libcrypto/bio/bio.h b/src/lib/libcrypto/bio/bio.h
index 300b330e00..54bf622a3b 100644
--- a/src/lib/libcrypto/bio/bio.h
+++ b/src/lib/libcrypto/bio/bio.h
@@ -63,7 +63,9 @@
63extern "C" { 63extern "C" {
64#endif 64#endif
65 65
66#include "crypto.h" 66#include <stdio.h>
67#include <stdlib.h>
68#include <openssl/crypto.h>
67 69
68/* These are the 'types' of BIOs */ 70/* These are the 'types' of BIOs */
69#define BIO_TYPE_NONE 0 71#define BIO_TYPE_NONE 0
@@ -84,6 +86,8 @@ extern "C" {
84#define BIO_TYPE_PROXY_SERVER (15|0x0200) /* server proxy BIO */ 86#define BIO_TYPE_PROXY_SERVER (15|0x0200) /* server proxy BIO */
85#define BIO_TYPE_NBIO_TEST (16|0x0200) /* server proxy BIO */ 87#define BIO_TYPE_NBIO_TEST (16|0x0200) /* server proxy BIO */
86#define BIO_TYPE_NULL_FILTER (17|0x0200) 88#define BIO_TYPE_NULL_FILTER (17|0x0200)
89#define BIO_TYPE_BER (18|0x0200) /* BER -> bin filter */
90#define BIO_TYPE_BIO (19|0x0400) /* (half a) BIO pair */
87 91
88#define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */ 92#define BIO_TYPE_DESCRIPTOR 0x0100 /* socket, fd, connect or accept */
89#define BIO_TYPE_FILTER 0x0200 93#define BIO_TYPE_FILTER 0x0200
@@ -202,7 +206,7 @@ extern "C" {
202typedef struct bio_method_st 206typedef struct bio_method_st
203 { 207 {
204 int type; 208 int type;
205 char *name; 209 const char *name;
206 int (*bwrite)(); 210 int (*bwrite)();
207 int (*bread)(); 211 int (*bread)();
208 int (*bputs)(); 212 int (*bputs)();
@@ -215,7 +219,7 @@ typedef struct bio_method_st
215typedef struct bio_method_st 219typedef struct bio_method_st
216 { 220 {
217 int type; 221 int type;
218 char *name; 222 const char *name;
219 int (_far *bwrite)(); 223 int (_far *bwrite)();
220 int (_far *bread)(); 224 int (_far *bread)();
221 int (_far *bputs)(); 225 int (_far *bputs)();
@@ -229,12 +233,8 @@ typedef struct bio_method_st
229typedef struct bio_st 233typedef struct bio_st
230 { 234 {
231 BIO_METHOD *method; 235 BIO_METHOD *method;
232#ifndef NOPROTO
233 /* bio, mode, argp, argi, argl, ret */ 236 /* bio, mode, argp, argi, argl, ret */
234 long (*callback)(struct bio_st *,int,char *,int, long,long); 237 long (*callback)(struct bio_st *,int,const char *,int, long,long);
235#else
236 long (*callback)();
237#endif
238 char *cb_arg; /* first argument for the callback */ 238 char *cb_arg; /* first argument for the callback */
239 239
240 int init; 240 int init;
@@ -242,7 +242,7 @@ typedef struct bio_st
242 int flags; /* extra storage */ 242 int flags; /* extra storage */
243 int retry_reason; 243 int retry_reason;
244 int num; 244 int num;
245 char *ptr; 245 void *ptr;
246 struct bio_st *next_bio; /* used by filter BIOs */ 246 struct bio_st *next_bio; /* used by filter BIOs */
247 struct bio_st *prev_bio; /* used by filter BIOs */ 247 struct bio_st *prev_bio; /* used by filter BIOs */
248 int references; 248 int references;
@@ -276,7 +276,7 @@ typedef struct bio_f_buffer_ctx_struct
276#define BIO_CONN_S_OK 6 276#define BIO_CONN_S_OK 6
277#define BIO_CONN_S_BLOCKED_CONNECT 7 277#define BIO_CONN_S_BLOCKED_CONNECT 7
278#define BIO_CONN_S_NBIO 8 278#define BIO_CONN_S_NBIO 8
279#define BIO_CONN_get_param_hostname BIO_ctrl 279/*#define BIO_CONN_get_param_hostname BIO_ctrl */
280 280
281#define BIO_number_read(b) ((b)->num_read) 281#define BIO_number_read(b) ((b)->num_read)
282#define BIO_number_written(b) ((b)->num_write) 282#define BIO_number_written(b) ((b)->num_write)
@@ -309,18 +309,28 @@ typedef struct bio_f_buffer_ctx_struct
309#define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 309#define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125
310#define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 310#define BIO_C_GET_SSL_NUM_RENEGOTIATES 126
311#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 311#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127
312#define BIO_C_FILE_SEEK 128
313#define BIO_C_GET_CIPHER_CTX 129
314#define BIO_C_SET_BUF_MEM_EOF_RETURN 130/*return end of input value*/
315#define BIO_C_SET_BIND_MODE 131
316#define BIO_C_GET_BIND_MODE 132
317#define BIO_C_FILE_TELL 133
318#define BIO_C_GET_SOCKS 134
319#define BIO_C_SET_SOCKS 135
320
321#define BIO_C_SET_WRITE_BUF_SIZE 136/* for BIO_s_bio */
322#define BIO_C_GET_WRITE_BUF_SIZE 137
323#define BIO_C_MAKE_BIO_PAIR 138
324#define BIO_C_DESTROY_BIO_PAIR 139
325#define BIO_C_GET_WRITE_GUARANTEE 140
326#define BIO_C_GET_READ_REQUEST 141
327#define BIO_C_SHUTDOWN_WR 142
328
312 329
313#define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,(char *)arg) 330#define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,(char *)arg)
314#define BIO_get_app_data(s) BIO_get_ex_data(s,0) 331#define BIO_get_app_data(s) BIO_get_ex_data(s,0)
315 332
316int BIO_get_ex_num(BIO *bio); 333/* BIO_s_connect() and BIO_s_socks4a_connect() */
317int BIO_set_ex_data(BIO *bio,int idx,char *data);
318char *BIO_get_ex_data(BIO *bio,int idx);
319void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)());
320int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
321 int (*dup_func)(), void (*free_func)());
322
323/* BIO_s_connect_socket() */
324#define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) 334#define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name)
325#define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) 335#define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port)
326#define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) 336#define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip)
@@ -328,7 +338,8 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
328#define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) 338#define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)
329#define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) 339#define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)
330#define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2) 340#define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2)
331#define BIO_get_conn_int port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port) 341#define BIO_get_conn_int_port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port)
342
332 343
333#define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) 344#define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)
334 345
@@ -339,6 +350,12 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
339#define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL) 350#define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL)
340#define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) 351#define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio)
341 352
353#define BIO_BIND_NORMAL 0
354#define BIO_BIND_REUSEADDR_IF_UNUSED 1
355#define BIO_BIND_REUSEADDR 2
356#define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL)
357#define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL)
358
342#define BIO_do_connect(b) BIO_do_handshake(b) 359#define BIO_do_connect(b) BIO_do_handshake(b)
343#define BIO_do_accept(b) BIO_do_handshake(b) 360#define BIO_do_accept(b) BIO_do_handshake(b)
344#define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL) 361#define BIO_do_handshake(b) BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL)
@@ -364,12 +381,26 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
364#define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) 381#define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp)
365#define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp) 382#define BIO_get_fp(b,fpp) BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp)
366 383
384#define BIO_seek(b,ofs) (int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL)
385#define BIO_tell(b) (int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL)
386
387/* name is cast to lose const, but might be better to route through a function
388 so we can do it safely */
389#ifdef CONST_STRICT
390/* If you are wondering why this isn't defined, its because CONST_STRICT is
391 * purely a compile-time kludge to allow const to be checked.
392 */
393int BIO_read_filename(BIO *b,const char *name);
394#else
367#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ 395#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
368 BIO_CLOSE|BIO_FP_READ,name) 396 BIO_CLOSE|BIO_FP_READ,(char *)name)
397#endif
369#define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ 398#define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
370 BIO_CLOSE|BIO_FP_WRITE,name) 399 BIO_CLOSE|BIO_FP_WRITE,name)
371#define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ 400#define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
372 BIO_CLOSE|BIO_FP_APPEND,name) 401 BIO_CLOSE|BIO_FP_APPEND,name)
402#define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
403 BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name)
373 404
374/* WARNING WARNING, this ups the reference count on the read bio of the 405/* WARNING WARNING, this ups the reference count on the read bio of the
375 * SSL structure. This is because the ssl read BIO is now pointed to by 406 * SSL structure. This is because the ssl read BIO is now pointed to by
@@ -388,8 +419,11 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
388/* defined in evp.h */ 419/* defined in evp.h */
389/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ 420/* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */
390 421
422#define BIO_get_mem_data(b,pp) BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
391#define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm) 423#define BIO_set_mem_buf(b,bm,c) BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm)
392#define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp) 424#define BIO_get_mem_ptr(b,pp) BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp)
425#define BIO_set_mem_eof_return(b,v) \
426 BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL)
393 427
394/* For the BIO_f_buffer() type */ 428/* For the BIO_f_buffer() type */
395#define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) 429#define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL)
@@ -407,6 +441,9 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
407#define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL) 441#define BIO_get_close(b) (int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL)
408#define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) 442#define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL)
409#define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) 443#define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL)
444/* ...pending macros have inappropriate return type */
445size_t BIO_ctrl_pending(BIO *b);
446size_t BIO_ctrl_wpending(BIO *b);
410#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) 447#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL)
411#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp) 448#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp)
412#define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb) 449#define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb)
@@ -414,11 +451,32 @@ int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
414/* For the BIO_f_buffer() type */ 451/* For the BIO_f_buffer() type */
415#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) 452#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL)
416 453
454/* For BIO_s_bio() */
455#define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL)
456#define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL)
457#define BIO_make_bio_pair(b1,b2) (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2)
458#define BIO_destroy_bio_pair(b) (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL)
459/* macros with inappropriate type -- but ...pending macros use int too: */
460#define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL)
461#define BIO_get_read_request(b) (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL)
462size_t BIO_ctrl_get_write_guarantee(BIO *b);
463size_t BIO_ctrl_get_read_request(BIO *b);
464
465
466
417#ifdef NO_STDIO 467#ifdef NO_STDIO
418#define NO_FP_API 468#define NO_FP_API
419#endif 469#endif
420 470
421#ifndef NOPROTO 471
472/* These two aren't currently implemented */
473/* int BIO_get_ex_num(BIO *bio); */
474/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */
475int BIO_set_ex_data(BIO *bio,int idx,char *data);
476char *BIO_get_ex_data(BIO *bio,int idx);
477int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
478 int (*dup_func)(), void (*free_func)());
479
422# if defined(WIN16) && defined(_WINDLL) 480# if defined(WIN16) && defined(_WINDLL)
423BIO_METHOD *BIO_s_file_internal(void); 481BIO_METHOD *BIO_s_file_internal(void);
424BIO *BIO_new_file_internal(char *filename, char *mode); 482BIO *BIO_new_file_internal(char *filename, char *mode);
@@ -428,39 +486,20 @@ BIO *BIO_new_fp_internal(FILE *stream, int close_flag);
428# define BIO_new_fp BIO_new_fp_internal 486# define BIO_new_fp BIO_new_fp_internal
429# else /* FP_API */ 487# else /* FP_API */
430BIO_METHOD *BIO_s_file(void ); 488BIO_METHOD *BIO_s_file(void );
431BIO *BIO_new_file(char *filename, char *mode); 489BIO *BIO_new_file(const char *filename, const char *mode);
432BIO *BIO_new_fp(FILE *stream, int close_flag); 490BIO *BIO_new_fp(FILE *stream, int close_flag);
433# define BIO_s_file_internal BIO_s_file 491# define BIO_s_file_internal BIO_s_file
434# define BIO_new_file_internal BIO_new_file 492# define BIO_new_file_internal BIO_new_file
435# define BIO_new_fp_internal BIO_s_file 493# define BIO_new_fp_internal BIO_s_file
436# endif /* FP_API */ 494# endif /* FP_API */
437#else
438# if defined(WIN16) && defined(_WINDLL)
439BIO_METHOD *BIO_s_file_internal();
440BIO *BIO_new_file_internal();
441BIO *BIO_new_fp_internal();
442# define BIO_s_file BIO_s_file_internal
443# define BIO_new_file BIO_new_file_internal
444# define BIO_new_fp BIO_new_fp_internal
445# else /* FP_API */
446BIO_METHOD *BIO_s_file();
447BIO *BIO_new_file();
448BIO *BIO_new_fp();
449# define BIO_s_file_internal BIO_s_file
450# define BIO_new_file_internal BIO_new_file
451# define BIO_new_fp_internal BIO_s_file
452# endif /* FP_API */
453#endif
454
455#ifndef NOPROTO
456BIO * BIO_new(BIO_METHOD *type); 495BIO * BIO_new(BIO_METHOD *type);
457int BIO_set(BIO *a,BIO_METHOD *type); 496int BIO_set(BIO *a,BIO_METHOD *type);
458int BIO_free(BIO *a); 497int BIO_free(BIO *a);
459int BIO_read(BIO *b, char *data, int len); 498int BIO_read(BIO *b, void *data, int len);
460int BIO_gets(BIO *bp,char *buf, int size); 499int BIO_gets(BIO *bp,char *buf, int size);
461int BIO_write(BIO *b, char *data, int len); 500int BIO_write(BIO *b, const char *data, int len);
462int BIO_puts(BIO *bp,char *buf); 501int BIO_puts(BIO *bp,const char *buf);
463long BIO_ctrl(BIO *bp,int cmd,long larg,char *parg); 502long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
464char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); 503char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg);
465long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); 504long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg);
466BIO * BIO_push(BIO *b,BIO *append); 505BIO * BIO_push(BIO *b,BIO *append);
@@ -472,10 +511,10 @@ int BIO_get_retry_reason(BIO *bio);
472BIO * BIO_dup_chain(BIO *in); 511BIO * BIO_dup_chain(BIO *in);
473 512
474#ifndef WIN16 513#ifndef WIN16
475long BIO_debug_callback(BIO *bio,int cmd,char *argp,int argi, 514long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi,
476 long argl,long ret); 515 long argl,long ret);
477#else 516#else
478long _far _loadds BIO_debug_callback(BIO *bio,int cmd,char *argp,int argi, 517long _far _loadds BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi,
479 long argl,long ret); 518 long argl,long ret);
480#endif 519#endif
481 520
@@ -484,23 +523,35 @@ BIO_METHOD *BIO_s_socket(void);
484BIO_METHOD *BIO_s_connect(void); 523BIO_METHOD *BIO_s_connect(void);
485BIO_METHOD *BIO_s_accept(void); 524BIO_METHOD *BIO_s_accept(void);
486BIO_METHOD *BIO_s_fd(void); 525BIO_METHOD *BIO_s_fd(void);
526BIO_METHOD *BIO_s_log(void);
527BIO_METHOD *BIO_s_bio(void);
487BIO_METHOD *BIO_s_null(void); 528BIO_METHOD *BIO_s_null(void);
488BIO_METHOD *BIO_f_null(void); 529BIO_METHOD *BIO_f_null(void);
489BIO_METHOD *BIO_f_nbio_test(void);
490BIO_METHOD *BIO_f_buffer(void); 530BIO_METHOD *BIO_f_buffer(void);
531BIO_METHOD *BIO_f_nbio_test(void);
532/* BIO_METHOD *BIO_f_ber(void); */
491 533
492int BIO_sock_should_retry(int i); 534int BIO_sock_should_retry(int i);
493int BIO_sock_non_fatal_error(int error); 535int BIO_sock_non_fatal_error(int error);
494int BIO_fd_should_retry(int i); 536int BIO_fd_should_retry(int i);
495int BIO_fd_non_fatal_error(int error); 537int BIO_fd_non_fatal_error(int error);
496int BIO_dump(BIO *b,char *bytes,int len); 538int BIO_dump(BIO *b,const char *bytes,int len);
497 539
498struct hostent *BIO_gethostbyname(char *name); 540struct hostent *BIO_gethostbyname(const char *name);
541/* We might want a thread-safe interface too:
542 * struct hostent *BIO_gethostbyname_r(const char *name,
543 * struct hostent *result, void *buffer, size_t buflen);
544 * or something similar (caller allocates a struct hostent,
545 * pointed to by "result", and additional buffer space for the various
546 * substructures; if the buffer does not suffice, NULL is returned
547 * and an appropriate error code is set).
548 */
499int BIO_sock_error(int sock); 549int BIO_sock_error(int sock);
500int BIO_socket_ioctl(int fd, long type, unsigned long *arg); 550int BIO_socket_ioctl(int fd, long type, unsigned long *arg);
501int BIO_get_port(char *str, short *port_ptr); 551int BIO_socket_nbio(int fd,int mode);
502int BIO_get_host_ip(char *str, unsigned char *ip); 552int BIO_get_port(const char *str, unsigned short *port_ptr);
503int BIO_get_accept_socket(char *host_port); 553int BIO_get_host_ip(const char *str, unsigned char *ip);
554int BIO_get_accept_socket(char *host_port,int mode);
504int BIO_accept(int sock,char **ip_port); 555int BIO_accept(int sock,char **ip_port);
505int BIO_sock_init(void ); 556int BIO_sock_init(void );
506void BIO_sock_cleanup(void); 557void BIO_sock_cleanup(void);
@@ -513,174 +564,78 @@ BIO *BIO_new_fd(int fd, int close_flag);
513BIO *BIO_new_connect(char *host_port); 564BIO *BIO_new_connect(char *host_port);
514BIO *BIO_new_accept(char *host_port); 565BIO *BIO_new_accept(char *host_port);
515 566
567int BIO_new_bio_pair(BIO **bio1, size_t writebuf1,
568 BIO **bio2, size_t writebuf2);
569/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints.
570 * Otherwise returns 0 and sets *bio1 and *bio2 to NULL.
571 * Size 0 uses default value.
572 */
573
516void BIO_copy_next_retry(BIO *b); 574void BIO_copy_next_retry(BIO *b);
517 575
518long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); 576long BIO_ghbn_ctrl(int cmd,int iarg,char *parg);
519 577
520#else 578int BIO_printf(BIO *bio, ...);
521
522BIO * BIO_new();
523int BIO_set();
524int BIO_free();
525int BIO_read();
526int BIO_gets();
527int BIO_write();
528int BIO_puts();
529char * BIO_ptr_ctrl();
530long BIO_ctrl();
531long BIO_int_ctrl();
532BIO * BIO_push();
533BIO * BIO_pop();
534void BIO_free_all();
535BIO * BIO_find_type();
536BIO * BIO_get_retry_BIO();
537int BIO_get_retry_reason();
538BIO * BIO_dup_chain();
539
540#ifndef WIN16
541long BIO_debug_callback();
542#else
543long _far _loadds BIO_debug_callback();
544#endif
545
546BIO_METHOD *BIO_s_mem();
547BIO_METHOD *BIO_s_socket();
548BIO_METHOD *BIO_s_connect();
549BIO_METHOD *BIO_s_accept();
550BIO_METHOD *BIO_s_fd();
551BIO_METHOD *BIO_s_null();
552BIO_METHOD *BIO_f_null();
553BIO_METHOD *BIO_f_buffer();
554BIO_METHOD *BIO_f_nbio_test();
555
556int BIO_sock_should_retry();
557int BIO_sock_non_fatal_error();
558int BIO_fd_should_retry();
559int BIO_fd_non_fatal_error();
560int BIO_dump();
561
562struct hostent *BIO_gethostbyname();
563int BIO_sock_error();
564int BIO_socket_ioctl();
565int BIO_get_port();
566int BIO_get_host_ip();
567int BIO_get_accept_socket();
568int BIO_accept();
569int BIO_sock_init();
570void BIO_sock_cleanup();
571int BIO_set_tcp_ndelay();
572
573void ERR_load_BIO_strings();
574
575BIO *BIO_new_socket();
576BIO *BIO_new_fd();
577BIO *BIO_new_connect();
578BIO *BIO_new_accept();
579
580void BIO_copy_next_retry();
581
582int BIO_ghbn_ctrl();
583
584#endif
585
586/* Tim Hudson's portable varargs stuff */
587
588#ifndef NOPROTO
589#define VAR_ANSI /* select ANSI version by default */
590#endif
591
592#ifdef VAR_ANSI
593/* ANSI version of a "portable" macro set for variable length args */
594#ifndef __STDARG_H__ /**/
595#include <stdarg.h>
596#endif /**/
597
598#define VAR_PLIST(arg1type,arg1) arg1type arg1, ...
599#define VAR_PLIST2(arg1type,arg1,arg2type,arg2) arg1type arg1,arg2type arg2,...
600#define VAR_ALIST
601#define VAR_BDEFN(args,arg1type,arg1) va_list args
602#define VAR_BDEFN2(args,arg1type,arg1,arg2type,arg2) va_list args
603#define VAR_INIT(args,arg1type,arg1) va_start(args,arg1);
604#define VAR_INIT2(args,arg1type,arg1,arg2type,arg2) va_start(args,arg2);
605#define VAR_ARG(args,type,arg) arg=va_arg(args,type)
606#define VAR_END(args) va_end(args);
607
608#else
609
610/* K&R version of a "portable" macro set for variable length args */
611#ifndef __VARARGS_H__
612#include <varargs.h>
613#endif
614
615#define VAR_PLIST(arg1type,arg1) va_alist
616#define VAR_PLIST2(arg1type,arg1,arg2type,arg2) va_alist
617#define VAR_ALIST va_dcl
618#define VAR_BDEFN(args,arg1type,arg1) va_list args; arg1type arg1
619#define VAR_BDEFN2(args,arg1type,arg1,arg2type,arg2) va_list args; \
620 arg1type arg1; arg2type arg2
621#define VAR_INIT(args,arg1type,arg1) va_start(args); \
622 arg1=va_arg(args,arg1type);
623#define VAR_INIT2(args,arg1type,arg1,arg2type,arg2) va_start(args); \
624 arg1=va_arg(args,arg1type); arg2=va_arg(args,arg2type);
625#define VAR_ARG(args,type,arg) arg=va_arg(args,type)
626#define VAR_END(args) va_end(args);
627
628#endif
629
630#ifndef NOPROTO
631int BIO_printf( VAR_PLIST( BIO *, bio ) );
632#else
633int BIO_printf();
634#endif
635 579
636/* BEGIN ERROR CODES */ 580/* BEGIN ERROR CODES */
581/* The following lines are auto generated by the script mkerr.pl. Any changes
582 * made after this point may be overwritten when the script is next run.
583 */
584
637/* Error codes for the BIO functions. */ 585/* Error codes for the BIO functions. */
638 586
639/* Function codes. */ 587/* Function codes. */
640#define BIO_F_ACPT_STATE 100 588#define BIO_F_ACPT_STATE 100
641#define BIO_F_BIO_ACCEPT 101 589#define BIO_F_BIO_ACCEPT 101
642#define BIO_F_BIO_CTRL 102 590#define BIO_F_BIO_BER_GET_HEADER 102
643#define BIO_F_BIO_GETS 103 591#define BIO_F_BIO_CTRL 103
644#define BIO_F_BIO_GET_ACCEPT_SOCKET 104 592#define BIO_F_BIO_GETHOSTBYNAME 120
645#define BIO_F_BIO_GET_HOST_IP 105 593#define BIO_F_BIO_GETS 104
646#define BIO_F_BIO_GET_PORT 106 594#define BIO_F_BIO_GET_ACCEPT_SOCKET 105
647#define BIO_F_BIO_NEW 107 595#define BIO_F_BIO_GET_HOST_IP 106
648#define BIO_F_BIO_NEW_FILE 108 596#define BIO_F_BIO_GET_PORT 107
649#define BIO_F_BIO_PUTS 109 597#define BIO_F_BIO_MAKE_PAIR 121
650#define BIO_F_BIO_READ 110 598#define BIO_F_BIO_NEW 108
651#define BIO_F_BIO_SOCK_INIT 111 599#define BIO_F_BIO_NEW_FILE 109
652#define BIO_F_BIO_WRITE 112 600#define BIO_F_BIO_PUTS 110
653#define BIO_F_BUFFER_CTRL 113 601#define BIO_F_BIO_READ 111
654#define BIO_F_CONN_STATE 114 602#define BIO_F_BIO_SOCK_INIT 112
655#define BIO_F_FILE_CTRL 115 603#define BIO_F_BIO_WRITE 113
656#define BIO_F_MEM_WRITE 116 604#define BIO_F_BUFFER_CTRL 114
657#define BIO_F_SSL_NEW 117 605#define BIO_F_CONN_STATE 115
658#define BIO_F_WSASTARTUP 118 606#define BIO_F_FILE_CTRL 116
607#define BIO_F_MEM_WRITE 117
608#define BIO_F_SSL_NEW 118
609#define BIO_F_WSASTARTUP 119
659 610
660/* Reason codes. */ 611/* Reason codes. */
661#define BIO_R_ACCEPT_ERROR 100 612#define BIO_R_ACCEPT_ERROR 100
662#define BIO_R_BAD_FOPEN_MODE 101 613#define BIO_R_BAD_FOPEN_MODE 101
663#define BIO_R_BAD_HOSTNAME_LOOKUP 102 614#define BIO_R_BAD_HOSTNAME_LOOKUP 102
615#define BIO_R_BROKEN_PIPE 124
664#define BIO_R_CONNECT_ERROR 103 616#define BIO_R_CONNECT_ERROR 103
665#define BIO_R_ERROR_SETTING_NBIO 104 617#define BIO_R_ERROR_SETTING_NBIO 104
666#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105 618#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET 105
667#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 619#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106
668#define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 620#define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107
621#define BIO_R_INVALID_ARGUMENT 125
669#define BIO_R_INVALID_IP_ADDRESS 108 622#define BIO_R_INVALID_IP_ADDRESS 108
623#define BIO_R_IN_USE 123
670#define BIO_R_KEEPALIVE 109 624#define BIO_R_KEEPALIVE 109
671#define BIO_R_NBIO_CONNECT_ERROR 110 625#define BIO_R_NBIO_CONNECT_ERROR 110
672#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 626#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111
673#define BIO_R_NO_HOSTHNAME_SPECIFIED 112 627#define BIO_R_NO_HOSTNAME_SPECIFIED 112
674#define BIO_R_NO_PORT_DEFINED 113 628#define BIO_R_NO_PORT_DEFINED 113
675#define BIO_R_NO_PORT_SPECIFIED 114 629#define BIO_R_NO_PORT_SPECIFIED 114
676#define BIO_R_NULL_PARAMETER 115 630#define BIO_R_NULL_PARAMETER 115
677#define BIO_R_UNABLE_TO_BIND_SOCKET 116 631#define BIO_R_TAG_MISMATCH 116
678#define BIO_R_UNABLE_TO_CREATE_SOCKET 117 632#define BIO_R_UNABLE_TO_BIND_SOCKET 117
679#define BIO_R_UNABLE_TO_LISTEN_SOCKET 118 633#define BIO_R_UNABLE_TO_CREATE_SOCKET 118
680#define BIO_R_UNINITALISED 119 634#define BIO_R_UNABLE_TO_LISTEN_SOCKET 119
681#define BIO_R_UNSUPPORTED_METHOD 120 635#define BIO_R_UNINITIALIZED 120
682#define BIO_R_WSASTARTUP 121 636#define BIO_R_UNSUPPORTED_METHOD 121
683 637#define BIO_R_WSASTARTUP 122
638
684#ifdef __cplusplus 639#ifdef __cplusplus
685} 640}
686#endif 641#endif
diff --git a/src/lib/libcrypto/bio/bio_cb.c b/src/lib/libcrypto/bio/bio_cb.c
index bc6ed9eda1..37c7c22666 100644
--- a/src/lib/libcrypto/bio/bio_cb.c
+++ b/src/lib/libcrypto/bio/bio_cb.c
@@ -60,16 +60,11 @@
60#include <string.h> 60#include <string.h>
61#include <stdlib.h> 61#include <stdlib.h>
62#include "cryptlib.h" 62#include "cryptlib.h"
63#include "bio.h" 63#include <openssl/bio.h>
64#include "err.h" 64#include <openssl/err.h>
65 65
66long MS_CALLBACK BIO_debug_callback(bio,cmd,argp,argi,argl,ret) 66long MS_CALLBACK BIO_debug_callback(BIO *bio, int cmd, const char *argp,
67BIO *bio; 67 int argi, long argl, long ret)
68int cmd;
69char *argp;
70int argi;
71long argl;
72long ret;
73 { 68 {
74 BIO *b; 69 BIO *b;
75 MS_STATIC char buf[256]; 70 MS_STATIC char buf[256];
diff --git a/src/lib/libcrypto/bio/bio_err.c b/src/lib/libcrypto/bio/bio_err.c
index 37e14ca107..712d98a3a1 100644
--- a/src/lib/libcrypto/bio/bio_err.c
+++ b/src/lib/libcrypto/bio/bio_err.c
@@ -1,63 +1,65 @@
1/* lib/bio/bio_err.c */ 1/* crypto/bio/bio_err.c */
2/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) 2/* ====================================================================
3 * All rights reserved. 3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
4 * 4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
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 (tjh@cryptsoft.com).
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 5 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
25 * are met: 7 * are met:
26 * 1. Redistributions of source code must retain the copyright 8 *
27 * notice, this list of conditions and the following disclaimer. 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
28 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in
30 * documentation and/or other materials provided with the distribution. 14 * the documentation and/or other materials provided with the
31 * 3. All advertising materials mentioning features or use of this software 15 * distribution.
32 * must display the following acknowledgement: 16 *
33 * "This product includes cryptographic software written by 17 * 3. All advertising materials mentioning features or use of this
34 * Eric Young (eay@cryptsoft.com)" 18 * software must display the following acknowledgment:
35 * The word 'cryptographic' can be left out if the rouines from the library 19 * "This product includes software developed by the OpenSSL Project
36 * being used are not cryptographic related :-). 20 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
37 * 4. If you include any Windows specific code (or a derivative thereof) from 21 *
38 * the apps directory (application code) you must include an acknowledgement: 22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 23 * endorse or promote products derived from this software without
40 * 24 * prior written permission. For written permission, please contact
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 25 * openssl-core@OpenSSL.org.
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 *
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * 5. Products derived from this software may not be called "OpenSSL"
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 28 * nor may "OpenSSL" appear in their names without prior written
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * permission of the OpenSSL Project.
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 *
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * 6. Redistributions of any form whatsoever must retain the following
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * acknowledgment:
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * "This product includes software developed by the OpenSSL Project
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
51 * SUCH DAMAGE. 35 *
52 * 36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
53 * The licence and distribution terms for any publically available version or 37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
55 * copied and put under another distribution licence 39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
56 * [including the GNU Public Licence.] 40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 * OF THE POSSIBILITY OF SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This product includes cryptographic software written by Eric Young
51 * (eay@cryptsoft.com). This product includes software written by Tim
52 * Hudson (tjh@cryptsoft.com).
53 *
57 */ 54 */
55
56/* NOTE: this file was auto generated by the mkerr.pl script: any changes
57 * made to it will be overwritten when the script next updates this file.
58 */
59
58#include <stdio.h> 60#include <stdio.h>
59#include "err.h" 61#include <openssl/err.h>
60#include "bio.h" 62#include <openssl/bio.h>
61 63
62/* BEGIN ERROR CODES */ 64/* BEGIN ERROR CODES */
63#ifndef NO_ERR 65#ifndef NO_ERR
@@ -65,11 +67,14 @@ static ERR_STRING_DATA BIO_str_functs[]=
65 { 67 {
66{ERR_PACK(0,BIO_F_ACPT_STATE,0), "ACPT_STATE"}, 68{ERR_PACK(0,BIO_F_ACPT_STATE,0), "ACPT_STATE"},
67{ERR_PACK(0,BIO_F_BIO_ACCEPT,0), "BIO_accept"}, 69{ERR_PACK(0,BIO_F_BIO_ACCEPT,0), "BIO_accept"},
70{ERR_PACK(0,BIO_F_BIO_BER_GET_HEADER,0), "BIO_BER_GET_HEADER"},
68{ERR_PACK(0,BIO_F_BIO_CTRL,0), "BIO_ctrl"}, 71{ERR_PACK(0,BIO_F_BIO_CTRL,0), "BIO_ctrl"},
72{ERR_PACK(0,BIO_F_BIO_GETHOSTBYNAME,0), "BIO_gethostbyname"},
69{ERR_PACK(0,BIO_F_BIO_GETS,0), "BIO_gets"}, 73{ERR_PACK(0,BIO_F_BIO_GETS,0), "BIO_gets"},
70{ERR_PACK(0,BIO_F_BIO_GET_ACCEPT_SOCKET,0), "BIO_get_accept_socket"}, 74{ERR_PACK(0,BIO_F_BIO_GET_ACCEPT_SOCKET,0), "BIO_get_accept_socket"},
71{ERR_PACK(0,BIO_F_BIO_GET_HOST_IP,0), "BIO_get_host_ip"}, 75{ERR_PACK(0,BIO_F_BIO_GET_HOST_IP,0), "BIO_get_host_ip"},
72{ERR_PACK(0,BIO_F_BIO_GET_PORT,0), "BIO_get_port"}, 76{ERR_PACK(0,BIO_F_BIO_GET_PORT,0), "BIO_get_port"},
77{ERR_PACK(0,BIO_F_BIO_MAKE_PAIR,0), "BIO_MAKE_PAIR"},
73{ERR_PACK(0,BIO_F_BIO_NEW,0), "BIO_new"}, 78{ERR_PACK(0,BIO_F_BIO_NEW,0), "BIO_new"},
74{ERR_PACK(0,BIO_F_BIO_NEW_FILE,0), "BIO_new_file"}, 79{ERR_PACK(0,BIO_F_BIO_NEW_FILE,0), "BIO_new_file"},
75{ERR_PACK(0,BIO_F_BIO_PUTS,0), "BIO_puts"}, 80{ERR_PACK(0,BIO_F_BIO_PUTS,0), "BIO_puts"},
@@ -80,9 +85,9 @@ static ERR_STRING_DATA BIO_str_functs[]=
80{ERR_PACK(0,BIO_F_CONN_STATE,0), "CONN_STATE"}, 85{ERR_PACK(0,BIO_F_CONN_STATE,0), "CONN_STATE"},
81{ERR_PACK(0,BIO_F_FILE_CTRL,0), "FILE_CTRL"}, 86{ERR_PACK(0,BIO_F_FILE_CTRL,0), "FILE_CTRL"},
82{ERR_PACK(0,BIO_F_MEM_WRITE,0), "MEM_WRITE"}, 87{ERR_PACK(0,BIO_F_MEM_WRITE,0), "MEM_WRITE"},
83{ERR_PACK(0,BIO_F_SSL_NEW,0), "SSL_NEW"}, 88{ERR_PACK(0,BIO_F_SSL_NEW,0), "SSL_new"},
84{ERR_PACK(0,BIO_F_WSASTARTUP,0), "WSASTARTUP"}, 89{ERR_PACK(0,BIO_F_WSASTARTUP,0), "WSASTARTUP"},
85{0,NULL}, 90{0,NULL}
86 }; 91 };
87 92
88static ERR_STRING_DATA BIO_str_reasons[]= 93static ERR_STRING_DATA BIO_str_reasons[]=
@@ -90,36 +95,40 @@ static ERR_STRING_DATA BIO_str_reasons[]=
90{BIO_R_ACCEPT_ERROR ,"accept error"}, 95{BIO_R_ACCEPT_ERROR ,"accept error"},
91{BIO_R_BAD_FOPEN_MODE ,"bad fopen mode"}, 96{BIO_R_BAD_FOPEN_MODE ,"bad fopen mode"},
92{BIO_R_BAD_HOSTNAME_LOOKUP ,"bad hostname lookup"}, 97{BIO_R_BAD_HOSTNAME_LOOKUP ,"bad hostname lookup"},
98{BIO_R_BROKEN_PIPE ,"broken pipe"},
93{BIO_R_CONNECT_ERROR ,"connect error"}, 99{BIO_R_CONNECT_ERROR ,"connect error"},
94{BIO_R_ERROR_SETTING_NBIO ,"error setting nbio"}, 100{BIO_R_ERROR_SETTING_NBIO ,"error setting nbio"},
95{BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET,"error setting nbio on accepted socket"}, 101{BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET,"error setting nbio on accepted socket"},
96{BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET,"error setting nbio on accept socket"}, 102{BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET,"error setting nbio on accept socket"},
97{BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET ,"gethostbyname addr is not af inet"}, 103{BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET ,"gethostbyname addr is not af inet"},
104{BIO_R_INVALID_ARGUMENT ,"invalid argument"},
98{BIO_R_INVALID_IP_ADDRESS ,"invalid ip address"}, 105{BIO_R_INVALID_IP_ADDRESS ,"invalid ip address"},
106{BIO_R_IN_USE ,"in use"},
99{BIO_R_KEEPALIVE ,"keepalive"}, 107{BIO_R_KEEPALIVE ,"keepalive"},
100{BIO_R_NBIO_CONNECT_ERROR ,"nbio connect error"}, 108{BIO_R_NBIO_CONNECT_ERROR ,"nbio connect error"},
101{BIO_R_NO_ACCEPT_PORT_SPECIFIED ,"no accept port specified"}, 109{BIO_R_NO_ACCEPT_PORT_SPECIFIED ,"no accept port specified"},
102{BIO_R_NO_HOSTHNAME_SPECIFIED ,"no hosthname specified"}, 110{BIO_R_NO_HOSTNAME_SPECIFIED ,"no hostname specified"},
103{BIO_R_NO_PORT_DEFINED ,"no port defined"}, 111{BIO_R_NO_PORT_DEFINED ,"no port defined"},
104{BIO_R_NO_PORT_SPECIFIED ,"no port specified"}, 112{BIO_R_NO_PORT_SPECIFIED ,"no port specified"},
105{BIO_R_NULL_PARAMETER ,"null parameter"}, 113{BIO_R_NULL_PARAMETER ,"null parameter"},
114{BIO_R_TAG_MISMATCH ,"tag mismatch"},
106{BIO_R_UNABLE_TO_BIND_SOCKET ,"unable to bind socket"}, 115{BIO_R_UNABLE_TO_BIND_SOCKET ,"unable to bind socket"},
107{BIO_R_UNABLE_TO_CREATE_SOCKET ,"unable to create socket"}, 116{BIO_R_UNABLE_TO_CREATE_SOCKET ,"unable to create socket"},
108{BIO_R_UNABLE_TO_LISTEN_SOCKET ,"unable to listen socket"}, 117{BIO_R_UNABLE_TO_LISTEN_SOCKET ,"unable to listen socket"},
109{BIO_R_UNINITALISED ,"uninitalised"}, 118{BIO_R_UNINITIALIZED ,"uninitialized"},
110{BIO_R_UNSUPPORTED_METHOD ,"unsupported method"}, 119{BIO_R_UNSUPPORTED_METHOD ,"unsupported method"},
111{BIO_R_WSASTARTUP ,"wsastartup"}, 120{BIO_R_WSASTARTUP ,"wsastartup"},
112{0,NULL}, 121{0,NULL}
113 }; 122 };
114 123
115#endif 124#endif
116 125
117void ERR_load_BIO_strings() 126void ERR_load_BIO_strings(void)
118 { 127 {
119 static int init=1; 128 static int init=1;
120 129
121 if (init); 130 if (init)
122 {; 131 {
123 init=0; 132 init=0;
124#ifndef NO_ERR 133#ifndef NO_ERR
125 ERR_load_strings(ERR_LIB_BIO,BIO_str_functs); 134 ERR_load_strings(ERR_LIB_BIO,BIO_str_functs);
diff --git a/src/lib/libcrypto/bio/bio_lib.c b/src/lib/libcrypto/bio/bio_lib.c
index 7a66b0892e..b72688ea90 100644
--- a/src/lib/libcrypto/bio/bio_lib.c
+++ b/src/lib/libcrypto/bio/bio_lib.c
@@ -58,16 +58,15 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#include "crypto.h" 61#include <openssl/crypto.h>
62#include "cryptlib.h" 62#include "cryptlib.h"
63#include "bio.h" 63#include <openssl/bio.h>
64#include "stack.h" 64#include <openssl/stack.h>
65 65
66static STACK *bio_meth=NULL; 66static STACK *bio_meth=NULL;
67static int bio_meth_num=0; 67static int bio_meth_num=0;
68 68
69BIO *BIO_new(method) 69BIO *BIO_new(BIO_METHOD *method)
70BIO_METHOD *method;
71 { 70 {
72 BIO *ret=NULL; 71 BIO *ret=NULL;
73 72
@@ -85,9 +84,7 @@ BIO_METHOD *method;
85 return(ret); 84 return(ret);
86 } 85 }
87 86
88int BIO_set(bio,method) 87int BIO_set(BIO *bio, BIO_METHOD *method)
89BIO *bio;
90BIO_METHOD *method;
91 { 88 {
92 bio->method=method; 89 bio->method=method;
93 bio->callback=NULL; 90 bio->callback=NULL;
@@ -110,8 +107,7 @@ BIO_METHOD *method;
110 return(1); 107 return(1);
111 } 108 }
112 109
113int BIO_free(a) 110int BIO_free(BIO *a)
114BIO *a;
115 { 111 {
116 int ret=0,i; 112 int ret=0,i;
117 113
@@ -121,7 +117,7 @@ BIO *a;
121#ifdef REF_PRINT 117#ifdef REF_PRINT
122 REF_PRINT("BIO",a); 118 REF_PRINT("BIO",a);
123#endif 119#endif
124 if (i > 0) return(1); 120 if (i > 0) return(1);
125#ifdef REF_CHECK 121#ifdef REF_CHECK
126 if (i < 0) 122 if (i < 0)
127 { 123 {
@@ -141,10 +137,7 @@ BIO *a;
141 return(1); 137 return(1);
142 } 138 }
143 139
144int BIO_read(b,out,outl) 140int BIO_read(BIO *b, void *out, int outl)
145BIO *b;
146char *out;
147int outl;
148 { 141 {
149 int i; 142 int i;
150 long (*cb)(); 143 long (*cb)();
@@ -162,11 +155,12 @@ int outl;
162 155
163 if (!b->init) 156 if (!b->init)
164 { 157 {
165 BIOerr(BIO_F_BIO_READ,BIO_R_UNINITALISED); 158 BIOerr(BIO_F_BIO_READ,BIO_R_UNINITIALIZED);
166 return(-2); 159 return(-2);
167 } 160 }
168 161
169 i=b->method->bread(b,out,outl); 162 i=b->method->bread(b,out,outl);
163
170 if (i > 0) b->num_read+=(unsigned long)i; 164 if (i > 0) b->num_read+=(unsigned long)i;
171 165
172 if (cb != NULL) 166 if (cb != NULL)
@@ -175,10 +169,7 @@ int outl;
175 return(i); 169 return(i);
176 } 170 }
177 171
178int BIO_write(b,in,inl) 172int BIO_write(BIO *b, const char *in, int inl)
179BIO *b;
180char *in;
181int inl;
182 { 173 {
183 int i; 174 int i;
184 long (*cb)(); 175 long (*cb)();
@@ -199,22 +190,27 @@ int inl;
199 190
200 if (!b->init) 191 if (!b->init)
201 { 192 {
202 BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITALISED); 193 BIOerr(BIO_F_BIO_WRITE,BIO_R_UNINITIALIZED);
203 return(-2); 194 return(-2);
204 } 195 }
205 196
206 i=b->method->bwrite(b,in,inl); 197 i=b->method->bwrite(b,in,inl);
198
207 if (i > 0) b->num_write+=(unsigned long)i; 199 if (i > 0) b->num_write+=(unsigned long)i;
208 200
209 if (cb != NULL) 201 /* This is evil and not thread safe. If the BIO has been freed,
202 * we must not call the callback. The only way to be able to
203 * determine this is the reference count which is now invalid since
204 * the memory has been free()ed.
205 */
206 if (b->references <= 0) abort();
207 if (cb != NULL) /* && (b->references >= 1)) */
210 i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, 208 i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl,
211 0L,(long)i); 209 0L,(long)i);
212 return(i); 210 return(i);
213 } 211 }
214 212
215int BIO_puts(b,in) 213int BIO_puts(BIO *b, const char *in)
216BIO *b;
217char *in;
218 { 214 {
219 int i; 215 int i;
220 long (*cb)(); 216 long (*cb)();
@@ -233,7 +229,7 @@ char *in;
233 229
234 if (!b->init) 230 if (!b->init)
235 { 231 {
236 BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITALISED); 232 BIOerr(BIO_F_BIO_PUTS,BIO_R_UNINITIALIZED);
237 return(-2); 233 return(-2);
238 } 234 }
239 235
@@ -245,10 +241,7 @@ char *in;
245 return(i); 241 return(i);
246 } 242 }
247 243
248int BIO_gets(b,in,inl) 244int BIO_gets(BIO *b, char *in, int inl)
249BIO *b;
250char *in;
251int inl;
252 { 245 {
253 int i; 246 int i;
254 long (*cb)(); 247 long (*cb)();
@@ -267,7 +260,7 @@ int inl;
267 260
268 if (!b->init) 261 if (!b->init)
269 { 262 {
270 BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITALISED); 263 BIOerr(BIO_F_BIO_GETS,BIO_R_UNINITIALIZED);
271 return(-2); 264 return(-2);
272 } 265 }
273 266
@@ -279,11 +272,7 @@ int inl;
279 return(i); 272 return(i);
280 } 273 }
281 274
282long BIO_int_ctrl(b,cmd,larg,iarg) 275long BIO_int_ctrl(BIO *b, int cmd, long larg, int iarg)
283BIO *b;
284int cmd;
285long larg;
286int iarg;
287 { 276 {
288 int i; 277 int i;
289 278
@@ -291,10 +280,7 @@ int iarg;
291 return(BIO_ctrl(b,cmd,larg,(char *)&i)); 280 return(BIO_ctrl(b,cmd,larg,(char *)&i));
292 } 281 }
293 282
294char *BIO_ptr_ctrl(b,cmd,larg) 283char *BIO_ptr_ctrl(BIO *b, int cmd, long larg)
295BIO *b;
296int cmd;
297long larg;
298 { 284 {
299 char *p=NULL; 285 char *p=NULL;
300 286
@@ -304,11 +290,7 @@ long larg;
304 return(p); 290 return(p);
305 } 291 }
306 292
307long BIO_ctrl(b,cmd,larg,parg) 293long BIO_ctrl(BIO *b, int cmd, long larg, void *parg)
308BIO *b;
309int cmd;
310long larg;
311char *parg;
312 { 294 {
313 long ret; 295 long ret;
314 long (*cb)(); 296 long (*cb)();
@@ -335,9 +317,22 @@ char *parg;
335 return(ret); 317 return(ret);
336 } 318 }
337 319
320/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros
321 * do; but those macros have inappropriate return type, and for interfacing
322 * from other programming languages, C macros aren't much of a help anyway. */
323size_t BIO_ctrl_pending(BIO *bio)
324 {
325 return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL);
326 }
327
328size_t BIO_ctrl_wpending(BIO *bio)
329 {
330 return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL);
331 }
332
333
338/* put the 'bio' on the end of b's list of operators */ 334/* put the 'bio' on the end of b's list of operators */
339BIO *BIO_push(b,bio) 335BIO *BIO_push(BIO *b, BIO *bio)
340BIO *b,*bio;
341 { 336 {
342 BIO *lb; 337 BIO *lb;
343 338
@@ -354,8 +349,7 @@ BIO *b,*bio;
354 } 349 }
355 350
356/* Remove the first and return the rest */ 351/* Remove the first and return the rest */
357BIO *BIO_pop(b) 352BIO *BIO_pop(BIO *b)
358BIO *b;
359 { 353 {
360 BIO *ret; 354 BIO *ret;
361 355
@@ -373,9 +367,7 @@ BIO *b;
373 return(ret); 367 return(ret);
374 } 368 }
375 369
376BIO *BIO_get_retry_BIO(bio,reason) 370BIO *BIO_get_retry_BIO(BIO *bio, int *reason)
377BIO *bio;
378int *reason;
379 { 371 {
380 BIO *b,*last; 372 BIO *b,*last;
381 373
@@ -391,15 +383,12 @@ int *reason;
391 return(last); 383 return(last);
392 } 384 }
393 385
394int BIO_get_retry_reason(bio) 386int BIO_get_retry_reason(BIO *bio)
395BIO *bio;
396 { 387 {
397 return(bio->retry_reason); 388 return(bio->retry_reason);
398 } 389 }
399 390
400BIO *BIO_find_type(bio,type) 391BIO *BIO_find_type(BIO *bio, int type)
401BIO *bio;
402int type;
403 { 392 {
404 int mt,mask; 393 int mt,mask;
405 394
@@ -421,8 +410,7 @@ int type;
421 return(NULL); 410 return(NULL);
422 } 411 }
423 412
424void BIO_free_all(bio) 413void BIO_free_all(BIO *bio)
425BIO *bio;
426 { 414 {
427 BIO *b; 415 BIO *b;
428 int ref; 416 int ref;
@@ -438,8 +426,7 @@ BIO *bio;
438 } 426 }
439 } 427 }
440 428
441BIO *BIO_dup_chain(in) 429BIO *BIO_dup_chain(BIO *in)
442BIO *in;
443 { 430 {
444 BIO *ret=NULL,*eoc=NULL,*bio,*new; 431 BIO *ret=NULL,*eoc=NULL,*bio,*new;
445 432
@@ -461,9 +448,9 @@ BIO *in;
461 goto err; 448 goto err;
462 } 449 }
463 450
464 /* copy app data */ 451 /* copy app data */
465 if (!CRYPTO_dup_ex_data(bio_meth,&new->ex_data,&bio->ex_data)) 452 if (!CRYPTO_dup_ex_data(bio_meth,&new->ex_data,&bio->ex_data))
466 goto err; 453 goto err;
467 454
468 if (ret == NULL) 455 if (ret == NULL)
469 { 456 {
@@ -483,36 +470,26 @@ err:
483 return(NULL); 470 return(NULL);
484 } 471 }
485 472
486void BIO_copy_next_retry(b) 473void BIO_copy_next_retry(BIO *b)
487BIO *b;
488 { 474 {
489 BIO_set_flags(b,BIO_get_retry_flags(b->next_bio)); 475 BIO_set_flags(b,BIO_get_retry_flags(b->next_bio));
490 b->retry_reason=b->next_bio->retry_reason; 476 b->retry_reason=b->next_bio->retry_reason;
491 } 477 }
492 478
493int BIO_get_ex_new_index(argl,argp,new_func,dup_func,free_func) 479int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(),
494long argl; 480 int (*dup_func)(), void (*free_func)())
495char *argp; 481 {
496int (*new_func)(); 482 bio_meth_num++;
497int (*dup_func)(); 483 return(CRYPTO_get_ex_new_index(bio_meth_num-1,&bio_meth,
498void (*free_func)(); 484 argl,argp,new_func,dup_func,free_func));
499 { 485 }
500 bio_meth_num++; 486
501 return(CRYPTO_get_ex_new_index(bio_meth_num-1,&bio_meth, 487int BIO_set_ex_data(BIO *bio, int idx, char *data)
502 argl,argp,new_func,dup_func,free_func));
503 }
504
505int BIO_set_ex_data(bio,idx,data)
506BIO *bio;
507int idx;
508char *data;
509 { 488 {
510 return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); 489 return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data));
511 } 490 }
512 491
513char *BIO_get_ex_data(bio,idx) 492char *BIO_get_ex_data(BIO *bio, int idx)
514BIO *bio;
515int idx;
516 { 493 {
517 return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); 494 return(CRYPTO_get_ex_data(&(bio->ex_data),idx));
518 } 495 }
diff --git a/src/lib/libcrypto/bio/bss_acpt.c b/src/lib/libcrypto/bio/bss_acpt.c
index e49902fa9f..47af80f76d 100644
--- a/src/lib/libcrypto/bio/bss_acpt.c
+++ b/src/lib/libcrypto/bio/bss_acpt.c
@@ -62,9 +62,7 @@
62#include <errno.h> 62#include <errno.h>
63#define USE_SOCKETS 63#define USE_SOCKETS
64#include "cryptlib.h" 64#include "cryptlib.h"
65#include "bio.h" 65#include <openssl/bio.h>
66
67/* BIOerr(BIO_F_WSASTARTUP,BIO_R_WSASTARTUP ); */
68 66
69#ifdef WIN16 67#ifdef WIN16
70#define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ 68#define SOCKET_PROTOCOL 0 /* more microsoft stupidity */
@@ -72,6 +70,11 @@
72#define SOCKET_PROTOCOL IPPROTO_TCP 70#define SOCKET_PROTOCOL IPPROTO_TCP
73#endif 71#endif
74 72
73#if (defined(VMS) && __VMS_VER < 70000000)
74/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
75#undef FIONBIO
76#endif
77
75typedef struct bio_accept_st 78typedef struct bio_accept_st
76 { 79 {
77 int state; 80 int state;
@@ -82,39 +85,24 @@ typedef struct bio_accept_st
82 85
83 char *addr; 86 char *addr;
84 int nbio; 87 int nbio;
88 /* If 0, it means normal, if 1, do a connect on bind failure,
89 * and if there is no-one listening, bind with SO_REUSEADDR.
90 * If 2, always use SO_REUSEADDR. */
91 int bind_mode;
85 BIO *bio_chain; 92 BIO *bio_chain;
86 } BIO_ACCEPT; 93 } BIO_ACCEPT;
87 94
88#ifndef NOPROTO
89static int acpt_write(BIO *h,char *buf,int num); 95static int acpt_write(BIO *h,char *buf,int num);
90static int acpt_read(BIO *h,char *buf,int size); 96static int acpt_read(BIO *h,char *buf,int size);
91static int acpt_puts(BIO *h,char *str); 97static int acpt_puts(BIO *h,char *str);
92static long acpt_ctrl(BIO *h,int cmd,long arg1,char *arg2); 98static long acpt_ctrl(BIO *h,int cmd,long arg1,char *arg2);
93static int acpt_new(BIO *h); 99static int acpt_new(BIO *h);
94static int acpt_free(BIO *data); 100static int acpt_free(BIO *data);
95#else
96static int acpt_write();
97static int acpt_read();
98static int acpt_puts();
99static long acpt_ctrl();
100static int acpt_new();
101static int acpt_free();
102#endif
103
104#ifndef NOPROTO
105static int acpt_state(BIO *b, BIO_ACCEPT *c); 101static int acpt_state(BIO *b, BIO_ACCEPT *c);
106static void acpt_close_socket(BIO *data); 102static void acpt_close_socket(BIO *data);
107BIO_ACCEPT *BIO_ACCEPT_new(void ); 103BIO_ACCEPT *BIO_ACCEPT_new(void );
108void BIO_ACCEPT_free(BIO_ACCEPT *a); 104void BIO_ACCEPT_free(BIO_ACCEPT *a);
109 105
110#else
111
112static int acpt_state();
113static void acpt_close_socket();
114BIO_ACCEPT *BIO_ACCEPT_new();
115void BIO_ACCEPT_free();
116#endif
117
118#define ACPT_S_BEFORE 1 106#define ACPT_S_BEFORE 1
119#define ACPT_S_GET_ACCEPT_SOCKET 2 107#define ACPT_S_GET_ACCEPT_SOCKET 2
120#define ACPT_S_OK 3 108#define ACPT_S_OK 3
@@ -132,13 +120,12 @@ static BIO_METHOD methods_acceptp=
132 acpt_free, 120 acpt_free,
133 }; 121 };
134 122
135BIO_METHOD *BIO_s_accept() 123BIO_METHOD *BIO_s_accept(void)
136 { 124 {
137 return(&methods_acceptp); 125 return(&methods_acceptp);
138 } 126 }
139 127
140static int acpt_new(bi) 128static int acpt_new(BIO *bi)
141BIO *bi;
142 { 129 {
143 BIO_ACCEPT *ba; 130 BIO_ACCEPT *ba;
144 131
@@ -153,7 +140,7 @@ BIO *bi;
153 return(1); 140 return(1);
154 } 141 }
155 142
156BIO_ACCEPT *BIO_ACCEPT_new() 143BIO_ACCEPT *BIO_ACCEPT_new(void)
157 { 144 {
158 BIO_ACCEPT *ret; 145 BIO_ACCEPT *ret;
159 146
@@ -162,20 +149,22 @@ BIO_ACCEPT *BIO_ACCEPT_new()
162 149
163 memset(ret,0,sizeof(BIO_ACCEPT)); 150 memset(ret,0,sizeof(BIO_ACCEPT));
164 ret->accept_sock=INVALID_SOCKET; 151 ret->accept_sock=INVALID_SOCKET;
152 ret->bind_mode=BIO_BIND_NORMAL;
165 return(ret); 153 return(ret);
166 } 154 }
167 155
168void BIO_ACCEPT_free(a) 156void BIO_ACCEPT_free(BIO_ACCEPT *a)
169BIO_ACCEPT *a;
170 { 157 {
158 if(a == NULL)
159 return;
160
171 if (a->param_addr != NULL) Free(a->param_addr); 161 if (a->param_addr != NULL) Free(a->param_addr);
172 if (a->addr != NULL) Free(a->addr); 162 if (a->addr != NULL) Free(a->addr);
173 if (a->bio_chain != NULL) BIO_free(a->bio_chain); 163 if (a->bio_chain != NULL) BIO_free(a->bio_chain);
174 Free(a); 164 Free(a);
175 } 165 }
176 166
177static void acpt_close_socket(bio) 167static void acpt_close_socket(BIO *bio)
178BIO *bio;
179 { 168 {
180 BIO_ACCEPT *c; 169 BIO_ACCEPT *c;
181 170
@@ -183,18 +172,13 @@ BIO *bio;
183 if (c->accept_sock != INVALID_SOCKET) 172 if (c->accept_sock != INVALID_SOCKET)
184 { 173 {
185 shutdown(c->accept_sock,2); 174 shutdown(c->accept_sock,2);
186# ifdef WINDOWS
187 closesocket(c->accept_sock); 175 closesocket(c->accept_sock);
188# else
189 close(c->accept_sock);
190# endif
191 c->accept_sock=INVALID_SOCKET; 176 c->accept_sock=INVALID_SOCKET;
192 bio->num=INVALID_SOCKET; 177 bio->num=INVALID_SOCKET;
193 } 178 }
194 } 179 }
195 180
196static int acpt_free(a) 181static int acpt_free(BIO *a)
197BIO *a;
198 { 182 {
199 BIO_ACCEPT *data; 183 BIO_ACCEPT *data;
200 184
@@ -212,12 +196,9 @@ BIO *a;
212 return(1); 196 return(1);
213 } 197 }
214 198
215static int acpt_state(b,c) 199static int acpt_state(BIO *b, BIO_ACCEPT *c)
216BIO *b;
217BIO_ACCEPT *c;
218 { 200 {
219 BIO *bio=NULL,*dbio; 201 BIO *bio=NULL,*dbio;
220 unsigned long l=1;
221 int s= -1; 202 int s= -1;
222 int i; 203 int i;
223 204
@@ -230,31 +211,24 @@ again:
230 BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED); 211 BIOerr(BIO_F_ACPT_STATE,BIO_R_NO_ACCEPT_PORT_SPECIFIED);
231 return(-1); 212 return(-1);
232 } 213 }
233 s=BIO_get_accept_socket(c->param_addr); 214 s=BIO_get_accept_socket(c->param_addr,c->bind_mode);
234 if (s == INVALID_SOCKET) 215 if (s == INVALID_SOCKET)
235 return(-1); 216 return(-1);
236 217
237#ifdef FIONBIO
238 if (c->accept_nbio) 218 if (c->accept_nbio)
239 { 219 {
240 i=BIO_socket_ioctl(b->num,FIONBIO,&l); 220 if (!BIO_socket_nbio(s,1))
241 if (i < 0)
242 { 221 {
243#ifdef WINDOWS
244 closesocket(s); 222 closesocket(s);
245#else
246 close(s);
247# endif
248 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET); 223 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET);
249 return(-1); 224 return(-1);
250 } 225 }
251 } 226 }
252#endif
253 c->accept_sock=s; 227 c->accept_sock=s;
254 b->num=s; 228 b->num=s;
255 c->state=ACPT_S_GET_ACCEPT_SOCKET; 229 c->state=ACPT_S_GET_ACCEPT_SOCKET;
256 return(1); 230 return(1);
257 break; 231 /* break; */
258 case ACPT_S_GET_ACCEPT_SOCKET: 232 case ACPT_S_GET_ACCEPT_SOCKET:
259 if (b->next_bio != NULL) 233 if (b->next_bio != NULL)
260 { 234 {
@@ -269,17 +243,14 @@ again:
269 BIO_set_callback(bio,BIO_get_callback(b)); 243 BIO_set_callback(bio,BIO_get_callback(b));
270 BIO_set_callback_arg(bio,BIO_get_callback_arg(b)); 244 BIO_set_callback_arg(bio,BIO_get_callback_arg(b));
271 245
272#ifdef FIONBIO
273 if (c->nbio) 246 if (c->nbio)
274 { 247 {
275 i=BIO_socket_ioctl(i,FIONBIO,&l); 248 if (!BIO_socket_nbio(i,1))
276 if (i < 0)
277 { 249 {
278 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET); 250 BIOerr(BIO_F_ACPT_STATE,BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET);
279 goto err; 251 goto err;
280 } 252 }
281 } 253 }
282#endif
283 254
284 /* If the accept BIO has an bio_chain, we dup it and 255 /* If the accept BIO has an bio_chain, we dup it and
285 * put the new socket at the end. */ 256 * put the new socket at the end. */
@@ -298,15 +269,9 @@ err:
298 if (bio != NULL) 269 if (bio != NULL)
299 BIO_free(bio); 270 BIO_free(bio);
300 else if (s >= 0) 271 else if (s >= 0)
301 {
302#ifdef WINDOWS
303 closesocket(s); 272 closesocket(s);
304#else
305 close(s);
306# endif
307 }
308 return(0); 273 return(0);
309 break; 274 /* break; */
310 case ACPT_S_OK: 275 case ACPT_S_OK:
311 if (b->next_bio == NULL) 276 if (b->next_bio == NULL)
312 { 277 {
@@ -314,23 +279,20 @@ err:
314 goto again; 279 goto again;
315 } 280 }
316 return(1); 281 return(1);
317 break; 282 /* break; */
318 default: 283 default:
319 return(0); 284 return(0);
320 break; 285 /* break; */
321 } 286 }
322 287
323 } 288 }
324 289
325static int acpt_read(b,out,outl) 290static int acpt_read(BIO *b, char *out, int outl)
326BIO *b;
327char *out;
328int outl;
329 { 291 {
330 int ret=0; 292 int ret=0;
331 BIO_ACCEPT *data; 293 BIO_ACCEPT *data;
332 294
333 BIO_clear_retry_flags(b); 295 BIO_clear_retry_flags(b);
334 data=(BIO_ACCEPT *)b->ptr; 296 data=(BIO_ACCEPT *)b->ptr;
335 297
336 while (b->next_bio == NULL) 298 while (b->next_bio == NULL)
@@ -344,10 +306,7 @@ int outl;
344 return(ret); 306 return(ret);
345 } 307 }
346 308
347static int acpt_write(b,in,inl) 309static int acpt_write(BIO *b, char *in, int inl)
348BIO *b;
349char *in;
350int inl;
351 { 310 {
352 int ret; 311 int ret;
353 BIO_ACCEPT *data; 312 BIO_ACCEPT *data;
@@ -366,11 +325,7 @@ int inl;
366 return(ret); 325 return(ret);
367 } 326 }
368 327
369static long acpt_ctrl(b,cmd,num,ptr) 328static long acpt_ctrl(BIO *b, int cmd, long num, char *ptr)
370BIO *b;
371int cmd;
372long num;
373char *ptr;
374 { 329 {
375 BIO *dbio; 330 BIO *dbio;
376 int *ip; 331 int *ip;
@@ -417,13 +372,21 @@ char *ptr;
417 case BIO_C_SET_NBIO: 372 case BIO_C_SET_NBIO:
418 data->nbio=(int)num; 373 data->nbio=(int)num;
419 break; 374 break;
375 case BIO_C_SET_FD:
376 b->init=1;
377 b->num= *((int *)ptr);
378 data->accept_sock=b->num;
379 data->state=ACPT_S_GET_ACCEPT_SOCKET;
380 b->shutdown=(int)num;
381 b->init=1;
382 break;
420 case BIO_C_GET_FD: 383 case BIO_C_GET_FD:
421 if (b->init) 384 if (b->init)
422 { 385 {
423 ip=(int *)ptr; 386 ip=(int *)ptr;
424 if (ip != NULL) 387 if (ip != NULL)
425 *ip=data->accept_sock; 388 *ip=data->accept_sock;
426 ret=b->num; 389 ret=data->accept_sock;
427 } 390 }
428 else 391 else
429 ret= -1; 392 ret= -1;
@@ -454,6 +417,12 @@ char *ptr;
454 break; 417 break;
455 case BIO_CTRL_FLUSH: 418 case BIO_CTRL_FLUSH:
456 break; 419 break;
420 case BIO_C_SET_BIND_MODE:
421 data->bind_mode=(int)num;
422 break;
423 case BIO_C_GET_BIND_MODE:
424 ret=(long)data->bind_mode;
425 break;
457 case BIO_CTRL_DUP: 426 case BIO_CTRL_DUP:
458 dbio=(BIO *)ptr; 427 dbio=(BIO *)ptr;
459/* if (data->param_port) EAY EAY 428/* if (data->param_port) EAY EAY
@@ -470,9 +439,7 @@ char *ptr;
470 return(ret); 439 return(ret);
471 } 440 }
472 441
473static int acpt_puts(bp,str) 442static int acpt_puts(BIO *bp, char *str)
474BIO *bp;
475char *str;
476 { 443 {
477 int n,ret; 444 int n,ret;
478 445
@@ -481,8 +448,7 @@ char *str;
481 return(ret); 448 return(ret);
482 } 449 }
483 450
484BIO *BIO_new_accept(str) 451BIO *BIO_new_accept(char *str)
485char *str;
486 { 452 {
487 BIO *ret; 453 BIO *ret;
488 454
diff --git a/src/lib/libcrypto/bio/bss_bio.c b/src/lib/libcrypto/bio/bss_bio.c
new file mode 100644
index 0000000000..562e9d8de2
--- /dev/null
+++ b/src/lib/libcrypto/bio/bss_bio.c
@@ -0,0 +1,588 @@
1/* crypto/bio/bss_bio.c -*- Mode: C; c-file-style: "eay" -*- */
2
3/* Special method for a BIO where the other endpoint is also a BIO
4 * of this kind, handled by the same thread (i.e. the "peer" is actually
5 * ourselves, wearing a different hat).
6 * Such "BIO pairs" are mainly for using the SSL library with I/O interfaces
7 * for which no specific BIO method is available.
8 * See ssl/ssltest.c for some hints on how this can be used. */
9
10#ifndef BIO_PAIR_DEBUG
11# undef NDEBUG /* avoid conflicting definitions */
12# define NDEBUG
13#endif
14
15#include <assert.h>
16#include <stdlib.h>
17#include <string.h>
18
19#include <openssl/bio.h>
20#include <openssl/err.h>
21#include <openssl/crypto.h>
22
23static int bio_new(BIO *bio);
24static int bio_free(BIO *bio);
25static int bio_read(BIO *bio, char *buf, int size);
26static int bio_write(BIO *bio, char *buf, int num);
27static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr);
28static int bio_puts(BIO *bio, char *str);
29
30static int bio_make_pair(BIO *bio1, BIO *bio2);
31static void bio_destroy_pair(BIO *bio);
32
33static BIO_METHOD methods_biop =
34{
35 BIO_TYPE_BIO,
36 "BIO pair",
37 bio_write,
38 bio_read,
39 bio_puts,
40 NULL /* no bio_gets */,
41 bio_ctrl,
42 bio_new,
43 bio_free
44};
45
46BIO_METHOD *BIO_s_bio(void)
47 {
48 return &methods_biop;
49 }
50
51struct bio_bio_st
52{
53 BIO *peer; /* NULL if buf == NULL.
54 * If peer != NULL, then peer->ptr is also a bio_bio_st,
55 * and its "peer" member points back to us.
56 * peer != NULL iff init != 0 in the BIO. */
57
58 /* This is for what we write (i.e. reading uses peer's struct): */
59 int closed; /* valid iff peer != NULL */
60 size_t len; /* valid iff buf != NULL; 0 if peer == NULL */
61 size_t offset; /* valid iff buf != NULL; 0 if len == 0 */
62 size_t size;
63 char *buf; /* "size" elements (if != NULL) */
64
65 size_t request; /* valid iff peer != NULL; 0 if len != 0,
66 * otherwise set by peer to number of bytes
67 * it (unsuccesfully) tried to read,
68 * never more than buffer space (size-len) warrants. */
69};
70
71static int bio_new(BIO *bio)
72 {
73 struct bio_bio_st *b;
74
75 b = Malloc(sizeof *b);
76 if (b == NULL)
77 return 0;
78
79 b->peer = NULL;
80 b->size = 17*1024; /* enough for one TLS record (just a default) */
81 b->buf = NULL;
82
83 bio->ptr = b;
84 return 1;
85 }
86
87
88static int bio_free(BIO *bio)
89 {
90 struct bio_bio_st *b;
91
92 if (bio == NULL)
93 return 0;
94 b = bio->ptr;
95
96 assert(b != NULL);
97
98 if (b->peer)
99 bio_destroy_pair(bio);
100
101 if (b->buf != NULL)
102 {
103 Free(b->buf);
104 }
105
106 Free(b);
107
108 return 1;
109 }
110
111
112
113static int bio_read(BIO *bio, char *buf, int size_)
114 {
115 size_t size = size_;
116 size_t rest;
117 struct bio_bio_st *b, *peer_b;
118
119 BIO_clear_retry_flags(bio);
120
121 if (!bio->init)
122 return 0;
123
124 b = bio->ptr;
125 assert(b != NULL);
126 assert(b->peer != NULL);
127 peer_b = b->peer->ptr;
128 assert(peer_b != NULL);
129 assert(peer_b->buf != NULL);
130
131 peer_b->request = 0; /* will be set in "retry_read" situation */
132
133 if (buf == NULL || size == 0)
134 return 0;
135
136 if (peer_b->len == 0)
137 {
138 if (peer_b->closed)
139 return 0; /* writer has closed, and no data is left */
140 else
141 {
142 BIO_set_retry_read(bio); /* buffer is empty */
143 if (size <= peer_b->size)
144 peer_b->request = size;
145 else
146 /* don't ask for more than the peer can
147 * deliver in one write */
148 peer_b->request = peer_b->size;
149 return -1;
150 }
151 }
152
153 /* we can read */
154 if (peer_b->len < size)
155 size = peer_b->len;
156
157 /* now read "size" bytes */
158
159 rest = size;
160
161 assert(rest > 0);
162 do /* one or two iterations */
163 {
164 size_t chunk;
165
166 assert(rest <= peer_b->len);
167 if (peer_b->offset + rest <= peer_b->size)
168 chunk = rest;
169 else
170 /* wrap around ring buffer */
171 chunk = peer_b->size - peer_b->offset;
172 assert(peer_b->offset + chunk <= peer_b->size);
173
174 memcpy(buf, peer_b->buf + peer_b->offset, chunk);
175
176 peer_b->len -= chunk;
177 if (peer_b->len)
178 {
179 peer_b->offset += chunk;
180 assert(peer_b->offset <= peer_b->size);
181 if (peer_b->offset == peer_b->size)
182 peer_b->offset = 0;
183 buf += chunk;
184 }
185 else
186 {
187 /* buffer now empty, no need to advance "buf" */
188 assert(chunk == rest);
189 peer_b->offset = 0;
190 }
191 rest -= chunk;
192 }
193 while (rest);
194
195 return size;
196 }
197
198static int bio_write(BIO *bio, char *buf, int num_)
199 {
200 size_t num = num_;
201 size_t rest;
202 struct bio_bio_st *b;
203
204 BIO_clear_retry_flags(bio);
205
206 if (!bio->init || buf == NULL || num == 0)
207 return 0;
208
209 b = bio->ptr;
210 assert(b != NULL);
211 assert(b->peer != NULL);
212 assert(b->buf != NULL);
213
214 b->request = 0;
215 if (b->closed)
216 {
217 /* we already closed */
218 BIOerr(BIO_F_BIO_WRITE, BIO_R_BROKEN_PIPE);
219 return -1;
220 }
221
222 assert(b->len <= b->size);
223
224 if (b->len == b->size)
225 {
226 BIO_set_retry_write(bio); /* buffer is full */
227 return -1;
228 }
229
230 /* we can write */
231 if (num > b->size - b->len)
232 num = b->size - b->len;
233
234 /* now write "num" bytes */
235
236 rest = num;
237
238 assert(rest > 0);
239 do /* one or two iterations */
240 {
241 size_t write_offset;
242 size_t chunk;
243
244 assert(b->len + rest <= b->size);
245
246 write_offset = b->offset + b->len;
247 if (write_offset >= b->size)
248 write_offset -= b->size;
249 /* b->buf[write_offset] is the first byte we can write to. */
250
251 if (write_offset + rest <= b->size)
252 chunk = rest;
253 else
254 /* wrap around ring buffer */
255 chunk = b->size - write_offset;
256
257 memcpy(b->buf + write_offset, buf, chunk);
258
259 b->len += chunk;
260
261 assert(b->len <= b->size);
262
263 rest -= chunk;
264 buf += chunk;
265 }
266 while (rest);
267
268 return num;
269 }
270
271
272static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
273 {
274 long ret;
275 struct bio_bio_st *b = bio->ptr;
276
277 assert(b != NULL);
278
279 switch (cmd)
280 {
281 /* specific CTRL codes */
282
283 case BIO_C_SET_WRITE_BUF_SIZE:
284 if (b->peer)
285 {
286 BIOerr(BIO_F_BIO_CTRL, BIO_R_IN_USE);
287 ret = 0;
288 }
289 else if (num == 0)
290 {
291 BIOerr(BIO_F_BIO_CTRL, BIO_R_INVALID_ARGUMENT);
292 ret = 0;
293 }
294 else
295 {
296 size_t new_size = num;
297
298 if (b->size != new_size)
299 {
300 if (b->buf)
301 {
302 Free(b->buf);
303 b->buf = NULL;
304 }
305 b->size = new_size;
306 }
307 ret = 1;
308 }
309 break;
310
311 case BIO_C_GET_WRITE_BUF_SIZE:
312 num = (long) b->size;
313
314 case BIO_C_MAKE_BIO_PAIR:
315 {
316 BIO *other_bio = ptr;
317
318 if (bio_make_pair(bio, other_bio))
319 ret = 1;
320 else
321 ret = 0;
322 }
323 break;
324
325 case BIO_C_DESTROY_BIO_PAIR:
326 /* Effects both BIOs in the pair -- call just once!
327 * Or let BIO_free(bio1); BIO_free(bio2); do the job. */
328 bio_destroy_pair(bio);
329 ret = 1;
330 break;
331
332 case BIO_C_GET_WRITE_GUARANTEE:
333 /* How many bytes can the caller feed to the next write
334 * withouth having to keep any? */
335 if (b->peer == NULL || b->closed)
336 ret = 0;
337 else
338 ret = (long) b->size - b->len;
339 break;
340
341 case BIO_C_GET_READ_REQUEST:
342 /* If the peer unsuccesfully tried to read, how many bytes
343 * were requested? (As with BIO_CTRL_PENDING, that number
344 * can usually be treated as boolean.) */
345 ret = (long) b->request;
346 break;
347
348 case BIO_C_SHUTDOWN_WR:
349 /* similar to shutdown(..., SHUT_WR) */
350 b->closed = 1;
351 ret = 1;
352 break;
353
354
355 /* standard CTRL codes follow */
356
357 case BIO_CTRL_RESET:
358 if (b->buf != NULL)
359 {
360 b->len = 0;
361 b->offset = 0;
362 }
363 ret = 0;
364 break;
365
366 case BIO_CTRL_GET_CLOSE:
367 ret = bio->shutdown;
368 break;
369
370 case BIO_CTRL_SET_CLOSE:
371 bio->shutdown = (int) num;
372 ret = 1;
373 break;
374
375 case BIO_CTRL_PENDING:
376 if (b->peer != NULL)
377 {
378 struct bio_bio_st *peer_b = b->peer->ptr;
379
380 ret = (long) peer_b->len;
381 }
382 else
383 ret = 0;
384 break;
385
386 case BIO_CTRL_WPENDING:
387 if (b->buf != NULL)
388 ret = (long) b->len;
389 else
390 ret = 0;
391 break;
392
393 case BIO_CTRL_DUP:
394 /* See BIO_dup_chain for circumstances we have to expect. */
395 {
396 BIO *other_bio = ptr;
397 struct bio_bio_st *other_b;
398
399 assert(other_bio != NULL);
400 other_b = other_bio->ptr;
401 assert(other_b != NULL);
402
403 assert(other_b->buf == NULL); /* other_bio is always fresh */
404
405 other_b->size = b->size;
406 }
407
408 ret = 1;
409 break;
410
411 case BIO_CTRL_FLUSH:
412 ret = 1;
413 break;
414
415 case BIO_CTRL_EOF:
416 {
417 BIO *other_bio = ptr;
418
419 if (other_bio)
420 {
421 struct bio_bio_st *other_b = other_bio->ptr;
422
423 assert(other_b != NULL);
424 ret = other_b->len == 0 && other_b->closed;
425 }
426 else
427 ret = 1;
428 }
429 break;
430
431 default:
432 ret = 0;
433 }
434 return ret;
435 }
436
437static int bio_puts(BIO *bio, char *str)
438 {
439 return bio_write(bio, str, strlen(str));
440 }
441
442
443static int bio_make_pair(BIO *bio1, BIO *bio2)
444 {
445 struct bio_bio_st *b1, *b2;
446
447 assert(bio1 != NULL);
448 assert(bio2 != NULL);
449
450 b1 = bio1->ptr;
451 b2 = bio2->ptr;
452
453 if (b1->peer != NULL || b2->peer != NULL)
454 {
455 BIOerr(BIO_F_BIO_MAKE_PAIR, BIO_R_IN_USE);
456 return 0;
457 }
458
459 if (b1->buf == NULL)
460 {
461 b1->buf = Malloc(b1->size);
462 if (b1->buf == NULL)
463 {
464 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
465 return 0;
466 }
467 b1->len = 0;
468 b1->offset = 0;
469 }
470
471 if (b2->buf == NULL)
472 {
473 b2->buf = Malloc(b2->size);
474 if (b2->buf == NULL)
475 {
476 BIOerr(BIO_F_BIO_MAKE_PAIR, ERR_R_MALLOC_FAILURE);
477 return 0;
478 }
479 b2->len = 0;
480 b2->offset = 0;
481 }
482
483 b1->peer = bio2;
484 b1->closed = 0;
485 b1->request = 0;
486 b2->peer = bio1;
487 b2->closed = 0;
488 b2->request = 0;
489
490 bio1->init = 1;
491 bio2->init = 1;
492
493 return 1;
494 }
495
496static void bio_destroy_pair(BIO *bio)
497 {
498 struct bio_bio_st *b = bio->ptr;
499
500 if (b != NULL)
501 {
502 BIO *peer_bio = b->peer;
503
504 if (peer_bio != NULL)
505 {
506 struct bio_bio_st *peer_b = peer_bio->ptr;
507
508 assert(peer_b != NULL);
509 assert(peer_b->peer == bio);
510
511 peer_b->peer = NULL;
512 peer_bio->init = 0;
513 assert(peer_b->buf != NULL);
514 peer_b->len = 0;
515 peer_b->offset = 0;
516
517 b->peer = NULL;
518 bio->init = 0;
519 assert(b->buf != NULL);
520 b->len = 0;
521 b->offset = 0;
522 }
523 }
524 }
525
526
527/* Exported convenience functions */
528int BIO_new_bio_pair(BIO **bio1_p, size_t writebuf1,
529 BIO **bio2_p, size_t writebuf2)
530 {
531 BIO *bio1 = NULL, *bio2 = NULL;
532 long r;
533 int ret = 0;
534
535 bio1 = BIO_new(BIO_s_bio());
536 if (bio1 == NULL)
537 goto err;
538 bio2 = BIO_new(BIO_s_bio());
539 if (bio2 == NULL)
540 goto err;
541
542 if (writebuf1)
543 {
544 r = BIO_set_write_buf_size(bio1, writebuf1);
545 if (!r)
546 goto err;
547 }
548 if (writebuf2)
549 {
550 r = BIO_set_write_buf_size(bio2, writebuf2);
551 if (!r)
552 goto err;
553 }
554
555 r = BIO_make_bio_pair(bio1, bio2);
556 if (!r)
557 goto err;
558 ret = 1;
559
560 err:
561 if (ret == 0)
562 {
563 if (bio1)
564 {
565 BIO_free(bio1);
566 bio1 = NULL;
567 }
568 if (bio2)
569 {
570 BIO_free(bio2);
571 bio2 = NULL;
572 }
573 }
574
575 *bio1_p = bio1;
576 *bio2_p = bio2;
577 return ret;
578 }
579
580size_t BIO_ctrl_get_write_guarantee(BIO *bio)
581 {
582 return BIO_ctrl(bio, BIO_C_GET_WRITE_GUARANTEE, 0, NULL);
583 }
584
585size_t BIO_ctrl_get_read_request(BIO *bio)
586 {
587 return BIO_ctrl(bio, BIO_C_GET_READ_REQUEST, 0, NULL);
588 }
diff --git a/src/lib/libcrypto/bio/bss_conn.c b/src/lib/libcrypto/bio/bss_conn.c
index 6e547bf866..68c46e3d69 100644
--- a/src/lib/libcrypto/bio/bss_conn.c
+++ b/src/lib/libcrypto/bio/bss_conn.c
@@ -62,9 +62,7 @@
62#include <errno.h> 62#include <errno.h>
63#define USE_SOCKETS 63#define USE_SOCKETS
64#include "cryptlib.h" 64#include "cryptlib.h"
65#include "bio.h" 65#include <openssl/bio.h>
66
67/* BIOerr(BIO_F_WSASTARTUP,BIO_R_WSASTARTUP ); */
68 66
69#ifdef WIN16 67#ifdef WIN16
70#define SOCKET_PROTOCOL 0 /* more microsoft stupidity */ 68#define SOCKET_PROTOCOL 0 /* more microsoft stupidity */
@@ -72,6 +70,12 @@
72#define SOCKET_PROTOCOL IPPROTO_TCP 70#define SOCKET_PROTOCOL IPPROTO_TCP
73#endif 71#endif
74 72
73#if (defined(VMS) && __VMS_VER < 70000000)
74/* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
75#undef FIONBIO
76#endif
77
78
75typedef struct bio_connect_st 79typedef struct bio_connect_st
76 { 80 {
77 int state; 81 int state;
@@ -81,13 +85,12 @@ typedef struct bio_connect_st
81 int nbio; 85 int nbio;
82 86
83 unsigned char ip[4]; 87 unsigned char ip[4];
84 short port; 88 unsigned short port;
85 89
86 struct sockaddr_in them; 90 struct sockaddr_in them;
87 91
88 /* int socket; this will be kept in bio->num so that it is 92 /* int socket; this will be kept in bio->num so that it is
89 * compatable with the bss_sock bio */ 93 * compatable with the bss_sock bio */
90 int error;
91 94
92 /* called when the connection is initially made 95 /* called when the connection is initially made
93 * callback(BIO,state,ret); The callback should return 96 * callback(BIO,state,ret); The callback should return
@@ -95,38 +98,18 @@ typedef struct bio_connect_st
95 int (*info_callback)(); 98 int (*info_callback)();
96 } BIO_CONNECT; 99 } BIO_CONNECT;
97 100
98#ifndef NOPROTO
99static int conn_write(BIO *h,char *buf,int num); 101static int conn_write(BIO *h,char *buf,int num);
100static int conn_read(BIO *h,char *buf,int size); 102static int conn_read(BIO *h,char *buf,int size);
101static int conn_puts(BIO *h,char *str); 103static int conn_puts(BIO *h,char *str);
102static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2); 104static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2);
103static int conn_new(BIO *h); 105static int conn_new(BIO *h);
104static int conn_free(BIO *data); 106static int conn_free(BIO *data);
105#else
106static int conn_write();
107static int conn_read();
108static int conn_puts();
109static long conn_ctrl();
110static int conn_new();
111static int conn_free();
112#endif
113
114#ifndef NOPROTO
115 107
116static int conn_state(BIO *b, BIO_CONNECT *c); 108static int conn_state(BIO *b, BIO_CONNECT *c);
117static void conn_close_socket(BIO *data); 109static void conn_close_socket(BIO *data);
118BIO_CONNECT *BIO_CONNECT_new(void ); 110BIO_CONNECT *BIO_CONNECT_new(void );
119void BIO_CONNECT_free(BIO_CONNECT *a); 111void BIO_CONNECT_free(BIO_CONNECT *a);
120 112
121#else
122
123static int conn_state();
124static void conn_close_socket();
125BIO_CONNECT *BIO_CONNECT_new();
126void BIO_CONNECT_free();
127
128#endif
129
130static BIO_METHOD methods_connectp= 113static BIO_METHOD methods_connectp=
131 { 114 {
132 BIO_TYPE_CONNECT, 115 BIO_TYPE_CONNECT,
@@ -140,9 +123,7 @@ static BIO_METHOD methods_connectp=
140 conn_free, 123 conn_free,
141 }; 124 };
142 125
143static int conn_state(b,c) 126static int conn_state(BIO *b, BIO_CONNECT *c)
144BIO *b;
145BIO_CONNECT *c;
146 { 127 {
147 int ret= -1,i; 128 int ret= -1,i;
148 unsigned long l; 129 unsigned long l;
@@ -160,7 +141,7 @@ BIO_CONNECT *c;
160 p=c->param_hostname; 141 p=c->param_hostname;
161 if (p == NULL) 142 if (p == NULL)
162 { 143 {
163 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTHNAME_SPECIFIED); 144 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTNAME_SPECIFIED);
164 goto exit_loop; 145 goto exit_loop;
165 } 146 }
166 for ( ; *p != '\0'; p++) 147 for ( ; *p != '\0'; p++)
@@ -187,7 +168,7 @@ BIO_CONNECT *c;
187 } 168 }
188 } 169 }
189 170
190 if (p == NULL) 171 if (c->param_port == NULL)
191 { 172 {
192 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); 173 BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED);
193 ERR_add_error_data(2,"host=",c->param_hostname); 174 ERR_add_error_data(2,"host=",c->param_hostname);
@@ -203,7 +184,12 @@ BIO_CONNECT *c;
203 break; 184 break;
204 185
205 case BIO_CONN_S_GET_PORT: 186 case BIO_CONN_S_GET_PORT:
206 if (BIO_get_port(c->param_port,&c->port) <= 0) 187 if (c->param_port == NULL)
188 {
189 abort();
190 goto exit_loop;
191 }
192 else if (BIO_get_port(c->param_port,&c->port) <= 0)
207 goto exit_loop; 193 goto exit_loop;
208 c->state=BIO_CONN_S_CREATE_SOCKET; 194 c->state=BIO_CONN_S_CREATE_SOCKET;
209 break; 195 break;
@@ -235,12 +221,9 @@ BIO_CONNECT *c;
235 break; 221 break;
236 222
237 case BIO_CONN_S_NBIO: 223 case BIO_CONN_S_NBIO:
238#ifdef FIONBIO
239 if (c->nbio) 224 if (c->nbio)
240 { 225 {
241 l=1; 226 if (!BIO_socket_nbio(b->num,1))
242 ret=BIO_socket_ioctl(b->num,FIONBIO,&l);
243 if (ret < 0)
244 { 227 {
245 BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); 228 BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO);
246 ERR_add_error_data(4,"host=", 229 ERR_add_error_data(4,"host=",
@@ -249,7 +232,6 @@ BIO_CONNECT *c;
249 goto exit_loop; 232 goto exit_loop;
250 } 233 }
251 } 234 }
252#endif
253 c->state=BIO_CONN_S_CONNECT; 235 c->state=BIO_CONN_S_CONNECT;
254 236
255#ifdef SO_KEEPALIVE 237#ifdef SO_KEEPALIVE
@@ -326,17 +308,15 @@ BIO_CONNECT *c;
326 } 308 }
327 } 309 }
328 310
329 if (1) 311 /* Loop does not exit */
330 {
331exit_loop: 312exit_loop:
332 if (cb != NULL) 313 if (cb != NULL)
333 ret=cb((BIO *)b,c->state,ret); 314 ret=cb((BIO *)b,c->state,ret);
334 }
335end: 315end:
336 return(ret); 316 return(ret);
337 } 317 }
338 318
339BIO_CONNECT *BIO_CONNECT_new() 319BIO_CONNECT *BIO_CONNECT_new(void)
340 { 320 {
341 BIO_CONNECT *ret; 321 BIO_CONNECT *ret;
342 322
@@ -353,13 +333,14 @@ BIO_CONNECT *BIO_CONNECT_new()
353 ret->ip[3]=0; 333 ret->ip[3]=0;
354 ret->port=0; 334 ret->port=0;
355 memset((char *)&ret->them,0,sizeof(ret->them)); 335 memset((char *)&ret->them,0,sizeof(ret->them));
356 ret->error=0;
357 return(ret); 336 return(ret);
358 } 337 }
359 338
360void BIO_CONNECT_free(a) 339void BIO_CONNECT_free(BIO_CONNECT *a)
361BIO_CONNECT *a;
362 { 340 {
341 if(a == NULL)
342 return;
343
363 if (a->param_hostname != NULL) 344 if (a->param_hostname != NULL)
364 Free(a->param_hostname); 345 Free(a->param_hostname);
365 if (a->param_port != NULL) 346 if (a->param_port != NULL)
@@ -367,13 +348,12 @@ BIO_CONNECT *a;
367 Free(a); 348 Free(a);
368 } 349 }
369 350
370BIO_METHOD *BIO_s_connect() 351BIO_METHOD *BIO_s_connect(void)
371 { 352 {
372 return(&methods_connectp); 353 return(&methods_connectp);
373 } 354 }
374 355
375static int conn_new(bi) 356static int conn_new(BIO *bi)
376BIO *bi;
377 { 357 {
378 bi->init=0; 358 bi->init=0;
379 bi->num=INVALID_SOCKET; 359 bi->num=INVALID_SOCKET;
@@ -384,8 +364,7 @@ BIO *bi;
384 return(1); 364 return(1);
385 } 365 }
386 366
387static void conn_close_socket(bio) 367static void conn_close_socket(BIO *bio)
388BIO *bio;
389 { 368 {
390 BIO_CONNECT *c; 369 BIO_CONNECT *c;
391 370
@@ -395,17 +374,12 @@ BIO *bio;
395 /* Only do a shutdown if things were established */ 374 /* Only do a shutdown if things were established */
396 if (c->state == BIO_CONN_S_OK) 375 if (c->state == BIO_CONN_S_OK)
397 shutdown(bio->num,2); 376 shutdown(bio->num,2);
398# ifdef WINDOWS
399 closesocket(bio->num); 377 closesocket(bio->num);
400# else
401 close(bio->num);
402# endif
403 bio->num=INVALID_SOCKET; 378 bio->num=INVALID_SOCKET;
404 } 379 }
405 } 380 }
406 381
407static int conn_free(a) 382static int conn_free(BIO *a)
408BIO *a;
409 { 383 {
410 BIO_CONNECT *data; 384 BIO_CONNECT *data;
411 385
@@ -423,10 +397,7 @@ BIO *a;
423 return(1); 397 return(1);
424 } 398 }
425 399
426static int conn_read(b,out,outl) 400static int conn_read(BIO *b, char *out, int outl)
427BIO *b;
428char *out;
429int outl;
430 { 401 {
431 int ret=0; 402 int ret=0;
432 BIO_CONNECT *data; 403 BIO_CONNECT *data;
@@ -442,11 +413,7 @@ int outl;
442 if (out != NULL) 413 if (out != NULL)
443 { 414 {
444 clear_socket_error(); 415 clear_socket_error();
445#if defined(WINDOWS) 416 ret=readsocket(b->num,out,outl);
446 ret=recv(b->num,out,outl,0);
447#else
448 ret=read(b->num,out,outl);
449#endif
450 BIO_clear_retry_flags(b); 417 BIO_clear_retry_flags(b);
451 if (ret <= 0) 418 if (ret <= 0)
452 { 419 {
@@ -457,10 +424,7 @@ int outl;
457 return(ret); 424 return(ret);
458 } 425 }
459 426
460static int conn_write(b,in,inl) 427static int conn_write(BIO *b, char *in, int inl)
461BIO *b;
462char *in;
463int inl;
464 { 428 {
465 int ret; 429 int ret;
466 BIO_CONNECT *data; 430 BIO_CONNECT *data;
@@ -473,11 +437,7 @@ int inl;
473 } 437 }
474 438
475 clear_socket_error(); 439 clear_socket_error();
476#if defined(WINDOWS) 440 ret=writesocket(b->num,in,inl);
477 ret=send(b->num,in,inl,0);
478#else
479 ret=write(b->num,in,inl);
480#endif
481 BIO_clear_retry_flags(b); 441 BIO_clear_retry_flags(b);
482 if (ret <= 0) 442 if (ret <= 0)
483 { 443 {
@@ -487,15 +447,11 @@ int inl;
487 return(ret); 447 return(ret);
488 } 448 }
489 449
490static long conn_ctrl(b,cmd,num,ptr) 450static long conn_ctrl(BIO *b, int cmd, long num, char *ptr)
491BIO *b;
492int cmd;
493long num;
494char *ptr;
495 { 451 {
496 BIO *dbio; 452 BIO *dbio;
497 int *ip; 453 int *ip;
498 char **pptr; 454 const char **pptr;
499 long ret=1; 455 long ret=1;
500 BIO_CONNECT *data; 456 BIO_CONNECT *data;
501 457
@@ -519,7 +475,7 @@ char *ptr;
519 case BIO_C_GET_CONNECT: 475 case BIO_C_GET_CONNECT:
520 if (ptr != NULL) 476 if (ptr != NULL)
521 { 477 {
522 pptr=(char **)ptr; 478 pptr=(const char **)ptr;
523 if (num == 0) 479 if (num == 0)
524 { 480 {
525 *pptr=data->param_hostname; 481 *pptr=data->param_hostname;
@@ -559,9 +515,26 @@ char *ptr;
559 data->param_port=BUF_strdup(ptr); 515 data->param_port=BUF_strdup(ptr);
560 } 516 }
561 else if (num == 2) 517 else if (num == 2)
562 memcpy(data->ip,ptr,4); 518 {
519 char buf[16];
520
521 sprintf(buf,"%d.%d.%d.%d",
522 ptr[0],ptr[1],ptr[2],ptr[3]);
523 if (data->param_hostname != NULL)
524 Free(data->param_hostname);
525 data->param_hostname=BUF_strdup(buf);
526 memcpy(&(data->ip[0]),ptr,4);
527 }
563 else if (num == 3) 528 else if (num == 3)
529 {
530 char buf[16];
531
532 sprintf(buf,"%d",*(int *)ptr);
533 if (data->param_port != NULL)
534 Free(data->param_port);
535 data->param_port=BUF_strdup(buf);
564 data->port= *(int *)ptr; 536 data->port= *(int *)ptr;
537 }
565 } 538 }
566 break; 539 break;
567 case BIO_C_SET_NBIO: 540 case BIO_C_SET_NBIO:
@@ -597,7 +570,7 @@ char *ptr;
597 if (data->param_hostname) 570 if (data->param_hostname)
598 BIO_set_conn_hostname(dbio,data->param_hostname); 571 BIO_set_conn_hostname(dbio,data->param_hostname);
599 BIO_set_nbio(dbio,data->nbio); 572 BIO_set_nbio(dbio,data->nbio);
600 BIO_set_info_callback(dbio,data->info_callback); 573 (void)BIO_set_info_callback(dbio,data->info_callback);
601 break; 574 break;
602 case BIO_CTRL_SET_CALLBACK: 575 case BIO_CTRL_SET_CALLBACK:
603 data->info_callback=(int (*)())ptr; 576 data->info_callback=(int (*)())ptr;
@@ -617,9 +590,7 @@ char *ptr;
617 return(ret); 590 return(ret);
618 } 591 }
619 592
620static int conn_puts(bp,str) 593static int conn_puts(BIO *bp, char *str)
621BIO *bp;
622char *str;
623 { 594 {
624 int n,ret; 595 int n,ret;
625 596
@@ -628,8 +599,7 @@ char *str;
628 return(ret); 599 return(ret);
629 } 600 }
630 601
631BIO *BIO_new_connect(str) 602BIO *BIO_new_connect(char *str)
632char *str;
633 { 603 {
634 BIO *ret; 604 BIO *ret;
635 605
diff --git a/src/lib/libcrypto/bio/bss_file.c b/src/lib/libcrypto/bio/bss_file.c
index 1484cf849e..52c0c39df0 100644
--- a/src/lib/libcrypto/bio/bss_file.c
+++ b/src/lib/libcrypto/bio/bss_file.c
@@ -68,12 +68,11 @@
68#include <stdio.h> 68#include <stdio.h>
69#include <errno.h> 69#include <errno.h>
70#include "cryptlib.h" 70#include "cryptlib.h"
71#include "bio.h" 71#include <openssl/bio.h>
72#include "err.h" 72#include <openssl/err.h>
73 73
74#if !defined(NO_STDIO) 74#if !defined(NO_STDIO)
75 75
76#ifndef NOPROTO
77static int MS_CALLBACK file_write(BIO *h,char *buf,int num); 76static int MS_CALLBACK file_write(BIO *h,char *buf,int num);
78static int MS_CALLBACK file_read(BIO *h,char *buf,int size); 77static int MS_CALLBACK file_read(BIO *h,char *buf,int size);
79static int MS_CALLBACK file_puts(BIO *h,char *str); 78static int MS_CALLBACK file_puts(BIO *h,char *str);
@@ -81,16 +80,6 @@ static int MS_CALLBACK file_gets(BIO *h,char *str,int size);
81static long MS_CALLBACK file_ctrl(BIO *h,int cmd,long arg1,char *arg2); 80static long MS_CALLBACK file_ctrl(BIO *h,int cmd,long arg1,char *arg2);
82static int MS_CALLBACK file_new(BIO *h); 81static int MS_CALLBACK file_new(BIO *h);
83static int MS_CALLBACK file_free(BIO *data); 82static int MS_CALLBACK file_free(BIO *data);
84#else
85static int MS_CALLBACK file_write();
86static int MS_CALLBACK file_read();
87static int MS_CALLBACK file_puts();
88static int MS_CALLBACK file_gets();
89static long MS_CALLBACK file_ctrl();
90static int MS_CALLBACK file_new();
91static int MS_CALLBACK file_free();
92#endif
93
94static BIO_METHOD methods_filep= 83static BIO_METHOD methods_filep=
95 { 84 {
96 BIO_TYPE_FILE, 85 BIO_TYPE_FILE,
@@ -104,9 +93,7 @@ static BIO_METHOD methods_filep=
104 file_free, 93 file_free,
105 }; 94 };
106 95
107BIO *BIO_new_file(filename,mode) 96BIO *BIO_new_file(const char *filename, const char *mode)
108char *filename;
109char *mode;
110 { 97 {
111 BIO *ret; 98 BIO *ret;
112 FILE *file; 99 FILE *file;
@@ -125,9 +112,7 @@ char *mode;
125 return(ret); 112 return(ret);
126 } 113 }
127 114
128BIO *BIO_new_fp(stream,close_flag) 115BIO *BIO_new_fp(FILE *stream, int close_flag)
129FILE *stream;
130int close_flag;
131 { 116 {
132 BIO *ret; 117 BIO *ret;
133 118
@@ -138,13 +123,12 @@ int close_flag;
138 return(ret); 123 return(ret);
139 } 124 }
140 125
141BIO_METHOD *BIO_s_file() 126BIO_METHOD *BIO_s_file(void)
142 { 127 {
143 return(&methods_filep); 128 return(&methods_filep);
144 } 129 }
145 130
146static int MS_CALLBACK file_new(bi) 131static int MS_CALLBACK file_new(BIO *bi)
147BIO *bi;
148 { 132 {
149 bi->init=0; 133 bi->init=0;
150 bi->num=0; 134 bi->num=0;
@@ -152,8 +136,7 @@ BIO *bi;
152 return(1); 136 return(1);
153 } 137 }
154 138
155static int MS_CALLBACK file_free(a) 139static int MS_CALLBACK file_free(BIO *a)
156BIO *a;
157 { 140 {
158 if (a == NULL) return(0); 141 if (a == NULL) return(0);
159 if (a->shutdown) 142 if (a->shutdown)
@@ -168,10 +151,7 @@ BIO *a;
168 return(1); 151 return(1);
169 } 152 }
170 153
171static int MS_CALLBACK file_read(b,out,outl) 154static int MS_CALLBACK file_read(BIO *b, char *out, int outl)
172BIO *b;
173char *out;
174int outl;
175 { 155 {
176 int ret=0; 156 int ret=0;
177 157
@@ -182,10 +162,7 @@ int outl;
182 return(ret); 162 return(ret);
183 } 163 }
184 164
185static int MS_CALLBACK file_write(b,in,inl) 165static int MS_CALLBACK file_write(BIO *b, char *in, int inl)
186BIO *b;
187char *in;
188int inl;
189 { 166 {
190 int ret=0; 167 int ret=0;
191 168
@@ -201,11 +178,7 @@ int inl;
201 return(ret); 178 return(ret);
202 } 179 }
203 180
204static long MS_CALLBACK file_ctrl(b,cmd,num,ptr) 181static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, char *ptr)
205BIO *b;
206int cmd;
207long num;
208char *ptr;
209 { 182 {
210 long ret=1; 183 long ret=1;
211 FILE *fp=(FILE *)b->ptr; 184 FILE *fp=(FILE *)b->ptr;
@@ -214,18 +187,20 @@ char *ptr;
214 187
215 switch (cmd) 188 switch (cmd)
216 { 189 {
190 case BIO_C_FILE_SEEK:
217 case BIO_CTRL_RESET: 191 case BIO_CTRL_RESET:
218 ret=(long)fseek(fp,num,0); 192 ret=(long)fseek(fp,num,0);
219 break; 193 break;
220 case BIO_CTRL_EOF: 194 case BIO_CTRL_EOF:
221 ret=(long)feof(fp); 195 ret=(long)feof(fp);
222 break; 196 break;
197 case BIO_C_FILE_TELL:
223 case BIO_CTRL_INFO: 198 case BIO_CTRL_INFO:
224 ret=ftell(fp); 199 ret=ftell(fp);
225 break; 200 break;
226 case BIO_C_SET_FILE_PTR: 201 case BIO_C_SET_FILE_PTR:
227 file_free(b); 202 file_free(b);
228 b->shutdown=(int)num; 203 b->shutdown=(int)num&BIO_CLOSE;
229 b->ptr=(char *)ptr; 204 b->ptr=(char *)ptr;
230 b->init=1; 205 b->init=1;
231#if defined(MSDOS) || defined(WINDOWS) 206#if defined(MSDOS) || defined(WINDOWS)
@@ -307,10 +282,7 @@ char *ptr;
307 return(ret); 282 return(ret);
308 } 283 }
309 284
310static int MS_CALLBACK file_gets(bp,buf,size) 285static int MS_CALLBACK file_gets(BIO *bp, char *buf, int size)
311BIO *bp;
312char *buf;
313int size;
314 { 286 {
315 int ret=0; 287 int ret=0;
316 288
@@ -321,9 +293,7 @@ int size;
321 return(ret); 293 return(ret);
322 } 294 }
323 295
324static int MS_CALLBACK file_puts(bp,str) 296static int MS_CALLBACK file_puts(BIO *bp, char *str)
325BIO *bp;
326char *str;
327 { 297 {
328 int n,ret; 298 int n,ret;
329 299
diff --git a/src/lib/libcrypto/bio/bss_log.c b/src/lib/libcrypto/bio/bss_log.c
new file mode 100644
index 0000000000..db82e757e7
--- /dev/null
+++ b/src/lib/libcrypto/bio/bss_log.c
@@ -0,0 +1,232 @@
1/* crypto/bio/bss_log.c */
2/* ====================================================================
3 * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. All advertising materials mentioning features or use of this
18 * software must display the following acknowledgment:
19 * "This product includes software developed by the OpenSSL Project
20 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
21 *
22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23 * endorse or promote products derived from this software without
24 * prior written permission. For written permission, please contact
25 * licensing@OpenSSL.org.
26 *
27 * 5. Products derived from this software may not be called "OpenSSL"
28 * nor may "OpenSSL" appear in their names without prior written
29 * permission of the OpenSSL Project.
30 *
31 * 6. Redistributions of any form whatsoever must retain the following
32 * acknowledgment:
33 * "This product includes software developed by the OpenSSL Project
34 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
35 *
36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 * OF THE POSSIBILITY OF SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This product includes cryptographic software written by Eric Young
51 * (eay@cryptsoft.com). This product includes software written by Tim
52 * Hudson (tjh@cryptsoft.com).
53 *
54 */
55
56/*
57 Why BIO_s_log?
58
59 BIO_s_log is useful for system daemons (or services under NT).
60 It is one-way BIO, it sends all stuff to syslogd (or event log
61 under NT).
62
63*/
64
65
66#include <stdio.h>
67#include <errno.h>
68
69#ifndef WIN32
70#ifdef __ultrix
71#include <sys/syslog.h>
72#else
73#include <syslog.h>
74#endif
75#endif
76
77#include "cryptlib.h"
78#include <openssl/buffer.h>
79#include <openssl/err.h>
80#ifndef NO_SYSLOG
81
82
83static int MS_CALLBACK slg_write(BIO *h,char *buf,int num);
84static int MS_CALLBACK slg_puts(BIO *h,char *str);
85static long MS_CALLBACK slg_ctrl(BIO *h,int cmd,long arg1,char *arg2);
86static int MS_CALLBACK slg_new(BIO *h);
87static int MS_CALLBACK slg_free(BIO *data);
88static int xopenlog(BIO* bp, const char* name, int level);
89static int xcloselog(BIO* bp);
90
91static BIO_METHOD methods_slg=
92 {
93 BIO_TYPE_MEM,"syslog",
94 slg_write,
95 NULL,
96 slg_puts,
97 NULL,
98 slg_ctrl,
99 slg_new,
100 slg_free,
101 };
102
103BIO_METHOD *BIO_s_log(void)
104 {
105 return(&methods_slg);
106 }
107
108static int MS_CALLBACK slg_new(BIO *bi)
109 {
110 bi->init=1;
111 bi->num=0;
112 bi->ptr=NULL;
113#ifndef WIN32
114 xopenlog(bi, "application", LOG_DAEMON);
115#else
116 xopenlog(bi, "application", 0);
117#endif
118 return(1);
119 }
120
121static int MS_CALLBACK slg_free(BIO *a)
122 {
123 if (a == NULL) return(0);
124 xcloselog(a);
125 return(1);
126 }
127
128static int MS_CALLBACK slg_write(BIO *b, char *in, int inl)
129 {
130 int ret= inl;
131 char* buf= in;
132 char* pp;
133#if defined(WIN32)
134 LPTSTR lpszStrings[1];
135 WORD evtype= EVENTLOG_ERROR_TYPE;
136#else
137 int priority;
138#endif
139
140 if((buf= (char *)Malloc(inl+ 1)) == NULL){
141 return(0);
142 }
143 strncpy(buf, in, inl);
144 buf[inl]= '\0';
145#if defined(WIN32)
146 if(strncmp(buf, "ERR ", 4) == 0){
147 evtype= EVENTLOG_ERROR_TYPE;
148 pp= buf+ 4;
149 }else if(strncmp(buf, "WAR ", 4) == 0){
150 evtype= EVENTLOG_WARNING_TYPE;
151 pp= buf+ 4;
152 }else if(strncmp(buf, "INF ", 4) == 0){
153 evtype= EVENTLOG_INFORMATION_TYPE;
154 pp= buf+ 4;
155 }else{
156 evtype= EVENTLOG_ERROR_TYPE;
157 pp= buf;
158 }
159 lpszStrings[0]= pp;
160
161 if(b->ptr)
162 ReportEvent(b->ptr, evtype, 0, 1024, NULL, 1, 0,
163 lpszStrings, NULL);
164#else
165 if(strncmp(buf, "ERR ", 4) == 0){
166 priority= LOG_ERR;
167 pp= buf+ 4;
168 }else if(strncmp(buf, "WAR ", 4) == 0){
169 priority= LOG_WARNING;
170 pp= buf+ 4;
171 }else if(strncmp(buf, "INF ", 4) == 0){
172 priority= LOG_INFO;
173 pp= buf+ 4;
174 }else{
175 priority= LOG_ERR;
176 pp= buf;
177 }
178
179 syslog(priority, "%s", pp);
180#endif
181 Free(buf);
182 return(ret);
183 }
184
185static long MS_CALLBACK slg_ctrl(BIO *b, int cmd, long num, char *ptr)
186 {
187 switch (cmd)
188 {
189 case BIO_CTRL_SET:
190 xcloselog(b);
191 xopenlog(b, ptr, num);
192 break;
193 default:
194 break;
195 }
196 return(0);
197 }
198
199static int MS_CALLBACK slg_puts(BIO *bp, char *str)
200 {
201 int n,ret;
202
203 n=strlen(str);
204 ret=slg_write(bp,str,n);
205 return(ret);
206 }
207
208static int xopenlog(BIO* bp, const char* name, int level)
209{
210#if defined(WIN32)
211 if((bp->ptr= (char *)RegisterEventSource(NULL, name)) == NULL){
212 return(0);
213 }
214#else
215 openlog(name, LOG_PID|LOG_CONS, level);
216#endif
217 return(1);
218}
219
220static int xcloselog(BIO* bp)
221{
222#if defined(WIN32)
223 if(bp->ptr)
224 DeregisterEventSource((HANDLE)(bp->ptr));
225 bp->ptr= NULL;
226#else
227 closelog();
228#endif
229 return(1);
230}
231
232#endif
diff --git a/src/lib/libcrypto/bio/bss_mem.c b/src/lib/libcrypto/bio/bss_mem.c
index 40c4e39f02..7e749a503e 100644
--- a/src/lib/libcrypto/bio/bss_mem.c
+++ b/src/lib/libcrypto/bio/bss_mem.c
@@ -59,9 +59,8 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include "bio.h" 62#include <openssl/bio.h>
63 63
64#ifndef NOPROTO
65static int mem_write(BIO *h,char *buf,int num); 64static int mem_write(BIO *h,char *buf,int num);
66static int mem_read(BIO *h,char *buf,int size); 65static int mem_read(BIO *h,char *buf,int size);
67static int mem_puts(BIO *h,char *str); 66static int mem_puts(BIO *h,char *str);
@@ -69,16 +68,6 @@ static int mem_gets(BIO *h,char *str,int size);
69static long mem_ctrl(BIO *h,int cmd,long arg1,char *arg2); 68static long mem_ctrl(BIO *h,int cmd,long arg1,char *arg2);
70static int mem_new(BIO *h); 69static int mem_new(BIO *h);
71static int mem_free(BIO *data); 70static int mem_free(BIO *data);
72#else
73static int mem_write();
74static int mem_read();
75static int mem_puts();
76static int mem_gets();
77static long mem_ctrl();
78static int mem_new();
79static int mem_free();
80#endif
81
82static BIO_METHOD mem_method= 71static BIO_METHOD mem_method=
83 { 72 {
84 BIO_TYPE_MEM, 73 BIO_TYPE_MEM,
@@ -92,13 +81,15 @@ static BIO_METHOD mem_method=
92 mem_free, 81 mem_free,
93 }; 82 };
94 83
95BIO_METHOD *BIO_s_mem() 84/* bio->num is used to hold the value to return on 'empty', if it is
85 * 0, should_retry is not set */
86
87BIO_METHOD *BIO_s_mem(void)
96 { 88 {
97 return(&mem_method); 89 return(&mem_method);
98 } 90 }
99 91
100static int mem_new(bi) 92static int mem_new(BIO *bi)
101BIO *bi;
102 { 93 {
103 BUF_MEM *b; 94 BUF_MEM *b;
104 95
@@ -106,13 +97,12 @@ BIO *bi;
106 return(0); 97 return(0);
107 bi->shutdown=1; 98 bi->shutdown=1;
108 bi->init=1; 99 bi->init=1;
109 bi->num=0; 100 bi->num= -1;
110 bi->ptr=(char *)b; 101 bi->ptr=(char *)b;
111 return(1); 102 return(1);
112 } 103 }
113 104
114static int mem_free(a) 105static int mem_free(BIO *a)
115BIO *a;
116 { 106 {
117 if (a == NULL) return(0); 107 if (a == NULL) return(0);
118 if (a->shutdown) 108 if (a->shutdown)
@@ -126,10 +116,7 @@ BIO *a;
126 return(1); 116 return(1);
127 } 117 }
128 118
129static int mem_read(b,out,outl) 119static int mem_read(BIO *b, char *out, int outl)
130BIO *b;
131char *out;
132int outl;
133 { 120 {
134 int ret= -1; 121 int ret= -1;
135 BUF_MEM *bm; 122 BUF_MEM *bm;
@@ -151,16 +138,14 @@ int outl;
151 } 138 }
152 else if (bm->length == 0) 139 else if (bm->length == 0)
153 { 140 {
154 BIO_set_retry_read(b); 141 if (b->num != 0)
155 ret= -1; 142 BIO_set_retry_read(b);
143 ret= b->num;
156 } 144 }
157 return(ret); 145 return(ret);
158 } 146 }
159 147
160static int mem_write(b,in,inl) 148static int mem_write(BIO *b, char *in, int inl)
161BIO *b;
162char *in;
163int inl;
164 { 149 {
165 int ret= -1; 150 int ret= -1;
166 int blen; 151 int blen;
@@ -183,11 +168,7 @@ end:
183 return(ret); 168 return(ret);
184 } 169 }
185 170
186static long mem_ctrl(b,cmd,num,ptr) 171static long mem_ctrl(BIO *b, int cmd, long num, char *ptr)
187BIO *b;
188int cmd;
189long num;
190char *ptr;
191 { 172 {
192 long ret=1; 173 long ret=1;
193 char **pptr; 174 char **pptr;
@@ -204,6 +185,9 @@ char *ptr;
204 case BIO_CTRL_EOF: 185 case BIO_CTRL_EOF:
205 ret=(long)(bm->length == 0); 186 ret=(long)(bm->length == 0);
206 break; 187 break;
188 case BIO_C_SET_BUF_MEM_EOF_RETURN:
189 b->num=(int)num;
190 break;
207 case BIO_CTRL_INFO: 191 case BIO_CTRL_INFO:
208 ret=(long)bm->length; 192 ret=(long)bm->length;
209 if (ptr != NULL) 193 if (ptr != NULL)
@@ -250,10 +234,7 @@ char *ptr;
250 return(ret); 234 return(ret);
251 } 235 }
252 236
253static int mem_gets(bp,buf,size) 237static int mem_gets(BIO *bp, char *buf, int size)
254BIO *bp;
255char *buf;
256int size;
257 { 238 {
258 int i,j; 239 int i,j;
259 int ret= -1; 240 int ret= -1;
@@ -283,9 +264,7 @@ int size;
283 return(ret); 264 return(ret);
284 } 265 }
285 266
286static int mem_puts(bp,str) 267static int mem_puts(BIO *bp, char *str)
287BIO *bp;
288char *str;
289 { 268 {
290 int n,ret; 269 int n,ret;
291 270
diff --git a/src/lib/libcrypto/bio/bss_null.c b/src/lib/libcrypto/bio/bss_null.c
index 0791a2471a..d04be888e5 100644
--- a/src/lib/libcrypto/bio/bss_null.c
+++ b/src/lib/libcrypto/bio/bss_null.c
@@ -59,9 +59,8 @@
59#include <stdio.h> 59#include <stdio.h>
60#include <errno.h> 60#include <errno.h>
61#include "cryptlib.h" 61#include "cryptlib.h"
62#include "bio.h" 62#include <openssl/bio.h>
63 63
64#ifndef NOPROTO
65static int null_write(BIO *h,char *buf,int num); 64static int null_write(BIO *h,char *buf,int num);
66static int null_read(BIO *h,char *buf,int size); 65static int null_read(BIO *h,char *buf,int size);
67static int null_puts(BIO *h,char *str); 66static int null_puts(BIO *h,char *str);
@@ -69,16 +68,6 @@ static int null_gets(BIO *h,char *str,int size);
69static long null_ctrl(BIO *h,int cmd,long arg1,char *arg2); 68static long null_ctrl(BIO *h,int cmd,long arg1,char *arg2);
70static int null_new(BIO *h); 69static int null_new(BIO *h);
71static int null_free(BIO *data); 70static int null_free(BIO *data);
72#else
73static int null_write();
74static int null_read();
75static int null_puts();
76static int null_gets();
77static long null_ctrl();
78static int null_new();
79static int null_free();
80#endif
81
82static BIO_METHOD null_method= 71static BIO_METHOD null_method=
83 { 72 {
84 BIO_TYPE_NULL, 73 BIO_TYPE_NULL,
@@ -92,13 +81,12 @@ static BIO_METHOD null_method=
92 null_free, 81 null_free,
93 }; 82 };
94 83
95BIO_METHOD *BIO_s_null() 84BIO_METHOD *BIO_s_null(void)
96 { 85 {
97 return(&null_method); 86 return(&null_method);
98 } 87 }
99 88
100static int null_new(bi) 89static int null_new(BIO *bi)
101BIO *bi;
102 { 90 {
103 bi->init=1; 91 bi->init=1;
104 bi->num=0; 92 bi->num=0;
@@ -106,34 +94,23 @@ BIO *bi;
106 return(1); 94 return(1);
107 } 95 }
108 96
109static int null_free(a) 97static int null_free(BIO *a)
110BIO *a;
111 { 98 {
112 if (a == NULL) return(0); 99 if (a == NULL) return(0);
113 return(1); 100 return(1);
114 } 101 }
115 102
116static int null_read(b,out,outl) 103static int null_read(BIO *b, char *out, int outl)
117BIO *b;
118char *out;
119int outl;
120 { 104 {
121 return(0); 105 return(0);
122 } 106 }
123 107
124static int null_write(b,in,inl) 108static int null_write(BIO *b, char *in, int inl)
125BIO *b;
126char *in;
127int inl;
128 { 109 {
129 return(inl); 110 return(inl);
130 } 111 }
131 112
132static long null_ctrl(b,cmd,num,ptr) 113static long null_ctrl(BIO *b, int cmd, long num, char *ptr)
133BIO *b;
134int cmd;
135long num;
136char *ptr;
137 { 114 {
138 long ret=1; 115 long ret=1;
139 116
@@ -159,17 +136,12 @@ char *ptr;
159 return(ret); 136 return(ret);
160 } 137 }
161 138
162static int null_gets(bp,buf,size) 139static int null_gets(BIO *bp, char *buf, int size)
163BIO *bp;
164char *buf;
165int size;
166 { 140 {
167 return(0); 141 return(0);
168 } 142 }
169 143
170static int null_puts(bp,str) 144static int null_puts(BIO *bp, char *str)
171BIO *bp;
172char *str;
173 { 145 {
174 if (str == NULL) return(0); 146 if (str == NULL) return(0);
175 return(strlen(str)); 147 return(strlen(str));
diff --git a/src/lib/libcrypto/bio/bss_rtcp.c b/src/lib/libcrypto/bio/bss_rtcp.c
index 6eb434dee8..2ef040057e 100644
--- a/src/lib/libcrypto/bio/bss_rtcp.c
+++ b/src/lib/libcrypto/bio/bss_rtcp.c
@@ -58,6 +58,7 @@
58 58
59/* Written by David L. Jones <jonesd@kcgl1.eng.ohio-state.edu> 59/* Written by David L. Jones <jonesd@kcgl1.eng.ohio-state.edu>
60 * Date: 22-JUL-1996 60 * Date: 22-JUL-1996
61 * Revised: 25-SEP-1997 Update for 0.8.1, BIO_CTRL_SET -> BIO_C_SET_FD
61 */ 62 */
62/* VMS */ 63/* VMS */
63#include <stdio.h> 64#include <stdio.h>
@@ -65,10 +66,11 @@
65#include <string.h> 66#include <string.h>
66#include <errno.h> 67#include <errno.h>
67#include "cryptlib.h" 68#include "cryptlib.h"
68#include "bio.h" 69#include <openssl/bio.h>
69 70
70#include <iodef.h> /* VMS IO$_ definitions */ 71#include <iodef.h> /* VMS IO$_ definitions */
71extern int SYS$QIOW(); 72#include <starlet.h>
73
72typedef unsigned short io_channel; 74typedef unsigned short io_channel;
73/*************************************************************************/ 75/*************************************************************************/
74struct io_status { short status, count; long flags; }; 76struct io_status { short status, count; long flags; };
@@ -107,18 +109,24 @@ static BIO_METHOD rtcp_method=
107 rtcp_free, 109 rtcp_free,
108 }; 110 };
109 111
110BIO_METHOD *BIO_s_rtcp() 112BIO_METHOD *BIO_s_rtcp(void)
111 { 113 {
112 return(&rtcp_method); 114 return(&rtcp_method);
113 } 115 }
114/*****************************************************************************/ 116/*****************************************************************************/
115/* Decnet I/O routines. 117/* Decnet I/O routines.
116 */ 118 */
119
120#ifdef __DECC
121#pragma message save
122#pragma message disable DOLLARID
123#endif
124
117static int get ( io_channel chan, char *buffer, int maxlen, int *length ) 125static int get ( io_channel chan, char *buffer, int maxlen, int *length )
118{ 126{
119 int status; 127 int status;
120 struct io_status iosb; 128 struct io_status iosb;
121 status = SYS$QIOW ( 0, chan, IO$_READVBLK, &iosb, 0, 0, 129 status = sys$qiow ( 0, chan, IO$_READVBLK, &iosb, 0, 0,
122 buffer, maxlen, 0, 0, 0, 0 ); 130 buffer, maxlen, 0, 0, 0, 0 );
123 if ( (status&1) == 1 ) status = iosb.status; 131 if ( (status&1) == 1 ) status = iosb.status;
124 if ( (status&1) == 1 ) *length = iosb.count; 132 if ( (status&1) == 1 ) *length = iosb.count;
@@ -129,15 +137,19 @@ static int put ( io_channel chan, char *buffer, int length )
129{ 137{
130 int status; 138 int status;
131 struct io_status iosb; 139 struct io_status iosb;
132 status = SYS$QIOW ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0, 140 status = sys$qiow ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0,
133 buffer, length, 0, 0, 0, 0 ); 141 buffer, length, 0, 0, 0, 0 );
134 if ( (status&1) == 1 ) status = iosb.status; 142 if ( (status&1) == 1 ) status = iosb.status;
135 return status; 143 return status;
136} 144}
145
146#ifdef __DECC
147#pragma message restore
148#endif
149
137/***************************************************************************/ 150/***************************************************************************/
138 151
139static int rtcp_new(bi) 152static int rtcp_new(BIO *bi)
140BIO *bi;
141{ 153{
142 struct rpc_ctx *ctx; 154 struct rpc_ctx *ctx;
143 bi->init=1; 155 bi->init=1;
@@ -150,8 +162,7 @@ BIO *bi;
150 return(1); 162 return(1);
151} 163}
152 164
153static int rtcp_free(a) 165static int rtcp_free(BIO *a)
154BIO *a;
155{ 166{
156 if (a == NULL) return(0); 167 if (a == NULL) return(0);
157 if ( a->ptr ) Free ( a->ptr ); 168 if ( a->ptr ) Free ( a->ptr );
@@ -159,10 +170,7 @@ BIO *a;
159 return(1); 170 return(1);
160} 171}
161 172
162static int rtcp_read(b,out,outl) 173static int rtcp_read(BIO *b, char *out, int outl)
163BIO *b;
164char *out;
165int outl;
166{ 174{
167 int status, length; 175 int status, length;
168 struct rpc_ctx *ctx; 176 struct rpc_ctx *ctx;
@@ -209,10 +217,7 @@ int outl;
209 return length; 217 return length;
210} 218}
211 219
212static int rtcp_write(b,in,inl) 220static int rtcp_write(BIO *b, char *in, int inl)
213BIO *b;
214char *in;
215int inl;
216{ 221{
217 int status, i, segment, length; 222 int status, i, segment, length;
218 struct rpc_ctx *ctx; 223 struct rpc_ctx *ctx;
@@ -241,11 +246,7 @@ int inl;
241 return(i); 246 return(i);
242} 247}
243 248
244static long rtcp_ctrl(b,cmd,num,ptr) 249static long rtcp_ctrl(BIO *b, int cmd, long num, char *ptr)
245BIO *b;
246int cmd;
247long num;
248char *ptr;
249 { 250 {
250 long ret=1; 251 long ret=1;
251 252
@@ -255,7 +256,7 @@ char *ptr;
255 case BIO_CTRL_EOF: 256 case BIO_CTRL_EOF:
256 ret = 1; 257 ret = 1;
257 break; 258 break;
258 case BIO_CTRL_SET: 259 case BIO_C_SET_FD:
259 b->num = num; 260 b->num = num;
260 ret = 1; 261 ret = 1;
261 break; 262 break;
@@ -276,17 +277,12 @@ char *ptr;
276 return(ret); 277 return(ret);
277 } 278 }
278 279
279static int rtcp_gets(bp,buf,size) 280static int rtcp_gets(BIO *bp, char *buf, int size)
280BIO *bp;
281char *buf;
282int size;
283 { 281 {
284 return(0); 282 return(0);
285 } 283 }
286 284
287static int rtcp_puts(bp,str) 285static int rtcp_puts(BIO *bp, char *str)
288BIO *bp;
289char *str;
290{ 286{
291 int length; 287 int length;
292 if (str == NULL) return(0); 288 if (str == NULL) return(0);
diff --git a/src/lib/libcrypto/bio/bss_sock.c b/src/lib/libcrypto/bio/bss_sock.c
index d907a2867b..d336b99fe8 100644
--- a/src/lib/libcrypto/bio/bss_sock.c
+++ b/src/lib/libcrypto/bio/bss_sock.c
@@ -62,10 +62,9 @@
62#include <errno.h> 62#include <errno.h>
63#define USE_SOCKETS 63#define USE_SOCKETS
64#include "cryptlib.h" 64#include "cryptlib.h"
65#include "bio.h" 65#include <openssl/bio.h>
66 66
67#ifndef BIO_FD 67#ifndef BIO_FD
68#ifndef NOPROTO
69static int sock_write(BIO *h,char *buf,int num); 68static int sock_write(BIO *h,char *buf,int num);
70static int sock_read(BIO *h,char *buf,int size); 69static int sock_read(BIO *h,char *buf,int size);
71static int sock_puts(BIO *h,char *str); 70static int sock_puts(BIO *h,char *str);
@@ -74,18 +73,7 @@ static int sock_new(BIO *h);
74static int sock_free(BIO *data); 73static int sock_free(BIO *data);
75int BIO_sock_should_retry(int s); 74int BIO_sock_should_retry(int s);
76#else 75#else
77static int sock_write();
78static int sock_read();
79static int sock_puts();
80static long sock_ctrl();
81static int sock_new();
82static int sock_free();
83int BIO_sock_should_retry();
84#endif
85
86#else
87 76
88#ifndef NOPROTO
89static int fd_write(BIO *h,char *buf,int num); 77static int fd_write(BIO *h,char *buf,int num);
90static int fd_read(BIO *h,char *buf,int size); 78static int fd_read(BIO *h,char *buf,int size);
91static int fd_puts(BIO *h,char *str); 79static int fd_puts(BIO *h,char *str);
@@ -93,15 +81,6 @@ static long fd_ctrl(BIO *h,int cmd,long arg1,char *arg2);
93static int fd_new(BIO *h); 81static int fd_new(BIO *h);
94static int fd_free(BIO *data); 82static int fd_free(BIO *data);
95int BIO_fd_should_retry(int s); 83int BIO_fd_should_retry(int s);
96#else
97static int fd_write();
98static int fd_read();
99static int fd_puts();
100static long fd_ctrl();
101static int fd_new();
102static int fd_free();
103int BIO_fd_should_retry();
104#endif
105#endif 84#endif
106 85
107#ifndef BIO_FD 86#ifndef BIO_FD
@@ -118,7 +97,7 @@ static BIO_METHOD methods_sockp=
118 sock_free, 97 sock_free,
119 }; 98 };
120 99
121BIO_METHOD *BIO_s_socket() 100BIO_METHOD *BIO_s_socket(void)
122 { 101 {
123 return(&methods_sockp); 102 return(&methods_sockp);
124 } 103 }
@@ -135,19 +114,17 @@ static BIO_METHOD methods_fdp=
135 fd_free, 114 fd_free,
136 }; 115 };
137 116
138BIO_METHOD *BIO_s_fd() 117BIO_METHOD *BIO_s_fd(void)
139 { 118 {
140 return(&methods_fdp); 119 return(&methods_fdp);
141 } 120 }
142#endif 121#endif
143 122
144#ifndef BIO_FD 123#ifndef BIO_FD
145BIO *BIO_new_socket(fd,close_flag) 124BIO *BIO_new_socket(int fd, int close_flag)
146#else 125#else
147BIO *BIO_new_fd(fd,close_flag) 126BIO *BIO_new_fd(int fd,int close_flag)
148#endif 127#endif
149int fd;
150int close_flag;
151 { 128 {
152 BIO *ret; 129 BIO *ret;
153 130
@@ -162,11 +139,10 @@ int close_flag;
162 } 139 }
163 140
164#ifndef BIO_FD 141#ifndef BIO_FD
165static int sock_new(bi) 142static int sock_new(BIO *bi)
166#else 143#else
167static int fd_new(bi) 144static int fd_new(BIO *bi)
168#endif 145#endif
169BIO *bi;
170 { 146 {
171 bi->init=0; 147 bi->init=0;
172 bi->num=0; 148 bi->num=0;
@@ -176,11 +152,10 @@ BIO *bi;
176 } 152 }
177 153
178#ifndef BIO_FD 154#ifndef BIO_FD
179static int sock_free(a) 155static int sock_free(BIO *a)
180#else 156#else
181static int fd_free(a) 157static int fd_free(BIO *a)
182#endif 158#endif
183BIO *a;
184 { 159 {
185 if (a == NULL) return(0); 160 if (a == NULL) return(0);
186 if (a->shutdown) 161 if (a->shutdown)
@@ -189,11 +164,7 @@ BIO *a;
189 { 164 {
190#ifndef BIO_FD 165#ifndef BIO_FD
191 shutdown(a->num,2); 166 shutdown(a->num,2);
192# ifdef WINDOWS
193 closesocket(a->num); 167 closesocket(a->num);
194# else
195 close(a->num);
196# endif
197#else /* BIO_FD */ 168#else /* BIO_FD */
198 close(a->num); 169 close(a->num);
199#endif 170#endif
@@ -206,21 +177,18 @@ BIO *a;
206 } 177 }
207 178
208#ifndef BIO_FD 179#ifndef BIO_FD
209static int sock_read(b,out,outl) 180static int sock_read(BIO *b, char *out, int outl)
210#else 181#else
211static int fd_read(b,out,outl) 182static int fd_read(BIO *b, char *out,int outl)
212#endif 183#endif
213BIO *b;
214char *out;
215int outl;
216 { 184 {
217 int ret=0; 185 int ret=0;
218 186
219 if (out != NULL) 187 if (out != NULL)
220 { 188 {
221#if defined(WINDOWS) && !defined(BIO_FD) 189#ifndef BIO_FD
222 clear_socket_error(); 190 clear_socket_error();
223 ret=recv(b->num,out,outl,0); 191 ret=readsocket(b->num,out,outl);
224#else 192#else
225 clear_sys_error(); 193 clear_sys_error();
226 ret=read(b->num,out,outl); 194 ret=read(b->num,out,outl);
@@ -240,19 +208,16 @@ int outl;
240 } 208 }
241 209
242#ifndef BIO_FD 210#ifndef BIO_FD
243static int sock_write(b,in,inl) 211static int sock_write(BIO *b, char *in, int inl)
244#else 212#else
245static int fd_write(b,in,inl) 213static int fd_write(BIO *b, char *in, int inl)
246#endif 214#endif
247BIO *b;
248char *in;
249int inl;
250 { 215 {
251 int ret; 216 int ret;
252 217
253#if defined(WINDOWS) && !defined(BIO_FD) 218#ifndef BIO_FD
254 clear_socket_error(); 219 clear_socket_error();
255 ret=send(b->num,in,inl,0); 220 ret=writesocket(b->num,in,inl);
256#else 221#else
257 clear_sys_error(); 222 clear_sys_error();
258 ret=write(b->num,in,inl); 223 ret=write(b->num,in,inl);
@@ -271,14 +236,10 @@ int inl;
271 } 236 }
272 237
273#ifndef BIO_FD 238#ifndef BIO_FD
274static long sock_ctrl(b,cmd,num,ptr) 239static long sock_ctrl(BIO *b, int cmd, long num, char *ptr)
275#else 240#else
276static long fd_ctrl(b,cmd,num,ptr) 241static long fd_ctrl(BIO *b, int cmd, long num, char *ptr)
277#endif 242#endif
278BIO *b;
279int cmd;
280long num;
281char *ptr;
282 { 243 {
283 long ret=1; 244 long ret=1;
284 int *ip; 245 int *ip;
@@ -286,14 +247,21 @@ char *ptr;
286 switch (cmd) 247 switch (cmd)
287 { 248 {
288 case BIO_CTRL_RESET: 249 case BIO_CTRL_RESET:
250 num=0;
251 case BIO_C_FILE_SEEK:
289#ifdef BIO_FD 252#ifdef BIO_FD
290 ret=(long)lseek(b->num,0,0); 253 ret=(long)lseek(b->num,num,0);
291#else 254#else
292 ret=0; 255 ret=0;
293#endif 256#endif
294 break; 257 break;
258 case BIO_C_FILE_TELL:
295 case BIO_CTRL_INFO: 259 case BIO_CTRL_INFO:
260#ifdef BIO_FD
261 ret=(long)lseek(b->num,0,1);
262#else
296 ret=0; 263 ret=0;
264#endif
297 break; 265 break;
298 case BIO_C_SET_FD: 266 case BIO_C_SET_FD:
299#ifndef BIO_FD 267#ifndef BIO_FD
@@ -329,7 +297,6 @@ char *ptr;
329 case BIO_CTRL_FLUSH: 297 case BIO_CTRL_FLUSH:
330 ret=1; 298 ret=1;
331 break; 299 break;
332 break;
333 default: 300 default:
334 ret=0; 301 ret=0;
335 break; 302 break;
@@ -338,22 +305,17 @@ char *ptr;
338 } 305 }
339 306
340#ifdef undef 307#ifdef undef
341static int sock_gets(bp,buf,size) 308static int sock_gets(BIO *bp, char *buf,int size)
342BIO *bp;
343char *buf;
344int size;
345 { 309 {
346 return(-1); 310 return(-1);
347 } 311 }
348#endif 312#endif
349 313
350#ifndef BIO_FD 314#ifndef BIO_FD
351static int sock_puts(bp,str) 315static int sock_puts(BIO *bp, char *str)
352#else 316#else
353static int fd_puts(bp,str) 317static int fd_puts(BIO *bp, char *str)
354#endif 318#endif
355BIO *bp;
356char *str;
357 { 319 {
358 int n,ret; 320 int n,ret;
359 321
@@ -367,23 +329,22 @@ char *str;
367 } 329 }
368 330
369#ifndef BIO_FD 331#ifndef BIO_FD
370int BIO_sock_should_retry(i) 332int BIO_sock_should_retry(int i)
371#else 333#else
372int BIO_fd_should_retry(i) 334int BIO_fd_should_retry(int i)
373#endif 335#endif
374int i;
375 { 336 {
376 int err; 337 int err;
377 338
378 if ((i == 0) || (i == -1)) 339 if ((i == 0) || (i == -1))
379 { 340 {
380#if !defined(BIO_FD) && defined(WINDOWS) 341#ifndef BIO_FD
381 err=get_last_socket_error(); 342 err=get_last_socket_error();
382#else 343#else
383 err=get_last_sys_error(); 344 err=get_last_sys_error();
384#endif 345#endif
385 346
386#if defined(WINDOWS) /* more microsoft stupidity */ 347#if defined(WINDOWS) && 0 /* more microsoft stupidity? perhaps not? Ben 4/1/99 */
387 if ((i == -1) && (err == 0)) 348 if ((i == -1) && (err == 0))
388 return(1); 349 return(1);
389#endif 350#endif
@@ -398,11 +359,10 @@ int i;
398 } 359 }
399 360
400#ifndef BIO_FD 361#ifndef BIO_FD
401int BIO_sock_non_fatal_error(err) 362int BIO_sock_non_fatal_error(int err)
402#else 363#else
403int BIO_fd_non_fatal_error(err) 364int BIO_fd_non_fatal_error(int err)
404#endif 365#endif
405int err;
406 { 366 {
407 switch (err) 367 switch (err)
408 { 368 {
@@ -411,8 +371,10 @@ int err;
411 case WSAEWOULDBLOCK: 371 case WSAEWOULDBLOCK:
412# endif 372# endif
413 373
414# if defined(WSAENOTCONN) 374# if 0 /* This appears to always be an error */
375# if defined(WSAENOTCONN)
415 case WSAENOTCONN: 376 case WSAENOTCONN:
377# endif
416# endif 378# endif
417#endif 379#endif
418 380
@@ -452,7 +414,7 @@ int err;
452 case EALREADY: 414 case EALREADY:
453#endif 415#endif
454 return(1); 416 return(1);
455 break; 417 /* break; */
456 default: 418 default:
457 break; 419 break;
458 } 420 }