From 4f95210cf32561e58a7c0a3749365116f39604c9 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Mon, 10 Jan 2022 18:59:45 +1100
Subject: [PATCH] follow changes of the resolve_tree_s structure

---
 src/lib66/tree_resolve.c | 299 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 289 insertions(+), 10 deletions(-)

diff --git a/src/lib66/tree_resolve.c b/src/lib66/tree_resolve.c
index 81ebe9ad..e36f3ba2 100644
--- a/src/lib66/tree_resolve.c
+++ b/src/lib66/tree_resolve.c
@@ -15,8 +15,11 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <stdlib.h>//free
+#include <pwd.h>
+#include <sys/stat.h>
 
 #include <oblibs/log.h>
+#include <oblibs/string.h>
 
 #include <skalibs/stralloc.h>
 #include <skalibs/cdbmake.h>
@@ -24,6 +27,30 @@
 
 #include <66/tree.h>
 #include <66/resolve.h>
+#include <66/constants.h>
+#include <66/graph.h>
+
+
+resolve_tree_field_table_t resolve_tree_field_table[] = {
+
+    [TREE_ENUM_NAME] = { .field = "name" },
+    [TREE_ENUM_DEPENDS] = { .field = "depends" },
+    [TREE_ENUM_REQUIREDBY] = { .field = "requiredby" },
+    [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" },
+    [TREE_ENUM_NGROUPS] = { .field = "ngroups" },
+    [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 }
+} ;
 
 int tree_read_cdb(cdb *c, resolve_tree_t *tres)
 {
@@ -33,7 +60,7 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
     resolve_wrapper_t_ref wres ;
     uint32_t x ;
 
-    wres = resolve_set_struct(SERVICE_STRUCT, tres) ;
+    wres = resolve_set_struct(DATA_SERVICE, tres) ;
 
     resolve_init(wres) ;
 
@@ -53,10 +80,22 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
     resolve_find_cdb(&tmp,c,"allow") ;
     tres->allow = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
 
+    /* groups */
+    resolve_find_cdb(&tmp,c,"groups") ;
+    tres->groups = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ;
+
     /* contents */
     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 ;
@@ -65,14 +104,18 @@ int tree_read_cdb(cdb *c, resolve_tree_t *tres)
     x = resolve_find_cdb(&tmp,c,"nrequiredby") ;
     tres->nrequiredby = x ;
 
+    /* nallow */
+    x = resolve_find_cdb(&tmp,c,"nallow") ;
+    tres->nallow = x ;
+
+    /* ngroups */
+    x = resolve_find_cdb(&tmp,c,"ngroups") ;
+    tres->ngroups = x ;
+
     /* ncontents */
     x = resolve_find_cdb(&tmp,c,"ncontents") ;
     tres->ncontents = x ;
 
-    /* current */
-    x = resolve_find_cdb(&tmp,c,"current") ;
-    tres->current = x ;
-
     /* init */
     x = resolve_find_cdb(&tmp,c,"init") ;
     tres->init = x ;
@@ -81,6 +124,10 @@ 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) ;
 
@@ -105,26 +152,41 @@ int tree_write_cdb(cdbmaker *c, resolve_tree_t *tres)
     /* allow */
     !resolve_add_cdb(c,"allow",str + tres->allow) ||
 
+    /* groups */
+    !resolve_add_cdb(c,"groups",str + tres->groups) ||
+
     /* 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) ||
 
     /* nrequiredby */
     !resolve_add_cdb_uint(c,"nrequiredby",tres->nrequiredby) ||
 
+    /* nallow */
+    !resolve_add_cdb_uint(c,"nallow",tres->nallow) ||
+
+    /* ngroups */
+    !resolve_add_cdb_uint(c,"ngroups",tres->ngroups) ||
+
     /* ncontents */
     !resolve_add_cdb_uint(c,"ncontents",tres->ncontents) ||
 
-    /* current */
-    !resolve_add_cdb_uint(c,"current",tres->current) ||
-
     /* init */
     !resolve_add_cdb_uint(c,"init",tres->init) ||
 
     /* disen */
-    !resolve_add_cdb_uint(c,"disen",tres->disen)) return 0 ;
+    !resolve_add_cdb_uint(c,"disen",tres->disen) ||
+
+    /* nenabled */
+    !resolve_add_cdb_uint(c,"nenabled",tres->nenabled)) return 0 ;
 
     return 1 ;
 }
@@ -146,14 +208,231 @@ int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres)
     dst->depends = tres->depends ;
     dst->requiredby = tres->requiredby ;
     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 ;
+    dst->ngroups = tres->ngroups ;
     dst->ncontents = tres->ncontents ;
-    dst->current = tres->current ;
     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() ;
+
+    uint32_t ifield ;
+    int e = 0 ;
+
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, tres) ;
+
+    switch(field) {
+
+        case TREE_ENUM_NAME:
+            tres->name = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_DEPENDS:
+            tres->depends = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_REQUIREDBY:
+            tres->requiredby = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_ALLOW:
+            tres->allow = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_GROUPS:
+            tres->groups = resolve_add_string(wres,data) ;
+            break ;
+
+        case TREE_ENUM_CONTENTS:
+            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 ;
+            break ;
+
+        case TREE_ENUM_NREQUIREDBY:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->nrequiredby = ifield ;
+            break ;
+
+        case TREE_ENUM_NALLOW:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->nallow = ifield ;
+            break ;
+
+        case TREE_ENUM_NGROUPS:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->ngroups = ifield ;
+            break ;
+
+        case TREE_ENUM_NCONTENTS:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->ncontents = ifield ;
+            break ;
+
+        case TREE_ENUM_INIT:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->init = ifield ;
+            break ;
+
+        case TREE_ENUM_DISEN:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->disen = ifield ;
+            break ;
+
+        case TREE_ENUM_NENABLED:
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->nenabled = ifield ;
+            break ;
+
+        default:
+            break ;
+    }
+
+    e = 1 ;
+
+    err:
+        free(wres) ;
+        return e ;
+
+}
+
+int tree_resolve_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree_enum_t field)
+{
+    log_flow() ;
+
+    uint32_t ifield ;
+
+    switch(field) {
+
+        case TREE_ENUM_NAME:
+            ifield = tres->name ;
+            break ;
+
+        case TREE_ENUM_DEPENDS:
+            ifield = tres->depends ;
+            break ;
+
+        case TREE_ENUM_REQUIREDBY:
+            ifield = tres->requiredby ;
+            break ;
+
+        case TREE_ENUM_ALLOW:
+            ifield = tres->allow ;
+            break ;
+
+        case TREE_ENUM_GROUPS:
+            ifield = tres->groups ;
+            break ;
+
+        case TREE_ENUM_CONTENTS:
+            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 ;
+
+        case TREE_ENUM_NREQUIREDBY:
+            ifield = tres->nrequiredby ;
+            break ;
+
+        case TREE_ENUM_NALLOW:
+            ifield = tres->nallow ;
+            break ;
+
+        case TREE_ENUM_NGROUPS:
+            ifield = tres->ngroups ;
+            break ;
+
+        case TREE_ENUM_NCONTENTS:
+            ifield = tres->ncontents ;
+            break ;
+
+        case TREE_ENUM_INIT:
+            ifield = tres->init ;
+            break ;
+
+        case TREE_ENUM_DISEN:
+            ifield = tres->disen ;
+            break ;
+
+        case TREE_ENUM_NENABLED:
+            ifield = tres->nenabled ;
+            break ;
+
+        default:
+            return 0 ;
+    }
+
+    if (!auto_stra(sa,tres->sa.s + ifield))
+        return 0 ;
+
+    return 1 ;
+}
-- 
GitLab