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