From 47f837c105ee7b70b7e80e41772b7c9470bbe153 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 14 Jun 2012 10:32:43 +0200 Subject: 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 metze --- source3/smbd/files.c | 24 ++++++++++++++++++++++++ source3/smbd/proto.h | 1 + 2 files changed, 25 insertions(+) diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 3fc36d5783..18330805d8 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -597,6 +597,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 e7bc3eb5b4..53d9e2dd37 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -387,6 +387,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); -- cgit