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:
Bernhard Miklautz 2015-12-16 18:33:19 +01:00 committed by Armin Novak
parent 5b2f4f50a0
commit 06307f1ac1

View File

@ -107,19 +107,10 @@ static DWORD FileSetFilePointer(HANDLE hFile, LONG lDistanceToMove,
WINPR_FILE* pFile = (WINPR_FILE*) hFile;
long offset = lDistanceToMove;
int whence;
FILE* fp;
if (!hFile)
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)
{
case FILE_BEGIN:
@ -135,14 +126,14 @@ static DWORD FileSetFilePointer(HANDLE hFile, LONG lDistanceToMove,
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,
strerror(errno), errno);
return INVALID_SET_FILE_POINTER;
}
return ftell(fp);
return ftell(pFile->fp);
}
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)
{
WINPR_FILE* file;
FILE* fp;
long cur, size;
if (!Object)
return 0;
file = (WINPR_FILE *)Object;
fp = file->fp;
if (!fp)
{
WLog_ERR(TAG, "fopen(%s) failed with %s [%08X]", file->lpFileName,
strerror(errno), errno);
return INVALID_FILE_SIZE;
}
cur = ftell(fp);
cur = ftell(file->fp);
if (cur < 0)
{
@ -238,14 +220,14 @@ static DWORD FileGetFileSize(HANDLE Object, LPDWORD lpFileSizeHigh)
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,
strerror(errno), errno);
return INVALID_FILE_SIZE;
}
size = ftell(fp);
size = ftell(file->fp);
if (size < 0)
{
@ -254,7 +236,7 @@ static DWORD FileGetFileSize(HANDLE Object, LPDWORD lpFileSizeHigh)
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,
strerror(errno), errno);
@ -489,14 +471,15 @@ static HANDLE FileCreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dw
pFile->fp = fp;
if (!pFile->fp)
{
WLog_ERR(TAG, "Failed to open file pointer for %s",
pFile->lpFileName);
/* This case can occur when trying to open a
* not existing file without create flag. */
free(pFile->lpFileName);
free(pFile);
return INVALID_HANDLE_VALUE;
}
setvbuf(fp, NULL, _IONBF, 0);
if (dwShareMode & FILE_SHARE_READ)
lock = LOCK_SH;
if (dwShareMode & FILE_SHARE_WRITE)
@ -538,7 +521,6 @@ HANDLE_CREATOR *GetFileHandleCreator(void)
static WINPR_FILE *FileHandle_New(FILE* fp)
{
WINPR_FILE *pFile;
HANDLE hFile;
char name[MAX_PATH];
_snprintf(name, sizeof(name), "device_%d", fileno(fp));
@ -552,7 +534,6 @@ static WINPR_FILE *FileHandle_New(FILE* fp)
pFile->ops = &shmOps;
pFile->lpFileName = _strdup(name);
hFile = (HANDLE) pFile;
WINPR_HANDLE_SET_TYPE_AND_MODE(pFile, HANDLE_TYPE_FILE, WINPR_FD_READ);
return pFile;
}
@ -619,6 +600,11 @@ HANDLE GetFileHandleForFileDescriptor(int fd)
else
fp = fdopen(fd, "rb");
if (!fp)
return INVALID_HANDLE_VALUE;
setvbuf(fp, NULL, _IONBF, 0);
pFile = FileHandle_New(fp);
if (!pFile)
return INVALID_HANDLE_VALUE;