From c4ede22db0dfbafad9b7ba9acab3f7cf3a3895a9 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Wed, 7 Feb 2024 10:21:33 +0100 Subject: [PATCH] s3/lib: move set_namearray() to util_namearray.c Needed to fix circular dependencies between samba-passdb, secrets3 and samba3util (iirc). Signed-off-by: Ralph Boehme Reviewed-by: Stefan Metzmacher --- source3/lib/util.c | 63 --------------------------- source3/lib/util_namearray.c | 84 ++++++++++++++++++++++++++++++++++++ source3/wscript_build | 8 ++++ 3 files changed, 92 insertions(+), 63 deletions(-) create mode 100644 source3/lib/util_namearray.c diff --git a/source3/lib/util.c b/source3/lib/util.c index 3246294261a..5561aa815ce 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -792,69 +792,6 @@ bool is_in_path(const char *name, return False; } -/******************************************************************* - Strip a '/' separated list into an array of - name_compare_enties structures suitable for - passing to is_in_path(). We do this for - speed so we can pre-parse all the names in the list - and don't do it for each call to is_in_path(). - We also check if the entry contains a wildcard to - remove a potentially expensive call to mask_match - if possible. -********************************************************************/ - -void set_namearray(TALLOC_CTX *mem_ctx, - const char *namelist_in, - struct name_compare_entry **_name_array) -{ - struct name_compare_entry *name_array = NULL; - struct name_compare_entry *e = NULL; - char *namelist = NULL; - const char *p = NULL; - size_t num_entries; - - *_name_array = NULL; - - if ((namelist_in == NULL) || (namelist_in[0] == '\0')) { - return; - } - - namelist = path_to_strv(mem_ctx, namelist_in); - if (namelist == NULL) { - DBG_ERR("path_to_strv failed\n"); - return; - } - - num_entries = strv_count(namelist); - - name_array = talloc_zero_array(mem_ctx, - struct name_compare_entry, - num_entries + 1); - if (name_array == NULL) { - DBG_ERR("talloc failed\n"); - TALLOC_FREE(namelist); - return; - } - - namelist = talloc_reparent(mem_ctx, name_array, namelist); - - e = &name_array[0]; - - while ((p = strv_next(namelist, p)) != NULL) { - if (*p == '\0') { - /* cope with multiple (useless) /s) */ - continue; - } - - e->name = p; - e->is_wild = ms_has_wild(e->name); - e++; - } - - *_name_array = name_array; - return; -} - #undef DBGC_CLASS #define DBGC_CLASS DBGC_LOCKING diff --git a/source3/lib/util_namearray.c b/source3/lib/util_namearray.c new file mode 100644 index 00000000000..43cf3e24536 --- /dev/null +++ b/source3/lib/util_namearray.c @@ -0,0 +1,84 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Ralph Boehme 2024 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "lib/util/strv.h" + +/******************************************************************* + Strip a '/' separated list into an array of + name_compare_enties structures suitable for + passing to is_in_path(). We do this for + speed so we can pre-parse all the names in the list + and don't do it for each call to is_in_path(). + We also check if the entry contains a wildcard to + remove a potentially expensive call to mask_match + if possible. +********************************************************************/ + +void set_namearray(TALLOC_CTX *mem_ctx, + const char *namelist_in, + struct name_compare_entry **_name_array) +{ + struct name_compare_entry *name_array = NULL; + struct name_compare_entry *e = NULL; + char *namelist = NULL; + const char *p = NULL; + size_t num_entries; + + *_name_array = NULL; + + if ((namelist_in == NULL) || (namelist_in[0] == '\0')) { + return; + } + + namelist = path_to_strv(mem_ctx, namelist_in); + if (namelist == NULL) { + DBG_ERR("path_to_strv failed\n"); + return; + } + + num_entries = strv_count(namelist); + + name_array = talloc_zero_array(mem_ctx, + struct name_compare_entry, + num_entries + 1); + if (name_array == NULL) { + DBG_ERR("talloc failed\n"); + TALLOC_FREE(namelist); + return; + } + + namelist = talloc_reparent(mem_ctx, name_array, namelist); + + e = &name_array[0]; + + while ((p = strv_next(namelist, p)) != NULL) { + if (*p == '\0') { + /* cope with multiple (useless) /s) */ + continue; + } + + e->name = p; + e->is_wild = ms_has_wild(e->name); + e++; + } + + *_name_array = name_array; + return; +} diff --git a/source3/wscript_build b/source3/wscript_build index cb68e7fffad..64969dbbefa 100644 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -313,6 +313,13 @@ bld.SAMBA3_SUBSYSTEM('samba3util', iov_buf ''') +bld.SAMBA3_SUBSYSTEM('samba3-namearray', + source=''' + lib/util_namearray.c + ''', + deps=''' + ''') + if bld.env.with_ctdb: SAMBA_CLUSTER_SUPPORT_SOURCES=''' lib/cluster_support.c @@ -742,6 +749,7 @@ bld.SAMBA3_LIBRARY('smbd_base', GNUTLS_HELPERS fd_handle cli_spoolss + samba3-namearray ''' + bld.env['dmapi_lib'] + bld.env['legacy_quota_libs'] + -- 2.47.3