winpr/file: disable buffering
When FILE streams are used per default buffering is enabled but WriteFile/ReadFile shouldn't do any extra buffering.
This commit is contained in:
parent
5b2f4f50a0
commit
06307f1ac1
@ -107,19 +107,10 @@ static DWORD FileSetFilePointer(HANDLE hFile, LONG lDistanceToMove,
|
|||||||
WINPR_FILE* pFile = (WINPR_FILE*) hFile;
|
WINPR_FILE* pFile = (WINPR_FILE*) hFile;
|
||||||
long offset = lDistanceToMove;
|
long offset = lDistanceToMove;
|
||||||
int whence;
|
int whence;
|
||||||
FILE* fp;
|
|
||||||
|
|
||||||
if (!hFile)
|
if (!hFile)
|
||||||
return INVALID_SET_FILE_POINTER;
|
return INVALID_SET_FILE_POINTER;
|
||||||
|
|
||||||
fp = pFile->fp;
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
{
|
|
||||||
WLog_ERR(TAG, "No file pointer for(%s)", pFile->lpFileName);
|
|
||||||
return INVALID_SET_FILE_POINTER;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(dwMoveMethod)
|
switch(dwMoveMethod)
|
||||||
{
|
{
|
||||||
case FILE_BEGIN:
|
case FILE_BEGIN:
|
||||||
@ -135,14 +126,14 @@ static DWORD FileSetFilePointer(HANDLE hFile, LONG lDistanceToMove,
|
|||||||
return INVALID_SET_FILE_POINTER;
|
return INVALID_SET_FILE_POINTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fseek(fp, offset, whence))
|
if (fseek(pFile->fp, offset, whence))
|
||||||
{
|
{
|
||||||
WLog_ERR(TAG, "fseek(%s) failed with %s [%08X]", pFile->lpFileName,
|
WLog_ERR(TAG, "fseek(%s) failed with %s [%08X]", pFile->lpFileName,
|
||||||
strerror(errno), errno);
|
strerror(errno), errno);
|
||||||
return INVALID_SET_FILE_POINTER;
|
return INVALID_SET_FILE_POINTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ftell(fp);
|
return ftell(pFile->fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL FileRead(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
|
static BOOL FileRead(PVOID Object, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
|
||||||
@ -213,23 +204,14 @@ static BOOL FileWrite(PVOID Object, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrit
|
|||||||
static DWORD FileGetFileSize(HANDLE Object, LPDWORD lpFileSizeHigh)
|
static DWORD FileGetFileSize(HANDLE Object, LPDWORD lpFileSizeHigh)
|
||||||
{
|
{
|
||||||
WINPR_FILE* file;
|
WINPR_FILE* file;
|
||||||
FILE* fp;
|
|
||||||
long cur, size;
|
long cur, size;
|
||||||
|
|
||||||
if (!Object)
|
if (!Object)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
file = (WINPR_FILE *)Object;
|
file = (WINPR_FILE *)Object;
|
||||||
fp = file->fp;
|
|
||||||
|
|
||||||
if (!fp)
|
cur = ftell(file->fp);
|
||||||
{
|
|
||||||
WLog_ERR(TAG, "fopen(%s) failed with %s [%08X]", file->lpFileName,
|
|
||||||
strerror(errno), errno);
|
|
||||||
return INVALID_FILE_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
cur = ftell(fp);
|
|
||||||
|
|
||||||
if (cur < 0)
|
if (cur < 0)
|
||||||
{
|
{
|
||||||
@ -238,14 +220,14 @@ static DWORD FileGetFileSize(HANDLE Object, LPDWORD lpFileSizeHigh)
|
|||||||
return INVALID_FILE_SIZE;
|
return INVALID_FILE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fseek(fp, 0, SEEK_END) != 0)
|
if (fseek(file->fp, 0, SEEK_END) != 0)
|
||||||
{
|
{
|
||||||
WLog_ERR(TAG, "fseek(%s) failed with %s [%08X]", file->lpFileName,
|
WLog_ERR(TAG, "fseek(%s) failed with %s [%08X]", file->lpFileName,
|
||||||
strerror(errno), errno);
|
strerror(errno), errno);
|
||||||
return INVALID_FILE_SIZE;
|
return INVALID_FILE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
size = ftell(fp);
|
size = ftell(file->fp);
|
||||||
|
|
||||||
if (size < 0)
|
if (size < 0)
|
||||||
{
|
{
|
||||||
@ -254,7 +236,7 @@ static DWORD FileGetFileSize(HANDLE Object, LPDWORD lpFileSizeHigh)
|
|||||||
return INVALID_FILE_SIZE;
|
return INVALID_FILE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fseek(fp, cur, SEEK_SET) != 0)
|
if (fseek(file->fp, cur, SEEK_SET) != 0)
|
||||||
{
|
{
|
||||||
WLog_ERR(TAG, "ftell(%s) failed with %s [%08X]", file->lpFileName,
|
WLog_ERR(TAG, "ftell(%s) failed with %s [%08X]", file->lpFileName,
|
||||||
strerror(errno), errno);
|
strerror(errno), errno);
|
||||||
@ -489,14 +471,15 @@ static HANDLE FileCreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dw
|
|||||||
pFile->fp = fp;
|
pFile->fp = fp;
|
||||||
if (!pFile->fp)
|
if (!pFile->fp)
|
||||||
{
|
{
|
||||||
WLog_ERR(TAG, "Failed to open file pointer for %s",
|
/* This case can occur when trying to open a
|
||||||
pFile->lpFileName);
|
* not existing file without create flag. */
|
||||||
|
|
||||||
free(pFile->lpFileName);
|
free(pFile->lpFileName);
|
||||||
free(pFile);
|
free(pFile);
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setvbuf(fp, NULL, _IONBF, 0);
|
||||||
|
|
||||||
if (dwShareMode & FILE_SHARE_READ)
|
if (dwShareMode & FILE_SHARE_READ)
|
||||||
lock = LOCK_SH;
|
lock = LOCK_SH;
|
||||||
if (dwShareMode & FILE_SHARE_WRITE)
|
if (dwShareMode & FILE_SHARE_WRITE)
|
||||||
@ -538,7 +521,6 @@ HANDLE_CREATOR *GetFileHandleCreator(void)
|
|||||||
static WINPR_FILE *FileHandle_New(FILE* fp)
|
static WINPR_FILE *FileHandle_New(FILE* fp)
|
||||||
{
|
{
|
||||||
WINPR_FILE *pFile;
|
WINPR_FILE *pFile;
|
||||||
HANDLE hFile;
|
|
||||||
char name[MAX_PATH];
|
char name[MAX_PATH];
|
||||||
|
|
||||||
_snprintf(name, sizeof(name), "device_%d", fileno(fp));
|
_snprintf(name, sizeof(name), "device_%d", fileno(fp));
|
||||||
@ -552,7 +534,6 @@ static WINPR_FILE *FileHandle_New(FILE* fp)
|
|||||||
pFile->ops = &shmOps;
|
pFile->ops = &shmOps;
|
||||||
pFile->lpFileName = _strdup(name);
|
pFile->lpFileName = _strdup(name);
|
||||||
|
|
||||||
hFile = (HANDLE) pFile;
|
|
||||||
WINPR_HANDLE_SET_TYPE_AND_MODE(pFile, HANDLE_TYPE_FILE, WINPR_FD_READ);
|
WINPR_HANDLE_SET_TYPE_AND_MODE(pFile, HANDLE_TYPE_FILE, WINPR_FD_READ);
|
||||||
return pFile;
|
return pFile;
|
||||||
}
|
}
|
||||||
@ -619,6 +600,11 @@ HANDLE GetFileHandleForFileDescriptor(int fd)
|
|||||||
else
|
else
|
||||||
fp = fdopen(fd, "rb");
|
fp = fdopen(fd, "rb");
|
||||||
|
|
||||||
|
if (!fp)
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
|
setvbuf(fp, NULL, _IONBF, 0);
|
||||||
|
|
||||||
pFile = FileHandle_New(fp);
|
pFile = FileHandle_New(fp);
|
||||||
if (!pFile)
|
if (!pFile)
|
||||||
return INVALID_HANDLE_VALUE;
|
return INVALID_HANDLE_VALUE;
|
||||||
|
Loading…
Reference in New Issue
Block a user