bss_file.c: reserve for option to encode file name with UTF-8.
authorAndy Polyakov <appro@openssl.org>
Wed, 21 Apr 2010 20:38:21 +0000 (20:38 +0000)
committerAndy Polyakov <appro@openssl.org>
Wed, 21 Apr 2010 20:38:21 +0000 (20:38 +0000)
crypto/bio/bss_file.c

index ba4f8e9940300686b797d890007233b2364627ce..3f458a0c7cb3817faddd34c1efe4ca9928652d13 100644 (file)
@@ -121,7 +121,27 @@ BIO *BIO_new_file(const char *filename, const char *mode)
        BIO *ret;
        FILE *file;
 
        BIO *ret;
        FILE *file;
 
-       if ((file=fopen(filename,mode)) == NULL)
+       file=fopen(filename,mode);      
+#if defined(_WIN32) && defined(CP_UTF8)
+       if (file==NULL && errno==ENOENT) /* see if filename is UTF-8 encoded */
+               {
+               int sz,len_0 = (int)strlen(filename)+1;
+               if ((sz=MultiByteToWideChar(CP_UTF8,0,filename,len_0,
+                                           NULL,0))>0)
+                       {
+                       WCHAR wmode[8];
+                       WCHAR *wfilename = _alloca(sz*sizeof(WCHAR));
+
+                       if (MultiByteToWideChar(CP_UTF8,0,filename,len_0,
+                                               wfilename,sz) &&
+                           MultiByteToWideChar(CP_UTF8,0,mode,strlen(mode)+1,
+                                               wmode,sizeof(wmode)/sizeof(wmode[0]))
+                          )
+                               file = _wfopen(wfilename,wmode);
+                       }
+               }
+#endif
+       if (file == NULL)
                {
                SYSerr(SYS_F_FOPEN,get_last_sys_error());
                ERR_add_error_data(5,"fopen('",filename,"','",mode,"')");
                {
                SYSerr(SYS_F_FOPEN,get_last_sys_error());
                ERR_add_error_data(5,"fopen('",filename,"','",mode,"')");