From 70543292bcf73a80b5be892931a02e8b42488835 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Wed, 12 Jan 2022 19:36:07 +1100 Subject: [PATCH] use resolve tree Master file to deal with the current one --- src/include/66/tree.h | 10 +------ src/lib66/tree.c | 49 ++++++++++++++------------------- src/lib66/tree_sethome.c | 2 +- src/lib66/tree_switch_current.c | 48 +++++--------------------------- 4 files changed, 30 insertions(+), 79 deletions(-) diff --git a/src/include/66/tree.h b/src/include/66/tree.h index df40bf5a..8a47af25 100644 --- a/src/include/66/tree.h +++ b/src/include/66/tree.h @@ -142,7 +142,7 @@ extern int tree_isvalid(char const *base, char const *treename) ; /** Append @tree with the name of the current tree * @Return 1 on success * @Return 0 on fail */ -extern int tree_find_current(stralloc *tree, char const *base, uid_t owner) ; +extern int tree_find_current(stralloc *tree, char const *base) ; /** @Return 1 on success * @Return 0 if not valid @@ -170,14 +170,6 @@ extern int tree_copy(stralloc *dir, char const *tree,char const *treename) ; extern int tree_copy_tmp(char const *workdir, ssexec_t *info) ; -/** Set the tree to use as current for 66 tools - * This is avoid to use the -t options for all 66 tools - * Search on @base the directory current and append @tree - * with the path. - * @Return 1 on success - * @Return 0 on fail */ -extern int tree_find_current(stralloc *tree, char const *base, uid_t owner) ; - extern int tree_get_permissions(char const *tree, uid_t owner) ; extern int tree_sethome(ssexec_t *info) ; diff --git a/src/lib66/tree.c b/src/lib66/tree.c index 5b4f4b82..13aafb73 100644 --- a/src/lib66/tree.c +++ b/src/lib66/tree.c @@ -50,35 +50,28 @@ int tree_isvalid(char const *base, char const *treename) return 1 ; } -int tree_find_current(stralloc *tree, char const *base, uid_t owner) +int tree_find_current(stralloc *tree, char const *base) { log_flow() ; - ssize_t r ; + int e = 0 ; size_t baselen = strlen(base) ; - char pack[UID_FMT] ; - - uint32_pack(pack,owner) ; - size_t packlen = uint_fmt(pack,owner) ; - pack[packlen] = 0 ; - - char t[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + 1 + SS_TREE_CURRENT_LEN + 1] ; - auto_strings(t, base, SS_TREE_CURRENT, "/", pack, "/", SS_TREE_CURRENT) ; - - r = scan_mode(t,S_IFDIR) ; - if(r <= 0) - return 0 ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; + char t[baselen + SS_SYSTEM_LEN + 1] ; - r = sarealpath(tree,t) ; - if (r < 0 ) - return 0 ; + auto_strings(t, base, SS_SYSTEM) ; - if (!stralloc_0(tree)) - return 0 ; + if (!resolve_read(wres, t, SS_MASTER + 1)) + goto err ; - tree->len--; + if (!auto_stra(tree, base, SS_SYSTEM, "/", mres.sa.s + mres.current)) + goto err ; - return 1 ; + e = 1 ; + err: + resolve_free(wres) ; + return e ; } int tree_iscurrent(char const *base, char const *treename) @@ -87,8 +80,8 @@ int tree_iscurrent(char const *base, char const *treename) int e = -1 ; size_t baselen = strlen(base) ; - resolve_tree_t tres = RESOLVE_TREE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; char t[baselen + SS_SYSTEM_LEN + 1] ; auto_strings(t, base, SS_SYSTEM) ; @@ -96,7 +89,7 @@ int tree_iscurrent(char const *base, char const *treename) if (!resolve_read(wres, t, SS_MASTER + 1)) goto err ; - if (!strcmp(tres.sa.s + tres.current, treename)) + if (!strcmp(mres.sa.s + mres.current, treename)) e = 1 ; else e = 0 ; @@ -135,8 +128,8 @@ int tree_isenabled(char const *base, char const *treename) int e = -1 ; size_t baselen = strlen(base), pos = 0 ; stralloc sa = STRALLOC_ZERO ; - resolve_tree_t tres = RESOLVE_TREE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; char solve[baselen + SS_SYSTEM_LEN + 1] ; auto_strings(solve, base, SS_SYSTEM) ; @@ -144,9 +137,9 @@ int tree_isenabled(char const *base, char const *treename) if (!resolve_read(wres, solve, SS_MASTER + 1)) goto err ; - if (tres.nenabled) { + if (mres.nenabled) { - if (!sastr_clean_string(&sa, tres.sa.s + tres.enabled)) + if (!sastr_clean_string(&sa, mres.sa.s + mres.enabled)) goto err ; e = 0 ; diff --git a/src/lib66/tree_sethome.c b/src/lib66/tree_sethome.c index ccf74539..7f4e1d0a 100644 --- a/src/lib66/tree_sethome.c +++ b/src/lib66/tree_sethome.c @@ -46,7 +46,7 @@ int tree_sethome(ssexec_t *info) if (!info->treename.len) { - if (!tree_find_current(&info->tree, base, owner)) + if (!tree_find_current(&info->tree, base)) return -3 ; if (!tree_setname(&info->treename,info->tree.s)) diff --git a/src/lib66/tree_switch_current.c b/src/lib66/tree_switch_current.c index 36f3fe04..249191aa 100644 --- a/src/lib66/tree_switch_current.c +++ b/src/lib66/tree_switch_current.c @@ -15,59 +15,25 @@ #include <66/tree.h> #include <sys/types.h> -#include <stddef.h> +#include <string.h> #include <oblibs/string.h> -#include <oblibs/directory.h> -#include <oblibs/types.h> +#include <oblibs/log.h> -#include <skalibs/stralloc.h> -#include <skalibs/types.h> -#include <skalibs/unix-transactional.h> - -#include <66/config.h> #include <66/constants.h> -#include <66/utils.h> #include <66/resolve.h> - int tree_switch_current(char const *base, char const *treename) { log_flow() ; ssize_t r ; - size_t baselen = strlen(base), treelen = strlen(treename), newlen = 0, packlen = 0 ; - resolve_tree_t tres = RESOLVE_TREE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; - char pack[UID_FMT] ; - char dst[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + treelen + 2 + 1] ; - - packlen = uint_fmt(pack,MYUID) ; - pack[packlen] = 0 ; - - auto_strings(dst,base,SS_SYSTEM,"/",treename) ; - - r = scan_mode(dst,S_IFDIR) ; - if (r <= 0) return 0 ; - - auto_string_from(dst,baselen,SS_TREE_CURRENT,"/",pack) ; - newlen = baselen + SS_TREE_CURRENT_LEN + 1 + packlen ; - - r = scan_mode(dst,S_IFDIR) ; - if (!r){ - if (!dir_create_parent(dst,0755)) return 0 ; - } - if(r == -1) return 0 ; - - char current[newlen + 1 + SS_TREE_CURRENT_LEN + 1] ; - - auto_strings(current,dst,"/",SS_TREE_CURRENT) ; - auto_string_from(dst,baselen,SS_SYSTEM,"/",treename) ; - - if (!atomic_symlink(dst, current,"tree_switch_current")) return 0 ; + size_t baselen = strlen(base), treelen = strlen(treename) ; + resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ; - if (!resolve_modify_field_g(wres, base, SS_MASTER + 1, TREE_ENUM_CURRENT, treename)) - log_warnu_return(LOG_EXIT_ZERO, "modify field: ", resolve_tree_field_table[TREE_ENUM_CURRENT].field," of tree: ", SS_MASTER + 1, " with value: ", treename) ; + if (!resolve_modify_field_g(wres, base, SS_MASTER + 1, TREE_ENUM_MASTER_CURRENT, treename)) + log_warnu_return(LOG_EXIT_ZERO, "modify field: ", resolve_tree_master_field_table[TREE_ENUM_MASTER_CURRENT].field," of inner resolve file with value: ", treename) ; resolve_free(wres) ; -- GitLab