From c8862abe23a59d5a34f1996e4113517c7ebcfa85 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Wed, 12 Jan 2022 19:09:54 +1100
Subject: [PATCH] split tree Master resolve file to an independent file

---
 src/66/66-inresolve.c    |  55 ++++---
 src/include/66/resolve.h |   3 +-
 src/include/66/tree.h    |  51 +++++--
 src/lib66/resolve.c      |  51 +++++--
 src/lib66/ssexec_tree.c  |  48 +++----
 src/lib66/tree_resolve.c | 301 +++++++++++++++++++++++++++------------
 6 files changed, 358 insertions(+), 151 deletions(-)

diff --git a/src/66/66-inresolve.c b/src/66/66-inresolve.c
index 1ba06a44..5179d7ea 100644
--- a/src/66/66-inresolve.c
+++ b/src/66/66-inresolve.c
@@ -301,6 +301,8 @@ int main(int argc, char const *const *argv)
 
     } else {
 
+        uint8_t master = 0 ;
+
         char tree_buf[MAXOPTS][INFO_FIELD_MAXLEN] = {
             "Name",
             "Depends" ,
@@ -319,8 +321,19 @@ int main(int argc, char const *const *argv)
             "Disen",
             "Nenabled" } ;
 
+        resolve_wrapper_t_ref wres = 0 ;
         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 ;
+
+        if (!strcmp(svname, SS_MASTER + 1)) {
+
+            master = 1 ;
+            wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ;
+
+        } else {
+
+            wres = resolve_set_struct(DATA_TREE, &tres) ;
+        }
 
         if (!set_ownersysdir(&src, getuid()))
             log_dieusys(LOG_EXIT_SYS, "set owner directory") ;
@@ -340,22 +353,30 @@ int main(int argc, char const *const *argv)
 
         info_field_align(tree_buf,fields,field_suffix,MAXOPTS) ;
 
-        info_display_string(fields[0],tres.sa.s + tres.name) ;
-        info_display_string(fields[1],tres.sa.s + tres.depends) ;
-        info_display_string(fields[2],tres.sa.s + tres.requiredby) ;
-        info_display_string(fields[3],tres.sa.s + tres.allow) ;
-        info_display_string(fields[4],tres.sa.s + tres.groups) ;
-        info_display_string(fields[5],tres.sa.s + tres.contents) ;
-        info_display_string(fields[6],tres.sa.s + tres.enabled) ;
-        info_display_string(fields[7],tres.sa.s + tres.current) ;
-        info_display_int(fields[8],tres.ndepends) ;
-        info_display_int(fields[9],tres.nrequiredby) ;
-        info_display_int(fields[10],tres.nallow) ;
-        info_display_int(fields[11],tres.ngroups) ;
-        info_display_int(fields[12],tres.ncontents) ;
-        info_display_int(fields[13],tres.init) ;
-        info_display_int(fields[14],tres.disen) ;
-        info_display_int(fields[15],tres.nenabled) ;
+        if (!master) {
+
+            info_display_string(fields[0],tres.sa.s + tres.name) ;
+            info_display_string(fields[1],tres.sa.s + tres.depends) ;
+            info_display_string(fields[2],tres.sa.s + tres.requiredby) ;
+            info_display_string(fields[3],tres.sa.s + tres.allow) ;
+            info_display_string(fields[4],tres.sa.s + tres.groups) ;
+            info_display_string(fields[5],tres.sa.s + tres.contents) ;
+            info_display_int(fields[8],tres.ndepends) ;
+            info_display_int(fields[9],tres.nrequiredby) ;
+            info_display_int(fields[10],tres.nallow) ;
+            info_display_int(fields[11],tres.ngroups) ;
+            info_display_int(fields[12],tres.ncontents) ;
+            info_display_int(fields[13],tres.init) ;
+            info_display_int(fields[14],tres.disen) ;
+
+        } else {
+
+            info_display_string(fields[0],mres.sa.s + mres.name) ;
+            info_display_string(fields[3],mres.sa.s + mres.allow) ;
+            info_display_string(fields[6],mres.sa.s + mres.enabled) ;
+            info_display_string(fields[7],mres.sa.s + mres.current) ;
+            info_display_int(fields[15],mres.nenabled) ;
+        }
 
         resolve_free(wres) ;
 
diff --git a/src/include/66/resolve.h b/src/include/66/resolve.h
index c4ddcc8c..dacea9be 100644
--- a/src/include/66/resolve.h
+++ b/src/include/66/resolve.h
@@ -52,7 +52,8 @@ struct resolve_wrapper_s
 #define RESOLVE_SET_SAWRES(wres) \
     stralloc_ref sawres = 0 ; \
     if (wres->type == DATA_SERVICE) sawres = (&((resolve_service_t *)wres->obj)->sa) ; \
-    else if (wres->type == DATA_TREE) sawres = (&((resolve_tree_t *)wres->obj)->sa) ;
+    else if (wres->type == DATA_TREE) sawres = (&((resolve_tree_t *)wres->obj)->sa) ; \
+    else if (wres->type == DATA_TREE_MASTER) sawres = (&((resolve_tree_master_t *)wres->obj)->sa) ;
 #endif
 /**
  *
diff --git a/src/include/66/tree.h b/src/include/66/tree.h
index ca1a5830..df40bf5a 100644
--- a/src/include/66/tree.h
+++ b/src/include/66/tree.h
@@ -26,6 +26,7 @@
 
 
 #define DATA_TREE 1
+#define DATA_TREE_MASTER 2
 #define TREE_GROUPS_BOOT "boot"
 #define TREE_GROUPS_BOOT_LEN (sizeof TREE_GROUPS_BOOT - 1)
 #define TREE_GROUPS_ADM "admin"
@@ -33,7 +34,6 @@
 #define TREE_GROUPS_USER "user"
 #define TREE_GROUPS_USER_LEN (sizeof TREE_GROUPS_USER - 1)
 
-
 typedef struct resolve_tree_s resolve_tree_t, *resolve_tree_t_ref ;
 struct resolve_tree_s
 {
@@ -46,9 +46,6 @@ struct resolve_tree_s
     uint32_t allow ;
     uint32_t groups ;
     uint32_t contents ;
-    // for the master
-    uint32_t enabled ; //string of all enabled tree
-    uint32_t current ;//name of the current tree, only available and used on Master resolve file
 
     uint32_t ndepends ;
     uint32_t nrequiredby ;
@@ -58,10 +55,8 @@ struct resolve_tree_s
 
     uint32_t init ;//not initialized->0, initialized->1
     uint32_t disen ;//disable->0, enable->1
-    // for the master
-    uint32_t nenabled ; //nbre of enabled tree
 } ;
-#define RESOLVE_TREE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+#define RESOLVE_TREE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0 }
 
 typedef enum resolve_tree_enum_e resolve_tree_enum_t, *resolve_tree_enum_t_ref;
 enum resolve_tree_enum_e
@@ -72,8 +67,6 @@ enum resolve_tree_enum_e
     TREE_ENUM_ALLOW,
     TREE_ENUM_GROUPS,
     TREE_ENUM_CONTENTS,
-    TREE_ENUM_ENABLED,
-    TREE_ENUM_CURRENT,
     TREE_ENUM_NDEPENDS,
     TREE_ENUM_NREQUIREDBY,
     TREE_ENUM_NALLOW,
@@ -81,7 +74,6 @@ enum resolve_tree_enum_e
     TREE_ENUM_NCONTENTS,
     TREE_ENUM_INIT,
     TREE_ENUM_DISEN,
-    TREE_ENUM_NENABLED,
     TREE_ENUM_ENDOFKEY
 } ;
 
@@ -93,6 +85,35 @@ struct resolve_tree_field_table_s
 
 extern resolve_tree_field_table_t resolve_tree_field_table[] ;
 
+typedef struct resolve_tree_master_s resolve_tree_master_t, *resolve_tree_master_t_ref ;
+struct resolve_tree_master_s
+{
+   uint32_t salen ;
+   stralloc sa ;
+
+   uint32_t name ;
+   uint32_t allow ;
+   uint32_t enabled ;
+   uint32_t current ;
+
+   uint32_t nenabled ;
+
+} ;
+#define RESOLVE_TREE_MASTER_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0 }
+
+typedef enum resolve_tree_master_enum_e resolve_tree_master_enum_t, *resolve_tree_master_enum_t_ref;
+enum resolve_tree_master_enum_e
+{
+    TREE_ENUM_MASTER_NAME = 0,
+    TREE_ENUM_MASTER_ALLOW,
+    TREE_ENUM_MASTER_ENABLED,
+    TREE_ENUM_MASTER_CURRENT,
+    TREE_ENUM_MASTER_NENABLED,
+    TREE_ENUM_MASTER_ENDOFKEY
+} ;
+
+extern resolve_tree_field_table_t resolve_tree_master_field_table[] ;
+
 typedef struct tree_seed_s tree_seed_t, tree_seed_t_ref ;
 struct tree_seed_s
 {
@@ -173,13 +194,21 @@ extern int tree_switch_current(char const *base, char const *tree) ;
  *
  * */
 
+/** tree */
 extern int tree_read_cdb(cdb *c, resolve_tree_t *tres) ;
 extern int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres) ;
 extern int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres) ;
-extern int tree_resolve_create_master(char const *base, uid_t owner) ;
 extern int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *data) ;
 extern int tree_resolve_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enum_t field) ;
 
+/** Master */
+extern int tree_read_master_cdb(cdb *c, resolve_tree_master_t *mres) ;
+extern int tree_write_master_cdb(cdbmaker *c, resolve_tree_master_t *mres) ;
+extern int tree_resolve_master_create(char const *base, uid_t owner) ;
+extern int tree_resolve_master_copy(resolve_tree_master_t *dst, resolve_tree_master_t *mres) ;
+extern int tree_resolve_master_modify_field(resolve_tree_master_t *mres, uint8_t field, char const *data) ;
+extern int tree_resolve_master_field_tosa(stralloc *sa, resolve_tree_master_t *mres, resolve_tree_master_enum_t field) ;
+
 /**
  *
  * Seed API
diff --git a/src/lib66/resolve.c b/src/lib66/resolve.c
index 214c2164..2fc670d7 100644
--- a/src/lib66/resolve.c
+++ b/src/lib66/resolve.c
@@ -141,6 +141,15 @@ int resolve_append(genalloc *ga, resolve_wrapper_t *wres)
         if (!genalloc_append(resolve_tree_t, ga, &cp))
             goto err ;
 
+    } else if (wres->type == DATA_TREE_MASTER) {
+
+            resolve_tree_master_t cp = RESOLVE_TREE_MASTER_ZERO ;
+
+            if (!tree_resolve_master_copy(&cp, ((resolve_tree_master_t *)wres->obj)))
+                goto err ;
+
+            if (!genalloc_append(resolve_tree_master_t, ga, &cp))
+                goto err ;
     }
 
     e = 1 ;
@@ -269,7 +278,7 @@ int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const *
         if (!service_resolve_modify_field(res, field, by))
             goto err ;
 
-    } else if (wres-> type == DATA_TREE) {
+    } else if (wres->type == DATA_TREE) {
 
         resolve_tree_t_ref res = (resolve_tree_t *)wres->obj  ;
         mwres = resolve_set_struct(DATA_TREE, res) ;
@@ -279,7 +288,17 @@ int resolve_modify_field(resolve_wrapper_t_ref wres, uint8_t field, char const *
         if (!tree_resolve_modify_field(res, field, by))
             goto err ;
 
+    } else if (wres->type == DATA_TREE_MASTER) {
+
+        resolve_tree_master_t_ref res = (resolve_tree_master_t *)wres->obj  ;
+        mwres = resolve_set_struct(DATA_TREE_MASTER, res) ;
+
+        log_trace("modify field ", resolve_tree_master_field_table[field].field," of inner resolve file of trees with value: ", by) ;
+
+        if (!tree_resolve_master_modify_field(res, field, by))
+            goto err ;
     }
+
     e = 1 ;
     err:
         free(mwres) ;
@@ -291,27 +310,23 @@ int resolve_modify_field_g(resolve_wrapper_t_ref wres, char const *base, char co
 
     log_flow() ;
 
-    size_t baselen = strlen(base), tot = 0, treelen = 0 ;
+    size_t baselen = strlen(base), tot = baselen + SS_SYSTEM_LEN + 1, treelen = 0 ;
     char *treename = 0 ;
 
     if (wres->type == DATA_SERVICE) {
+        treename = ((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename ;
+        treelen = strlen(treename) ;
+        tot += treelen + SS_SVDIRS_LEN + 1 ;
 
-        treelen = strlen(((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename) ;
-        tot = baselen + SS_SYSTEM_LEN + 1 + treelen + SS_SVDIRS_LEN + 1 ;
-
-    } else {
-
-        tot = baselen + SS_SYSTEM_LEN + 1 ;
     }
 
     char solve[tot] ;
 
     if (wres->type == DATA_SERVICE) {
 
-        treename = ((resolve_service_t *)wres->obj)->sa.s + ((resolve_service_t *)wres->obj)->treename ;
         auto_strings(solve, base, SS_SYSTEM, "/", treename, SS_SVDIRS) ;
 
-    } else {
+    } else if (wres->type == DATA_TREE || wres->type == DATA_TREE_MASTER) {
 
         auto_strings(solve, base, SS_SYSTEM) ;
     }
@@ -365,6 +380,13 @@ void resolve_deep_free(uint8_t type, genalloc *g)
             stralloc_free(&genalloc_s(resolve_tree_t, g)[pos].sa) ;
 
          genalloc_free(resolve_tree_t, g) ;
+
+    } else if (type == DATA_TREE_MASTER) {
+
+        for (; pos < genalloc_len(resolve_tree_master_t, g) ; pos++)
+            stralloc_free(&genalloc_s(resolve_tree_master_t, g)[pos].sa) ;
+
+         genalloc_free(resolve_tree_master_t, g) ;
     }
 
 }
@@ -403,6 +425,10 @@ int resolve_read_cdb(resolve_wrapper_t *wres, char const *name)
         if (!tree_read_cdb(&c, ((resolve_tree_t *)wres->obj)))
             goto err ;
 
+    } else if (wres->type == DATA_TREE_MASTER) {
+
+        if (!tree_read_master_cdb(&c, ((resolve_tree_master_t *)wres->obj)))
+            goto err ;
     }
 
     e = 1 ;
@@ -449,6 +475,11 @@ int resolve_write_cdb(resolve_wrapper_t *wres, char const *dst, char const *name
         if (!tree_write_cdb(&c, ((resolve_tree_t *)wres->obj)))
             goto err ;
 
+    } else if (wres->type == DATA_TREE_MASTER) {
+
+        if (!tree_write_master_cdb(&c, ((resolve_tree_master_t *)wres->obj)))
+            goto err ;
+
     }
 
     if (!cdbmake_finish(&c) || fsync(fd) < 0) {
diff --git a/src/lib66/ssexec_tree.c b/src/lib66/ssexec_tree.c
index ba21427c..5bb047b1 100644
--- a/src/lib66/ssexec_tree.c
+++ b/src/lib66/ssexec_tree.c
@@ -300,12 +300,12 @@ void sanitize_system(ssexec_t *info)
     auto_strings(dst + baselen + SS_SYSTEM_LEN + SS_RESOLVE_LEN, SS_MASTER) ;
 
     if (!scan_mode(dst, S_IFREG))
-        if (!tree_resolve_create_master(info->base.s, info->owner))
+        if (!tree_resolve_master_create(info->base.s, info->owner))
             log_dieu(LOG_EXIT_SYS, "write resolve file of inner tree") ;
 
     auto_strings(dst + baselen, SS_TREE_CURRENT) ;
     auto_check(dst) ;
-    auto_strings(dst + baselen,SS_SYSTEM, SS_BACKUP) ;
+    auto_strings(dst + baselen, SS_SYSTEM, SS_BACKUP) ;
     auto_check(dst) ;
 }
 
@@ -633,7 +633,7 @@ void create_tree(ssexec_t *info)
     auto_create(dst, SS_RESOLVE, newlen) ;
     dst[newlen] = 0 ;
 
-    if (!service_resolve_create_master(info->base.s, info->treename.s))
+    if (!service_resolve_master_create(info->base.s, info->treename.s))
         log_dieusys_nclean(LOG_EXIT_SYS,&cleanup,"write resolve file of inner bundle") ;
 
     auto_strings(sym,dst, "/", SS_SYM_SVC) ;
@@ -810,28 +810,28 @@ void tree_master_enable_disable(char const *base, char const *treename, uint8_t
 
     size_t pos = 0, nb = 0, baselen = strlen(base), len = 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] ;
 
     log_trace(!action ? "disable" : "enable"," tree: ", treename, " from: ", SS_MASTER + 1) ;
 
     auto_strings(solve, base, SS_SYSTEM) ;
 
-    if (!resolve_read(wres, solve, SS_MASTER))
-        log_dieusys(LOG_EXIT_SYS, "read resolve file of inner tree") ;
+    if (!resolve_read(wres, solve, SS_MASTER + 1))
+        log_dieusys(LOG_EXIT_SYS, "read inner resolve file of trees") ;
 
-    if (!tres.nenabled && action) {
-        if (!resolve_modify_field(wres, TREE_ENUM_ENABLED, treename))
-            log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", SS_MASTER + 1) ;
+    if (!mres.nenabled && action) {
+        if (!resolve_modify_field(wres, TREE_ENUM_MASTER_ENABLED, treename))
+            log_dieusys(LOG_EXIT_SYS, "modify inner resolve file of trees") ;
 
-        tres.nenabled = 1 ;
+        mres.nenabled = 1 ;
         goto write ;
     }
 
-    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))
             log_dieu(LOG_EXIT_SYS, "clean string") ;
 
         len = sa.len ;
@@ -867,15 +867,15 @@ void tree_master_enable_disable(char const *base, char const *treename, uint8_t
         if (!stralloc_0(&sa))
             log_die_nomem("stralloc") ;
 
-        if (!resolve_modify_field(wres, TREE_ENUM_ENABLED, sa.s))
+        if (!resolve_modify_field(wres, TREE_ENUM_MASTER_ENABLED, sa.s))
             log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", SS_MASTER + 1) ;
 
-        tres.nenabled = nb ;
+        mres.nenabled = nb ;
     }
 
     write:
         if (!resolve_write(wres, solve, SS_MASTER + 1))
-            log_dieusys(LOG_EXIT_SYS, "read resolve file of inner tree") ;
+            log_dieusys(LOG_EXIT_SYS, "write inner resolve file of trees") ;
 
         resolve_free(wres) ;
         stralloc_free(&sa) ;
@@ -1316,7 +1316,7 @@ void tree_clone(char const *clone, ssexec_t *info)
 
     int r ;
     resolve_service_t res = RESOLVE_SERVICE_ZERO ;
-    resolve_tree_t tres = RESOLVE_TREE_ZERO ;
+    resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ;
     resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ;
     stralloc sa = STRALLOC_ZERO ;
     char const *exclude[1] = { 0 } ;
@@ -1441,19 +1441,19 @@ void tree_clone(char const *clone, ssexec_t *info)
 
     resolve_free(wres) ;
 
-    wres = resolve_set_struct(DATA_TREE, &tres) ;
+    wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ;
 
     if (!resolve_read(wres, system, info->treename.s))
-        log_dieusys_nclean(LOG_EXIT_SYS,&cleanup,"read resolve file of: ", system, "/", info->treename.s) ;
+        log_dieusys_nclean(LOG_EXIT_SYS,&cleanup,"read inner resolve file of trees") ;
 
-    if (!resolve_modify_field(wres, TREE_ENUM_ENABLED, 0) ||
-        !resolve_modify_field(wres, TREE_ENUM_NAME, clone))
-            log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", clone) ;
+    if (!resolve_modify_field(wres, TREE_ENUM_MASTER_ENABLED, 0) ||
+        !resolve_modify_field(wres, TREE_ENUM_MASTER_NAME, clone))
+            log_dieusys(LOG_EXIT_SYS, "modify inner resolve file of trees") ;
 
-    tres.disen = 0 ;
+    mres.nenabled = 0 ;
 
     if (!resolve_write(wres, system, clone))
-        log_dieusys_nclean(LOG_EXIT_SYS, &cleanup, "write resolve file of: ", system, "/", clone) ;
+        log_dieusys_nclean(LOG_EXIT_SYS, &cleanup, "write inner resolve file of trees") ;
 
     resolve_free(wres) ;
 
diff --git a/src/lib66/tree_resolve.c b/src/lib66/tree_resolve.c
index e36f3ba2..4c8f29fb 100644
--- a/src/lib66/tree_resolve.c
+++ b/src/lib66/tree_resolve.c
@@ -39,8 +39,6 @@ resolve_tree_field_table_t resolve_tree_field_table[] = {
     [TREE_ENUM_ALLOW] = { .field = "allow" },
     [TREE_ENUM_GROUPS] = { .field = "groups" },
     [TREE_ENUM_CONTENTS] = { .field = "contents" },
-    [TREE_ENUM_ENABLED] = { .field = "enabled" },
-    [TREE_ENUM_CURRENT] = { .field = "current" },
     [TREE_ENUM_NDEPENDS] = { .field = "ndepends" },
     [TREE_ENUM_NREQUIREDBY] = { .field = "nrequiredby" },
     [TREE_ENUM_NALLOW] = { .field = "nallow" },
@@ -48,10 +46,19 @@ resolve_tree_field_table_t resolve_tree_field_table[] = {
     [TREE_ENUM_NCONTENTS] = { .field = "ncontents" },
     [TREE_ENUM_INIT] = { .field = "init" },
     [TREE_ENUM_DISEN] = { .field = "disen" },
-    [TREE_ENUM_NENABLED] = { .field = "nenabled" },
     [TREE_ENUM_ENDOFKEY] = { .field = 0 }
 } ;
 
+resolve_tree_field_table_t resolve_tree_master_field_table[] = {
+
+    [TREE_ENUM_MASTER_NAME] = { .field = "name" },
+    [TREE_ENUM_MASTER_ALLOW] = { .field = "allow" },
+    [TREE_ENUM_MASTER_ENABLED] = { .field = "enabled" },
+    [TREE_ENUM_MASTER_CURRENT] = { .field = "current" },
+    [TREE_ENUM_MASTER_NENABLED] = { .field = "nenabled" },
+    [TREE_ENUM_MASTER_ENDOFKEY] = { .field = 0 }
+} ;
+
 int tree_read_cdb(cdb *c, resolve_tree_t *tres)
 {
     log_flow() ;
@@ -60,7 +67,7 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
     resolve_wrapper_t_ref wres ;
     uint32_t x ;
 
-    wres = resolve_set_struct(DATA_SERVICE, tres) ;
+    wres = resolve_set_struct(DATA_TREE, tres) ;
 
     resolve_init(wres) ;
 
@@ -88,14 +95,6 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
     resolve_find_cdb(&tmp,c,"contents") ;
     tres->contents = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
 
-    /* enabled */
-    resolve_find_cdb(&tmp,c,"enabled") ;
-    tres->enabled = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
-
-    /* current */
-    resolve_find_cdb(&tmp,c,"current") ;
-    tres->current = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
-
     /* ndepends */
     x = resolve_find_cdb(&tmp,c,"ndepends") ;
     tres->ndepends = x ;
@@ -124,10 +123,6 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
     x = resolve_find_cdb(&tmp,c,"disen") ;
     tres->disen = x ;
 
-    /* nenabled */
-    x = resolve_find_cdb(&tmp,c,"nenabled") ;
-    tres->nenabled = x ;
-
     free(wres) ;
     stralloc_free(&tmp) ;
 
@@ -158,12 +153,6 @@ int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres)
     /* contents */
     !resolve_add_cdb(c,"contents",str + tres->contents) ||
 
-    /* enabled */
-    !resolve_add_cdb(c,"enabled",str + tres->enabled) ||
-
-    /* current */
-    !resolve_add_cdb(c,"current",str + tres->current) ||
-
     /* ndepends */
     !resolve_add_cdb_uint(c,"ndepends",tres->ndepends) ||
 
@@ -183,10 +172,7 @@ int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres)
     !resolve_add_cdb_uint(c,"init",tres->init) ||
 
     /* disen */
-    !resolve_add_cdb_uint(c,"disen",tres->disen) ||
-
-    /* nenabled */
-    !resolve_add_cdb_uint(c,"nenabled",tres->nenabled)) return 0 ;
+    !resolve_add_cdb_uint(c,"disen",tres->disen)) return 0 ;
 
     return 1 ;
 }
@@ -210,8 +196,6 @@ int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres)
     dst->allow = tres->allow ;
     dst->groups = tres->groups ;
     dst->contents = tres->contents ;
-    dst->enabled = tres->enabled ;
-    dst->current = tres->current ;
     dst->ndepends = tres->ndepends ;
     dst->nrequiredby = tres->nrequiredby ;
     dst->nallow = tres->nallow ;
@@ -219,47 +203,11 @@ int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres)
     dst->ncontents = tres->ncontents ;
     dst->init = tres->init ;
     dst->disen = tres->disen ;
-    dst->nenabled = tres->nenabled ;
 
     return 1 ;
 
 }
 
-int tree_resolve_create_master(char const *base, uid_t owner)
-{
-    int e = 0 ;
-    size_t baselen = strlen(base) ;
-    struct passwd *pw = getpwuid(owner) ;
-    resolve_tree_t tres = RESOLVE_TREE_ZERO ;
-    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
-    char dst[baselen + SS_SYSTEM_LEN + 1] ;
-
-    if (!pw) {
-
-        if (!errno)
-            errno = ESRCH ;
-        goto err ;
-    }
-
-    resolve_init(wres) ;
-
-    auto_strings(dst, base, SS_SYSTEM) ;
-
-    tres.name = resolve_add_string(wres, SS_MASTER + 1) ;
-    tres.allow = resolve_add_string(wres, pw->pw_name) ;
-    tres.groups = resolve_add_string(wres, owner ? TREE_GROUPS_USER : TREE_GROUPS_ADM) ;
-
-    log_trace("write resolve file of inner tree") ;
-    if (!resolve_write(wres, dst, SS_MASTER + 1))
-        goto err ;
-
-    e  = 1 ;
-
-    err:
-        resolve_free(wres) ;
-        return e ;
-}
-
 int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *data)
 {
     log_flow() ;
@@ -295,14 +243,6 @@ int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *d
             tres->contents = resolve_add_string(wres,data) ;
             break ;
 
-        case TREE_ENUM_ENABLED:
-            tres->enabled = resolve_add_string(wres,data) ;
-            break ;
-
-        case TREE_ENUM_CURRENT:
-            tres->current = resolve_add_string(wres,data) ;
-            break ;
-
         case TREE_ENUM_NDEPENDS:
             if (!uint0_scan(data, &ifield)) goto err ;
             tres->ndepends = ifield ;
@@ -338,11 +278,6 @@ int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *d
             tres->disen = ifield ;
             break ;
 
-        case TREE_ENUM_NENABLED:
-            if (!uint0_scan(data, &ifield)) goto err ;
-            tres->nenabled = ifield ;
-            break ;
-
         default:
             break ;
     }
@@ -387,14 +322,6 @@ int tree_resolve_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enu
             ifield = tres->contents ;
             break ;
 
-        case TREE_ENUM_ENABLED:
-            ifield = tres->enabled ;
-            break ;
-
-        case TREE_ENUM_CURRENT:
-            ifield = tres->current ;
-            break ;
-
         case TREE_ENUM_NDEPENDS:
             ifield = tres->ndepends ;
             break ;
@@ -423,15 +350,213 @@ int tree_resolve_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enu
             ifield = tres->disen ;
             break ;
 
-        case TREE_ENUM_NENABLED:
-            ifield = tres->nenabled ;
+        default:
+            return 0 ;
+    }
+
+    if (!auto_stra(sa,tres->sa.s + ifield))
+        return 0 ;
+
+    return 1 ;
+}
+
+/** Master */
+int tree_read_master_cdb(cdb *c, resolve_tree_master_t *mres)
+{
+    log_flow() ;
+
+    stralloc tmp = STRALLOC_ZERO ;
+    resolve_wrapper_t_ref wres ;
+    uint32_t x ;
+
+    wres = resolve_set_struct(DATA_TREE_MASTER, mres) ;
+
+    resolve_init(wres) ;
+
+    /* name */
+    resolve_find_cdb(&tmp,c,"name") ;
+    mres->name = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* allow */
+    resolve_find_cdb(&tmp,c,"allow") ;
+    mres->allow = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* enabled */
+    resolve_find_cdb(&tmp,c,"enabled") ;
+    mres->enabled = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* current */
+    resolve_find_cdb(&tmp,c,"current") ;
+    mres->current = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
+    /* nenabled */
+    x = resolve_find_cdb(&tmp,c,"nenabled") ;
+    mres->nenabled = x ;
+
+    free(wres) ;
+    stralloc_free(&tmp) ;
+
+    return 1 ;
+}
+
+int tree_write_master_cdb(cdbmaker *c, resolve_tree_master_t *mres)
+{
+    log_flow() ;
+
+    char *str = mres->sa.s ;
+
+    /* name */
+    if (!resolve_add_cdb(c,"name",str + mres->name) ||
+
+    /* allow */
+    !resolve_add_cdb(c,"allow",str + mres->allow) ||
+
+    /* enabled */
+    !resolve_add_cdb(c,"enabled",str + mres->enabled) ||
+
+    /* current */
+    !resolve_add_cdb(c,"current",str + mres->current) ||
+
+    /* nenabled */
+    !resolve_add_cdb_uint(c,"nenabled",mres->nenabled)) return 0 ;
+
+    return 1 ;
+}
+
+int tree_resolve_master_create(char const *base, uid_t owner)
+{
+    int e = 0 ;
+    size_t baselen = strlen(base) ;
+    struct passwd *pw = getpwuid(owner) ;
+    resolve_tree_master_t mres = RESOLVE_TREE_MASTER_ZERO ;
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, &mres) ;
+    char dst[baselen + SS_SYSTEM_LEN + 1] ;
+
+    if (!pw) {
+
+        if (!errno)
+            errno = ESRCH ;
+        goto err ;
+    }
+
+    resolve_init(wres) ;
+
+    auto_strings(dst, base, SS_SYSTEM) ;
+
+    mres.name = resolve_add_string(wres, SS_MASTER + 1) ;
+    mres.allow = resolve_add_string(wres, pw->pw_name) ;
+
+    log_trace("write inner resolve file of trees") ;
+    if (!resolve_write(wres, dst, SS_MASTER + 1))
+        goto err ;
+
+    e  = 1 ;
+
+    err:
+        resolve_free(wres) ;
+        return e ;
+}
+
+int tree_resolve_master_copy(resolve_tree_master_t *dst, resolve_tree_master_t *mres)
+{
+    log_flow() ;
+
+    stralloc_free(&dst->sa) ;
+
+    size_t len = mres->sa.len - 1 ;
+    dst->salen = mres->salen ;
+
+    if (!stralloc_catb(&dst->sa,mres->sa.s,len) ||
+        !stralloc_0(&dst->sa))
+            return 0 ;
+
+    dst->name = mres->name ;
+    dst->allow = mres->allow ;
+    dst->enabled = mres->enabled ;
+    dst->current = mres->current ;
+    dst->nenabled = mres->nenabled ;
+
+    return 1 ;
+
+}
+
+int tree_resolve_master_modify_field(resolve_tree_master_t *mres, uint8_t field, char const *data)
+{
+    log_flow() ;
+
+    uint32_t ifield ;
+    int e = 0 ;
+
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE_MASTER, mres) ;
+
+    switch(field) {
+
+        case TREE_ENUM_MASTER_NAME:
+            mres->name = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_MASTER_ALLOW:
+            mres->allow = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_MASTER_ENABLED:
+            mres->enabled = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_MASTER_CURRENT:
+            mres->current = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_MASTER_NENABLED:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            mres->nenabled = ifield ;
+            break ;
+
+        default:
+            break ;
+    }
+
+    e = 1 ;
+
+    err:
+        free(wres) ;
+        return e ;
+
+}
+
+int tree_resolve_master_field_tosa(stralloc *sa, resolve_tree_master_t *mres, resolve_tree_master_enum_t field)
+{
+    log_flow() ;
+
+    uint32_t ifield ;
+
+    switch(field) {
+
+        case TREE_ENUM_MASTER_NAME:
+            ifield = mres->name ;
+            break ;
+
+        case TREE_ENUM_MASTER_ALLOW:
+            ifield = mres->name ;
+            break ;
+
+        case TREE_ENUM_MASTER_ENABLED:
+            ifield = mres->enabled ;
+            break ;
+
+        case TREE_ENUM_MASTER_CURRENT:
+            ifield = mres->current ;
+            break ;
+
+        case TREE_ENUM_MASTER_NENABLED:
+            ifield = mres->nenabled ;
             break ;
 
         default:
             return 0 ;
     }
 
-    if (!auto_stra(sa,tres->sa.s + ifield))
+    if (!auto_stra(sa,mres->sa.s + ifield))
         return 0 ;
 
     return 1 ;
-- 
GitLab