]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:locking: add file_has_open_streams()
authorRalph Boehme <slow@samba.org>
Sun, 27 May 2018 11:03:25 +0000 (13:03 +0200)
committerKarolin Seeger <kseeger@samba.org>
Thu, 12 Jul 2018 11:11:22 +0000 (13:11 +0200)
This can be used to check if a file opened by fsp also has stream opens.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=13451

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(cherry picked from commit dd8cf54c79fe8536e34cde15801d60931cd47b8b)

source3/locking/locking.c
source3/locking/proto.h

index 4e9f1bbc681e30144a1b4eb04ef458e8524e6a83..f71cd17602971ad3d80f059ac2632259faf0aed9 100644 (file)
@@ -1318,3 +1318,34 @@ struct timespec get_share_mode_write_time(struct share_mode_lock *lck)
        }
        return d->old_write_time;
 }
+
+bool file_has_open_streams(files_struct *fsp)
+{
+       struct share_mode_lock *lock = NULL;
+       struct share_mode_data *d = NULL;
+       uint32_t i;
+
+       lock = get_existing_share_mode_lock(talloc_tos(), fsp->file_id);
+       if (lock == NULL) {
+               return false;
+       }
+       d = lock->data;
+
+       for (i = 0; i < d->num_share_modes; i++) {
+               struct share_mode_entry *e = &d->share_modes[i];
+
+               if (share_mode_stale_pid(d, i)) {
+                       continue;
+               }
+
+               if (e->private_options &
+                   NTCREATEX_OPTIONS_PRIVATE_STREAM_BASEOPEN)
+               {
+                       TALLOC_FREE(lock);
+                       return true;
+               }
+       }
+
+       TALLOC_FREE(lock);
+       return false;
+}
index 33184e0fa0a925230f4a711cd225a48fd6c545ab..4cd38091f3c8ef7b53d87008fa8df1510fe56d9f 100644 (file)
@@ -205,6 +205,7 @@ bool is_delete_on_close_set(struct share_mode_lock *lck, uint32_t name_hash);
 bool set_sticky_write_time(struct file_id fileid, struct timespec write_time);
 bool set_write_time(struct file_id fileid, struct timespec write_time);
 struct timespec get_share_mode_write_time(struct share_mode_lock *lck);
+bool file_has_open_streams(files_struct *fsp);
 int share_mode_forall(int (*fn)(struct file_id fid,
                                const struct share_mode_data *data,
                                void *private_data),