winpr/file: disable buffering
authorBernhard Miklautz <bernhard.miklautz@thincast.com>
Wed, 16 Dec 2015 17:33:19 +0000 (18:33 +0100)
committerArmin Novak <armin.novak@thincast.com>
Wed, 16 Dec 2015 17:47:42 +0000 (18:47 +0100)
When FILE streams are used per default buffering is enabled but
WriteFile/ReadFile shouldn't do any extra buffering.

winpr/libwinpr/file/file.c

index e58b224..066a76e 100644 (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;