From 6d39f3bdce5ba8ed7d88a430a2de9f96d4b2c513 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 10 Jun 2005 00:31:59 +0000 Subject: r7452: Set sparse flag if needed. Based on code from jpeach@sgi.com. Fixes bug #2774. Jeremy. (This used to be commit 5d366047debed68f36d44d34233ba4670e412d1e) --- source3/smbd/dosmode.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index 65ea2807e7..3602e3f908 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -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 @@ uint32 dos_mode_from_sbuf(connection_struct *conn, const char *path, SMB_STRUCT_ 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 @@ uint32 dos_mode(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf) /* 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; } -- cgit