From: Jeremy Allison Date: Tue, 25 Jan 2011 21:49:01 +0000 (-0800) Subject: Add name_hash to files_struct. Set within fsp_set_smb_fname(). X-Git-Tag: tevent-0.9.11~1248 X-Git-Url: http://git.samba.org/samba.git/?p=sfrench%2Fsamba-autobuild%2F.git;a=commitdiff_plain;h=76418e23bcde1eba4dfefbc10c51c083567a52e6 Add name_hash to files_struct. Set within fsp_set_smb_fname(). --- diff --git a/source3/include/proto.h b/source3/include/proto.h index 29dbcc97635..fafcf6be52e 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -4764,6 +4764,8 @@ files_struct *file_fsp(struct smb_request *req, uint16 fid); NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from, uint32 access_mask, uint32 share_access, uint32 create_options, files_struct *to); +NTSTATUS file_name_hash(connection_struct *conn, + const char *name, uint32_t *p_name_hash); NTSTATUS fsp_set_smb_fname(struct files_struct *fsp, const struct smb_filename *smb_fname_in); diff --git a/source3/include/smb.h b/source3/include/smb.h index 1a76691a44a..6cfb6307d0f 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -346,6 +346,7 @@ typedef struct files_struct { bool posix_open; bool is_sparse; struct smb_filename *fsp_name; + uint32_t name_hash; /* Jenkins hash of full pathname. */ struct vfs_fsp_data *vfs_extension; struct fake_file_handle *fake_file_handle; diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 7275868ffae..f01da2c8a21 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -590,6 +590,35 @@ NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from, return fsp_set_smb_fname(to, from->fsp_name); } +/** + * Return a jenkins hash of a pathname on a connection. + */ + +NTSTATUS file_name_hash(connection_struct *conn, + const char *name, uint32_t *p_name_hash) +{ + TDB_DATA key; + char *fullpath = NULL; + + /* Set the hash of the full pathname. */ + fullpath = talloc_asprintf(talloc_tos(), + "%s/%s", + conn->connectpath, + name); + if (!fullpath) { + return NT_STATUS_NO_MEMORY; + } + key = string_term_tdb_data(fullpath); + *p_name_hash = tdb_jenkins_hash(&key); + + DEBUG(10,("file_name_hash: %s hash 0x%x\n", + fullpath, + (unsigned int)*p_name_hash )); + + TALLOC_FREE(fullpath); + return NT_STATUS_OK; +} + /** * The only way that the fsp->fsp_name field should ever be set. */ @@ -607,5 +636,7 @@ NTSTATUS fsp_set_smb_fname(struct files_struct *fsp, TALLOC_FREE(fsp->fsp_name); fsp->fsp_name = smb_fname_new; - return NT_STATUS_OK; + return file_name_hash(fsp->conn, + smb_fname_str_dbg(fsp->fsp_name), + &fsp->name_hash); }