From 71db2710616e24fdfbad1078da3f7ad85db0ee51 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sat, 28 Jan 2023 20:45:00 +1100
Subject: [PATCH] add tree_issupervised function and its resolve field

---
 src/include/66/tree.h                        | 13 ++++--
 src/lib66/exec/ssexec_inresolve.c            | 18 ++++----
 src/lib66/tree/deps-lib/deps                 |  1 +
 src/lib66/tree/tree_issupervised.c           | 43 ++++++++++++++++++++
 src/lib66/tree/tree_resolve_copy.c           |  1 +
 src/lib66/tree/tree_resolve_get_field_tosa.c |  5 +++
 src/lib66/tree/tree_resolve_modify_field.c   |  8 ++++
 src/lib66/tree/tree_resolve_read_cdb.c       |  4 ++
 src/lib66/tree/tree_resolve_write_cdb.c      |  3 ++
 9 files changed, 85 insertions(+), 11 deletions(-)
 create mode 100644 src/lib66/tree/tree_issupervised.c

diff --git a/src/include/66/tree.h b/src/include/66/tree.h
index a0bf979a..bfd6bc95 100644
--- a/src/include/66/tree.h
+++ b/src/include/66/tree.h
@@ -43,18 +43,19 @@ struct resolve_tree_s
     uint32_t requiredby ;
     uint32_t allow ;
     uint32_t groups ;
-    uint32_t contents ;//not used
+    uint32_t contents ;
 
     uint32_t ndepends ;
     uint32_t nrequiredby ;
     uint32_t nallow ;
     uint32_t ngroups ; //not really useful for now, we accept only one group
-    uint32_t ncontents ; //not used
+    uint32_t ncontents ;
 
     uint32_t init ;//not initialized->0, initialized->1
+    uint32_t supervised ;//not superviseded->0, supervised->1
     uint32_t disen ;//disable->0, enable->1
 } ;
-#define RESOLVE_TREE_ZERO { 0,STRALLOC_ZERO,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,0 }
 
 typedef enum resolve_tree_enum_e resolve_tree_enum_t, *resolve_tree_enum_t_ref;
 enum resolve_tree_enum_e
@@ -71,6 +72,7 @@ enum resolve_tree_enum_e
     E_RESOLVE_TREE_NGROUPS,
     E_RESOLVE_TREE_NCONTENTS,
     E_RESOLVE_TREE_INIT,
+    E_RESOLVE_TREE_SUPERVISED,
     E_RESOLVE_TREE_DISEN,
     E_RESOLVE_TREE_ENDOFKEY
 } ;
@@ -149,6 +151,11 @@ extern int tree_iscurrent(char const *base, char const *treename) ;
  * @Return -1 on system error */
 extern int tree_isinitialized(char const *base, char const *treename) ;
 
+/** @Return 1 on success
+ * @Return 0 on fail
+ * @Return -1 on system error */
+extern int tree_issupervised(char const *base, char const *treename) ;
+
 /** @Return 1 on success
  * @Return 0 if not valid
  * @Return -1 on system error */
diff --git a/src/lib66/exec/ssexec_inresolve.c b/src/lib66/exec/ssexec_inresolve.c
index 0f4860e9..2ae548c9 100644
--- a/src/lib66/exec/ssexec_inresolve.c
+++ b/src/lib66/exec/ssexec_inresolve.c
@@ -377,13 +377,14 @@ int ssexec_inresolve(int argc, char const *const *argv, ssexec_t *info)
             "ngroups",
             "ncontents",
             "init" ,
-            "disen", // 13
+            "supervised",
+            "disen", // 14
             // Master
             "enabled",
             "current",
             "contents",
             "nenabled",
-            "ncontents" // 18
+            "ncontents" // 19
         } ;
 
         resolve_wrapper_t_ref wres = 0 ;
@@ -426,17 +427,18 @@ int ssexec_inresolve(int argc, char const *const *argv, ssexec_t *info)
             info_display_int(fields[9], tres.ngroups) ;
             info_display_int(fields[10], tres.ncontents) ;
             info_display_int(fields[11], tres.init) ;
-            info_display_int(fields[12], tres.disen) ;
+            info_display_int(fields[12], tres.supervised) ;
+            info_display_int(fields[13], tres.disen) ;
 
         } else {
 
             info_display_string(fields[0], mres.sa.s, mres.name, 1) ;
             info_display_string(fields[3], mres.sa.s, mres.allow, 1) ;
-            info_display_string(fields[13], mres.sa.s, mres.enabled, 1) ;
-            info_display_string(fields[14], mres.sa.s, mres.current, 1) ;
-            info_display_string(fields[15], mres.sa.s, mres.contents, 1) ;
-            info_display_int(fields[16], mres.nenabled) ;
-            info_display_int(fields[17], mres.ncontents) ;
+            info_display_string(fields[14], mres.sa.s, mres.enabled, 1) ;
+            info_display_string(fields[15], mres.sa.s, mres.current, 1) ;
+            info_display_string(fields[16], mres.sa.s, mres.contents, 1) ;
+            info_display_int(fields[17], mres.nenabled) ;
+            info_display_int(fields[18], mres.ncontents) ;
         }
 
         resolve_free(wres) ;
diff --git a/src/lib66/tree/deps-lib/deps b/src/lib66/tree/deps-lib/deps
index af4d52ec..55d84ba3 100644
--- a/src/lib66/tree/deps-lib/deps
+++ b/src/lib66/tree/deps-lib/deps
@@ -3,6 +3,7 @@ tree_get_permissions.o
 tree_iscurrent.o
 tree_isenabled.o
 tree_isinitialized.o
+tree_issupervised.o
 tree_isvalid.o
 tree_ongroups.o
 tree_resolve_array_search.o
diff --git a/src/lib66/tree/tree_issupervised.c b/src/lib66/tree/tree_issupervised.c
new file mode 100644
index 00000000..96786f23
--- /dev/null
+++ b/src/lib66/tree/tree_issupervised.c
@@ -0,0 +1,43 @@
+/*
+ * tree_issupervised.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <string.h>
+
+#include <oblibs/string.h>
+#include <oblibs/log.h>
+
+#include <66/constants.h>
+#include <66/resolve.h>
+#include <66/tree.h>
+
+int tree_issupervised(char const *base, char const *treename)
+{
+    log_flow() ;
+
+    int e = -1 ;
+    resolve_tree_t tres = RESOLVE_TREE_ZERO ;
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
+
+    if (!resolve_read_g(wres, base, treename))
+        goto err ;
+
+    if (tres.supervised)
+        e = 1 ;
+    else
+        e = 0 ;
+
+    err:
+        resolve_free(wres) ;
+        return e ;
+}
diff --git a/src/lib66/tree/tree_resolve_copy.c b/src/lib66/tree/tree_resolve_copy.c
index c154c80e..ef5776be 100644
--- a/src/lib66/tree/tree_resolve_copy.c
+++ b/src/lib66/tree/tree_resolve_copy.c
@@ -46,6 +46,7 @@ int tree_resolve_copy(resolve_tree_t *dst, resolve_tree_t *tres)
     dst->ngroups = tres->ngroups ;
     dst->ncontents = tres->ncontents ;
     dst->init = tres->init ;
+    dst->supervised = tres->supervised ;
     dst->disen = tres->disen ;
 
     return 1 ;
diff --git a/src/lib66/tree/tree_resolve_get_field_tosa.c b/src/lib66/tree/tree_resolve_get_field_tosa.c
index 09dbcff7..9234cf40 100644
--- a/src/lib66/tree/tree_resolve_get_field_tosa.c
+++ b/src/lib66/tree/tree_resolve_get_field_tosa.c
@@ -83,6 +83,11 @@ int tree_resolve_get_field_tosa(stralloc *sa, resolve_tree_t *tres, resolve_tree
             str = fmt ;
             break ;
 
+        case E_RESOLVE_TREE_SUPERVISED:
+            fmt[uint32_fmt(fmt,tres->supervised)] = 0 ;
+            str = fmt ;
+            break ;
+
         case E_RESOLVE_TREE_DISEN:
             fmt[uint32_fmt(fmt,tres->disen)] = 0 ;
             str = fmt ;
diff --git a/src/lib66/tree/tree_resolve_modify_field.c b/src/lib66/tree/tree_resolve_modify_field.c
index a3277ded..496116e8 100644
--- a/src/lib66/tree/tree_resolve_modify_field.c
+++ b/src/lib66/tree/tree_resolve_modify_field.c
@@ -36,6 +36,7 @@ resolve_field_table_t resolve_tree_field_table[] = {
     [E_RESOLVE_TREE_NGROUPS] = { .field = "ngroups" },
     [E_RESOLVE_TREE_NCONTENTS] = { .field = "ncontents" },
     [E_RESOLVE_TREE_INIT] = { .field = "init" },
+    [E_RESOLVE_TREE_SUPERVISED] = { .field = "supervised" },
     [E_RESOLVE_TREE_DISEN] = { .field = "disen" },
     [E_RESOLVE_TREE_ENDOFKEY] = { .field = 0 }
 } ;
@@ -117,6 +118,13 @@ int tree_resolve_modify_field(resolve_tree_t *tres, uint8_t field, char const *d
             tres->init = ifield ;
             break ;
 
+        case E_RESOLVE_TREE_SUPERVISED:
+            if (!data)
+                data = "0" ;
+            if (!uint0_scan(data, &ifield)) goto err ;
+            tres->supervised = ifield ;
+            break ;
+
         case E_RESOLVE_TREE_DISEN:
             if (!data)
                 data = "0" ;
diff --git a/src/lib66/tree/tree_resolve_read_cdb.c b/src/lib66/tree/tree_resolve_read_cdb.c
index 15de1dcc..3f74c649 100644
--- a/src/lib66/tree/tree_resolve_read_cdb.c
+++ b/src/lib66/tree/tree_resolve_read_cdb.c
@@ -83,6 +83,10 @@ int tree_resolve_read_cdb(cdb *c, resolve_tree_t *tres)
     x = resolve_find_cdb(&tmp,c,"init") ;
     tres->init = x ;
 
+    /* supervised */
+    x = resolve_find_cdb(&tmp,c,"supervised") ;
+    tres->supervised = x ;
+
     /* disen */
     x = resolve_find_cdb(&tmp,c,"disen") ;
     tres->disen = x ;
diff --git a/src/lib66/tree/tree_resolve_write_cdb.c b/src/lib66/tree/tree_resolve_write_cdb.c
index b867ffb9..e0e996ea 100644
--- a/src/lib66/tree/tree_resolve_write_cdb.c
+++ b/src/lib66/tree/tree_resolve_write_cdb.c
@@ -61,6 +61,9 @@ int tree_resolve_write_cdb(cdbmaker *c, resolve_tree_t *tres)
     /* init */
     !resolve_add_cdb_uint(c,"init",tres->init) ||
 
+    /* supervised */
+    !resolve_add_cdb_uint(c,"supervised",tres->supervised) ||
+
     /* disen */
     !resolve_add_cdb_uint(c,"disen",tres->disen)) return 0 ;
 
-- 
GitLab