From 3e24e07467962436fa505f3b8e591f1af6cafdc0 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 29 Dec 2013 13:56:44 +0100 Subject: [PATCH] lib: Move full_path_tos to util_str.c This can be useful elsewhere Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/include/proto.h | 3 +++ source3/lib/util_str.c | 39 +++++++++++++++++++++++++++++++++++++++ source3/smbd/files.c | 39 --------------------------------------- source3/smbd/proto.h | 3 --- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/source3/include/proto.h b/source3/include/proto.h index 3197b76af7d..c8548829770 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -724,6 +724,9 @@ bool validate_net_name( const char *name, int max_len); char *escape_shell_string(const char *src); char **str_list_make_v3(TALLOC_CTX *mem_ctx, const char *string, const char *sep); +ssize_t full_path_tos(const char *dir, const char *name, + char *tmpbuf, size_t tmpbuf_len, + char **pdst, char **to_free); /* The following definitions come from lib/version.c */ diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c index 967beda1c5d..908f23aaa9d 100644 --- a/source3/lib/util_str.c +++ b/source3/lib/util_str.c @@ -1294,3 +1294,42 @@ char **str_list_make_v3(TALLOC_CTX *mem_ctx, const char *string, TALLOC_FREE(s); return list; } + +/* + * This routine improves performance for operations temporarily acting on a + * full path. It is equivalent to the much more expensive + * + * talloc_asprintf(talloc_tos(), "%s/%s", dir, name) + * + * This actually does make a difference in metadata-heavy workloads (i.e. the + * "standard" client.txt nbench run. + */ + +ssize_t full_path_tos(const char *dir, const char *name, + char *tmpbuf, size_t tmpbuf_len, + char **pdst, char **to_free) +{ + size_t dirlen, namelen, len; + char *dst; + + dirlen = strlen(dir); + namelen = strlen(name); + len = dirlen + namelen + 1; + + if (len < tmpbuf_len) { + dst = tmpbuf; + *to_free = NULL; + } else { + dst = talloc_array(talloc_tos(), char, len+1); + if (dst == NULL) { + return -1; + } + *to_free = dst; + } + + memcpy(dst, dir, dirlen); + dst[dirlen] = '/'; + memcpy(dst+dirlen+1, name, namelen+1); + *pdst = dst; + return len; +} diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 5cf037edc26..84968067082 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -688,45 +688,6 @@ NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from, return fsp_set_smb_fname(to, from->fsp_name); } -/* - * This routine improves performance for operations temporarily acting on a - * full path. It is equivalent to the much more expensive - * - * talloc_asprintf(talloc_tos(), "%s/%s", dir, name) - * - * This actually does make a difference in metadata-heavy workloads (i.e. the - * "standard" client.txt nbench run. - */ - -ssize_t full_path_tos(const char *dir, const char *name, - char *tmpbuf, size_t tmpbuf_len, - char **pdst, char **to_free) -{ - size_t dirlen, namelen, len; - char *dst; - - dirlen = strlen(dir); - namelen = strlen(name); - len = dirlen + namelen + 1; - - if (len < tmpbuf_len) { - dst = tmpbuf; - *to_free = NULL; - } else { - dst = talloc_array(talloc_tos(), char, len+1); - if (dst == NULL) { - return -1; - } - *to_free = dst; - } - - memcpy(dst, dir, dirlen); - dst[dirlen] = '/'; - memcpy(dst+dirlen+1, name, namelen+1); - *pdst = dst; - return len; -} - /** * Return a jenkins hash of a pathname on a connection. */ diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 62c9728a4e8..d9b86b6f539 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -397,9 +397,6 @@ 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); -ssize_t full_path_tos(const char *dir, const char *name, - char *tmpbuf, size_t tmpbuf_len, - char **pdst, char **to_free); /* The following definitions come from smbd/ipc.c */ -- 2.34.1