summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h4
-rw-r--r--source3/smbd/files.c22
2 files changed, 26 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 81fc1c061f..5b5f9098e0 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -6285,6 +6285,10 @@ void file_close_pid(uint16 smbpid, int vuid);
void file_init(void);
void file_close_user(int vuid);
void file_dump_open_table(void);
+struct files_struct *file_walk_table(
+ struct files_struct *(*fn)(struct files_struct *fsp,
+ void *private_data),
+ void *private_data);
files_struct *file_find_fd(int fd);
files_struct *file_find_dif(struct file_id id, unsigned long gen_id);
files_struct *file_find_fsp(files_struct *orig_fsp);
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index d2ea520146..0e6dd7e457 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -204,6 +204,28 @@ void file_close_user(int vuid)
}
}
+/*
+ * Walk the files table until "fn" returns non-NULL
+ */
+
+struct files_struct *file_walk_table(
+ struct files_struct *(*fn)(struct files_struct *fsp,
+ void *private_data),
+ void *private_data)
+{
+ struct files_struct *fsp, *next;
+
+ for (fsp = Files; fsp; fsp = next) {
+ struct files_struct *ret;
+ next = fsp->next;
+ ret = fn(fsp, private_data);
+ if (ret != NULL) {
+ return ret;
+ }
+ }
+ return NULL;
+}
+
/****************************************************************************
Debug to enumerate all open files in the smbd.
****************************************************************************/