From 58964a492275ca9a59a0cd9c8155cb2491b4b909 Mon Sep 17 00:00:00 2001 From: "Ralf S. Engelschall" Date: Mon, 21 Dec 1998 10:56:39 +0000 Subject: Import of old SSLeay release: SSLeay 0.9.0b --- crypto/bio/Makefile.ssl | 6 +- crypto/bio/b_dump.c | 2 +- crypto/bio/b_print.c | 2 +- crypto/bio/b_sock.c | 206 +++++++++++++++++++++------- crypto/bio/bf_buff.c | 51 +++++-- crypto/bio/bf_nbio.c | 6 +- crypto/bio/bf_null.c | 6 +- crypto/bio/bio.err | 35 ++--- crypto/bio/bio.h | 199 +++++++++++++++++++-------- crypto/bio/bio_cb.c | 14 +- crypto/bio/bio_err.c | 13 +- crypto/bio/bio_lib.c | 122 +++++++++++++---- crypto/bio/bss_acpt.c | 20 ++- crypto/bio/bss_conn.c | 348 ++++++++++++++++++++++++++++++------------------ crypto/bio/bss_fd.c | 2 +- crypto/bio/bss_file.c | 57 ++++---- crypto/bio/bss_mem.c | 5 +- crypto/bio/bss_null.c | 5 +- crypto/bio/bss_rtcp.c | 5 +- crypto/bio/bss_sock.c | 28 ++-- 20 files changed, 791 insertions(+), 341 deletions(-) (limited to 'crypto/bio') diff --git a/crypto/bio/Makefile.ssl b/crypto/bio/Makefile.ssl index 9d21a3594d..42e11e1c94 100644 --- a/crypto/bio/Makefile.ssl +++ b/crypto/bio/Makefile.ssl @@ -35,7 +35,7 @@ LIBOBJ= bio_lib.o bio_cb.o $(ERRC).o \ SRC= $(LIBSRC) -EXHEADER= bio.h +EXHEADER= bio.h bss_file.c HEADER= $(EXHEADER) ALL= $(GENERAL) $(SRC) $(HEADER) @@ -61,7 +61,7 @@ links: $(TOP)/util/mklink.sh ../../apps $(APPS) install: - @for i in $(EXHEADER) ; \ + @for i in $(EXHEADER) bss_file.c ; \ do \ (cp $$i $(INSTALLTOP)/include/$$i; \ chmod 644 $(INSTALLTOP)/include/$$i ); \ @@ -87,6 +87,6 @@ clean: errors: perl $(TOP)/util/err-ins.pl $(ERR).err $(ERR).h - perl ../err/err_genc.pl $(ERR).h $(ERRC).c + perl ../err/err_genc.pl -s $(ERR).h $(ERRC).c # DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/crypto/bio/b_dump.c b/crypto/bio/b_dump.c index 287aff2a5e..db84ad3d47 100644 --- a/crypto/bio/b_dump.c +++ b/crypto/bio/b_dump.c @@ -1,5 +1,5 @@ /* crypto/bio/b_dump.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written diff --git a/crypto/bio/b_print.c b/crypto/bio/b_print.c index 0296296a7d..cdadeb839a 100644 --- a/crypto/bio/b_print.c +++ b/crypto/bio/b_print.c @@ -1,5 +1,5 @@ /* crypto/bio/b_print.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c index adab62135e..a45909527c 100644 --- a/crypto/bio/b_sock.c +++ b/crypto/bio/b_sock.c @@ -1,5 +1,5 @@ /* crypto/bio/b_sock.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -59,6 +59,7 @@ #ifndef NO_SOCK #include +#include #include #define USE_SOCKETS #include "cryptlib.h" @@ -72,17 +73,37 @@ #define SOCKET_PROTOCOL IPPROTO_TCP #endif +#ifdef SO_MAXCONN +#define MAX_LISTEN SOMAXCONN +#elif defined(SO_MAXCONN) +#define MAX_LISTEN SO_MAXCONN +#else +#define MAX_LISTEN 32 +#endif + #ifdef WINDOWS static int wsa_init_done=0; #endif -unsigned long BIO_ghbn_hits=0L; -unsigned long BIO_ghbn_miss=0L; +static unsigned long BIO_ghbn_hits=0L; +static unsigned long BIO_ghbn_miss=0L; + +#define GHBN_NUM 4 +static struct ghbn_cache_st + { + char name[129]; + struct hostent *ent; + unsigned long order; + } ghbn_cache[GHBN_NUM]; #ifndef NOPROTO static int get_ip(char *str,unsigned char *ip); +static void ghbn_free(struct hostent *a); +static struct hostent *ghbn_dup(struct hostent *a); #else static int get_ip(); +static void ghbn_free(); +static struct hostent *ghbn_dup(); #endif int BIO_get_host_ip(str,ip) @@ -97,6 +118,7 @@ unsigned char *ip; if (i < 0) { BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_INVALID_IP_ADDRESS); + ERR_add_error_data(2,"host=",str); return(0); } else @@ -107,6 +129,7 @@ unsigned char *ip; if (he == NULL) { BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_BAD_HOSTNAME_LOOKUP); + ERR_add_error_data(2,"host=",str); return(0); } @@ -114,6 +137,7 @@ unsigned char *ip; if ((short)he->h_addrtype != AF_INET) { BIOerr(BIO_F_BIO_GET_HOST_IP,BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET); + ERR_add_error_data(2,"host=",str); return(0); } for (i=0; i<4; i++) @@ -162,7 +186,8 @@ short *port_ptr; #endif else { - SYSerr(SYS_F_GETSERVBYNAME,errno); + SYSerr(SYS_F_GETSERVBYNAME,get_last_socket_error()); + ERR_add_error_data(3,"service='",str,"'"); return(0); } return(1); @@ -186,23 +211,128 @@ int sock; return(j); } -#define GHBN_NUM 4 -static struct ghbn_cache_st +long BIO_ghbn_ctrl(cmd,iarg,parg) +int cmd; +int iarg; +char *parg; { - char name[128]; - struct hostent ent; - unsigned long order; - } ghbn_cache[GHBN_NUM]; + int i; + char **p; + + switch (cmd) + { + case BIO_GHBN_CTRL_HITS: + return(BIO_ghbn_hits); + break; + case BIO_GHBN_CTRL_MISSES: + return(BIO_ghbn_miss); + break; + case BIO_GHBN_CTRL_CACHE_SIZE: + return(GHBN_NUM); + break; + case BIO_GHBN_CTRL_GET_ENTRY: + if ((iarg >= 0) && (iarg 0)) + { + p=(char **)parg; + if (p == NULL) return(0); + *p=ghbn_cache[iarg].name; + ghbn_cache[iarg].name[128]='\0'; + return(1); + } + return(0); + break; + case BIO_GHBN_CTRL_FLUSH: + for (i=0; ih_aliases[i] != NULL; i++) + ; + i++; + ret->h_aliases=(char **)malloc(sizeof(char *)*i); + memset(ret->h_aliases,0,sizeof(char *)*i); + if (ret == NULL) goto err; + + for (i=0; a->h_addr_list[i] != NULL; i++) + ; + i++; + ret->h_addr_list=(char **)malloc(sizeof(char *)*i); + memset(ret->h_addr_list,0,sizeof(char *)*i); + if (ret->h_addr_list == NULL) goto err; + + j=strlen(a->h_name)+1; + if ((ret->h_name=malloc(j)) == NULL) goto err; + memcpy((char *)ret->h_name,a->h_name,j); + for (i=0; a->h_aliases[i] != NULL; i++) + { + j=strlen(a->h_aliases[i])+1; + if ((ret->h_aliases[i]=malloc(j)) == NULL) goto err; + memcpy(ret->h_aliases[i],a->h_aliases[i],j); + } + ret->h_length=a->h_length; + ret->h_addrtype=a->h_addrtype; + for (i=0; a->h_addr_list[i] != NULL; i++) + { + if ((ret->h_addr_list[i]=malloc(a->h_length)) == NULL) + goto err; + memcpy(ret->h_addr_list[i],a->h_addr_list[i],a->h_length); + } + return(ret); +err: + if (ret != NULL) + ghbn_free(ret); + return(NULL); + } + +static void ghbn_free(a) +struct hostent *a; + { + int i; + + if (a->h_aliases != NULL) + { + for (i=0; a->h_aliases[i] != NULL; i++) + free(a->h_aliases[i]); + free(a->h_aliases); + } + if (a->h_addr_list != NULL) + { + for (i=0; a->h_addr_list[i] != NULL; i++) + free(a->h_addr_list[i]); + free(a->h_addr_list); + } + if (a->h_name != NULL) free((char *)a->h_name); + free(a); + } struct hostent *BIO_gethostbyname(name) char *name; { struct hostent *ret; - int i,lowi=0; + int i,lowi=0,j; unsigned long low= (unsigned long)-1; +/* return(gethostbyname(name)); */ + CRYPTO_w_lock(CRYPTO_LOCK_BIO_GETHOSTBYNAME); - if (strlen(name) < 128) + j=strlen(name); + if (j < 128) { for (i=0; i 128) return(ret); /* too big to cache */ + /* else add to cache */ + if (ghbn_cache[lowi].ent != NULL) + ghbn_free(ghbn_cache[lowi].ent); + strncpy(ghbn_cache[lowi].name,name,128); - memcpy((char *)&(ghbn_cache[lowi].ent),ret,sizeof(struct hostent)); + ghbn_cache[lowi].ent=ghbn_dup(ret); ghbn_cache[lowi].order=BIO_ghbn_miss+BIO_ghbn_hits; } else { BIO_ghbn_hits++; - ret= &(ghbn_cache[i].ent); + ret= ghbn_cache[i].ent; ghbn_cache[i].order=BIO_ghbn_miss+BIO_ghbn_hits; } CRYPTO_w_unlock(CRYPTO_LOCK_BIO_GETHOSTBYNAME); @@ -284,22 +420,11 @@ int fd; long type; unsigned long *arg; { - int i,err; + int i; -#ifdef WINDOWS i=ioctlsocket(fd,type,arg); -#else - i=ioctl(fd,type,arg); -#endif if (i < 0) - { -#ifdef WINDOWS - err=WSAGetLastError(); -#else - err=errno; -#endif - SYSerr(SYS_F_IOCTLSOCKET,err); - } + SYSerr(SYS_F_IOCTLSOCKET,get_last_socket_error()); return(i); } @@ -401,28 +526,22 @@ char *host; s=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); if (s == INVALID_SOCKET) { -#ifdef WINDOWS - errno=WSAGetLastError(); -#endif - SYSerr(SYS_F_SOCKET,errno); - BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); + SYSerr(SYS_F_SOCKET,get_last_socket_error()); + ERR_add_error_data(3,"port='",host,"'"); + BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_CREATE_SOCKET); goto err; } if (bind(s,(struct sockaddr *)&server,sizeof(server)) == -1) { -#ifdef WINDOWS - errno=WSAGetLastError(); -#endif - SYSerr(SYS_F_BIND,errno); + SYSerr(SYS_F_BIND,get_last_socket_error()); + ERR_add_error_data(3,"port='",host,"'"); BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_BIND_SOCKET); goto err; } - if (listen(s,5) == -1) + if (listen(s,MAX_LISTEN) == -1) { -#ifdef WINDOWS - errno=WSAGetLastError(); -#endif - SYSerr(SYS_F_LISTEN,errno); + SYSerr(SYS_F_BIND,get_last_socket_error()); + ERR_add_error_data(3,"port='",host,"'"); BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET,BIO_R_UNABLE_TO_LISTEN_SOCKET); goto err; } @@ -457,10 +576,7 @@ char **addr; ret=accept(sock,(struct sockaddr *)&from,&len); if (ret == INVALID_SOCKET) { -#ifdef WINDOWS - errno=WSAGetLastError(); -#endif - SYSerr(SYS_F_ACCEPT,errno); + SYSerr(SYS_F_ACCEPT,get_last_socket_error()); BIOerr(BIO_F_BIO_ACCEPT,BIO_R_ACCEPT_ERROR); goto end; } diff --git a/crypto/bio/bf_buff.c b/crypto/bio/bf_buff.c index ac3ba14fe0..7912b88473 100644 --- a/crypto/bio/bf_buff.c +++ b/crypto/bio/bf_buff.c @@ -1,5 +1,5 @@ /* crypto/bio/bf_buff.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -84,7 +84,8 @@ static int buffer_free(); static BIO_METHOD methods_buffer= { - BIO_TYPE_BUFFER,"buffer", + BIO_TYPE_BUFFER, + "buffer", buffer_write, buffer_read, buffer_puts, @@ -329,6 +330,19 @@ char *ptr; if (ret == 0) ret=BIO_ctrl(b->next_bio,cmd,num,ptr); break; + case BIO_C_SET_BUFF_READ_DATA: + if (num > ctx->ibuf_size) + { + p1=Malloc((int)num); + if (p1 == NULL) goto malloc_error; + if (ctx->ibuf != NULL) Free(ctx->ibuf); + ctx->ibuf=p1; + } + ctx->ibuf_off=0; + ctx->ibuf_len=(int)num; + memcpy(ctx->ibuf,ptr,(int)num); + ret=1; + break; case BIO_C_SET_BUFF_SIZE: if (ptr != NULL) { @@ -354,16 +368,15 @@ char *ptr; if ((ibs > DEFAULT_BUFFER_SIZE) && (ibs != ctx->ibuf_size)) { p1=(char *)Malloc((int)num); - if (p1 == NULL) { ret=0; break; } + if (p1 == NULL) goto malloc_error; } if ((obs > DEFAULT_BUFFER_SIZE) && (obs != ctx->obuf_size)) { p2=(char *)Malloc((int)num); if (p2 == NULL) { - ret=0; if (p1 != ctx->ibuf) Free(p1); - break; + goto malloc_error; } } if (ctx->ibuf != p1) @@ -391,7 +404,10 @@ char *ptr; case BIO_CTRL_FLUSH: if (ctx->obuf_len <= 0) + { + ret=BIO_ctrl(b->next_bio,cmd,num,ptr); break; + } for (;;) { @@ -428,6 +444,9 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_ break; } return(ret); +malloc_error: + BIOerr(BIO_F_BUFFER_CTRL,ERR_R_MALLOC_FAILURE); + return(0); } static int buffer_gets(b,buf,size) @@ -436,32 +455,36 @@ char *buf; int size; { BIO_F_BUFFER_CTX *ctx; - int num=0,i; + int num=0,i,flag; char *p; ctx=(BIO_F_BUFFER_CTX *)b->ptr; - size--; + size--; /* reserve space for a '\0' */ BIO_clear_retry_flags(b); for (;;) { - if (ctx->ibuf_len != 0) + if (ctx->ibuf_len > 0) { p= &(ctx->ibuf[ctx->ibuf_off]); - for (i=0; (iibuf_len) && (i<(size-1)); i++) + flag=0; + for (i=0; (iibuf_len) && (iibuf_len-=i; ctx->ibuf_off+=i; - if (p[i] == '\n') + if ((flag) || (i == size)) { - buf[i+1]='\0'; - ctx->ibuf_len--; - ctx->ibuf_off++; + *buf='\0'; return(num); } } diff --git a/crypto/bio/bf_nbio.c b/crypto/bio/bf_nbio.c index b493100ba4..034b3024df 100644 --- a/crypto/bio/bf_nbio.c +++ b/crypto/bio/bf_nbio.c @@ -1,5 +1,5 @@ /* crypto/bio/bf_nbio.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -93,7 +93,8 @@ typedef struct nbio_test_st static BIO_METHOD methods_nbiof= { - BIO_TYPE_NBIO_TEST,"non-blocking IO test filter", + BIO_TYPE_NBIO_TEST, + "non-blocking IO test filter", nbiof_write, nbiof_read, nbiof_puts, @@ -237,6 +238,7 @@ char *ptr; BIO_copy_next_retry(b); break; case BIO_CTRL_DUP: + ret=0L; break; default: ret=BIO_ctrl(b->next_bio,cmd,num,ptr); diff --git a/crypto/bio/bf_null.c b/crypto/bio/bf_null.c index 9864f4a03c..a47a65741a 100644 --- a/crypto/bio/bf_null.c +++ b/crypto/bio/bf_null.c @@ -1,5 +1,5 @@ /* crypto/bio/bf_null.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -85,7 +85,8 @@ static int nullf_free(); static BIO_METHOD methods_nullf= { - BIO_TYPE_NULL_FILTER,"NULL filter", + BIO_TYPE_NULL_FILTER, + "NULL filter", nullf_write, nullf_read, nullf_puts, @@ -166,6 +167,7 @@ char *ptr; BIO_copy_next_retry(b); break; case BIO_CTRL_DUP: + ret=0L; break; default: ret=BIO_ctrl(b->next_bio,cmd,num,ptr); diff --git a/crypto/bio/bio.err b/crypto/bio/bio.err index 3363971b31..6e2f2b63ca 100644 --- a/crypto/bio/bio.err +++ b/crypto/bio/bio.err @@ -14,10 +14,12 @@ #define BIO_F_BIO_READ 110 #define BIO_F_BIO_SOCK_INIT 111 #define BIO_F_BIO_WRITE 112 -#define BIO_F_CONN_STATE 113 -#define BIO_F_FILE_CTRL 114 -#define BIO_F_MEM_WRITE 115 -#define BIO_F_WSASTARTUP 116 +#define BIO_F_BUFFER_CTRL 113 +#define BIO_F_CONN_STATE 114 +#define BIO_F_FILE_CTRL 115 +#define BIO_F_MEM_WRITE 116 +#define BIO_F_SSL_NEW 117 +#define BIO_F_WSASTARTUP 118 /* Reason codes. */ #define BIO_R_ACCEPT_ERROR 100 @@ -29,15 +31,16 @@ #define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 #define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 #define BIO_R_INVALID_IP_ADDRESS 108 -#define BIO_R_NBIO_CONNECT_ERROR 109 -#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 110 -#define BIO_R_NO_HOSTHNAME_SPECIFIED 111 -#define BIO_R_NO_PORT_DEFINED 112 -#define BIO_R_NO_PORT_SPECIFIED 113 -#define BIO_R_NULL_PARAMETER 114 -#define BIO_R_UNABLE_TO_BIND_SOCKET 115 -#define BIO_R_UNABLE_TO_CREATE_SOCKET 116 -#define BIO_R_UNABLE_TO_LISTEN_SOCKET 117 -#define BIO_R_UNINITALISED 118 -#define BIO_R_UNSUPPORTED_METHOD 119 -#define BIO_R_WSASTARTUP 120 +#define BIO_R_KEEPALIVE 109 +#define BIO_R_NBIO_CONNECT_ERROR 110 +#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +#define BIO_R_NO_HOSTHNAME_SPECIFIED 112 +#define BIO_R_NO_PORT_DEFINED 113 +#define BIO_R_NO_PORT_SPECIFIED 114 +#define BIO_R_NULL_PARAMETER 115 +#define BIO_R_UNABLE_TO_BIND_SOCKET 116 +#define BIO_R_UNABLE_TO_CREATE_SOCKET 117 +#define BIO_R_UNABLE_TO_LISTEN_SOCKET 118 +#define BIO_R_UNINITALISED 119 +#define BIO_R_UNSUPPORTED_METHOD 120 +#define BIO_R_WSASTARTUP 121 diff --git a/crypto/bio/bio.h b/crypto/bio/bio.h index 0b2c6e77e1..300b330e00 100644 --- a/crypto/bio/bio.h +++ b/crypto/bio/bio.h @@ -1,5 +1,5 @@ /* crypto/bio/bio.h */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -63,6 +63,8 @@ extern "C" { #endif +#include "crypto.h" + /* These are the 'types' of BIOs */ #define BIO_TYPE_NONE 0 #define BIO_TYPE_MEM (1|0x0400) @@ -78,7 +80,7 @@ extern "C" { #define BIO_TYPE_BASE64 (11|0x0200) /* filter */ #define BIO_TYPE_CONNECT (12|0x0400|0x0100) /* socket - connect */ #define BIO_TYPE_ACCEPT (13|0x0400|0x0100) /* socket for accept */ -#define BIO_TYPE_PROXY_CLIENT (14|0x0400) /* client proxy BIO */ +#define BIO_TYPE_PROXY_CLIENT (14|0x0200) /* client proxy BIO */ #define BIO_TYPE_PROXY_SERVER (15|0x0200) /* server proxy BIO */ #define BIO_TYPE_NBIO_TEST (16|0x0200) /* server proxy BIO */ #define BIO_TYPE_NULL_FILTER (17|0x0200) @@ -107,6 +109,9 @@ extern "C" { #define BIO_CTRL_FLUSH 11 /* opt - 'flush' buffered output */ #define BIO_CTRL_DUP 12 /* man - extra stuff for 'duped' BIO */ #define BIO_CTRL_WPENDING 13 /* opt - number of bytes still to write */ +/* callback is int cb(BIO *bio,state,ret); */ +#define BIO_CTRL_SET_CALLBACK 14 /* opt - set callback function */ +#define BIO_CTRL_GET_CALLBACK 15 /* opt - set callback function */ #define BIO_CTRL_SET_FILENAME 30 /* BIO_s_file special */ @@ -122,12 +127,24 @@ extern "C" { #define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL) #define BIO_FLAGS_SHOULD_RETRY 0x08 +/* Used in BIO_gethostbyname() */ +#define BIO_GHBN_CTRL_HITS 1 +#define BIO_GHBN_CTRL_MISSES 2 +#define BIO_GHBN_CTRL_CACHE_SIZE 3 +#define BIO_GHBN_CTRL_GET_ENTRY 4 +#define BIO_GHBN_CTRL_FLUSH 5 + /* Mostly used in the SSL BIO */ -#define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 -#define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 -#define BIO_FLAGS_PROTOCOL_STARTUP 0x40 +/* Not used anymore + * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10 + * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20 + * #define BIO_FLAGS_PROTOCOL_STARTUP 0x40 + */ + +#define BIO_FLAGS_BASE64_NO_NL 0x100 #define BIO_set_flags(b,f) ((b)->flags|=(f)) +#define BIO_get_flags(b) ((b)->flags) #define BIO_set_retry_special(b) \ ((b)->flags|=(BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY)) #define BIO_set_retry_read(b) \ @@ -232,7 +249,7 @@ typedef struct bio_st unsigned long num_read; unsigned long num_write; - char *app_data; + CRYPTO_EX_DATA ex_data; } BIO; typedef struct bio_f_buffer_ctx_struct @@ -250,6 +267,17 @@ typedef struct bio_f_buffer_ctx_struct int obuf_off; /* write/read offset */ } BIO_F_BUFFER_CTX; +/* connect BIO stuff */ +#define BIO_CONN_S_BEFORE 1 +#define BIO_CONN_S_GET_IP 2 +#define BIO_CONN_S_GET_PORT 3 +#define BIO_CONN_S_CREATE_SOCKET 4 +#define BIO_CONN_S_CONNECT 5 +#define BIO_CONN_S_OK 6 +#define BIO_CONN_S_BLOCKED_CONNECT 7 +#define BIO_CONN_S_NBIO 8 +#define BIO_CONN_get_param_hostname BIO_ctrl + #define BIO_number_read(b) ((b)->num_read) #define BIO_number_written(b) ((b)->num_write) @@ -275,19 +303,40 @@ typedef struct bio_f_buffer_ctx_struct #define BIO_C_SSL_MODE 119 #define BIO_C_GET_MD_CTX 120 #define BIO_C_GET_PROXY_PARAM 121 - -#define BIO_set_app_data(s,arg) ((s)->app_data=(char *)arg) -#define BIO_get_app_data(s) ((s)->app_data) +#define BIO_C_SET_BUFF_READ_DATA 122 /* data to read first */ +#define BIO_C_GET_CONNECT 123 +#define BIO_C_GET_ACCEPT 124 +#define BIO_C_SET_SSL_RENEGOTIATE_BYTES 125 +#define BIO_C_GET_SSL_NUM_RENEGOTIATES 126 +#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT 127 + +#define BIO_set_app_data(s,arg) BIO_set_ex_data(s,0,(char *)arg) +#define BIO_get_app_data(s) BIO_get_ex_data(s,0) + +int BIO_get_ex_num(BIO *bio); +int BIO_set_ex_data(BIO *bio,int idx,char *data); +char *BIO_get_ex_data(BIO *bio,int idx); +void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); +int BIO_get_ex_new_index(long argl, char *argp, int (*new_func)(), + int (*dup_func)(), void (*free_func)()); /* BIO_s_connect_socket() */ -#define BIO_set_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) -#define BIO_set_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) +#define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name) +#define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port) +#define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip) +#define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port) +#define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0) +#define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1) +#define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2) +#define BIO_get_conn_int port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port) + #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) /* BIO_s_accept_socket() */ #define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name) +#define BIO_get_accept_port(b) BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0) /* #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */ -#define BIO_set_nbio_accpet(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL) +#define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL) #define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio) #define BIO_do_connect(b) BIO_do_handshake(b) @@ -302,12 +351,14 @@ typedef struct bio_f_buffer_ctx_struct /* BIO *BIO_get_filter_bio(BIO *bio); */ #define BIO_set_proxy_cb(b,cb) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(char *)(cb)) #define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) +#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) #define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp) #define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p)) #define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url)) +#define BIO_get_no_connect_return(b) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL) -#define BIO_set_fd(b,fd,c) BIO_ctrl_int(b,BIO_C_SET_FD,c,fd) +#define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd) #define BIO_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c) #define BIO_set_fp(b,fp,c) BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp) @@ -320,9 +371,19 @@ typedef struct bio_f_buffer_ctx_struct #define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \ BIO_CLOSE|BIO_FP_APPEND,name) +/* WARNING WARNING, this ups the reference count on the read bio of the + * SSL structure. This is because the ssl read BIO is now pointed to by + * the next_bio field in the bio. So when you free the BIO, make sure + * you are doing a BIO_free_all() to catch the underlying BIO. */ #define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl) #define BIO_get_ssl(b,sslp) BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp) #define BIO_set_ssl_mode(b,client) BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL) +#define BIO_set_ssl_renegotiate_bytes(b,num) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL); +#define BIO_get_num_renegotiates(b) \ + BIO_ctrl(b,BIO_C_SET_SSL_NUM_RENEGOTIATES,0,NULL); +#define BIO_set_ssl_renegotiate_timeout(b,seconds) \ + BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL); /* defined in evp.h */ /* #define BIO_set_md(b,md) BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */ @@ -333,11 +394,12 @@ typedef struct bio_f_buffer_ctx_struct /* For the BIO_f_buffer() type */ #define BIO_get_buffer_num_lines(b) BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL) #define BIO_set_buffer_size(b,size) BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL) -#define BIO_set_read_buffer_size(b,size) BIO_ctrl_int(b,BIO_C_SET_BUFF_SIZE,size,0) -#define BIO_set_write_buffer_size(b,size) BIO_ctrl_int(b,BIO_C_SET_BUFF_SIZE,size,1) +#define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0) +#define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1) +#define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf) /* Don't use the next one unless you know what you are doing :-) */ -#define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)ret) +#define BIO_dup_state(b,ret) BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret)) #define BIO_reset(b) (int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL) #define BIO_eof(b) (int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL) @@ -346,10 +408,50 @@ typedef struct bio_f_buffer_ctx_struct #define BIO_pending(b) (int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL) #define BIO_wpending(b) (int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL) #define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) +#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp) +#define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb) /* For the BIO_f_buffer() type */ #define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) +#ifdef NO_STDIO +#define NO_FP_API +#endif + +#ifndef NOPROTO +# if defined(WIN16) && defined(_WINDLL) +BIO_METHOD *BIO_s_file_internal(void); +BIO *BIO_new_file_internal(char *filename, char *mode); +BIO *BIO_new_fp_internal(FILE *stream, int close_flag); +# define BIO_s_file BIO_s_file_internal +# define BIO_new_file BIO_new_file_internal +# define BIO_new_fp BIO_new_fp_internal +# else /* FP_API */ +BIO_METHOD *BIO_s_file(void ); +BIO *BIO_new_file(char *filename, char *mode); +BIO *BIO_new_fp(FILE *stream, int close_flag); +# define BIO_s_file_internal BIO_s_file +# define BIO_new_file_internal BIO_new_file +# define BIO_new_fp_internal BIO_s_file +# endif /* FP_API */ +#else +# if defined(WIN16) && defined(_WINDLL) +BIO_METHOD *BIO_s_file_internal(); +BIO *BIO_new_file_internal(); +BIO *BIO_new_fp_internal(); +# define BIO_s_file BIO_s_file_internal +# define BIO_new_file BIO_new_file_internal +# define BIO_new_fp BIO_new_fp_internal +# else /* FP_API */ +BIO_METHOD *BIO_s_file(); +BIO *BIO_new_file(); +BIO *BIO_new_fp(); +# define BIO_s_file_internal BIO_s_file +# define BIO_new_file_internal BIO_new_file +# define BIO_new_fp_internal BIO_s_file +# endif /* FP_API */ +#endif + #ifndef NOPROTO BIO * BIO_new(BIO_METHOD *type); int BIO_set(BIO *a,BIO_METHOD *type); @@ -359,7 +461,8 @@ int BIO_gets(BIO *bp,char *buf, int size); int BIO_write(BIO *b, char *data, int len); int BIO_puts(BIO *bp,char *buf); long BIO_ctrl(BIO *bp,int cmd,long larg,char *parg); -long BIO_ctrl_int(BIO *bp,int cmd,long larg,int iarg); +char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); +long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); BIO * BIO_push(BIO *b,BIO *append); BIO * BIO_pop(BIO *b); void BIO_free_all(BIO *a); @@ -376,12 +479,6 @@ long _far _loadds BIO_debug_callback(BIO *bio,int cmd,char *argp,int argi, long argl,long ret); #endif -#if !defined(WIN16) || defined(APPS_WIN16) -BIO_METHOD *BIO_s_file(void); -#else -BIO_METHOD *BIO_s_file_internal_w16(void); -#endif - BIO_METHOD *BIO_s_mem(void); BIO_METHOD *BIO_s_socket(void); BIO_METHOD *BIO_s_connect(void); @@ -411,10 +508,6 @@ int BIO_set_tcp_ndelay(int sock,int turn_on); void ERR_load_BIO_strings(void ); -#if !defined(WIN16) || defined(APPS_WIN16) -BIO *BIO_new_file(char *filename, char *mode); -BIO *BIO_new_fp(FILE *stream, int close_flag); -#endif BIO *BIO_new_socket(int sock, int close_flag); BIO *BIO_new_fd(int fd, int close_flag); BIO *BIO_new_connect(char *host_port); @@ -422,6 +515,8 @@ BIO *BIO_new_accept(char *host_port); void BIO_copy_next_retry(BIO *b); +long BIO_ghbn_ctrl(int cmd,int iarg,char *parg); + #else BIO * BIO_new(); @@ -431,8 +526,9 @@ int BIO_read(); int BIO_gets(); int BIO_write(); int BIO_puts(); +char * BIO_ptr_ctrl(); long BIO_ctrl(); -long BIO_ctrl_int(); +long BIO_int_ctrl(); BIO * BIO_push(); BIO * BIO_pop(); void BIO_free_all(); @@ -447,12 +543,6 @@ long BIO_debug_callback(); long _far _loadds BIO_debug_callback(); #endif -#if !defined(WIN16) || defined(APPS_WIN16) -BIO_METHOD *BIO_s_file(); -#else -BIO_METHOD *BIO_s_file_internal_w16(); -#endif - BIO_METHOD *BIO_s_mem(); BIO_METHOD *BIO_s_socket(); BIO_METHOD *BIO_s_connect(); @@ -482,10 +572,6 @@ int BIO_set_tcp_ndelay(); void ERR_load_BIO_strings(); -#if !defined(WIN16) || defined(APPS_WIN16) -BIO *BIO_new_file(); -BIO *BIO_new_fp(); -#endif BIO *BIO_new_socket(); BIO *BIO_new_fd(); BIO *BIO_new_connect(); @@ -493,6 +579,8 @@ BIO *BIO_new_accept(); void BIO_copy_next_retry(); +int BIO_ghbn_ctrl(); + #endif /* Tim Hudson's portable varargs stuff */ @@ -562,10 +650,12 @@ int BIO_printf(); #define BIO_F_BIO_READ 110 #define BIO_F_BIO_SOCK_INIT 111 #define BIO_F_BIO_WRITE 112 -#define BIO_F_CONN_STATE 113 -#define BIO_F_FILE_CTRL 114 -#define BIO_F_MEM_WRITE 115 -#define BIO_F_WSASTARTUP 116 +#define BIO_F_BUFFER_CTRL 113 +#define BIO_F_CONN_STATE 114 +#define BIO_F_FILE_CTRL 115 +#define BIO_F_MEM_WRITE 116 +#define BIO_F_SSL_NEW 117 +#define BIO_F_WSASTARTUP 118 /* Reason codes. */ #define BIO_R_ACCEPT_ERROR 100 @@ -577,18 +667,19 @@ int BIO_printf(); #define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET 106 #define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET 107 #define BIO_R_INVALID_IP_ADDRESS 108 -#define BIO_R_NBIO_CONNECT_ERROR 109 -#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 110 -#define BIO_R_NO_HOSTHNAME_SPECIFIED 111 -#define BIO_R_NO_PORT_DEFINED 112 -#define BIO_R_NO_PORT_SPECIFIED 113 -#define BIO_R_NULL_PARAMETER 114 -#define BIO_R_UNABLE_TO_BIND_SOCKET 115 -#define BIO_R_UNABLE_TO_CREATE_SOCKET 116 -#define BIO_R_UNABLE_TO_LISTEN_SOCKET 117 -#define BIO_R_UNINITALISED 118 -#define BIO_R_UNSUPPORTED_METHOD 119 -#define BIO_R_WSASTARTUP 120 +#define BIO_R_KEEPALIVE 109 +#define BIO_R_NBIO_CONNECT_ERROR 110 +#define BIO_R_NO_ACCEPT_PORT_SPECIFIED 111 +#define BIO_R_NO_HOSTHNAME_SPECIFIED 112 +#define BIO_R_NO_PORT_DEFINED 113 +#define BIO_R_NO_PORT_SPECIFIED 114 +#define BIO_R_NULL_PARAMETER 115 +#define BIO_R_UNABLE_TO_BIND_SOCKET 116 +#define BIO_R_UNABLE_TO_CREATE_SOCKET 117 +#define BIO_R_UNABLE_TO_LISTEN_SOCKET 118 +#define BIO_R_UNINITALISED 119 +#define BIO_R_UNSUPPORTED_METHOD 120 +#define BIO_R_WSASTARTUP 121 #ifdef __cplusplus } diff --git a/crypto/bio/bio_cb.c b/crypto/bio/bio_cb.c index 2f98cd1256..bc6ed9eda1 100644 --- a/crypto/bio/bio_cb.c +++ b/crypto/bio/bio_cb.c @@ -1,5 +1,5 @@ /* crypto/bio/bio_cb.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -87,10 +87,16 @@ long ret; sprintf(p,"Free - %s\n",bio->method->name); break; case BIO_CB_READ: - sprintf(p,"read(%d,%d) - %s\n",bio->num,argi,bio->method->name); + if (bio->method->type & BIO_TYPE_DESCRIPTOR) + sprintf(p,"read(%d,%d) - %s fd=%d\n",bio->num,argi,bio->method->name,bio->num); + else + sprintf(p,"read(%d,%d) - %s\n",bio->num,argi,bio->method->name); break; case BIO_CB_WRITE: - sprintf(p,"write(%d,%d) - %s\n",bio->num,argi,bio->method->name); + if (bio->method->type & BIO_TYPE_DESCRIPTOR) + sprintf(p,"write(%d,%d) - %s fd=%d\n",bio->num,argi,bio->method->name,bio->num); + else + sprintf(p,"write(%d,%d) - %s\n",bio->num,argi,bio->method->name); break; case BIO_CB_PUTS: sprintf(p,"puts() - %s\n",bio->method->name); @@ -124,7 +130,7 @@ long ret; b=(BIO *)bio->cb_arg; if (b != NULL) BIO_write(b,buf,strlen(buf)); -#ifndef WIN16 +#if !defined(NO_STDIO) && !defined(WIN16) else fputs(buf,stderr); #endif diff --git a/crypto/bio/bio_err.c b/crypto/bio/bio_err.c index b78878fcb8..37e14ca107 100644 --- a/crypto/bio/bio_err.c +++ b/crypto/bio/bio_err.c @@ -60,6 +60,7 @@ #include "bio.h" /* BEGIN ERROR CODES */ +#ifndef NO_ERR static ERR_STRING_DATA BIO_str_functs[]= { {ERR_PACK(0,BIO_F_ACPT_STATE,0), "ACPT_STATE"}, @@ -75,9 +76,11 @@ static ERR_STRING_DATA BIO_str_functs[]= {ERR_PACK(0,BIO_F_BIO_READ,0), "BIO_read"}, {ERR_PACK(0,BIO_F_BIO_SOCK_INIT,0), "BIO_sock_init"}, {ERR_PACK(0,BIO_F_BIO_WRITE,0), "BIO_write"}, +{ERR_PACK(0,BIO_F_BUFFER_CTRL,0), "BUFFER_CTRL"}, {ERR_PACK(0,BIO_F_CONN_STATE,0), "CONN_STATE"}, {ERR_PACK(0,BIO_F_FILE_CTRL,0), "FILE_CTRL"}, {ERR_PACK(0,BIO_F_MEM_WRITE,0), "MEM_WRITE"}, +{ERR_PACK(0,BIO_F_SSL_NEW,0), "SSL_NEW"}, {ERR_PACK(0,BIO_F_WSASTARTUP,0), "WSASTARTUP"}, {0,NULL}, }; @@ -93,6 +96,7 @@ static ERR_STRING_DATA BIO_str_reasons[]= {BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET,"error setting nbio on accept socket"}, {BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET ,"gethostbyname addr is not af inet"}, {BIO_R_INVALID_IP_ADDRESS ,"invalid ip address"}, +{BIO_R_KEEPALIVE ,"keepalive"}, {BIO_R_NBIO_CONNECT_ERROR ,"nbio connect error"}, {BIO_R_NO_ACCEPT_PORT_SPECIFIED ,"no accept port specified"}, {BIO_R_NO_HOSTHNAME_SPECIFIED ,"no hosthname specified"}, @@ -108,14 +112,19 @@ static ERR_STRING_DATA BIO_str_reasons[]= {0,NULL}, }; +#endif + void ERR_load_BIO_strings() { static int init=1; - if (init) - { + if (init); + {; init=0; +#ifndef NO_ERR ERR_load_strings(ERR_LIB_BIO,BIO_str_functs); ERR_load_strings(ERR_LIB_BIO,BIO_str_reasons); +#endif + } } diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index 78e896f9ae..7a66b0892e 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -1,5 +1,5 @@ /* crypto/bio/bio_lib.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -58,8 +58,13 @@ #include #include +#include "crypto.h" #include "cryptlib.h" #include "bio.h" +#include "stack.h" + +static STACK *bio_meth=NULL; +static int bio_meth_num=0; BIO *BIO_new(method) BIO_METHOD *method; @@ -89,15 +94,16 @@ BIO_METHOD *method; bio->cb_arg=NULL; bio->init=0; bio->shutdown=1; - bio->num=0; bio->flags=0; bio->retry_reason=0; + bio->num=0; bio->ptr=NULL; bio->prev_bio=NULL; bio->next_bio=NULL; bio->references=1; bio->num_read=0L; bio->num_write=0L; + CRYPTO_new_ex_data(bio_meth,(char *)bio,&bio->ex_data); if (method->create != NULL) if (!method->create(bio)) return(0); @@ -112,7 +118,9 @@ BIO *a; if (a == NULL) return(0); i=CRYPTO_add(&a->references,-1,CRYPTO_LOCK_BIO); - +#ifdef REF_PRINT + REF_PRINT("BIO",a); +#endif if (i > 0) return(1); #ifdef REF_CHECK if (i < 0) @@ -125,6 +133,8 @@ BIO *a; ((i=(int)a->callback(a,BIO_CB_FREE,NULL,0,0L,1L)) <= 0)) return(i); + CRYPTO_free_ex_data(bio_meth,(char *)a,&a->ex_data); + if ((a->method == NULL) || (a->method->destroy == NULL)) return(1); ret=a->method->destroy(a); Free(a); @@ -137,6 +147,7 @@ char *out; int outl; { int i; + long (*cb)(); if ((b == NULL) || (b->method == NULL) || (b->method->bread == NULL)) { @@ -144,8 +155,9 @@ int outl; return(-2); } - if ((b->callback != NULL) && - ((i=(int)b->callback(b,BIO_CB_READ,out,outl,0L,1L)) <= 0)) + cb=b->callback; + if ((cb != NULL) && + ((i=(int)cb(b,BIO_CB_READ,out,outl,0L,1L)) <= 0)) return(i); if (!b->init) @@ -157,8 +169,8 @@ int outl; i=b->method->bread(b,out,outl); if (i > 0) b->num_read+=(unsigned long)i; - if (b->callback != NULL) - i=(int)b->callback(b,BIO_CB_READ|BIO_CB_RETURN,out,outl, + if (cb != NULL) + i=(int)cb(b,BIO_CB_READ|BIO_CB_RETURN,out,outl, 0L,(long)i); return(i); } @@ -169,15 +181,20 @@ char *in; int inl; { int i; + long (*cb)(); + + if (b == NULL) + return(0); - if ((b == NULL) || (b->method == NULL) || (b->method->bwrite == NULL)) + cb=b->callback; + if ((b->method == NULL) || (b->method->bwrite == NULL)) { BIOerr(BIO_F_BIO_WRITE,BIO_R_UNSUPPORTED_METHOD); return(-2); } - if ((b->callback != NULL) && - ((i=(int)b->callback(b,BIO_CB_WRITE,in,inl,0L,1L)) <= 0)) + if ((cb != NULL) && + ((i=(int)cb(b,BIO_CB_WRITE,in,inl,0L,1L)) <= 0)) return(i); if (!b->init) @@ -189,8 +206,8 @@ int inl; i=b->method->bwrite(b,in,inl); if (i > 0) b->num_write+=(unsigned long)i; - if (b->callback != NULL) - i=(int)b->callback(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, + if (cb != NULL) + i=(int)cb(b,BIO_CB_WRITE|BIO_CB_RETURN,in,inl, 0L,(long)i); return(i); } @@ -200,6 +217,7 @@ BIO *b; char *in; { int i; + long (*cb)(); if ((b == NULL) || (b->method == NULL) || (b->method->bputs == NULL)) { @@ -207,8 +225,10 @@ char *in; return(-2); } - if ((b->callback != NULL) && - ((i=(int)b->callback(b,BIO_CB_PUTS,in,0,0L,1L)) <= 0)) + cb=b->callback; + + if ((cb != NULL) && + ((i=(int)cb(b,BIO_CB_PUTS,in,0,0L,1L)) <= 0)) return(i); if (!b->init) @@ -219,8 +239,8 @@ char *in; i=b->method->bputs(b,in); - if (b->callback != NULL) - i=(int)b->callback(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, + if (cb != NULL) + i=(int)cb(b,BIO_CB_PUTS|BIO_CB_RETURN,in,0, 0L,(long)i); return(i); } @@ -231,6 +251,7 @@ char *in; int inl; { int i; + long (*cb)(); if ((b == NULL) || (b->method == NULL) || (b->method->bgets == NULL)) { @@ -238,8 +259,10 @@ int inl; return(-2); } - if ((b->callback != NULL) && - ((i=(int)b->callback(b,BIO_CB_GETS,in,inl,0L,1L)) <= 0)) + cb=b->callback; + + if ((cb != NULL) && + ((i=(int)cb(b,BIO_CB_GETS,in,inl,0L,1L)) <= 0)) return(i); if (!b->init) @@ -250,13 +273,13 @@ int inl; i=b->method->bgets(b,in,inl); - if (b->callback != NULL) - i=(int)b->callback(b,BIO_CB_GETS|BIO_CB_RETURN,in,inl, + if (cb != NULL) + i=(int)cb(b,BIO_CB_GETS|BIO_CB_RETURN,in,inl, 0L,(long)i); return(i); } -long BIO_ctrl_int(b,cmd,larg,iarg) +long BIO_int_ctrl(b,cmd,larg,iarg) BIO *b; int cmd; long larg; @@ -268,6 +291,19 @@ int iarg; return(BIO_ctrl(b,cmd,larg,(char *)&i)); } +char *BIO_ptr_ctrl(b,cmd,larg) +BIO *b; +int cmd; +long larg; + { + char *p=NULL; + + if (BIO_ctrl(b,cmd,larg,(char *)&p) <= 0) + return(NULL); + else + return(p); + } + long BIO_ctrl(b,cmd,larg,parg) BIO *b; int cmd; @@ -275,6 +311,7 @@ long larg; char *parg; { long ret; + long (*cb)(); if (b == NULL) return(0); @@ -284,14 +321,16 @@ char *parg; return(-2); } - if ((b->callback != NULL) && - ((ret=b->callback(b,BIO_CB_CTRL,parg,cmd,larg,1L)) <= 0)) + cb=b->callback; + + if ((cb != NULL) && + ((ret=cb(b,BIO_CB_CTRL,parg,cmd,larg,1L)) <= 0)) return(ret); ret=b->method->ctrl(b,cmd,larg,parg); - if (b->callback != NULL) - ret=b->callback(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, + if (cb != NULL) + ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,parg,cmd, larg,ret); return(ret); } @@ -309,6 +348,7 @@ BIO *b,*bio; lb->next_bio=bio; if (bio != NULL) bio->prev_bio=lb; + /* called to do internal processing */ BIO_ctrl(b,BIO_CTRL_PUSH,0,NULL); return(b); } @@ -420,6 +460,11 @@ BIO *in; BIO_free(new); goto err; } + + /* copy app data */ + if (!CRYPTO_dup_ex_data(bio_meth,&new->ex_data,&bio->ex_data)) + goto err; + if (ret == NULL) { eoc=new; @@ -445,3 +490,30 @@ BIO *b; b->retry_reason=b->next_bio->retry_reason; } +int BIO_get_ex_new_index(argl,argp,new_func,dup_func,free_func) +long argl; +char *argp; +int (*new_func)(); +int (*dup_func)(); +void (*free_func)(); + { + bio_meth_num++; + return(CRYPTO_get_ex_new_index(bio_meth_num-1,&bio_meth, + argl,argp,new_func,dup_func,free_func)); + } + +int BIO_set_ex_data(bio,idx,data) +BIO *bio; +int idx; +char *data; + { + return(CRYPTO_set_ex_data(&(bio->ex_data),idx,data)); + } + +char *BIO_get_ex_data(bio,idx) +BIO *bio; +int idx; + { + return(CRYPTO_get_ex_data(&(bio->ex_data),idx)); + } + diff --git a/crypto/bio/bss_acpt.c b/crypto/bio/bss_acpt.c index 251474198b..e49902fa9f 100644 --- a/crypto/bio/bss_acpt.c +++ b/crypto/bio/bss_acpt.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_acpt.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -121,7 +121,8 @@ void BIO_ACCEPT_free(); static BIO_METHOD methods_acceptp= { - BIO_TYPE_ACCEPT,"socket accept", + BIO_TYPE_ACCEPT, + "socket accept", acpt_write, acpt_read, acpt_puts, @@ -375,6 +376,7 @@ char *ptr; int *ip; long ret=1; BIO_ACCEPT *data; + char **pp; data=(BIO_ACCEPT *)b->ptr; @@ -426,6 +428,20 @@ char *ptr; else ret= -1; break; + case BIO_C_GET_ACCEPT: + if (b->init) + { + if (ptr != NULL) + { + pp=(char **)ptr; + *pp=data->param_addr; + } + else + ret= -1; + } + else + ret= -1; + break; case BIO_CTRL_GET_CLOSE: ret=b->shutdown; break; diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c index 4e31e3c1f8..6e547bf866 100644 --- a/crypto/bio/bss_conn.c +++ b/crypto/bio/bss_conn.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_conn.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -88,6 +88,11 @@ typedef struct bio_connect_st /* int socket; this will be kept in bio->num so that it is * compatable with the bss_sock bio */ int error; + + /* called when the connection is initially made + * callback(BIO,state,ret); The callback should return + * 'ret'. state is for compatablity with the ssl info_callback */ + int (*info_callback)(); } BIO_CONNECT; #ifndef NOPROTO @@ -122,18 +127,10 @@ void BIO_CONNECT_free(); #endif -#define CONN_S_BEFORE 1 -#define CONN_S_GET_IP 2 -#define CONN_S_GET_PORT 3 -#define CONN_S_CREATE_SOCKET 4 -#define CONN_S_CONNECT 5 -#define CONN_S_OK 6 -#define CONN_S_BLOCKED_CONNECT 7 -#define CONN_S_NBIO 8 - static BIO_METHOD methods_connectp= { - BIO_TYPE_CONNECT,"socket connect", + BIO_TYPE_CONNECT, + "socket connect", conn_write, conn_read, conn_puts, @@ -150,143 +147,192 @@ BIO_CONNECT *c; int ret= -1,i; unsigned long l; char *p,*q; + int (*cb)()=NULL; - switch (c->state) - { - case CONN_S_BEFORE: - p=c->param_hostname; - if (p == NULL) - { - BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTHNAME_SPECIFIED); - break; - } - for ( ; *p != '\0'; p++) - { - if ((*p == ':') || (*p == '/')) break; - } + if (c->info_callback != NULL) + cb=c->info_callback; - i= *p; - if ((i == ':') || (i == '/')) + for (;;) + { + switch (c->state) { + case BIO_CONN_S_BEFORE: + p=c->param_hostname; + if (p == NULL) + { + BIOerr(BIO_F_CONN_STATE,BIO_R_NO_HOSTHNAME_SPECIFIED); + goto exit_loop; + } + for ( ; *p != '\0'; p++) + { + if ((*p == ':') || (*p == '/')) break; + } - *(p++)='\0'; - if (i == ':') + i= *p; + if ((i == ':') || (i == '/')) { - for (q=p; *q; q++) - if (*q == '/') - { - *q='\0'; - break; - } - if (c->param_port != NULL) - Free(c->param_port); - c->param_port=BUF_strdup(p); + + *(p++)='\0'; + if (i == ':') + { + for (q=p; *q; q++) + if (*q == '/') + { + *q='\0'; + break; + } + if (c->param_port != NULL) + Free(c->param_port); + c->param_port=BUF_strdup(p); + } } - } - if (p == NULL) - { - BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); + if (p == NULL) + { + BIOerr(BIO_F_CONN_STATE,BIO_R_NO_PORT_SPECIFIED); + ERR_add_error_data(2,"host=",c->param_hostname); + goto exit_loop; + } + c->state=BIO_CONN_S_GET_IP; break; - } - c->state=CONN_S_GET_IP; - case CONN_S_GET_IP: - if (BIO_get_host_ip(c->param_hostname,&(c->ip[0])) <= 0) + case BIO_CONN_S_GET_IP: + if (BIO_get_host_ip(c->param_hostname,&(c->ip[0])) <= 0) + goto exit_loop; + c->state=BIO_CONN_S_GET_PORT; break; - c->state=CONN_S_GET_PORT; - case CONN_S_GET_PORT: - if (BIO_get_port(c->param_port,&c->port) <= 0) + case BIO_CONN_S_GET_PORT: + if (BIO_get_port(c->param_port,&c->port) <= 0) + goto exit_loop; + c->state=BIO_CONN_S_CREATE_SOCKET; break; - c->state=CONN_S_CREATE_SOCKET; - - case CONN_S_CREATE_SOCKET: - /* now setup address */ - memset((char *)&c->them,0,sizeof(c->them)); - c->them.sin_family=AF_INET; - c->them.sin_port=htons((unsigned short)c->port); - l=(unsigned long) - ((unsigned long)c->ip[0]<<24L)| - ((unsigned long)c->ip[1]<<16L)| - ((unsigned long)c->ip[2]<< 8L)| - ((unsigned long)c->ip[3]); - c->them.sin_addr.s_addr=htonl(l); - c->state=CONN_S_CREATE_SOCKET; - - ret=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); - if (ret == INVALID_SOCKET) - { - SYSerr(SYS_F_SOCKET,errno); - BIOerr(BIO_F_CONN_STATE,BIO_R_UNABLE_TO_CREATE_SOCKET); + + case BIO_CONN_S_CREATE_SOCKET: + /* now setup address */ + memset((char *)&c->them,0,sizeof(c->them)); + c->them.sin_family=AF_INET; + c->them.sin_port=htons((unsigned short)c->port); + l=(unsigned long) + ((unsigned long)c->ip[0]<<24L)| + ((unsigned long)c->ip[1]<<16L)| + ((unsigned long)c->ip[2]<< 8L)| + ((unsigned long)c->ip[3]); + c->them.sin_addr.s_addr=htonl(l); + c->state=BIO_CONN_S_CREATE_SOCKET; + + ret=socket(AF_INET,SOCK_STREAM,SOCKET_PROTOCOL); + if (ret == INVALID_SOCKET) + { + SYSerr(SYS_F_SOCKET,get_last_socket_error()); + ERR_add_error_data(4,"host=",c->param_hostname, + ":",c->param_port); + BIOerr(BIO_F_CONN_STATE,BIO_R_UNABLE_TO_CREATE_SOCKET); + goto exit_loop; + } + b->num=ret; + c->state=BIO_CONN_S_NBIO; break; - } - b->num=ret; - c->state=CONN_S_NBIO; - case CONN_S_NBIO: + case BIO_CONN_S_NBIO: #ifdef FIONBIO - if (c->nbio) - { - l=1; - ret=BIO_socket_ioctl(b->num,FIONBIO,&l); - if (ret < 0) + if (c->nbio) { - BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); - break; + l=1; + ret=BIO_socket_ioctl(b->num,FIONBIO,&l); + if (ret < 0) + { + BIOerr(BIO_F_CONN_STATE,BIO_R_ERROR_SETTING_NBIO); + ERR_add_error_data(4,"host=", + c->param_hostname, + ":",c->param_port); + goto exit_loop; + } } - } #endif - c->state=CONN_S_CONNECT; + c->state=BIO_CONN_S_CONNECT; - case CONN_S_CONNECT: - BIO_clear_retry_flags(b); - ret=connect(b->num, - (struct sockaddr *)&c->them, - sizeof(c->them)); - b->retry_reason=0; - if (ret < 0) - { - if (BIO_sock_should_retry(ret)) +#ifdef SO_KEEPALIVE + i=1; + i=setsockopt(b->num,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); + if (i < 0) { - BIO_set_retry_special(b); - c->state=CONN_S_BLOCKED_CONNECT; - b->retry_reason=BIO_RR_CONNECT; + SYSerr(SYS_F_SOCKET,get_last_socket_error()); + ERR_add_error_data(4,"host=",c->param_hostname, + ":",c->param_port); + BIOerr(BIO_F_CONN_STATE,BIO_R_KEEPALIVE); + goto exit_loop; + } +#endif + break; + + case BIO_CONN_S_CONNECT: + BIO_clear_retry_flags(b); + ret=connect(b->num, + (struct sockaddr *)&c->them, + sizeof(c->them)); + b->retry_reason=0; + if (ret < 0) + { + if (BIO_sock_should_retry(ret)) + { + BIO_set_retry_special(b); + c->state=BIO_CONN_S_BLOCKED_CONNECT; + b->retry_reason=BIO_RR_CONNECT; + } + else + { + SYSerr(SYS_F_CONNECT,get_last_socket_error()); + ERR_add_error_data(4,"host=", + c->param_hostname, + ":",c->param_port); + BIOerr(BIO_F_CONN_STATE,BIO_R_CONNECT_ERROR); + } + goto exit_loop; } else + c->state=BIO_CONN_S_OK; + break; + + case BIO_CONN_S_BLOCKED_CONNECT: + i=BIO_sock_error(b->num); + if (i) { - SYSerr(SYS_F_CONNECT,errno); - BIOerr(BIO_F_CONN_STATE,BIO_R_CONNECT_ERROR); + BIO_clear_retry_flags(b); + SYSerr(SYS_F_CONNECT,i); + ERR_add_error_data(4,"host=", + c->param_hostname, + ":",c->param_port); + BIOerr(BIO_F_CONN_STATE,BIO_R_NBIO_CONNECT_ERROR); + ret=0; + goto exit_loop; } - } - else - { + else + c->state=BIO_CONN_S_OK; + break; + + case BIO_CONN_S_OK: ret=1; - c->state=CONN_S_OK; + goto exit_loop; + default: + abort(); + goto exit_loop; } - break; - case CONN_S_BLOCKED_CONNECT: - BIO_clear_retry_flags(b); - i=BIO_sock_error(b->num); - if (i) + if (cb != NULL) { - SYSerr(SYS_F_CONNECT,i); - BIOerr(BIO_F_CONN_STATE,BIO_R_NBIO_CONNECT_ERROR); + if (!(ret=cb((BIO *)b,c->state,ret))) + goto end; } - else - { - c->state=CONN_S_OK; - ret=1; - } - break; + } - case CONN_S_OK: - ret=1; - break; - default: - abort(); + if (1) + { +exit_loop: + if (cb != NULL) + ret=cb((BIO *)b,c->state,ret); } +end: return(ret); } @@ -296,9 +342,10 @@ BIO_CONNECT *BIO_CONNECT_new() if ((ret=(BIO_CONNECT *)Malloc(sizeof(BIO_CONNECT))) == NULL) return(NULL); - ret->state=CONN_S_BEFORE; + ret->state=BIO_CONN_S_BEFORE; ret->param_hostname=NULL; ret->param_port=NULL; + ret->info_callback=NULL; ret->nbio=0; ret->ip[0]=0; ret->ip[1]=0; @@ -346,7 +393,7 @@ BIO *bio; if (bio->num != INVALID_SOCKET) { /* Only do a shutdown if things were established */ - if (c->state == CONN_S_OK) + if (c->state == BIO_CONN_S_OK) shutdown(bio->num,2); # ifdef WINDOWS closesocket(bio->num); @@ -385,15 +432,16 @@ int outl; BIO_CONNECT *data; data=(BIO_CONNECT *)b->ptr; - if (data->state != CONN_S_OK) + if (data->state != BIO_CONN_S_OK) { ret=conn_state(b,data); - if (ret <= 0) return(ret); + if (ret <= 0) + return(ret); } if (out != NULL) { - errno=0; + clear_socket_error(); #if defined(WINDOWS) ret=recv(b->num,out,outl,0); #else @@ -418,13 +466,13 @@ int inl; BIO_CONNECT *data; data=(BIO_CONNECT *)b->ptr; - if (data->state != CONN_S_OK) + if (data->state != BIO_CONN_S_OK) { ret=conn_state(b,data); if (ret <= 0) return(ret); } - errno=0; + clear_socket_error(); #if defined(WINDOWS) ret=send(b->num,in,inl,0); #else @@ -447,6 +495,7 @@ char *ptr; { BIO *dbio; int *ip; + char **pptr; long ret=1; BIO_CONNECT *data; @@ -456,17 +505,43 @@ char *ptr; { case BIO_CTRL_RESET: ret=0; - data->state=CONN_S_BEFORE; + data->state=BIO_CONN_S_BEFORE; conn_close_socket(b); b->flags=0; break; case BIO_C_DO_STATE_MACHINE: /* use this one to start the connection */ - if (!data->state != CONN_S_OK) + if (!data->state != BIO_CONN_S_OK) ret=(long)conn_state(b,data); else ret=1; break; + case BIO_C_GET_CONNECT: + if (ptr != NULL) + { + pptr=(char **)ptr; + if (num == 0) + { + *pptr=data->param_hostname; + + } + else if (num == 1) + { + *pptr=data->param_port; + } + else if (num == 2) + { + *pptr= (char *)&(data->ip[0]); + } + else if (num == 3) + { + *((int *)ptr)=data->port; + } + if ((!b->init) || (ptr == NULL)) + *pptr="not initalised"; + ret=1; + } + break; case BIO_C_SET_CONNECT: if (ptr != NULL) { @@ -483,6 +558,10 @@ char *ptr; Free(data->param_port); data->param_port=BUF_strdup(ptr); } + else if (num == 2) + memcpy(data->ip,ptr,4); + else if (num == 3) + data->port= *(int *)ptr; } break; case BIO_C_SET_NBIO: @@ -514,12 +593,23 @@ char *ptr; case BIO_CTRL_DUP: dbio=(BIO *)ptr; if (data->param_port) - BIO_set_port(dbio,data->param_port); + BIO_set_conn_port(dbio,data->param_port); if (data->param_hostname) - BIO_set_hostname(dbio,data->param_hostname); + BIO_set_conn_hostname(dbio,data->param_hostname); BIO_set_nbio(dbio,data->nbio); + BIO_set_info_callback(dbio,data->info_callback); break; + case BIO_CTRL_SET_CALLBACK: + data->info_callback=(int (*)())ptr; + break; + case BIO_CTRL_GET_CALLBACK: + { + int (**fptr)(); + fptr=(int (**)())ptr; + *fptr=data->info_callback; + } + break; default: ret=0; break; @@ -545,7 +635,7 @@ char *str; ret=BIO_new(BIO_s_connect()); if (ret == NULL) return(NULL); - if (BIO_set_hostname(ret,str)) + if (BIO_set_conn_hostname(ret,str)) return(ret); else { diff --git a/crypto/bio/bss_fd.c b/crypto/bio/bss_fd.c index 06ae229ff6..686c4909a2 100644 --- a/crypto/bio/bss_fd.c +++ b/crypto/bio/bss_fd.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_fd.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 33c18e744b..1484cf849e 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_file.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -56,12 +56,23 @@ * [including the GNU Public Licence.] */ +/* + * 03-Dec-1997 rdenny@dc3.com Fix bug preventing use of stdin/stdout + * with binary data (e.g. asn1parse -inform DER < xxx) under + * Windows + */ + +#ifndef HEADER_BSS_FILE_C +#define HEADER_BSS_FILE_C + #include #include #include "cryptlib.h" #include "bio.h" #include "err.h" +#if !defined(NO_STDIO) + #ifndef NOPROTO static int MS_CALLBACK file_write(BIO *h,char *buf,int num); static int MS_CALLBACK file_read(BIO *h,char *buf,int size); @@ -82,7 +93,8 @@ static int MS_CALLBACK file_free(); static BIO_METHOD methods_filep= { - BIO_TYPE_FILE,"FILE pointer", + BIO_TYPE_FILE, + "FILE pointer", file_write, file_read, file_puts, @@ -92,7 +104,6 @@ static BIO_METHOD methods_filep= file_free, }; -#if !defined(WIN16) || defined(APPS_WIN16) BIO *BIO_new_file(filename,mode) char *filename; char *mode; @@ -102,17 +113,13 @@ char *mode; if ((file=fopen(filename,mode)) == NULL) { - SYSerr(SYS_F_FOPEN,errno); + SYSerr(SYS_F_FOPEN,get_last_sys_error()); + ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); return(NULL); } - - if ((ret=BIO_new(BIO_s_file())) == NULL) + if ((ret=BIO_new(BIO_s_file_internal())) == NULL) return(NULL); -#if 0 - if ((ret=BIO_new(BIO_s_file_internal_w16())) == NULL) - return(NULL); -#endif BIO_set_fp(ret,file,BIO_CLOSE); return(ret); @@ -126,31 +133,16 @@ int close_flag; if ((ret=BIO_new(BIO_s_file())) == NULL) return(NULL); -#if 0 - if ((ret=BIO_new(BIO_s_file_internal_w16())) == NULL) -#endif BIO_set_fp(ret,stream,close_flag); return(ret); } -#endif /* !APPS_WIN16 */ - -#if !defined(WIN16) || defined(APPS_WIN16) BIO_METHOD *BIO_s_file() { return(&methods_filep); } -#else - -BIO_METHOD *BIO_s_file_internal_w16() - { - return(&methods_filep); - } - -#endif - static int MS_CALLBACK file_new(bi) BIO *bi; { @@ -236,6 +228,13 @@ char *ptr; b->shutdown=(int)num; b->ptr=(char *)ptr; b->init=1; +#if defined(MSDOS) || defined(WINDOWS) + /* Set correct text/binary mode */ + if (num & BIO_FP_TEXT) + _setmode(fileno((FILE *)ptr),_O_TEXT); + else + _setmode(fileno((FILE *)ptr),_O_BINARY); +#endif break; case BIO_C_SET_FILENAME: file_free(b); @@ -267,7 +266,8 @@ char *ptr; fp=fopen(ptr,p); if (fp == NULL) { - SYSerr(SYS_F_FOPEN,errno); + SYSerr(SYS_F_FOPEN,get_last_sys_error()); + ERR_add_error_data(5,"fopen('",ptr,"','",p,"')"); BIOerr(BIO_F_FILE_CTRL,ERR_R_SYS_LIB); ret=0; break; @@ -332,3 +332,8 @@ char *str; return(ret); } +#endif /* NO_STDIO */ + +#endif /* HEADER_BSS_FILE_C */ + + diff --git a/crypto/bio/bss_mem.c b/crypto/bio/bss_mem.c index 9b4cf40acf..40c4e39f02 100644 --- a/crypto/bio/bss_mem.c +++ b/crypto/bio/bss_mem.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_mem.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -81,7 +81,8 @@ static int mem_free(); static BIO_METHOD mem_method= { - BIO_TYPE_MEM,"memory buffer", + BIO_TYPE_MEM, + "memory buffer", mem_write, mem_read, mem_puts, diff --git a/crypto/bio/bss_null.c b/crypto/bio/bss_null.c index f93d471121..0791a2471a 100644 --- a/crypto/bio/bss_null.c +++ b/crypto/bio/bss_null.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_null.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -81,7 +81,8 @@ static int null_free(); static BIO_METHOD null_method= { - BIO_TYPE_NULL,"NULL", + BIO_TYPE_NULL, + "NULL", null_write, null_read, null_puts, diff --git a/crypto/bio/bss_rtcp.c b/crypto/bio/bss_rtcp.c index cd48f7ce95..6eb434dee8 100644 --- a/crypto/bio/bss_rtcp.c +++ b/crypto/bio/bss_rtcp.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_rtcp.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -96,7 +96,8 @@ static int rtcp_free(BIO *data); static BIO_METHOD rtcp_method= { - BIO_TYPE_FD,"RTCP", + BIO_TYPE_FD, + "RTCP", rtcp_write, rtcp_read, rtcp_puts, diff --git a/crypto/bio/bss_sock.c b/crypto/bio/bss_sock.c index ac96027051..d907a2867b 100644 --- a/crypto/bio/bss_sock.c +++ b/crypto/bio/bss_sock.c @@ -1,5 +1,5 @@ /* crypto/bio/bss_sock.c */ -/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written @@ -107,7 +107,8 @@ int BIO_fd_should_retry(); #ifndef BIO_FD static BIO_METHOD methods_sockp= { - BIO_TYPE_SOCKET,"socket", + BIO_TYPE_SOCKET, + "socket", sock_write, sock_read, sock_puts, @@ -217,10 +218,11 @@ int outl; if (out != NULL) { - errno=0; #if defined(WINDOWS) && !defined(BIO_FD) + clear_socket_error(); ret=recv(b->num,out,outl,0); #else + clear_sys_error(); ret=read(b->num,out,outl); #endif BIO_clear_retry_flags(b); @@ -248,10 +250,11 @@ int inl; { int ret; - errno=0; #if defined(WINDOWS) && !defined(BIO_FD) + clear_socket_error(); ret=send(b->num,in,inl,0); #else + clear_sys_error(); ret=write(b->num,in,inl); #endif BIO_clear_retry_flags(b); @@ -370,20 +373,25 @@ int BIO_fd_should_retry(i) #endif int i; { + int err; + if ((i == 0) || (i == -1)) { #if !defined(BIO_FD) && defined(WINDOWS) - errno=WSAGetLastError(); + err=get_last_socket_error(); +#else + err=get_last_sys_error(); #endif #if defined(WINDOWS) /* more microsoft stupidity */ - if ((i == -1) && (errno == 0)) + if ((i == -1) && (err == 0)) return(1); #endif + #ifndef BIO_FD - return(BIO_sock_non_fatal_error(errno)); + return(BIO_sock_non_fatal_error(err)); #else - return(BIO_fd_non_fatal_error(errno)); + return(BIO_fd_non_fatal_error(err)); #endif } return(0); @@ -418,6 +426,10 @@ int err; # endif #endif +#if defined(ENOTCONN) + case ENOTCONN: +#endif + #ifdef EINTR case EINTR: #endif -- cgit v1.2.3