1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Revamp fopen implementation, rely on open

This commit is contained in:
Anatol Belski
2017-12-09 11:45:21 +01:00
parent 98416a37f3
commit f3fd860e24
2 changed files with 56 additions and 16 deletions

View File

@@ -57,6 +57,7 @@
#include "win32/time.h"
#include "win32/ioutil.h"
#include "win32/codepage.h"
#include "main/streams/php_stream_plain_wrapper.h"
#include <pathcch.h>
@@ -665,6 +666,46 @@ PW32IO int php_win32_ioutil_access_w(const wchar_t *path, mode_t mode)
return 0;
}/*}}}*/
PW32IO FILE *php_win32_ioutil_fopen_w(const wchar_t *path, const wchar_t *mode)
{/*{{{*/
FILE *ret;
char *modea;
int err = 0, fd, flags;
PHP_WIN32_IOUTIL_CHECK_PATH_W(path, NULL, 0)
/* Using the converter from streams, char only. */
modea = php_win32_cp_w_to_any(mode);
if (!modea) {
err = GetLastError();
SET_ERRNO_FROM_WIN32_CODE(err);
return NULL;
}
if (SUCCESS != php_stream_parse_fopen_modes(modea, &flags)) {
free(modea);
SET_ERRNO_FROM_WIN32_CODE(ERROR_INVALID_PARAMETER);
return NULL;
}
free(modea);
fd = php_win32_ioutil_open_w(path, flags, 0666);
if (0 > fd) {
err = GetLastError();
SET_ERRNO_FROM_WIN32_CODE(err);
return NULL;
}
ret = _wfdopen(fd, mode);
if (!ret) {
err = GetLastError();
php_win32_ioutil_close(fd);
SET_ERRNO_FROM_WIN32_CODE(err);
return NULL;
}
return ret;
}/*}}}*/
/*
* Local variables:
* tab-width: 4

View File

@@ -257,6 +257,7 @@ PW32IO wchar_t *php_win32_ioutil_getcwd_w(wchar_t *buf, size_t len);
PW32IO int php_win32_ioutil_unlink_w(const wchar_t *path);
PW32IO int php_win32_ioutil_access_w(const wchar_t *path, mode_t mode);
PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode);
PW32IO FILE *php_win32_ioutil_fopen_w(const wchar_t *path, const wchar_t *mode);
__forceinline static int php_win32_ioutil_access(const char *path, mode_t mode)
{/*{{{*/
@@ -369,17 +370,13 @@ __forceinline static int php_win32_ioutil_rmdir(const char *path)
return ret;
}/*}}}*/
/* This needs to be improved once long path support is implemented. Use ioutil_open() and then
fdopen() might be the way, if we learn how to convert the mode options (maybe grab the routine
from the streams). That will allow to split for _a and _w. */
__forceinline static FILE *php_win32_ioutil_fopen(const char *patha, const char *modea)
{/*{{{*/
FILE *ret;
wchar_t *pathw;
wchar_t *modew;
int err = 0;
pathw = php_win32_ioutil_any_to_w(patha);
PHP_WIN32_IOUTIL_INIT_W(patha)
if (!pathw) {
SET_ERRNO_FROM_WIN32_CODE(ERROR_INVALID_PARAMETER);
return NULL;
@@ -387,23 +384,25 @@ __forceinline static FILE *php_win32_ioutil_fopen(const char *patha, const char
PHP_WIN32_IOUTIL_CHECK_PATH_W(pathw, NULL, 1)
modew = php_win32_ioutil_ascii_to_w(modea);
if (!modew) {
free(pathw);
modew = php_win32_cp_ascii_to_w(modea);
if (!patha) {
PHP_WIN32_IOUTIL_CLEANUP_W()
SET_ERRNO_FROM_WIN32_CODE(ERROR_INVALID_PARAMETER);
return NULL;
}
ret = _wfopen(pathw, modew);
ret = php_win32_ioutil_fopen_w(pathw, modew);
if (!ret) {
_get_errno(&err);
err = GetLastError();
PHP_WIN32_IOUTIL_CLEANUP_W()
free(modew);
SET_ERRNO_FROM_WIN32_CODE(err);
return NULL;
}
free(pathw);
PHP_WIN32_IOUTIL_CLEANUP_W()
free(modew);
if (!ret) {
_set_errno(err);
}
return ret;
}/*}}}*/
@@ -548,9 +547,9 @@ __forceinline static int php_win32_ioutil_chmod(const char *patha, int mode)
__forceinline static int php_win32_ioutil_mkdir(const char *path, mode_t mode)
{/*{{{*/
int ret;
wchar_t *pathw = php_win32_ioutil_any_to_w(path);
DWORD err = 0;
PHP_WIN32_IOUTIL_INIT_W(path)
if (!pathw) {
SET_ERRNO_FROM_WIN32_CODE(ERROR_INVALID_PARAMETER);
return -1;
@@ -561,7 +560,7 @@ __forceinline static int php_win32_ioutil_mkdir(const char *path, mode_t mode)
err = GetLastError();
}
free(pathw);
PHP_WIN32_IOUTIL_CLEANUP_W()
if (0 > ret) {
SET_ERRNO_FROM_WIN32_CODE(err);