Further BUILDENV refinement, further fool-proofing of Makefiles and
[openssl.git] / crypto / bio / bss_file.c
index 826b361fa22322ebaae2257ff0a26431435114c0..764b7f837245bbcac673ebec7302e7088aa33e59 100644 (file)
@@ -213,18 +213,45 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
                b->shutdown=(int)num&BIO_CLOSE;
                b->ptr=(char *)ptr;
                b->init=1;
-#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS)
+               {
+#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(fd,O_TEXT);
+               else
+                       _setmode(fd,O_BINARY);
+#elif defined(OPENSSL_SYS_MSDOS)
+               int fd = fileno((FILE*)ptr);
                /* Set correct text/binary mode */
                if (num & BIO_FP_TEXT)
-                       _setmode(fileno((FILE *)ptr),_O_TEXT);
+                       _setmode(fd,_O_TEXT);
+               /* Dangerous to set stdin/stdout to raw (unless redirected) */
                else
-                       _setmode(fileno((FILE *)ptr),_O_BINARY);
+                       {
+                       if (fd == STDIN_FILENO || fd == STDOUT_FILENO)
+                               {
+                               if (isatty(fd) <= 0)
+                                       _setmode(fd,_O_BINARY);
+                               }
+                       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);
@@ -232,28 +259,34 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
                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)
+#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
+                       strcat(p,"t");
+#endif
+#if defined(OPENSSL_SYS_NETWARE)
                if (!(num & BIO_FP_TEXT))
                        strcat(p,"b");
                else
                        strcat(p,"t");
 #endif
-               fp=fopen(ptr,p);
+fp=fopen(ptr,p);
                if (fp == NULL)
                        {
                        SYSerr(SYS_F_FOPEN,get_last_sys_error());