X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fbio%2Fbss_file.c;h=0d44dc388968975751f5d535277118b92be62b18;hb=3167f68faf4cd8f2a29b48785dc8e59ba0a2d25c;hp=33c18e744bd1d1a832d5a0b0c1979d89a5691792;hpb=d02b48c63a58ea4367a0e905979f140b7d090f86;p=oweals%2Fopenssl.git diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 33c18e744b..0d44dc3889 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,13 +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" +#include +#include + +#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); static int MS_CALLBACK file_puts(BIO *h,char *str); @@ -70,19 +80,10 @@ static int MS_CALLBACK file_gets(BIO *h,char *str,int size); static long MS_CALLBACK file_ctrl(BIO *h,int cmd,long arg1,char *arg2); static int MS_CALLBACK file_new(BIO *h); static int MS_CALLBACK file_free(BIO *data); -#else -static int MS_CALLBACK file_write(); -static int MS_CALLBACK file_read(); -static int MS_CALLBACK file_puts(); -static int MS_CALLBACK file_gets(); -static long MS_CALLBACK file_ctrl(); -static int MS_CALLBACK file_new(); -static int MS_CALLBACK file_free(); -#endif - static BIO_METHOD methods_filep= { - BIO_TYPE_FILE,"FILE pointer", + BIO_TYPE_FILE, + "FILE pointer", file_write, file_read, file_puts, @@ -90,69 +91,45 @@ static BIO_METHOD methods_filep= file_ctrl, file_new, file_free, + NULL, }; -#if !defined(WIN16) || defined(APPS_WIN16) -BIO *BIO_new_file(filename,mode) -char *filename; -char *mode; +BIO *BIO_new_file(const char *filename, const char *mode) { BIO *ret; FILE *file; 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) - return(NULL); -#if 0 - if ((ret=BIO_new(BIO_s_file_internal_w16())) == NULL) + if ((ret=BIO_new(BIO_s_file_internal())) == NULL) return(NULL); -#endif BIO_set_fp(ret,file,BIO_CLOSE); return(ret); } -BIO *BIO_new_fp(stream,close_flag) -FILE *stream; -int close_flag; +BIO *BIO_new_fp(FILE *stream, int close_flag) { BIO *ret; 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() +BIO_METHOD *BIO_s_file(void) { return(&methods_filep); } -#else - -BIO_METHOD *BIO_s_file_internal_w16() - { - return(&methods_filep); - } - -#endif - -static int MS_CALLBACK file_new(bi) -BIO *bi; +static int MS_CALLBACK file_new(BIO *bi) { bi->init=0; bi->num=0; @@ -160,8 +137,7 @@ BIO *bi; return(1); } -static int MS_CALLBACK file_free(a) -BIO *a; +static int MS_CALLBACK file_free(BIO *a) { if (a == NULL) return(0); if (a->shutdown) @@ -176,10 +152,7 @@ BIO *a; return(1); } -static int MS_CALLBACK file_read(b,out,outl) -BIO *b; -char *out; -int outl; +static int MS_CALLBACK file_read(BIO *b, char *out, int outl) { int ret=0; @@ -190,10 +163,7 @@ int outl; return(ret); } -static int MS_CALLBACK file_write(b,in,inl) -BIO *b; -char *in; -int inl; +static int MS_CALLBACK file_write(BIO *b, char *in, int inl) { int ret=0; @@ -202,18 +172,14 @@ int inl; if (fwrite(in,(int)inl,1,(FILE *)b->ptr)) ret=inl; /* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */ - /* acording to Tim Hudson , the commented + /* according to Tim Hudson , the commented * out version above can cause 'inl' write calls under * some stupid stdio implementations (VMS) */ } return(ret); } -static long MS_CALLBACK file_ctrl(b,cmd,num,ptr) -BIO *b; -int cmd; -long num; -char *ptr; +static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, char *ptr) { long ret=1; FILE *fp=(FILE *)b->ptr; @@ -222,20 +188,29 @@ char *ptr; switch (cmd) { + case BIO_C_FILE_SEEK: case BIO_CTRL_RESET: ret=(long)fseek(fp,num,0); break; case BIO_CTRL_EOF: ret=(long)feof(fp); break; + case BIO_C_FILE_TELL: case BIO_CTRL_INFO: ret=ftell(fp); break; case BIO_C_SET_FILE_PTR: file_free(b); - b->shutdown=(int)num; + b->shutdown=(int)num&BIO_CLOSE; 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 +242,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; @@ -307,10 +283,7 @@ char *ptr; return(ret); } -static int MS_CALLBACK file_gets(bp,buf,size) -BIO *bp; -char *buf; -int size; +static int MS_CALLBACK file_gets(BIO *bp, char *buf, int size) { int ret=0; @@ -321,9 +294,7 @@ int size; return(ret); } -static int MS_CALLBACK file_puts(bp,str) -BIO *bp; -char *str; +static int MS_CALLBACK file_puts(BIO *bp, char *str) { int n,ret; @@ -332,3 +303,8 @@ char *str; return(ret); } +#endif /* NO_STDIO */ + +#endif /* HEADER_BSS_FILE_C */ + +