Minor cygwin update.
[openssl.git] / crypto / bio / bss_file.c
index cbfe74a5eb1f556dbee32c992f7493b9369da584..764b7f837245bbcac673ebec7302e7088aa33e59 100644 (file)
@@ -103,7 +103,10 @@ BIO *BIO_new_file(const char *filename, const char *mode)
                {
                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);
+               if (errno == ENOENT)
+                       BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE);
+               else
+                       BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB);
                return(NULL);
                }
        if ((ret=BIO_new(BIO_s_file_internal())) == NULL)
@@ -159,6 +162,12 @@ 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))
+                       {
+                       SYSerr(SYS_F_FREAD,get_last_sys_error());
+                       BIOerr(BIO_F_FILE_READ,ERR_R_SYS_LIB);
+                       ret=-1;
+                       }
                }
        return(ret);
        }
@@ -204,13 +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(MSDOS) || defined(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
+                       {
+                       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(fd, O_TEXT);
                else
-                       _setmode(fileno((FILE *)ptr),_O_BINARY);
+                       setmode(fd, O_BINARY);
 #endif
+               }
                break;
        case BIO_C_SET_FILENAME:
                file_free(b);
@@ -218,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(MSDOS) || defined(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());