summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2012-06-14 10:32:43 +0200
committerKarolin Seeger <kseeger@samba.org>2012-06-22 21:51:48 +0200
commite64b2099bde8308692bcd913a944f9a509d9a158 (patch)
tree9d4854a0e6140a89826729e2e6e36339b8145c5c
parentea4d72c678c1aaaa7b9318a517da857a35ce58fa (diff)
downloadsamba-e64b2099bde8308692bcd913a944f9a509d9a158.tar.gz
s3:smbd: add a fsp_persistent_id() function
This calculates a 64-bit value that most likely uniquely identifies the files_struct globally to the server. * 32-bit random gen_id * 16-bit truncated open_time * 16-bit fnum (valatile_id) Based on code from Ira Cooper. Use fsp->fh->gen_id as the persistent fileid in SMB2. Pair-Programmed-With: Michael Adam <obnox@samba.org> metze Signed-off-by: Jeremy Allison <jra@samba.org> (cherry picked from commit cb5a0b1bc311667818ab45bb1837dc67a241a379)
-rw-r--r--source3/smbd/files.c24
-rw-r--r--source3/smbd/proto.h1
2 files changed, 25 insertions, 0 deletions
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 0018ceed5e5..1031ccfecba 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -566,6 +566,30 @@ files_struct *file_fsp(struct smb_request *req, uint16 fid)
return fsp;
}
+uint64_t fsp_persistent_id(const struct files_struct *fsp)
+{
+ uint64_t persistent_id;
+
+ /*
+ * This calculates a number that is most likely
+ * globally unique. In future we will have a database
+ * to make it completely unique.
+ *
+ * 32-bit random gen_id
+ * 16-bit truncated open_time
+ * 16-bit fnum (valatile_id)
+ */
+ persistent_id = fsp->fh->gen_id & UINT32_MAX;
+ persistent_id <<= 16;
+ persistent_id &= 0x0000FFFFFFFF0000LLU;
+ persistent_id |= fsp->open_time.tv_usec & UINT16_MAX;
+ persistent_id <<= 16;
+ persistent_id &= 0xFFFFFFFFFFFF0000LLU;
+ persistent_id |= fsp->fnum & UINT16_MAX;
+
+ return persistent_id;
+}
+
struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req,
uint64_t persistent_id,
uint64_t volatile_id)
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 929387b2193..d75138b117b 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -373,6 +373,7 @@ bool file_find_subpath(files_struct *dir_fsp);
void file_sync_all(connection_struct *conn);
void file_free(struct smb_request *req, files_struct *fsp);
files_struct *file_fsp(struct smb_request *req, uint16 fid);
+uint64_t fsp_persistent_id(const struct files_struct *fsp);
struct files_struct *file_fsp_smb2(struct smbd_smb2_request *smb2req,
uint64_t persistent_id,
uint64_t volatile_id);