From 399311ae5dc729ff0c0aea08510ed7b2662ca3e2 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Thu, 30 Mar 2017 02:54:22 +0300
Subject: Improve VirtfsDir::rwops_write.

---
 src/fs/virtfs/virtfsdirrwops.cpp | 30 +++++++++++++++++++++++-------
 src/fs/virtfs/virtfsdirrwops.h   |  2 +-
 2 files changed, 24 insertions(+), 8 deletions(-)

(limited to 'src')

diff --git a/src/fs/virtfs/virtfsdirrwops.cpp b/src/fs/virtfs/virtfsdirrwops.cpp
index 6b8be6e30..bd8e2f594 100644
--- a/src/fs/virtfs/virtfsdirrwops.cpp
+++ b/src/fs/virtfs/virtfsdirrwops.cpp
@@ -181,20 +181,36 @@ namespace VirtFsDir
     RWOPSSIZE rwops_write(SDL_RWops *const rw,
                           const void *const ptr,
                           const RWOPSSIZE size,
-                          const RWOPSSIZE num)
+                          const RWOPSSIZE maxnum)
     {
         if (!rw)
             return 0;
         VirtFile *const handle = static_cast<VirtFile *const>(
             rw->hidden.unknown.data1);
-        const int64_t rc = VirtFs::write(handle, ptr,
-            CAST_U32(size),
-            CAST_U32(num));
-        if (rc != static_cast<int64_t>(num))
+        FILEHTYPE fd = handle->mFd;
+
+#ifdef USE_FILE_FOPEN
+        const int64_t rc = fwrite(ptr, size, maxnum, fd);
+#else  // USE_FILE_FOPEN
+        int max = size * maxnum;
+        int cnt = ::write(fd, ptr, max);
+        if (cnt <= 0)
+            return cnt;
+        const int64_t rc = cnt / size;
+#endif  // USE_FILE_FOPEN
+
+        if (rc != static_cast<int64_t>(maxnum))
         {
-            logger->assertLog("VirtFs::rwops_seek: write error.");
+#ifndef USE_FILE_FOPEN
+            const int64_t pos = lseek(fd, 0, SEEK_CUR);
+            struct stat statbuf;
+            if (fstat(fd, &statbuf) == -1)
+            {
+                reportAlways("VirtFsDir::fileLength error.");
+                return CAST_S32(rc);
+            }
+#endif  // USE_FILE_FOPEN
         }
-
         return CAST_S32(rc);
     }
 
diff --git a/src/fs/virtfs/virtfsdirrwops.h b/src/fs/virtfs/virtfsdirrwops.h
index d8f5c7d15..6751694d1 100644
--- a/src/fs/virtfs/virtfsdirrwops.h
+++ b/src/fs/virtfs/virtfsdirrwops.h
@@ -39,7 +39,7 @@ namespace VirtFsDir
     RWOPSSIZE rwops_write(SDL_RWops *const rw,
                           const void *const ptr,
                           const RWOPSSIZE size,
-                          const RWOPSSIZE num);
+                          const RWOPSSIZE maxnum);
     int rwops_close(SDL_RWops *const rw);
 #ifdef USE_SDL2
     RWOPSINT rwops_size(SDL_RWops *const rw);
-- 
cgit v1.2.3-70-g09d2