Engage Applink in mingw. Note that application-side module is not
[openssl.git] / crypto / bio / bss_file.c
index 764b7f837245bbcac673ebec7302e7088aa33e59..dd17802f8fb18b7a7cd204ed81518ad64fd03b17 100644 (file)
@@ -68,7 +68,7 @@
 #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)
@@ -112,6 +112,7 @@ BIO *BIO_new_file(const char *filename, const char *mode)
        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);
        }
@@ -123,6 +124,7 @@ BIO *BIO_new_fp(FILE *stream, int close_flag)
        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);
        }
@@ -137,6 +139,7 @@ static int MS_CALLBACK file_new(BIO *bi)
        bi->init=0;
        bi->num=0;
        bi->ptr=NULL;
+       bi->flags=BIO_FLAGS_UPLINK; /* default to UPLINK */
        return(1);
        }
 
@@ -147,8 +150,12 @@ static int MS_CALLBACK file_free(BIO *a)
                {
                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;
                }
@@ -161,8 +168,11 @@ static int MS_CALLBACK file_read(BIO *b, char *out, int outl)
 
        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);
@@ -178,7 +188,11 @@ static int MS_CALLBACK file_write(BIO *b, const char *in, int inl)
 
        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
@@ -199,20 +213,45 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
                {
        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
+#if defined(__MINGW32__) && defined(__MSVCRT__) && !defined(_IOB_ENTRIES)
+#define _IOB_ENTRIES 20
+#endif
+#if 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
+#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);
@@ -286,7 +325,7 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
                else
                        strcat(p,"t");
 #endif
-fp=fopen(ptr,p);
+               fp=fopen(ptr,p);
                if (fp == NULL)
                        {
                        SYSerr(SYS_F_FOPEN,get_last_sys_error());
@@ -295,8 +334,9 @@ fp=fopen(ptr,p);
                        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. */
@@ -313,7 +353,10 @@ fp=fopen(ptr,p);
                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;