From 1bef409a1b0cd2aa65dc4e9c0ea5e2f0e25b2a10 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Fri, 17 Feb 2023 21:26:59 +1100 Subject: [PATCH] use tree master resolve file as checker --- src/lib66/tree/tree_isvalid.c | 61 +++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/src/lib66/tree/tree_isvalid.c b/src/lib66/tree/tree_isvalid.c index 8e215b7b..3496adb9 100644 --- a/src/lib66/tree/tree_isvalid.c +++ b/src/lib66/tree/tree_isvalid.c @@ -15,26 +15,61 @@ #include <string.h> #include <oblibs/log.h> -#include <oblibs/string.h> -#include <oblibs/types.h> +#include <oblibs/sastr.h> -#include <66/constants.h> +#include <skalibs/stralloc.h> + +#include <66/tree.h> #include <66/resolve.h> +#include <66/constants.h> int tree_isvalid(char const *base, char const *treename) { log_flow() ; - int r ; - size_t baselen = strlen(base), treelen = strlen(treename) ; - char t[baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN + 1 + treelen + 1] ; - auto_strings(t, base, SS_SYSTEM, SS_RESOLVE, "/", treename) ; + int e = -1 ; + size_t pos = 0 ; + stralloc sa = STRALLOC_ZERO ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; + + /** make distinction between system error + * and unexisting tree */ + { + resolve_tree_t tres = RESOLVE_TREE_ZERO ; + resolve_wrapper_t_ref twres = resolve_set_struct(DATA_TREE, &tres) ; + + if (!resolve_check_g(twres, base, treename)) { + e = 0 ; + goto freed ; + } + resolve_free(twres) ; + } + + if (!resolve_read_g(wres, base, SS_MASTER + 1)) + goto freed ; + + if (!tree_resolve_master_get_field_tosa(&sa, &mres, E_RESOLVE_TREE_MASTER_CONTENTS)) + goto freed ; + + if (mres.ncontents) { + + if (!sastr_clean_string_flush_sa(&sa, sa.s)) + goto freed ; + + FOREACH_SASTR(&sa, pos) { + + if (!strcmp(treename, sa.s + pos)) { + e = 1 ; + goto freed ; + } + } + + } else e = 0 ; - r = scan_mode(t, S_IFREG) ; - if (r < 0) - return -1 ; - else if (!r) - return 0 ; + freed: + stralloc_free(&sa) ; + resolve_free(wres) ; + return e ; - return 1 ; } -- GitLab