Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / client / lufs / captivefs-attr.c
index 55856b7..a1142f1 100644 (file)
 #include "captivefs-attr.h"    /* self */
 #include <glib/gmessages.h>
 #include <time.h>
+#include "captivefs-vfs.h"
 
 
-gboolean captivefs_GnomeVFSFileInfo_to_lufs_fattr(struct lufs_fattr *fattr,const GnomeVFSFileInfo *file_info)
+gboolean captivefs_GnomeVFSFileInfo_to_lufs_fattr
+               (struct captivefs_vfs *captivefs_vfs,struct lufs_fattr *fattr,const GnomeVFSFileInfo *file_info)
 {
+       g_return_val_if_fail(captivefs_vfs_validate(captivefs_vfs),FALSE);
        g_return_val_if_fail(fattr!=NULL,FALSE);
        g_return_val_if_fail(file_info!=NULL,FALSE);
 
@@ -33,8 +36,18 @@ gboolean captivefs_GnomeVFSFileInfo_to_lufs_fattr(struct lufs_fattr *fattr,const
 
        if (file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE)
                switch (file_info->type) {
-                       case GNOME_VFS_FILE_TYPE_REGULAR:   fattr->f_mode|=S_IFREG; break;
-                       case GNOME_VFS_FILE_TYPE_DIRECTORY: fattr->f_mode|=S_IFDIR; break;
+                       case GNOME_VFS_FILE_TYPE_REGULAR:
+                               fattr->f_mode|=S_IFREG;
+                               /* 'fmode' kernel LUFS option only |= to our reported 'f_mode': */
+                               if (!captivefs_vfs->private)
+                                       fattr->f_mode|=0444;
+                               break;
+                       case GNOME_VFS_FILE_TYPE_DIRECTORY:
+                               fattr->f_mode|=S_IFDIR;
+                               /* 'dmode' kernel LUFS option only |= to our reported 'f_mode': */
+                               if (!captivefs_vfs->private)
+                                       fattr->f_mode|=0555;
+                               break;
                        default:
                                g_warning("Unknown GnomeVFSFileInfo.type=%d of: %s",(int)file_info->type,file_info->name);
                                return FALSE;