[gvfs/gnome-2-28] [SMB] Fix free space calculation for older samba servers



commit bad65624c661d35da97093b873aea7ff376ded82
Author: Tomas Bzatek <tbzatek redhat com>
Date:   Mon Nov 30 15:28:11 2009 +0100

    [SMB] Fix free space calculation for older samba servers
    
    Samba servers older than 3.0.28 report zero values.

 daemon/gvfsbackendsmb.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)
---
diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c
index f53b8cb..88dac26 100644
--- a/daemon/gvfsbackendsmb.c
+++ b/daemon/gvfsbackendsmb.c
@@ -1615,13 +1615,17 @@ do_query_fs_info (GVfsBackend *backend,
 
       if (res == 0)
         {
-          /* FIXME: inconsistent return values (libsmbclient-3.4.2)
-           *       - for linux samba hosts, f_frsize is zero and f_bsize is a real block size
-           *       - for some Windows hosts (XP), f_frsize and f_bsize should be multiplied to get real block size
-           */
-          g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, st.f_bsize * st.f_blocks * ((st.f_frsize == 0) ? 1 : st.f_frsize));
-          g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, st.f_bsize * st.f_bfree * ((st.f_frsize == 0) ? 1 : st.f_frsize));
-          g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, st.f_flag & SMBC_VFS_FEATURE_RDONLY);
+          /* older samba versions ( < 3.0.28) return zero values in struct statvfs */
+          if (st.f_blocks > 0)
+            {
+              /* FIXME: inconsistent return values (libsmbclient-3.4.2)
+               *       - for linux samba hosts, f_frsize is zero and f_bsize is a real block size
+               *       - for some Windows hosts (XP), f_frsize and f_bsize should be multiplied to get real block size
+               */
+              g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, st.f_bsize * st.f_blocks * ((st.f_frsize == 0) ? 1 : st.f_frsize));
+              g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, st.f_bsize * st.f_bfree * ((st.f_frsize == 0) ? 1 : st.f_frsize));
+              g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, st.f_flag & SMBC_VFS_FEATURE_RDONLY);
+            }
         }
     }
 #endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]