diff options
author | Andy Polyakov <appro@openssl.org> | 2016-06-21 15:26:18 +0200 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2016-06-22 21:51:53 +0200 |
commit | 094878164de102cf97c4e9f2392f41e03ef2f11c (patch) | |
tree | 2986f580c305211e199e4b92efb4d07c631a1996 /crypto/bio/bss_file.c | |
parent | eeac54ef6d7eedd42a97025ddddaf06777be3c6b (diff) |
Move OS-specific fopen quirks to o_fopen.c.
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'crypto/bio/bss_file.c')
-rw-r--r-- | crypto/bio/bss_file.c | 85 |
1 files changed, 2 insertions, 83 deletions
diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 36099f8a5d..4f79c32bbb 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -61,91 +61,10 @@ static const BIO_METHOD methods_filep = { NULL, }; -static FILE *file_fopen(const char *filename, const char *mode) -{ - 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 (MultiByteToWideChar(CP_UTF8, flags, - filename, len_0, wfilename, sz) && - MultiByteToWideChar(CP_UTF8, 0, mode, strlen(mode) + 1, - wmode, OSSL_NELEM(wmode)) && - (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); - } -# elif defined(__DJGPP__) - { - char *newname = NULL; - - if (!HAS_LFN_SUPPORT(filename)) { - char *iterator; - char lastchar; - - newname = OPENSSL_malloc(strlen(filename) + 1); - if (newname == NULL) - return NULL; - - for(iterator = newname, lastchar = '\0'; - *filename; filename++, iterator++) { - if (lastchar == '/' && filename[0] == '.' - && filename[1] != '.' && filename[1] != '/') { - /* Leading dots are not permitted in plain DOS. */ - *iterator = '_'; - } else { - *iterator = *filename; - } - lastchar = *filename; - } - *iterator = '\0'; - filename = newname; - } - file = fopen(filename, mode); - - OPENSSL_free(newname); - } -# else - file = fopen(filename, mode); -# endif - return (file); -} - BIO *BIO_new_file(const char *filename, const char *mode) { BIO *ret; - FILE *file = file_fopen(filename, mode); + FILE *file = openssl_fopen(filename, mode); int fp_flags = BIO_CLOSE; if (strchr(mode, 'b') == NULL) @@ -363,7 +282,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) else strcat(p, "t"); # endif - fp = file_fopen(ptr, p); + fp = openssl_fopen(ptr, p); if (fp == NULL) { SYSerr(SYS_F_FOPEN, get_last_sys_error()); ERR_add_error_data(5, "fopen('", ptr, "','", p, "')"); |