support-stflags-stat-field-rw [plain text]
Index: samba/source/smbd/dosmode.c
===================================================================
--- samba/source/smbd/dosmode.c.orig
+++ samba/source/smbd/dosmode.c
@@ -519,6 +519,51 @@ int file_set_dosmode(connection_struct *
return 0;
}
+#if defined(HAVE_STAT_ST_FLAGS)
+ /* We have st_flags support so we ought to be able to use
+ * SMB_VFS_CHFLAGS to set the DOS attributes directly into
+ * the BSD file flags.
+ */
+ {
+ int st_flags = 0;
+
+#ifdef UF_IMMUTABLE
+ /* We only set the read-only bit for files, since the DOS
+ * semantics are to ignore read-only on directories.
+ */
+ if (S_ISREG(st->st_mode) &&
+ (dosmode & FILE_ATTRIBUTE_READONLY)) {
+ st_flags |= UF_IMMUTABLE;
+ }
+#endif
+
+#ifdef UF_HIDDEN
+ if (dosmode & FILE_ATTRIBUTE_HIDDEN) {
+ st_flags |= UF_HIDDEN;
+ }
+#endif
+
+#ifdef UF_NODUMP
+ /* If the file is not marked as "needs to be archived", then we
+ * should mark it as NODUMP (ie, "don't dump this").
+ */
+ if (!(dosmode & FILE_ATTRIBUTE_ARCHIVE)) {
+ st_flags |= UF_NODUMP;
+ }
+#endif
+
+ if (SMB_VFS_CHFLAGS(conn, fname, st_flags) == 0) {
+ notify_fname(conn, NOTIFY_ACTION_MODIFIED,
+ FILE_NOTIFY_CHANGE_ATTRIBUTES, fname);
+ st->st_flags = st_flags;
+ return 0;
+ }
+
+ return -1;
+ }
+
+#endif /* defined(HAVE_STAT_ST_FLAGS) */
+
unixmode = unix_mode(conn,dosmode,fname, parent_dir);
/* preserve the s bits */