#include <stdio.h>
#include <errno.h>
#include "cryptlib.h"
-#include <openssl/bio.h>
+#include "bio_lcl.h"
#include <openssl/err.h>
#if !defined(OPENSSL_NO_STDIO)
if ((ret=BIO_new(BIO_s_file_internal())) == NULL)
return(NULL);
+ BIO_clear_flags(ret,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
BIO_set_fp(ret,file,BIO_CLOSE);
return(ret);
}
if ((ret=BIO_new(BIO_s_file())) == NULL)
return(NULL);
+ BIO_set_flags(ret,BIO_FLAGS_UPLINK); /* redundant, left for documentation puposes */
BIO_set_fp(ret,stream,close_flag);
return(ret);
}
bi->init=0;
bi->num=0;
bi->ptr=NULL;
+ bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */
return(1);
}
{
if ((a->init) && (a->ptr != NULL))
{
- fclose((FILE *)a->ptr);
+ if (a->flags&BIO_FLAGS_UPLINK)
+ UP_fclose (a->ptr);
+ else
+ fclose (a->ptr);
a->ptr=NULL;
+ a->flags=BIO_FLAGS_UPLINK;
}
a->init=0;
}
if (b->init && (out != NULL))
{
- ret=fread(out,1,(int)outl,(FILE *)b->ptr);
- if(ret == 0 && ferror((FILE *)b->ptr))
+ if (b->flags&BIO_FLAGS_UPLINK)
+ ret=UP_fread(out,1,(int)outl,b->ptr);
+ else
+ ret=fread(out,1,(int)outl,(FILE *)b->ptr);
+ if(ret == 0 && (b->flags&BIO_FLAGS_UPLINK)?UP_ferror((FILE *)b->ptr):ferror((FILE *)b->ptr))
{
SYSerr(SYS_F_FREAD,get_last_sys_error());
BIOerr(BIO_F_FILE_READ,ERR_R_SYS_LIB);
if (b->init && (in != NULL))
{
- if (fwrite(in,(int)inl,1,(FILE *)b->ptr))
+ if (b->flags&BIO_FLAGS_UPLINK)
+ ret=UP_fwrite(in,(int)inl,1,b->ptr);
+ else
+ ret=fwrite(in,(int)inl,1,(FILE *)b->ptr);
+ if (ret)
ret=inl;
/* ret=fwrite(in,1,(int)inl,(FILE *)b->ptr); */
/* according to Tim Hudson <tjh@cryptsoft.com>, the commented
{
case BIO_C_FILE_SEEK:
case BIO_CTRL_RESET:
- ret=(long)fseek(fp,num,0);
+ if (b->flags&BIO_FLAGS_UPLINK)
+ ret=(long)UP_fseek(b->ptr,num,0);
+ else
+ ret=(long)fseek(fp,num,0);
break;
case BIO_CTRL_EOF:
- ret=(long)feof(fp);
+ if (b->flags&BIO_FLAGS_UPLINK)
+ ret=(long)UP_feof(fp);
+ else
+ ret=(long)feof(fp);
break;
case BIO_C_FILE_TELL:
case BIO_CTRL_INFO:
- ret=ftell(fp);
+ if (b->flags&BIO_FLAGS_UPLINK)
+ ret=UP_ftell(b->ptr);
+ else
+ ret=ftell(fp);
break;
case BIO_C_SET_FILE_PTR:
file_free(b);
b->shutdown=(int)num&BIO_CLOSE;
- b->ptr=(char *)ptr;
+ b->ptr=ptr;
b->init=1;
+#if BIO_FLAGS_UPLINK!=0 && defined(_IOB_ENTRIES)
+ /* Safety net to catch purely internal BIO_set_fp calls */
+ if ((size_t)ptr >= (size_t)stdin &&
+ (size_t)ptr < (size_t)(stdin+_IOB_ENTRIES))
+ BIO_clear_flags(b,BIO_FLAGS_UPLINK);
+#endif
+#ifdef UP_fsetmode
+ if (b->flags&BIO_FLAGS_UPLINK)
+ UP_fsetmode(b->ptr,num&BIO_FP_TEXT?'t':'b');
+ else
+#endif
+ {
#if defined(OPENSSL_SYS_WINDOWS)
+ int fd = fileno((FILE*)ptr);
if (num & BIO_FP_TEXT)
_setmode(fd,_O_TEXT);
else
_setmode(fd,_O_BINARY);
#elif defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB)
+ int fd = fileno((FILE*)ptr);
/* Under CLib there are differences in file modes
*/
if (num & BIO_FP_TEXT)
- _setmode(fileno((FILE *)ptr),O_TEXT);
+ _setmode(fd,O_TEXT);
else
- _setmode(fileno((FILE *)ptr),O_BINARY);
+ _setmode(fd,O_BINARY);
#elif defined(OPENSSL_SYS_MSDOS)
- {
int fd = fileno((FILE*)ptr);
/* Set correct text/binary mode */
if (num & BIO_FP_TEXT)
else
_setmode(fd,_O_BINARY);
}
- }
#elif defined(OPENSSL_SYS_OS2)
+ int fd = fileno((FILE*)ptr);
if (num & BIO_FP_TEXT)
- setmode(fileno((FILE *)ptr), O_TEXT);
+ setmode(fd, O_TEXT);
else
- setmode(fileno((FILE *)ptr), O_BINARY);
+ setmode(fd, O_BINARY);
#endif
+ }
break;
case BIO_C_SET_FILENAME:
file_free(b);
if (num & BIO_FP_APPEND)
{
if (num & BIO_FP_READ)
- strcpy(p,"a+");
- else strcpy(p,"a");
+ BUF_strlcpy(p,"a+",sizeof p);
+ else BUF_strlcpy(p,"a",sizeof p);
}
else if ((num & BIO_FP_READ) && (num & BIO_FP_WRITE))
- strcpy(p,"r+");
+ BUF_strlcpy(p,"r+",sizeof p);
else if (num & BIO_FP_WRITE)
- strcpy(p,"w");
+ BUF_strlcpy(p,"w",sizeof p);
else if (num & BIO_FP_READ)
- strcpy(p,"r");
+ BUF_strlcpy(p,"r",sizeof p);
else
{
BIOerr(BIO_F_FILE_CTRL,BIO_R_BAD_FOPEN_MODE);
ret=0;
break;
}
-#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2)
+#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_OS2) || defined(OPENSSL_SYS_WIN32_CYGWIN)
if (!(num & BIO_FP_TEXT))
strcat(p,"b");
else
else
strcat(p,"t");
#endif
-fp=fopen(ptr,p);
+ fp=fopen(ptr,p);
if (fp == NULL)
{
SYSerr(SYS_F_FOPEN,get_last_sys_error());
ret=0;
break;
}
- b->ptr=(char *)fp;
+ b->ptr=fp;
b->init=1;
+ BIO_clear_flags(b,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
break;
case BIO_C_GET_FILE_PTR:
/* the ptr parameter is actually a FILE ** in this case. */
b->shutdown=(int)num;
break;
case BIO_CTRL_FLUSH:
- fflush((FILE *)b->ptr);
+ if (b->flags&BIO_FLAGS_UPLINK)
+ UP_fflush(b->ptr);
+ else
+ fflush((FILE *)b->ptr);
break;
case BIO_CTRL_DUP:
ret=1;