Author: jra
Date: 2005-06-10 00:32:14 +0000 (Fri, 10 Jun 2005)
New Revision: 7453

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=7453

Log:
Set sparse flag if needed. Based on code from [EMAIL PROTECTED]
Fixes bug #2774.
Jeremy.

Modified:
   trunk/source/smbd/dosmode.c


Changeset:
Modified: trunk/source/smbd/dosmode.c
===================================================================
--- trunk/source/smbd/dosmode.c 2005-06-10 00:31:59 UTC (rev 7452)
+++ trunk/source/smbd/dosmode.c 2005-06-10 00:32:14 UTC (rev 7453)
@@ -20,6 +20,16 @@
 
 #include "includes.h"
 
+static int set_sparse_flag(const SMB_STRUCT_STAT * const sbuf)
+{
+#if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE)
+       if (sbuf->st_size > sbuf->st_blocks * (SMB_OFF_T)STAT_ST_BLOCKSIZE) {
+               return FILE_ATTRIBUTE_SPARSE;
+       }
+#endif
+       return 0;
+}
+
 /****************************************************************************
  Change a dos mode to a unix mode.
     Base permission for files:
@@ -140,11 +150,7 @@
        if (S_ISDIR(sbuf->st_mode))
                result = aDIR | (result & aRONLY);
 
-#if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE)
-       if (sbuf->st_size > sbuf->st_blocks * (SMB_OFF_T)STAT_ST_BLOCKSIZE) {
-               result |= FILE_ATTRIBUTE_SPARSE;
-       }
-#endif
+       result |= set_sparse_flag(sbuf);
  
 #ifdef S_ISLNK
 #if LINKS_READ_ONLY
@@ -293,6 +299,7 @@
 
        /* Get the DOS attributes from an EA by preference. */
        if (get_ea_dos_attribute(conn, path, sbuf, &result)) {
+               result |= set_sparse_flag(sbuf);
                return result;
        }
 

Reply via email to