r3545: initial support for using extended attributes to hold extended dos attributes...
[samba.git] / source4 / ntvfs / posix / pvfs_fileinfo.c
index 42aad1a20edba387a5a974ee6ad01c52f54bce32..49678e599852d3c18de32d87ae586f4567dcef0e 100644 (file)
@@ -20,7 +20,7 @@
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#include "include/includes.h"
+#include "includes.h"
 #include "vfs_posix.h"
 
 
@@ -45,14 +45,16 @@ static uint32_t dos_mode_from_stat(struct pvfs_state *pvfs, struct stat *st)
        if ((st->st_mode & S_IWUSR) == 0)
                result |= FILE_ATTRIBUTE_READONLY;
        
-       if ((pvfs->flags & PVFS_FLAG_MAP_ARCHIVE) && ((st->st_mode & S_IXUSR) != 0))
-               result |= FILE_ATTRIBUTE_ARCHIVE;
-
-       if ((pvfs->flags & PVFS_FLAG_MAP_SYSTEM) && ((st->st_mode & S_IXGRP) != 0))
-               result |= FILE_ATTRIBUTE_SYSTEM;
-       
-       if ((pvfs->flags & PVFS_FLAG_MAP_HIDDEN) && ((st->st_mode & S_IXOTH) != 0))
-               result |= FILE_ATTRIBUTE_HIDDEN;
+       if (!(pvfs->flags & PVFS_FLAG_XATTR_ENABLE)) {
+               if ((pvfs->flags & PVFS_FLAG_MAP_ARCHIVE) && ((st->st_mode & S_IXUSR) != 0))
+                       result |= FILE_ATTRIBUTE_ARCHIVE;
+
+               if ((pvfs->flags & PVFS_FLAG_MAP_SYSTEM) && ((st->st_mode & S_IXGRP) != 0))
+                       result |= FILE_ATTRIBUTE_SYSTEM;
+               
+               if ((pvfs->flags & PVFS_FLAG_MAP_HIDDEN) && ((st->st_mode & S_IXOTH) != 0))
+                       result |= FILE_ATTRIBUTE_HIDDEN;
+       }
   
        if (S_ISDIR(st->st_mode))
                result = FILE_ATTRIBUTE_DIRECTORY | (result & FILE_ATTRIBUTE_READONLY);
@@ -74,7 +76,7 @@ static uint32_t dos_mode_from_stat(struct pvfs_state *pvfs, struct stat *st)
 /*
   fill in the dos file attributes for a file
 */
-NTSTATUS pvfs_fill_dos_info(struct pvfs_state *pvfs, struct pvfs_filename *name)
+NTSTATUS pvfs_fill_dos_info(struct pvfs_state *pvfs, struct pvfs_filename *name, int fd)
 {
        /* make directories appear as size 0 */
        if (S_ISDIR(name->st.st_mode)) {
@@ -98,6 +100,12 @@ NTSTATUS pvfs_fill_dos_info(struct pvfs_state *pvfs, struct pvfs_filename *name)
        name->dos.ea_size = 0;
        name->dos.file_id = (((uint64_t)name->st.st_dev)<<32) | name->st.st_ino;
 
+#if HAVE_XATTR_SUPPORT
+       if (pvfs->flags & PVFS_FLAG_XATTR_ENABLE) {
+               return pvfs_xattr_load(pvfs, name, fd);
+       }
+#endif
+
        return NT_STATUS_OK;
 }
 
@@ -117,19 +125,21 @@ mode_t pvfs_fileperms(struct pvfs_state *pvfs, uint32 attrib)
                mode |= S_IWUSR;
        }
 
-       if ((attrib & FILE_ATTRIBUTE_ARCHIVE) &&
-           (pvfs->flags & PVFS_FLAG_MAP_ARCHIVE)) {
-               mode |= S_IXUSR;
-       }
-
-       if ((attrib & FILE_ATTRIBUTE_SYSTEM) &&
-           (pvfs->flags & PVFS_FLAG_MAP_SYSTEM)) {
-               mode |= S_IXGRP;
-       }
-
-       if ((attrib & FILE_ATTRIBUTE_HIDDEN) &&
-           (pvfs->flags & PVFS_FLAG_MAP_HIDDEN)) {
-               mode |= S_IXOTH;
+       if (!(pvfs->flags & PVFS_FLAG_XATTR_ENABLE)) {
+               if ((attrib & FILE_ATTRIBUTE_ARCHIVE) &&
+                   (pvfs->flags & PVFS_FLAG_MAP_ARCHIVE)) {
+                       mode |= S_IXUSR;
+               }
+               
+               if ((attrib & FILE_ATTRIBUTE_SYSTEM) &&
+                   (pvfs->flags & PVFS_FLAG_MAP_SYSTEM)) {
+                       mode |= S_IXGRP;
+               }
+               
+               if ((attrib & FILE_ATTRIBUTE_HIDDEN) &&
+                   (pvfs->flags & PVFS_FLAG_MAP_HIDDEN)) {
+                       mode |= S_IXOTH;
+               }
        }
 
        return mode;