]> git.ipfire.org Git - thirdparty/openssl.git/blobdiff - crypto/bio/bss_file.c
indent has problems with comments that are on the right hand side of a line.
[thirdparty/openssl.git] / crypto / bio / bss_file.c
index 93727685cf5909563332d30e50b3c816c512eaa2..01df9702d6f76f8c91dda87112a2a12ff319a226 100644 (file)
@@ -56,7 +56,7 @@
  * [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
 #include "bio_lcl.h"
 #include <openssl/err.h>
 
+#if defined(OPENSSL_SYS_NETWARE) && defined(NETWARE_CLIB)
+#include <nwfileio.h>
+#endif
+
 #if !defined(OPENSSL_NO_STDIO)
 
-static int MS_CALLBACK file_write(BIO *h, const char *buf, int num);
-static int MS_CALLBACK file_read(BIO *h, char *buf, int size);
-static int MS_CALLBACK file_puts(BIO *h, const char *str);
-static int MS_CALLBACK file_gets(BIO *h, char *str, int size);
-static long MS_CALLBACK file_ctrl(BIO *h, int cmd, long arg1, void *arg2);
-static int MS_CALLBACK file_new(BIO *h);
-static int MS_CALLBACK file_free(BIO *data);
+static int file_write(BIO *h, const char *buf, int num);
+static int file_read(BIO *h, char *buf, int size);
+static int file_puts(BIO *h, const char *str);
+static int file_gets(BIO *h, char *str, int size);
+static long file_ctrl(BIO *h, int cmd, long arg1, void *arg2);
+static int file_new(BIO *h);
+static int file_free(BIO *data);
 static BIO_METHOD methods_filep=
        {
        BIO_TYPE_FILE,
@@ -114,10 +118,58 @@ static BIO_METHOD methods_filep=
 
 BIO *BIO_new_file(const char *filename, const char *mode)
        {
-       BIO *ret;
-       FILE *file;
+       BIO  *ret;
+       FILE *file=NULL;
+
+#if defined(_WIN32) && defined(CP_UTF8)
+       int sz, len_0 = (int)strlen(filename)+1;
+       DWORD flags;
+
+       /*
+        * Basically there are three cases to cover: a) filename is
+        * pure ASCII string; b) actual UTF-8 encoded string and
+        * c) locale-ized string, i.e. one containing 8-bit
+        * characters that are meaningful in current system locale.
+        * If filename is pure ASCII or real UTF-8 encoded string,
+        * MultiByteToWideChar succeeds and _wfopen works. If
+        * filename is locale-ized string, chances are that
+        * MultiByteToWideChar fails reporting
+        * ERROR_NO_UNICODE_TRANSLATION, in which case we fall
+        * back to fopen...
+        */
+       if ((sz=MultiByteToWideChar(CP_UTF8,(flags=MB_ERR_INVALID_CHARS),
+                                       filename,len_0,NULL,0))>0 ||
+           (GetLastError()==ERROR_INVALID_FLAGS &&
+            (sz=MultiByteToWideChar(CP_UTF8,(flags=0),
+                                       filename,len_0,NULL,0))>0)
+          )
+               {
+               WCHAR  wmode[8];
+               WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
 
-       if ((file=fopen(filename,mode)) == NULL)
+               if (MultiByteToWideChar(CP_UTF8,flags,
+                                       filename,len_0,wfilename,sz) &&
+                   MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1,
+                                       wmode,sizeof(wmode)/sizeof(wmode[0])) &&
+                   (file=_wfopen(wfilename,wmode))==NULL &&
+                   (errno==ENOENT || errno==EBADF)
+                  )
+                       {
+                       /*
+                        * UTF-8 decode succeeded, but no file, filename
+                        * could still have been locale-ized...
+                        */
+                       file = fopen(filename,mode);
+                       }
+               }
+       else if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION)
+               {
+               file = fopen(filename,mode);
+               }
+#else
+       file=fopen(filename,mode);      
+#endif
+       if (file == NULL)
                {
                SYSerr(SYS_F_FOPEN,get_last_sys_error());
                ERR_add_error_data(5,"fopen('",filename,"','",mode,"')");
@@ -127,8 +179,11 @@ BIO *BIO_new_file(const char *filename, const char *mode)
                        BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB);
                return(NULL);
                }
-       if ((ret=BIO_new(BIO_s_file_internal())) == NULL)
+       if ((ret=BIO_new(BIO_s_file())) == NULL)
+               {
+               fclose(file);
                return(NULL);
+               }
 
        BIO_clear_flags(ret,BIO_FLAGS_UPLINK); /* we did fopen -> we disengage UPLINK */
        BIO_set_fp(ret,file,BIO_CLOSE);
@@ -152,7 +207,7 @@ BIO_METHOD *BIO_s_file(void)
        return(&methods_filep);
        }
 
-static int MS_CALLBACK file_new(BIO *bi)
+static int file_new(BIO *bi)
        {
        bi->init=0;
        bi->num=0;
@@ -161,7 +216,7 @@ static int MS_CALLBACK file_new(BIO *bi)
        return(1);
        }
 
-static int MS_CALLBACK file_free(BIO *a)
+static int file_free(BIO *a)
        {
        if (a == NULL) return(0);
        if (a->shutdown)
@@ -180,7 +235,7 @@ static int MS_CALLBACK file_free(BIO *a)
        return(1);
        }
        
-static int MS_CALLBACK file_read(BIO *b, char *out, int outl)
+static int file_read(BIO *b, char *out, int outl)
        {
        int ret=0;
 
@@ -200,7 +255,7 @@ static int MS_CALLBACK file_read(BIO *b, char *out, int outl)
        return(ret);
        }
 
-static int MS_CALLBACK file_write(BIO *b, const char *in, int inl)
+static int file_write(BIO *b, const char *in, int inl)
        {
        int ret=0;
 
@@ -220,7 +275,7 @@ static int MS_CALLBACK file_write(BIO *b, const char *in, int inl)
        return(ret);
        }
 
-static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
+static long file_ctrl(BIO *b, int cmd, long num, void *ptr)
        {
        long ret=1;
        FILE *fp=(FILE *)b->ptr;
@@ -265,14 +320,14 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
                        BIO_clear_flags(b,BIO_FLAGS_UPLINK);
 #endif
 #endif
-#ifdef UP_fsetmode
+#ifdef UP_fsetmod
                if (b->flags&BIO_FLAGS_UPLINK)
-                       UP_fsetmode(b->ptr,num&BIO_FP_TEXT?'t':'b');
+                       UP_fsetmod(b->ptr,(char)((num&BIO_FP_TEXT)?'t':'b'));
                else
 #endif
                {
 #if defined(OPENSSL_SYS_WINDOWS)
-               int fd = fileno((FILE*)ptr);
+               int fd = _fileno((FILE*)ptr);
                if (num & BIO_FP_TEXT)
                        _setmode(fd,_O_TEXT);
                else
@@ -281,9 +336,9 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
                int fd = fileno((FILE*)ptr);
                /* Under CLib there are differences in file modes */
                if (num & BIO_FP_TEXT)
-                       _setmode(fd,O_TEXT);
+                       setmode(fd,O_TEXT);
                else
-                       _setmode(fd,O_BINARY);
+                       setmode(fd,O_BINARY);
 #elif defined(OPENSSL_SYS_MSDOS)
                int fd = fileno((FILE*)ptr);
                /* Set correct text/binary mode */
@@ -390,21 +445,28 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
        return(ret);
        }
 
-static int MS_CALLBACK file_gets(BIO *bp, char *buf, int size)
+static int file_gets(BIO *bp, char *buf, int size)
        {
        int ret=0;
 
        buf[0]='\0';
        if (bp->flags&BIO_FLAGS_UPLINK)
-               UP_fgets(buf,size,bp->ptr);
+               {
+               if (!UP_fgets(buf,size,bp->ptr))
+                       goto err;
+               }
        else
-               fgets(buf,size,(FILE *)bp->ptr);
+               {
+               if (!fgets(buf,size,(FILE *)bp->ptr))
+                       goto err;
+               }
        if (buf[0] != '\0')
                ret=strlen(buf);
+       err:
        return(ret);
        }
 
-static int MS_CALLBACK file_puts(BIO *bp, const char *str)
+static int file_puts(BIO *bp, const char *str)
        {
        int n,ret;